Skip to content

chore(ci): bump docker/login-action from 4 to 4.5.2 in the actions-minor group across 1 directory - #8

Closed
dependabot[bot] wants to merge 3915 commits into
mainfrom
dependabot/github_actions/actions-minor-85123b4e12
Closed

chore(ci): bump docker/login-action from 4 to 4.5.2 in the actions-minor group across 1 directory#8
dependabot[bot] wants to merge 3915 commits into
mainfrom
dependabot/github_actions/actions-minor-85123b4e12

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 31, 2026

Copy link
Copy Markdown

Bumps the actions-minor group with 1 update in the / directory: docker/login-action.

Updates docker/login-action from 4 to 4.5.2

Release notes

Sourced from docker/login-action's releases.

v4.5.2

Full Changelog: docker/login-action@v4.5.1...v4.5.2

v4.5.1

Full Changelog: docker/login-action@v4.5.0...v4.5.1

v4.5.0

Full Changelog: docker/login-action@v4.4.0...v4.5.0

v4.4.0

Full Changelog: docker/login-action@v4.3.0...v4.4.0

v4.3.0

Full Changelog: docker/login-action@v4.2.0...v4.3.0

v4.2.0

... (truncated)

Commits
  • a5e9150 Merge pull request #1048 from docker/dockerhub-oidc-support
  • a482ba4 build(deps): bump the codeql-actions group with 2 updates
  • 9e3d36e chore: update generated content
  • 14d6a79 docker hub oidc support
  • 03c8510 Merge pull request #1044 from docker/dependabot/npm_and_yarn/docker/actions-t...
  • ad8a81f Merge pull request #1046 from docker/dependabot/npm_and_yarn/brace-expansion-...
  • 6d219a4 [dependabot skip] chore: update generated content
  • b320069 build(deps): bump @​docker/actions-toolkit from 0.92.0 to 0.93.0
  • 08d3680 [dependabot skip] chore: update generated content
  • 381f5a4 Merge pull request #1042 from docker/dependabot/github_actions/codeql-actions...
  • Additional commits viewable in compare view

Draek2077 and others added 30 commits July 19, 2026 16:37
Async sub-agents cross turn boundaries, so ordering the Log by when a row
settled scrambled the run: a sub-agent spawned three turns ago landed next
to whatever finished beside it. `UsageEvent` now carries the spawn-tree
identity — `startedAt` (first observed), `subagentKey`, and
`parentSubagentKey` — all optional, so old clients and old daemons keep
parsing. A row belongs to the turn that spawned it.

The Log reads that as a human reads a run: chat turn, its sub-agents, then
theirs. `usage-format` grows the grouping and formatting rules with tests,
`formatClockTime` gives day-grouped lists a time that doesn't repeat the
date already in its header, and the message-time setting is relabelled
"Time format" since it now governs the activity log too.

`SegmentedControl` gains `wrap` — segments never shrink, so a control with
many options is wider than a phone and wrapping is the only way it fits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
"View documentation" always tried to create a workspace for the source
directory. The daemon rejects a second workspace on an occupied checkout
(WorkspaceDirectoryOccupiedError), so for any project already open the
button surfaced that error instead of the file the user asked for.

Reading a README never justifies a workspace of its own: look for the live
workspace backed by that directory first — same resolved-path equality the
daemon uses in `findOccupyingWorkspaceForCwd`, so "reuse" here matches
"rejected" there — and create one only when nothing is there.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
READMEs are full of `<p align="center">`, `<div>`, `<center>`, and `<span>`
used purely for alignment. GitHub renders them invisibly; the viewer printed
the raw tags as literal text, which is strictly worse than dropping them. All
four now unwrap to their children, with block tags keeping the paragraph
boundary markdown-it needs. Unmatched opens — usually a close tag stranded in
the next part after an inline image split the token run — are dropped too.
Unknown non-layout tags still pass through inert.

Also breaks the file-rendering charter's relative-image workstream out into
its own file: `![](docs/x.png)` and `<img src="…">` fail in two different
places, and the fallback behaviour is still an open decision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The home screen kept the platform scrollbar, which reserves a gutter on web
and shifted the centred tile column off-centre whenever content overflowed.
Wraps the scroll region and routes it through the existing
`useWebScrollViewScrollbar` overlay (auto-hiding, no gutter) at every width;
native keeps its own indicator, which already auto-hides.

