Commit Graph

78555 Commits

Author SHA1 Message Date
Peter Steinberger dd2aedf08f refactor: burn export name collision debt (#121767)
* refactor(tasks): disambiguate lifecycle helpers

* refactor(channels): clarify account and id helpers

* refactor(media): separate SDK facades from cores

* refactor(auto-reply): consolidate command helpers

* refactor(cli): disambiguate registration helpers

* refactor(gateway): clarify runtime and test helpers

* chore(scripts): burn resolved collision debt

* fix(refactor): update remaining core callers

* fix(refactor): update remaining UI callers

* chore(plugin-sdk): refresh API baseline
2026-08-10 18:17:13 -07:00
RowanZhong 1e1f1b1d54 fix(memory): avoid rebuilding the index after empty searches (#114183)
Co-authored-by: RowanZhong <zhonghongfa09@gmail.com>

Punchcard-Session: cobalt-orchard-willow-ps

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-11 09:07:10 +08:00
Peter Steinberger 252e90a45e test(agents): remove duplicate restart progress case (#121781) 2026-08-10 18:07:01 -07:00
Peter Steinberger 32894a3ba5 feat: start sessions from registered projects (#121465)
* feat(gateway): add project registry sessions

* fix(gateway): authorize project branch discovery

* test(gateway): reuse worktree test imports

* fix(protocol): register projects schema owner

* fix(gateway): gate project paths by write scope

* feat(control-ui): register projects from folder browser

* refactor(gateway): extract session diff baseline preparation

* fix(gateway): honor admin scope in project listings
2026-08-10 17:56:12 -07:00
Peter Steinberger 11db07ac06 refactor(logging): remove dead console config fallback (#121776)
* refactor(logging): remove dead console config fallback

* test(logging): complete config module mock
2026-08-10 17:52:32 -07:00
Peter Steinberger e5de0a8434 refactor(ui): simplify retained chat sessions (#121777)
Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 17:50:03 -07:00
Peter Steinberger ad827054ea fix(agents): prevent follow-up replies from overwriting older results (#121771)
* fix(agents): scope frozen-result refresh to the owning generation

* style(agents): use immutable frozen-result ordering
2026-08-10 17:47:34 -07:00
Vyctor H. Brzezowski 1d989027cf feat(ui): let operators reorder queued chat messages (#121682)
Queue position becomes an explicit, operator-owned fact on ChatQueueItem
instead of an accident of arrival time and storage array order. One
comparator now serves the visible projection, the drain head selection,
the steer rebuild, and the alias merge, so what the composer shows is
what the Gateway receives.

Reordering lives entirely on one handle at the left of a queued row:
drag it, or focus it and press the arrow keys. Keyed rows keep focus on
the handle as it moves. Rows already handed to a run keep their place.

Also routes .chat-image-action through var(--cursor-action); its
hardcoded pointer was failing the cursor-policy test on main.
2026-08-10 21:44:40 -03:00
Peter Steinberger a68a5f6579 refactor(agents): remove dead subagent state variants (#121631)
* refactor(agents): drop dead subagent state variants

* fix(agents): type legacy suspension restore

* fix(agents): backfill legacy suspension reasons

Move the shipped retry-limit conversion into the database-open legacy backfill owner, as required by the accepted ClawSweeper finding. Runtime hydration now reads canonical rows only, with stored-row and second-open regression coverage.
2026-08-10 17:35:57 -07:00
Peter Steinberger e886bc4a40 fix: prevent cross-session sends from failing under contention (#121662)
* fix: isolate queued session work contexts

Amp-Thread-ID: https://ampcode.com/threads/T-019fe991-c41e-736c-89e4-479bb4974faa

* chore: refresh plugin sdk contract hashes

Amp-Thread-ID: https://ampcode.com/threads/T-019fe991-c41e-736c-89e4-479bb4974faa

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 17:35:36 -07:00
Peter Steinberger a7564ee12f fix(agents): repair failover retry accounting ownership (#121657)
* fix(agents): preserve classified prompt failure reasons

* refactor(agents): export run retry budget type

* test(agents): document retry accounting bounds

* fix(agents): align retry reason classification policy
2026-08-10 17:24:54 -07:00
Peter Steinberger aa25f88fe3 test(ai): remove schema cache reset seam (#121769) 2026-08-10 17:20:10 -07:00
Vyctor H. Brzezowski 41d023ab8a fix(ui): give the chat header a diff glyph, a task glyph, and one centerline (#121739)
* fix(ui): give the chat header a diff glyph, a task glyph, and one centerline

The session-changes action shipped icons.gitBranch, which reads as branching,
not as changes; background tasks shipped icons.activity, a heartbeat line that
says nothing to a developer about work running behind the thread. Both actions
now carry the glyph their tooltip promises: a Lucide file-diff (file plus +/-
marks) and a Lucide list-with-checks, applied at every entry point to each
action so one command never shows two icons.

Measuring the rendered header also found the row's controls disagreeing about
their box: openclaw-chat-header-session-menu is a custom element, so it
blockifies as a flex child while keeping a text line box, and the descender
space under its button rendered it 29.8px tall and dragged its glyph 0.9px
below the 18px icons beside it. The pill chips stood 26px against the 28px
icon buttons, the branches trigger drew a 14px glyph among 18px siblings, and
the rename affordance's padding shifted the title 5px sideways the moment
renaming was allowed. The actions row now declares one box model for every
child, the chips adopt the shared 28px control height, and the title's hover
padding is pulled back out of the layout.

* fix(ui): optically center chat session title

* test(ui): mirror the shipped title markup in the split-header fixture

The optical-center commit moved the title's ellipsis onto an inner
.chat-pane__session-title-text span, so the split-header fixture's bare
.chat-pane__session-title no longer had white-space: nowrap or
text-overflow: ellipsis. Its deliberately long title wrapped instead of
truncating, which still satisfied the close-button assertion but stopped
exercising the ellipsis path the fixture exists to guard.
2026-08-10 21:07:15 -03:00
sunlit-deng 078f3a6d59 fix(sessions): complete bounded short reads (#115106)
Punchcard-Session: amber-brook-cedar-se

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-08-11 08:05:30 +08:00
Peter Steinberger 527400f8ff refactor(gateway): split request context ownership facets (#121706)
* refactor(gateway): split request context ownership facets

* refactor(gateway): keep request context facets internal
2026-08-10 17:05:23 -07:00
Peter Steinberger ad0d4d8fe4 fix(agents): retry subagent registry restore after transient failure (#121766) 2026-08-10 17:04:04 -07:00
Peter Steinberger e581acbf81 refactor(state): remove the dead agent lease scope (#121615)
* refactor(state): remove dead agent lease scope

* docs(refactor): remove stale QMD lease claim
2026-08-10 17:01:53 -07:00
Vyctor H. Brzezowski 94490bd69b feat(ui): show GitHub link identity in Control UI chat (#121728)
* feat(ui): mark GitHub links in Control UI chat

Chat markdown anchors pointing at github.com now carry a decorative GitHub mark before their text, so a bare URL and a [#3434] shorthand read as the same destination. The mark is painted from the bundled brand path through a CSS mask on currentColor: it stays out of the accessibility tree and out of copied text, tracks the chat text size, and follows the link color in every theme. Image-only links such as badges and code spans stay undecorated.

* feat(ui): break long autolinked URLs at any character in chat

An autolinked URL is one unbreakable word, so the inherited overflow-wrap only splits it after every other option is exhausted: a long URL was pushed whole onto the next line, and with the new GitHub mark ahead of it the mark was left stranded alone at the end of the previous line. Autolinked anchors now carry markdown-bare-url and get unconditional character break opportunities, so the URL fills the line it starts on. Authored link labels keep word-boundary wrapping.

* fix(ui): drop resting underline on chat GitHub links

* test(ui): split markdown link tests into a sibling file

markdown.test.ts crossed the 1000-line oxlint budget once the GitHub-link
cases landed. Move the link-rendering describes (autolinks, explicit
protocol links, file links, bare-url marks, GitHub marks) into
markdown-links.test.ts. Pure move; no assertion changes.

* test(ui): assert GitHub links rest without an underline

Covers the resting/hover decoration contract through the real rendered
page, and pins the rule's scope with a non-GitHub link that keeps the
base underline.
2026-08-10 20:57:35 -03:00
Peter Steinberger 87bb2e5af0 fix(mac): profile onboarding updates the operator's host-global managed CLI (#121651)
* fix(mac): scope managed CLI install and detection to the active app profile

Under an active OPENCLAW_PROFILE the onboarding ready page detected the
host-global managed CLI (~/.openclaw/bin/openclaw) and its update/install
flow rewrote the operator's real managed copy. The managed install prefix
now follows the profile state directory (~/.openclaw-<name>), preferred
paths exclude other profiles' managed trees (including stale validated
executables and inherited shell PATH entries), and external CLIs stay
detectable read-only. Default-profile behavior is unchanged.

* chore(mac): refresh native i18n inventory for shifted source lines
2026-08-10 16:50:05 -07:00
Peter Steinberger 6dc77a37d9 refactor(agents): render failover user copy from one reason-keyed module (#121717)
* refactor(agents): centralize failover user copy

* refactor(agents): route failure callers through user copy

* refactor(qa): carry typed reply failure markers

* refactor(agents): keep failover copy import-light

* refactor(agents): pass structured failure copy context

* refactor(agents): isolate copy rendering from runtime state

* refactor(agents): separate copy rendering from sanitization

* refactor(agents): keep failover copy internals private

* fix(qa-channel): type failure markers on bus sends

* style(agents): brace failover copy conditions

* test(qa-lab): avoid map spread in failure cases

* chore(plugin-sdk): refresh failover closure hashes

* fix(agents): preserve generic runner fallback

* fix(qa): preserve text-only failure markers

* test(qa): type failure delivery fixture
2026-08-10 16:43:51 -07:00
Peter Steinberger 96b0cf95ef fix(gateway): restore restart preflight compatibility (#121757)
* fix(gateway): restore restart preflight compatibility

* ci(protocol): preserve restored method vintages

* chore: defer compatibility note to release
2026-08-10 16:43:27 -07:00
Peter Steinberger fd1b965f2b refactor(plugins): remove orphan test API barrels (#121761)
* test(plugins): remove orphan test API barrels

* refactor(plugins): remove orphan test-only exports

* refactor(imessage): remove orphan test plugin

* test(plugins): remove stale package guard timeout
2026-08-10 16:42:34 -07:00
Peter Steinberger 59492c51a5 feat(agents): rename spawn_task tool to suggest_task (#121694)
* feat(agents): rename spawn_task tool to suggest_task

Models across vendors read the name spawn_task as 'starts background
work' and refuse to call it when the user has not asked to start
anything (Claude Sonnet 5, verbatim: 'spawn_task (which actively starts
background work)... Since you didn't ask me to start work, I'm flagging
this as a follow-up instead'). The tool only records a suggestion card,
so the name defeated the feature.

Rename the model-facing tool to suggest_task everywhere (catalog,
descriptors, presets, display config, OpenClawKit tool-display, docs)
and migrate persisted operator state via doctor: config tool policies
and cron SQLite toolsAllow entries that reference spawn_task are
rewritten to suggest_task. No runtime alias remains; runtime exposes
only the canonical name.

Live clean-room matrix on a dev gateway (virgin session per cell):
suggested-task-card phrasing now yields exactly one card on
anthropic/claude-sonnet-5, claude-haiku-4-5, openai/gpt-5.6-sol,
gpt-5.6-luna, and google/gemini-3.1-pro; pre-rename the same bait
produced prose-only follow-ups.

* chore(doctor): keep legacy tool-name predicate module-local

isLegacyTaskSuggestionToolName has no external consumers; the exported
form tripped the knip unused-export gate (deadcode:exports).

* fix(doctor): keep tool-name migration out of plugin-owned config

The rename migration traversed the whole raw config, so any object
carrying a toolsAllow key was rewritten - including opaque
plugins.entries.*.config, which core must not mutate. Scope the apply
pass to the typed core roots (tools, agents, channels, gateway) and pin
plugin config preservation in the test. Plugin-owned tool lists migrate
via the owning plugin's doctor contract instead.

* fix(ci): heal main deadcode and stale Swift protocol mirror

Unrelated main breakage blocking this PR's merge gate, healed here per
landing policy:

- #121653 left dead exports in src/skills/workshop: make
  removeSkillCollectionDirectory and SkillCollectionRestoreResult
  module-local; register collection-review.ts under the documented knip
  ignoreIssues test-only-export convention (production runs it via the
  scheduled maintenance loop).
- #121673 added ApprovalResolveParams.reviewer without regenerating the
  Swift mirror; regenerate GatewayModels.swift (additive only).

* fix(ci): satisfy generic approval-runtime request signature in resolver test

Third main-heal carried by this PR: #121673 (9935ca3b30) left the
scoped-request mock's concrete inferred type unassignable to the generic
GatewayNativeApprovalRuntime request signature, breaking check-test-types
on main. Cast the mock at the runtime literal; assertions keep the Mock.

* chore(ci): drop approval-test cast superseded by main's typed mock rewrite

* chore(ci): drop duplicate knip entry superseded by main's heal
2026-08-10 16:41:39 -07:00
Peter Steinberger 033d32447d test(macos): remove Tailscale session exerciser (#121748) 2026-08-10 16:39:45 -07:00
Peter Steinberger bde96b7ecd test(doctor): remove private auth finding bridge (#121754) 2026-08-10 16:37:24 -07:00
Peter Steinberger a2dc90765c test(bench): trim shared helper duplicates (#121745) 2026-08-10 16:34:59 -07:00
Vincent Koc 7e03fe3ba0 Merge commit '546bb29055b3e204b981dc27d4375c4d7679c7dd' into HEAD
* commit '546bb29055b3e204b981dc27d4375c4d7679c7dd':
  fix(release): support frozen validation tooling
2026-08-11 07:34:47 +08:00
Peter Steinberger 9175530fc1 fix(ci): heal skills reconciliation fallout (#121751)
* test(skills): cover collection review through scheduler

* test(skills): preserve scheduler failure signals
2026-08-10 16:34:03 -07:00
Peter Steinberger 32dc816696 test(tooling): trim duplicate coverage (#121736) 2026-08-10 16:32:50 -07:00
Peter Steinberger 849f4abcdc refactor(agents): require live edit diff state (#121722) 2026-08-10 16:30:44 -07:00
Peter Steinberger 892c436a7f test(acpx): trim private runtime assertions (#121732)
* test(acpx): trim private runtime assertions

* test(acpx): retain malformed model coverage
2026-08-10 16:25:25 -07:00
Peter Steinberger f09a33ce41 Optimize OpenAI turn latency and simplify reuse (#121687)
Amp-Thread-ID: https://ampcode.com/threads/T-019fe95b-d75c-70fc-82b6-4825ca874826

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 16:23:06 -07:00
Vincent Koc 546bb29055 fix(release): support frozen validation tooling 2026-08-11 07:20:44 +08:00
Peter Steinberger 750d0dcd9e improve(ui): make warm session switching instant (#121625)
* perf(ui): make warm session switching instant

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* fix(ui): harden retained session ownership

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* test(ui): scope retained session assertions

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* fix(ui): align generated image preview checks

* fix(ui): preserve early transcript reading position

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* fix(ui): adopt latest-navigation-wins router

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* fix(ui): restore retained pane reactivity

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

* test(auto-reply): align item lifecycle expectations

* fix(ci): repair current-main validation gates

Amp-Thread-ID: https://ampcode.com/threads/T-019fe957-0e49-707f-859f-9600ef536125

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 16:17:25 -07:00
Patrick Erichsen c6b9be2646 fix(release): run plugin tooling against source checkout (#121762) 2026-08-10 16:16:33 -07:00
Alix-007 a287c2d96b fix(ui): prevent failed plugin icons from retaining connections (#121129)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
2026-08-10 18:12:41 -05:00
Peter Steinberger 3cd034f7a8 fix(ci): release workflow checks fail on macOS Bash 3.2 (#121669)
* fix(ci): keep release workflow checks portable on macOS

* fix(ci): repair current main compact shard regressions

* fix(ci): repair latest main validation drift

* fix(approvals): restore native account ownership gates

* fix(ci): repair skill workshop validation drift

* fix(ci): align approval route selection with main

* fix(ci): remove stale skill workshop test exports

* fix(ci): align repairs with latest main
2026-08-10 16:11:53 -07:00
Hannes Rudolph d6317094a9 fix(memory): prune stale session index rows at startup (#121665)
* fix(memory): prune stale session index rows at startup

* fix(memory): reconcile stale sessions without re-embedding

* oc-9df: fail closed on session corpus scan errors

---------

Co-authored-by: Josh Lehman <550978+jalehman@users.noreply.github.com>
2026-08-10 16:11:35 -07:00
Peter Steinberger 1ced7441eb refactor(agents): move announce, completion, recovery, and registry families into concept directories (#121553)
* refactor(agents): move announce family into subagents/announce/

* refactor(agents): move completion and main-session recovery families

* refactor(agents): move registry family into subagents/registry

* refactor(agents): update registry state type imports

* style(agents): format moved subagent imports

* test(agents): preserve isolated registry test routing

* fix(scripts): recognize relocated subagent announce seams
2026-08-10 16:06:39 -07:00
Peter Steinberger 2132c15bd6 fix(state): serialize ownership during database bootstrap (#121526)
* fix(state): serialize ownership during database bootstrap

* fix(state): preserve coordinator cleanup failures

* refactor(state): isolate database cache lifecycle

* fix(state): preserve state database API shape

* refactor(state): keep cache result type private

* refactor(state): hide cache implementation exports

* fix(state): stabilize ownership inspection

* test(state): prove concurrent bootstrap contention

* test(state): fix ownership CI coverage

* fix(migration): discard staged coordinator locks

* fix(state): validate rollback journal admission

* fix(state): recover rollback journals before write admission

* fix(ci): align exact-head validation

* fix(state): inspect ownership from stable private snapshots

* fix(state): use live ownership read for write admission

* test(memory): preserve invalid parent rejection

* refactor(state): keep private directory sync helper local

* test(cli): preserve config path exports in plugin mocks
2026-08-10 16:00:05 -07:00
Peter Steinberger a770218518 refactor: consolidate duplicate helpers (#121431)
* refactor(agents): consolidate session slug creation

* refactor(commands): consolidate config validation

* refactor(infra): consolidate stale pid termination

* refactor(tui): reuse canonical sleep helper

* chore(scripts): burn resolved entries from collision baseline

* fix(refactor): preserve cross-platform helper contracts

* fix(plugin-sdk): keep approval helper private

* chore(scripts): burn resolved wrapper shadowing entry

* chore(scripts): refresh wrapper shadowing baseline

* test(agents): target canonical session slug helper

* chore(plugin-sdk): refresh API baseline
2026-08-10 15:57:24 -07:00
Peter Steinberger cef6e690d5 test(auto-reply): drop persistence call count (#121742) 2026-08-10 15:50:15 -07:00
Peter Steinberger 18e5b0e3e3 test(web): trim duplicate provider test surfaces (#121727) 2026-08-10 15:44:54 -07:00
Peter Steinberger c39abcecda fix(security): report DM isolation from effective routing (#121741)
* fix(security): audit effective DM session ownership

Resolve admitted DM principals through canonical route, account, identity-link, and channel-owned session policy before reporting shared-session risk. Doctor now renders the structured channel security owner instead of duplicating the global-only default-account heuristic.\n\nCloses #121711

* chore(plugin-sdk): refresh API contract baseline

* fix(telegram): preserve direct peer SDK export

* fix(telegram): preserve direct peer resolver signature

* fix(ci): use supported DM audit grouping

* fix(protocol): refresh approval reviewer Swift models
2026-08-10 15:34:37 -07:00
Peter Steinberger cf432ec871 fix(media): keep file-store keys portable 2026-08-10 15:33:06 -07:00
Peter Steinberger 877e9831b9 fix(ci): refresh generated Swift protocol models (#121746) 2026-08-10 15:23:29 -07:00
Peter Steinberger 5fb5eefa61 refactor(cloud-workers): centralize placement lifecycle fences (#121658)
* refactor(cloud-workers): centralize placement ownership fences

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* test: restore core test typechecking

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* test: repair current-main CI regressions

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* test: align shared main contracts

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* docs(cloud-workers): document placement fence

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* test(approvals): align account routing fixtures

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* fix(protocol): refresh Swift approval resolve models

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

* test(approvals): use scoped event kind fixtures

Amp-Thread-ID: https://ampcode.com/threads/T-019feaaa-c7ed-769e-9f29-a3612bec72e7

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 15:15:24 -07:00
Peter Steinberger 1263450938 improve: start fresh gateways without migration overhead (#121639)
* Optimize fresh gateway startup migrations

* Fix startup optimization CI gates

* Fix compact startup CI coverage

Amp-Thread-ID: https://ampcode.com/threads/T-019fec00-3abd-710b-b9de-8925c23ad779

* Fix stale managed image CI coverage

* Fix stale model setup route expectation

* Fix setup admission lint

* Fix system agent setup test isolation

---------

Co-authored-by: Amp <amp@ampcode.com>
2026-08-10 15:01:37 -07:00
Peter Steinberger d230a4ac9f test(sqlite): preserve publication identity in fault injection 2026-08-10 14:59:25 -07:00
Peter Steinberger 0ca0781fec test(approvals): align plugin runtime event kinds 2026-08-10 14:57:25 -07:00