Also drops the dead `PrBadge` copy left behind in
`sidebar-workspace-row-content` when it moved to its own module.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
New charters, all plan-only, no code:
  * context-management — full accounting of everything sent before you type
    (context graph, skills, MCP, memory) behind a 3-pane tab, severity read
    as a share of the model window. Supersedes and absorbs context-health,
    which is deleted rather than left to drift alongside it.
  * history-management — archived chats have no delete or retention path at
    all today; the RPC exists with no UI, plus four retention bugs.
  * marketing-strategy — Otto's public voice (Philippe, first person) and
    the social channels that don't exist yet.
  * outreach — awareness plan scoped to the website, with the eligibility
    gates most channels currently fail.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Both sides dropped the upstream social badges from the README; kept the
local side, which replaces them with a GitHub Issues badge.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
HTML with a markdown equivalent is now converted (<h1> -> #, <strong> ->
**, lists, blockquotes, <hr>); everything else drops its tag and keeps its
text, so raw markup never reaches the reader. Unrenderable images fall back
to alt text, and `remoteImages` decides which surfaces may fetch at all.

The standing policy now lives in docs/markdown-rendering.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The preview body used to infer its state from `isLoading && !preview`, which
conflated "still loading" with "nothing to show". It now takes one resolved
FilePreviewState, so loading, unavailable, and ready are distinct branches.

Alongside: the file view-mode bar and its segmented control pick up the
compact sizing pass, and the viewer passes remoteImages: "altText" so a repo
document cannot reach the network just by being previewed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Otto Tools and Browser Tools trailed the Agents page, where they read as a
footnote to agent behaviour rather than the tool surfaces they are. They now
sit on a dedicated Tools sidebar section after Teams.

Speech settings move the other way, onto the Agents page, and each card owns
its own section header (Dictation / Voice / OpenAI) instead of sharing one.
The OpenAI key card only appears when OpenAI actually backs an engine slot.

Labels tightened to match: the browser master is "Enable Browser tools",
mirroring "Enable Otto tools", and its category row is just "Control" since
the section header already says Browser. docs/preview.md follows.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Phases 0-3 of the context-management charter, plus the edge-convert half of
Phase 4. The daemon scans a workspace's real context graph -- context files
and their @imports vs. plain links, memory index, skills roster, MCP tool
schemas, Otto's own injected prompt -- and evaluates the fixed weight of it
as a share of the model window, not as a bare token count.

Daemon: context-graph-scanner walks provider conventions (Claude, Codex,
OpenCode) from the project root; markdown-refs separates an @import (loaded
every request) from a link (loaded only if the agent reads it), which is the
load-bearing distinction the whole report rests on. evaluator turns that into
severity, content-findings adds the deterministic "worth fixing" list, and
edge-convert flips a reference between the two modes on disk. Reports cache
on a 15s TTL; converting an edge invalidates explicitly and pushes fresh.

App: a three-pane Context tab (graph tree, file view, findings) reachable
from the workspace tab menu and the sidebar project row, plus a composer
track that warns when fixed context takes a large share of the window.
Dismissal is device-local, per workspace. Both the tab and the warning sit
behind the contextManagement feature flag; the warning has its own settings
toggle, since the tab stays useful either way.

MCP tool weight is exact for openai-compat only -- the other providers hand
mcpServers to a subprocess and never expose schemas in-process, so that row
is absent rather than guessed. The window picker defaults to 200K: the
daemon accepts a real window, nothing populates it yet.

Not built: demote-to-subdirectory, skills/MCP toggles, AI compaction with
per-hunk diff. The charter says why each was deferred rather than forgotten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Refine: an AI rewrite loop with review -- diff always against the pinned
original, per-hunk keep/drop, re-run with a new instruction, and nothing
written until Accept. AI Refactor is explicitly not the foundation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The file explorer, file preview, and editor outline all gated their overlay
scrollbar on `isWeb && !isCompact`, so mobile web fell back to the platform's
dated bar. The app's own bar is wanted there too, and the hook no-ops off
web, which makes the compact half of the condition dead weight.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Context tab's left column was a fixed 320px, which is too narrow to read
a long path and too wide once you're working in the file pane. It now drags,
clamped so the file pane never falls below a readable width, and the chosen
width persists app-wide -- it's a preference about this tool, not a fact
about any one project.

Width lives on a plain Animated.View shell rather than the Unistyles node,
since Reanimated must not share a node Unistyles also patches. A narrower
window reconciles a too-large persisted width before it renders.

Alongside: the sidebar's fonts take the +2 compact bump and the back chevron
the gentler 1.5x, since this is the first screen on a phone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The menu labels moved to "chat" (Copy chat id, Reload chat) to match the UI
term; the assertions still named the old one. 9 tests green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The comment pointed at explorer-sidebar "for the same split", which reads as
if the Context sidebar inherited the open/close slide. It didn't -- there is
no useSidebarSlide, no opacity, no rendered gate, because this sidebar never
goes away. The animated node exists so the pan gesture can move the splitter
on the UI thread without re-rendering the tree and file pane every frame.

The one-rule StyleSheet.create for that shell becomes a plain constant.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Worth fixing list flattens every finding into one list, where a row had
no way to say which file it came from or take you there. Findings now carry
their node id and the 1-based line span of their range, resolved on the
daemon while the file text is already in hand, so a row opens the file and
selects the offending span.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The rate-limit and context-health bands both derived their fill by parsing
a theme token inside StyleSheet.create:

  hexColorWithAlpha(theme.colors.statusWarning, 0.12) ?? theme.colors.surface1

theme.colors.* is a real value in React but not inside the stylesheet
factory, so the regex never matched, the helper returned undefined, and the
?? silently painted bare surface1. The bands had no tint at any alpha.

Fill now comes from status*Surface tokens passed straight through, with
per-theme values (dark carries more alpha — the same wash that shouts on
near-white barely registers on a dark surface).

Adds a tone system so this stays fixed. Tones are named by color, not by
meaning, because that is how they get asked for. A band picks orange, red,
blue, green, or purple; every theme supplies its own calibrated value. The
fly-out geometry moves into a reusable FlyoutBand so callers own only when
to show it and what it says, never a color value.

Drops the hardcoded #f59e0b / #ef4444 the warning icons used in both light
and dark mode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
macOS builds ship unsigned, so no latest-mac.yml is published. The updater
had no darwin gate, so a mac install asked GitHub for that manifest, 404'd,
and held a permanent update error.

Publishing the manifest would not have fixed it. arm64 gets an ad-hoc
signature (arm64 macOS refuses to execute a wholly unsigned binary) and x64
gets none at all; an ad-hoc signature's designated requirement comes from
the cdhash and changes every build, so Squirrel.Mac can never validate a
replacement bundle. A manifest would only buy a download that then fails to
install.

So darwin gets a notify-only runtime instead: it reads the releases API
directly, honours the channel and the rollout gate, refuses to offer a
downgrade, and skips a release whose mac artifact is missing (the mac jobs
can land after a release publishes, and a failed mac build has nothing to
download). "Update now" opens the download page, where the Gatekeeper
instructions live, and reports installed:false rather than claiming a
restart that isn't coming.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Since the unsigned mac jobs landed, every release carries
Otto-<version>-{arm64,x64}-unsigned.dmg — while the download page went on
saying macOS builds aren't offered because there's no Mac dev environment.

The page now lists both arches and, more importantly, says what an unsigned
build does on first launch: Gatekeeper reports a quarantined unsigned app as
*damaged* rather than showing the usual unidentified-developer prompt, so
without the right-click-Open and xattr instructions the download reads as
broken. It also states that these builds don't auto-update.

Mac assets stay optional throughout. The mac jobs can finish after a release
publishes, and finalize-rollout tolerates a failed mac build so Windows and
Linux still ship — requiring a mac asset would pin the site to an older
release whenever mac alone fails. Missing assets degrade to no mac links.

The hero button sends mac visitors to the download page rather than straight
at a .dmg: the instructions have to be in view, and arch detection is a
guess. navigator.platform reports MacIntel on Apple Silicon too, so only
Chromium's userAgentData can identify Intel; everything else defaults to
Silicon. That ternary previously returned the same value on both branches.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… help dialog

The sidebar/explorer toggle tooltips and the keyboard shortcuts dialog rendered
hardcoded default key combos, so any user remap made them advertise a binding
that no longer fires. They now resolve through `useShortcutKeys` /
`getBindingIdForAction` + the override store, and render nothing when an action
has no binding on the current platform.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Outbound links now land in an Otto browser tab in the current workspace instead
of handing off to the system browser. The `linkOpenBehavior` setting still
offers "external", and the existing fallbacks (non-http schemes, no pane
available) are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Voice cues are part of the intended Visualizer experience, and the Visualizer's
existing sound mute already silences them, so defaulting them off just hid the
feature. Flips `visualizerVoiceCues` to true and updates docs/visualizer.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Draek2077 and others added 16 commits July 31, 2026 08:37
A research-heavy agentic task in the default suite: a self-contained orderkit
codebase (bench/corpus.ts, 10 interlinked Python + markdown files) whose pricing
bug can only be fixed correctly by finding and reading docs/SPEC.md - the two
load-bearing rules (discounts apply to the original subtotal; combined discount
capped at 50%) live only in the docs, not the code. The model explores with
read/list/search/find tools (docs read-only, tests hidden), fixes pricing.py, and
is scored on a hidden 6-test oracle via the real interpreter, with peak context
utilization surfaced. Verified graduated: buggy 2/6, code-only fix 3/6, spec-driven
fix 6/6; the summary flags "missed the spec" and how much context was held.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Chatting on Android went laggy as a transcript grew: typing stuttered, the
frame rate dropped, and the device heated up. All of it was JS-thread cost
that scaled with transcript length, which is why a fresh chat felt fast.

Native, where FlatList owns the mounted window:

- The live turn renders in the inverted list's ListHeaderComponent, so every
  ~48ms stream flush changed a FlatList prop, re-rendered VirtualizedList and
  walked every mounted cell. The header node now publishes through an external
  store read by a stable component, and the FlatList element is memoized, so a
  flush re-renders only the live turn. History spacing depends on live-head
  presence but not its text, so the live head's ids ride along as extraData.
- Virtualizer config was desktop-sized: windowSize 21 to 7, initialNumToRender
  40 to 12, maxToRenderPerBatch 40 to 10, updateCellsBatchingPeriod 0 to 50.

removeClippedSubviews stays false on purpose: the biggest remaining Android
lever, but a known blank-cell source on inverted lists. Needs on-device proof.

Mobile web had the opposite problem. The history split was gated on
!isMobileBreakpoint, so a phone browser mounted the entire transcript with no
fallback virtualizer at all. The gate is now platform === "web" alone, with a
mounted window of 8 against desktop's 12.

Native stays excluded from that split by design, and the tests now pin it:
strategy-native merges both segments back into one data array and renders every
row the same way, so splitting there buys nothing and double-virtualizing would
wreck height measurement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Snapshot of work that was already in the tree, committed at the user's request
alongside the mobile streaming perf fix. Not authored or verified in this
session; grouped separately so it can be reverted on its own.

Covers the observed-backgrounded subagent path across protocol, agent-manager,
projections and the Claude provider, desktop browser shortcut forwarding, and
in-progress composer track/seam work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The seam shadow stopped at the front card's top edge, but the front card
has rounded top corners: where the curve cuts in it paints nothing, so
the tucked bottom strip of the card behind showed through in two corner
notches at the far left and right. Unshaded, those read as bright nicks
in the seam.

Run the strip down to the card's own bottom edge instead, holding full
strength through the tucked remainder so the notches match the darkest
point of the falloff with no visible band boundary. The stops are
computed from the depth and the tuck rather than hardcoded, and the tuck
now reads SPACING[4] directly instead of a duplicated 16.

Anchor the strip to ChatWidthBounds rather than the surface. An
absolutely-positioned child anchors to the padding box, inside the
surface's 1px border, and the expandable surfaces clip to that same box
with overflow: hidden -- either way the taller strip would stop short of
the card's real edges.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…epo flow

Phase 1 of making the long-horizon eval actually long. The synthetic
extra-long-horizon corpus (~8-10K tokens) only pushed held context to 1-2%
on a large window, so a model could "crush" it without ingesting much.

Bench fidelity:
- New context-stress task (bench/context-corpus.ts + contextStressTask, in the
  default TASKS, weight 4): a staged pipeline of N passthrough placeholder
  modules whose per-stage rules live ONLY in a spec generated to ~55% of the
  served context window (contextWindow threaded through). The correct rule is
  nowhere in the code, so a model cannot score without holding the spec -- the
  >=50%-held guarantee is by construction. Hidden per-stage oracle via the real
  interpreter; deterministic, bounded mod 1000 so JS expectations match Python.
- long-horizon now also reports held context.
- Curated mined-repo flow: curated-repos.ts presets + `otto brain bench
  --curated <name>` (requires an explicit --repo-dir; the working copy is reset
  hard, never the live checkout). Repo.test() gains a files filter and the
  oracle runs are scoped to the mined test paths, so a repo task no longer runs
  the whole workspace suite.

Reporting/TUI (scorecard audit):
- HTML report: score bars are one hue with direct per-task labels + weights and
  a weighted Overall row, fixing the palette-overflow that hid later tasks
  (extra-long-horizon) and never explaining the weighted mean.
- TUI: Configuration and Benchmark panels share one width; a context-held block
  surfaces per-task utilization on the scorecard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Connectors for the user-mode initiative: a provider-neutral way to attach
packaged MCP servers / data sources and fan them out to every provider (data
in, deliverables out).

- app: Settings connectors UI (connectors-section.tsx, connectors-config.ts)
  and host-page wiring.
- server: connectors/connector-tools.ts, session + bootstrap + websocket-server
  hooks, provider-registry / provider-snapshot-manager, openai-compat agent/mcp
  wiring to expose connector tools, and daemon.connectors persistence.
- protocol: connector message + provider-config schema additions, plus the
  backgrounded agent-snapshot field (COMPAT(backgroundedObservedSubagents)) that
  the already-committed observed-backgrounded consumer needs. All optional /
  back-compatible.
- client: daemon-client connector RPCs.
- docs: projects/user-mode/user-mode.md charter + README ledger row.

Also: split mergeMutableConfigIntoPersistedConfig into resolveNextAgents +
buildPersistedDaemonSection to stay under the cyclomatic-complexity limit after
the connectors branch, and rebuilt stale protocol/client declarations so the
whole workspace typechecks clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Three test files pinned config-schema defaults with an exact toEqual and
drifted when agentBehaviors gained todoNudge and todoReconcileOnIdle
(and, for the client, when the brain config block landed):

- client index.test.ts: the config.get / config.patch assertions
- server agent-manager.test.ts: the three launch-context assertions,
  which is the server-tests failure on both Windows and Ubuntu

Each file carried the same literal two to four times, so one new config
key broke CI in nine places. Fold each file's copies into one shared
constant. The strict toEqual stays on purpose: the protocol contract
requires every new config field to ship a default, and this assertion
failing when someone adds one is the check working.

provider-icon-name.test.ts asserted that every ACP catalog entry with an
icon appears in the protocol icon registry. otto-brain ships an icon but
is deliberately NOT in that registry -- provider-icons.ts resolves it
through an app-local map it consults first. Putting it in the protocol
registry would be wrong twice over: it is Otto's own host rather than an
ACP provider, and guessTerminalProfileIcon would then match a command
named "otto-brain". Assert the real invariant against getProviderIcon
instead -- a catalog entry with an icon never falls back to the generic
bot -- which covers both routes.

Docker never packed @otto-code/brain, but both @otto-code/server and
@otto-code/cli depend on it, so the global install fell through to the
public registry and 404'd on an unpublished package.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Add a static, mode-tagged connector catalog (~50 entries, audience
user|developer so User Mode never shows engineering connectors) and a
"Browse connectors" picker that pre-fills the Add form, including a token
field injected as a stdio env var or an Authorization: Bearer header.

Templates and credential env vars are starting points to verify against
each connector's official MCP docs, not asserted live values.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
When a Codex turn finalized one assistant message and opened another, the
provider prepended "\n\n---\n\n" to the next message's first delta. That
rendered as a full-width horizontal rule inside the bubble, and because it
lived in the model's text it followed the reply into copies and retained
transcripts. reduceFinalText had to strip it back out, which is the tell
that it was only ever meant to be visual.

The separation it was drawing already exists: a second Codex item carries a
different messageId, so appendAssistantMessage starts a fresh stream row,
the block groups differ, and spacing.ts falls through to the normal
SPACING[4] inter-bubble gap. The rule was a second, louder separator on top
of one that was already working.

Removes the constant, the pendingAssistantMessageBoundary flag and its three
arming sites, and the strip-back in reduceFinalText.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The provider-neutral connectors layer added a `connectors: []` default to
the daemon config, so the client config-get/patch assertion drifted
again. One line now that the filled defaults are a shared constant.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Brain:
- bench: parse the test verdict from unittest STDERR with the OK/FAILED status
  anchored to the end, so a solution that prints "OK" to stdout can no longer
  spoof a passing score (+ regression tests)
- lifecycle: `otto brain start`/`restart` reconstruct the full sub-command path
  so the detached child runs `otto brain serve`, not the non-existent `otto serve`
- serve: mask hfToken in /__host/config; serialize model switches so a
  config-driven switch can't overlap a request-driven one
- download: reject/contain path-traversal in HF-provided file paths
- runtime: escape single quotes for PowerShell Expand-Archive (apostrophe paths)
- bench: size max_tokens for unrestricted (-1) reasoning; tighten the
  context-limit classifier; glob-match find_files so `**/*.py` finds files
- tui: stop the health sampler in a finally so a failed bench can't leak it

Server:
- brain-ops: `--` before positionals, reject empty repo/quant (silent no-op),
  ignore progress on a terminal (canceled) job
- todo-reminders: strip only Otto's own nudge, not any trailing
  <system-reminder> a user message may contain (+ regression tests)
- connectors: emit an error response if list_tools' close() rejects

App:
- brain models: latest-wins guards on search / quant-list races
- composer "Send all": exclude system-injected entries and attachment-unbacked
  entries from the merged user turn (adds queue `source` to the projection)
- connectors: fetch tools outside the setState updater

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…atalog

15 new User-audience entries across new categories: Office documents
(PowerPoint via Microsoft 365; Pages and PDF as local document tools),
Ecommerce (Shopify), Marketing & SEO (Ahrefs, Google Search Console, Google
Business Profile), Advertising (Google Ads, Meta Ads, TikTok Ads, Pinterest
Ads, Reddit Ads, StackAdapt), Social (Meta Business pages); ClickUp joins
Calendar & tasks. Native PowerPoint/Pages/PDF export remains User Mode
charter work, separate from these read/write connectors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LinkedIn Ads and Microsoft Advertising under Advertising; LinkedIn Pages
(organic) under Social. All User audience.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The actions in .github/workflows/ had drifted up to three majors behind, and
the only signal was a Node 20 deprecation annotation buried in every run log.
Nothing was watching: Dependabot alerts and security updates were both off.

Actions bumped to their latest majors: checkout v5/v6 -> v7, setup-node v4 ->
v7, upload-artifact v4 -> v7, download-artifact v4 -> v8, setup-dotnet v4 ->
v6, setup-java v4 -> v5, expo-github-action v8 -> v9. The docker/* actions and
install-nix-action were already current.

Three of those majors carry real breaking changes, none of which apply here:
setup-node v5 auto-caches only when package.json has a packageManager field
(we have none, and 24 of 25 call sites already pin cache: npm); checkout v7
blocks fork-PR checkout under pull_request_target/workflow_run (we use
neither); download-artifact v5 changed output paths for single downloads by ID
(all three call sites use name/pattern). download-artifact v8 also promotes a
digest mismatch from warning to error, which is a correctness win worth taking.

gradle/actions is held at v5 deliberately, not v6. v6 moves caching into
gradle-actions-caching, a proprietary component under Gradle's commercial
Terms of Use. v5 is Node 24 native and clears the deprecation without
accepting those terms.

Node 22 -> 24.18.1 (Active LTS, EOL 2028-04-30). Node 22 has entered
maintenance and is security-only until 2027-04-30. Node 26 does not become LTS
until 2026-10-28 and 27 is Current, so neither is a candidate yet. The version
was pinned in six places that all had to move together: the workflow matrix,
.tool-versions, the Docker base image, flake.nix, and both nix/*.nix packages.

@types/node is left alone. It is inconsistent across packages (^20.9.0 in
five, 24.6.0 in desktop, ^22.15.29 in website) and aligning it would surface
fresh type errors, so it belongs in its own change.

Adds .github/dependabot.yml for the github-actions ecosystem, grouped weekly
with majors broken out. npm is covered by Dependabot security updates instead
(a repository setting, now enabled) rather than routine version-bump PRs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code labels Jul 31, 2026
Draek2077 and others added 4 commits July 31, 2026 13:03
…apps

Enabling Dependabot alerts surfaced a backlog nothing had been watching.
The headline count of 389 was inflated: npm's own resolver finds 82 real
advisories, and 258 of the 389 rows came from packages/expo-two-way-audio
and its two example apps, each carrying a separately-counted lockfile.

Critical advisories go 7 -> 0. Fixed outright: tar, shell-quote,
@vitest/browser, @xmldom/xmldom, node-forge, tmp, and vite.

npm audit fix is unusable in this repo. It fails with an ERESOLVE conflict,
trying to resolve expo down to 40.0.1 to satisfy expo-clipboard's expo@"*"
peer. Its suggested fixes are also unreliable: it proposed "upgrading"
eas-cli to 0.52.0, which is a downgrade from the installed 16.24.1. Fixes
here are therefore explicit range bumps plus overrides.

Direct dependency bumps: eas-cli 16.24.1 -> 21.4.0, markdown-it 10 -> 15,
sharp 0.34.5 -> 0.35.3, @vitest/browser -> 4.1.8, undici -> 7.28.0,
vite -> 7.3.5, js-yaml -> 4.3.0, and ws -> 8.21.0 across all six packages
that declare it. Root-level overrides pin the transitive offenders; js-yaml
and ws use npm's $name syntax because a literal override on a root direct
dependency is an EOVERRIDE error.

Removes packages/expo-two-way-audio/examples. Both apps sat on Expo 52 /
RN 0.76 while the app is on Expo 54 / RN 0.81, nothing referenced or built
them, and npm workspaces never installed them. They contributed 174 alert
rows purely through stale lockfiles.

Verified: typecheck passes across all packages, and the markdown-it
dependent suites (mermaid pipeline, mermaid document, task lists) pass on
markdown-it 15.

Known gap: eas-cli is only exercised by the android and ios release
workflows, which are manually dispatched, so CI does not cover the 16 -> 21
jump. Dry-run those before the next mobile release.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6477d0e regenerated package-lock.json from scratch on Windows, which
silently dropped every platform-specific optional dependency for Linux and
macOS: 137 platform entries fell to 86, losing all lightningcss, @esbuild,
and related native binaries for non-Windows targets. That is the 41441 ->
34375 line drop in that commit, which looked like the removed example apps
but was not.

Two workflows broke as a result. Deploy Website failed with "Cannot find
module '../lightningcss.linux-x64-gnu.node'" while building on Linux, and
Nix Update Hash failed with ENOTCACHED because the prefetched npm deps no
longer matched the lockfile.

This restores the lockfile as npm generated it via --package-lock-only,
which preserves entries for all platforms rather than only the host's. The
dependency changes from 6477d0e are unaffected: criticals remain at 0 and
npm ci --dry-run resolves clean.

Lesson for future dependency work in this repo: never delete
package-lock.json to force re-resolution. Use --package-lock-only, which is
platform-preserving, and accept that some overrides will not bind rather
than reaching for a full regeneration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
v6 moves caching into gradle-actions-caching, a proprietary component under
Gradle's commercial Terms of Use. We deliberately hold at v5, which is Node 24
native and clears the deprecation while staying MIT. Without this rule
Dependabot re-opens the same PR every week (it already opened #9).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bumps the actions-minor group with 1 update in the / directory: [docker/login-action](https://github.com/docker/login-action).


Updates `docker/login-action` from 4 to 4.5.2
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@v4...v4.5.2)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 4.5.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot changed the title chore(ci): bump docker/login-action from 4 to 4.5.2 in the actions-minor group chore(ci): bump docker/login-action from 4 to 4.5.2 in the actions-minor group across 1 directory Jul 31, 2026
@dependabot
dependabot Bot force-pushed the dependabot/github_actions/actions-minor-85123b4e12 branch from ac89cbd to 11118b4 Compare July 31, 2026 19:15
@dependabot @github

dependabot Bot commented on behalf of github Aug 1, 2026

Copy link
Copy Markdown
Author

Looks like docker/login-action is updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this Aug 1, 2026
@dependabot
dependabot Bot deleted the dependabot/github_actions/actions-minor-85123b4e12 branch August 1, 2026 21:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant