Commit Graph

443 Commits

Author SHA1 Message Date
Peter Steinberger d3c84674e8 feat(gateway): task-suggestion acceptance modes with compact split-button card (#121173)
* feat(gateway): task-suggestion acceptance modes with compact split-button card

- taskSuggestions.accept gains additive mode (worktree default | local | cloud | session) + cloudProfileId; operator.admin unchanged; worktree requests stay {taskId}-only for older gateways
- local reuses the plain-cwd create; cloud mirrors the Control UI create-empty -> sessions.dispatch -> send sequence with pre-claim profile validation and full rollback; session delivers the prompt into the source session (steer single active run, plain turn when idle, ambiguous refused) and can only cancel the chip on failure, never touch the source session
- Control UI card redesigned per owner reference: repo-basename eyebrow, clamped summary, instructions expander, split button with per-profile cloud items or a disabled "No cloud environment configured" hint
- TUI gains the same modes as selector rows with capability gating and double-Enter arming

Release-note context: operators now choose where an accepted follow-up runs — isolated worktree (default), the project checkout, a configured cloud worker, or as the next instruction in the current session — from a compact suggestion card.

* fix(gateway): negotiate task-suggestion acceptance modes and enforce steerable-run invariant

- Gate non-worktree task-suggestion actions on the negotiated Gateway capability.
- Require exactly one steerable run ID before delivering into an active source session.
2026-08-09 12:21:21 -07:00
Peter Steinberger b0a1a2ab5c feat(ui): start CLI agent sessions in the terminal from the new-session page (#121126)
* feat(ui): start CLI agent sessions in the terminal from the new-session page

* test(ui): select labs rows by feature id
2026-08-09 11:08:42 -07:00
Peter Steinberger efb02a0671 fix(cron): prevent jobs disappearing during paginated refreshes (#121084)
* fix(cron): keep paged consumers on one snapshot

* test(cron): type malformed UI fixture

* test(cron): update canonical list fixtures
2026-08-09 09:05:30 -07:00
Peter Steinberger b4104e29b5 fix(sessions): stop active runs before archiving (#120892)
* fix(sessions): stop active runs before archiving

Archive now fences the exact session, stops and drains active work before commit, preserves main/global-main/unknown protections and Delete behavior, and keeps patchMany per-target ordering.

* test(gateway): provide archive lifecycle context

* test(ui): expect active sessions to remain archivable

* refactor(gateway): keep archive drains internal

* fix(gateway): keep abort lifecycle contract acyclic

* fix(sessions): fence sharing across archive drains

* test(gateway): type archive lifecycle responses

* fix(sessions): reclaim cloud workers before archive

* fix(sessions): align archive request integration

* test(gateway): omit default deferred type

* docs(sessions): clarify cloud archive retries
2026-08-09 09:03:20 -07:00
Peter Steinberger 0303af17f3 test: remove low-value implementation assertions (#121085)
* test: remove low-value implementation assertions

* test: refresh native i18n inventory
2026-08-09 08:48:48 -07:00
Peter Steinberger 8616c0c374 refactor: finish shared test helper migrations (#120996)
* test: finish shared helper migrations

* test: fix helper migration CI

* style: fix test import ordering

* test(acpx): restore deferred void types

* test: fix helper migrations after rebase
2026-08-09 06:00:06 -07:00
Shakker a3938ef435 fix: couple browser annotations to composer attachments 2026-08-09 13:56:55 +02:00
Peter Steinberger c708b41af4 fix(beam): open uploads at canonical catalog URLs (#120927)
* fix(beam): emit canonical catalog URLs

* fix(beam): type readonly runtime config

* fix(gateway): keep minimal metadata startup lazy

* chore(plugin-sdk): refresh API baseline
2026-08-09 02:09:01 -07:00
Peter Steinberger 34062ead20 fix(gateway): allow write-scoped session model changes (#120875) 2026-08-08 21:43:55 -07:00
Vyctor H. Brzezowski 7a819da6fc fix(ui): rank slash commands by relevance (#120790) 2026-08-09 01:10:48 -03:00
Peter Steinberger bd6d35443f fix(ui): keep dashboards alive across view switches (#120640)
* fix(ui): retain dashboards across view switches

Keep visited dashboard runtimes alive across Chat, Split, and Dashboard transitions, suspend hidden work, and avoid same-face persistence requests.

Refs #120639

* fix(ui): preserve session owner during route loads

Carry the last successful route match through pending loads so face-only navigation retains dashboard runtimes without stranding session or catalog switches.

Refs #120639

* fix(ui): preserve sandbox bridge while hidden

Suspend hidden board frame work without disposing the one-shot sandbox handshake, loaded document, or MessagePort.

Refs #120639

* fix(ui): forward sandbox readiness while hidden

Keep the constrained sandbox message channel alive during dashboard suspension so one-shot proxy readiness reaches the retained host without resuming widget work.

Refs #120639

* fix(ui): pause hidden plugin widgets

Propagate board activity through trusted plugin renderers so Workboard widgets suppress hidden refresh and mutation work, then refresh once without remounting.

Refs #120639
2026-08-08 15:53:59 -07:00
Peter Steinberger 47fd629c8d feat(gateway): persist per-origin device auth (#120533)
* feat(gateway): add per-origin device auth

* fix(ui): remove unused gateway scope alias

* test(tui): split gateway chat coverage

* test(tui): update connection test routing

* fix(auth): preserve legacy device auth migration guard
2026-08-08 13:53:31 -07:00
Peter Steinberger f15ce3941f refactor(ui): devices is the user-facing word for paired hardware (#120689)
Implements docs/plan/runners.md milestone 1b.
2026-08-08 13:47:17 -07:00
Peter Steinberger 1889764369 revert(ui): session is the product noun — undo thread copy rename (#120667)
Implements docs/plan/runners.md milestone 1a.
2026-08-08 12:43:05 -07:00
Peter Steinberger e7a9f33d89 refactor(core): adopt normalization-core leaf helpers across production (#120350)
* refactor(core): adopt normalization-core leaf helpers across production

* fix(ci): keep plugin contract source-resolvable

* fix(errors): preserve adapter-owned error fields

* fix(errors): short-circuit existing errors before stringifying

* fix(errors): skip throwing structured getters

* ci: retrigger checks on current base

* fix(errors): guard structured error enumeration

* fix: harden error detail copying
2026-08-08 12:00:49 -07:00
Peter Steinberger 13e30a9d55 refactor(ui): unify the visible board dock union into board settings (#120605)
The visible-dock union existed twice: BoardVisibleChatDock (hand-written
literal union in lib/board/settings.ts, persistence layer) and
VisibleBoardDock (derived from the protocol BoardTab shape in
chat-pane-shared.ts, render layer). Follow-up from #120487.

Keep one canonical exported type in lib/board/settings.ts, now derived
from BoardTab so persisted settings can never drift from the wire
contract, and migrate all render-layer consumers to it. Net -5 LOC,
type-only.
2026-08-08 09:29:43 -07:00
Shakker 6c3cc2c0a1 fix: discard retired session list errors (#120627) 2026-08-08 17:25:39 +01:00
Peter Steinberger 2d5ff4768c improve(ui): consolidate dashboard chat visibility into one Chat/Split/Dashboard toggle (#120487)
* improve(ui): consolidate dashboard chat visibility into one Chat/Split/Dashboard toggle

The dashboard face spread chat visibility across three separate
affordances: a two-option face toggle, an icon-only dock dropdown among
the header actions, and a floating vertically-rotated "Show chat"
button on the board edge that users could not discover. One concept,
three controls.

The header now renders a single segmented control - Chat | Split |
Dashboard - where Split is dashboard plus docked chat and Dashboard is
board-only (the former "Hide chat"). A compact caret attached to the
pill picks the dock side (left/right/bottom) and only appears in Split
mode when dock mutation is allowed; read-only sessions keep the plain
two-option Chat | Dashboard toggle. The floating reopen button, the
standalone dock menu button, and their CSS (including the mobile
overrides) are deleted, so the header ends up with fewer buttons than
before.

Verified in the mock-gateway dev harness: mode mapping, caret dropdown,
unhide-to-remembered-side, and hidden dock rendering board-only.

* fix(ci): unexport board dock settings union and repair stale plugin-sdk baseline

BoardVisibleChatDock lost its last external consumer when the board
view switch consolidated dock controls; keep it file-local so the
production unused-export scan stays clean.

Also regenerate docs/.generated/plugin-sdk-api-baseline.sha256: the
session-catalog module hash was stale on main (check fails on clean
origin/main after the agent-attribution reverts), which blocks every
PR's check-plugin-sdk-api-baseline job.

* docs(web): describe the Chat/Split/Dashboard switch and dock-side picker
2026-08-08 04:48:55 -07:00
Peter Steinberger fa9626c4e1 refactor(steering): make active-run admission exact and atomic (#120285)
* refactor(steering): make admission exact and atomic

* fix(steering): bind targets by run identity

* fix(steering): inject before reply dispatch

* fix(steering): preserve backend injection modes

* fix(steering): target session suggestions

* fix(steering): preserve sibling delivery contracts

* style(steering): satisfy exact-head lint

* fix(steering): preserve targetless protocol compatibility

* fix(steering): preserve exact targets through replies
2026-08-07 16:58:04 -07:00
Peter Steinberger 47a3bf50ce fix(ui): show 1M context for million-token models (#120369)
* fix(ui): show 1M context for million-token models

* fix(deps): update nanoid security patch

* revert: drop obsolete nanoid lock refresh
2026-08-07 15:54:50 -07:00
Peter Steinberger 8bf62e7007 refactor(ui): derive gateway types from protocol and consolidate navigation/error helpers (#120348)
* refactor(protocol): derive shared gateway types

* refactor(ui): consolidate navigation click handling

* refactor(ui): centralize UI state and error helpers
2026-08-07 15:25:07 -07:00
Peter Steinberger 8a6e1c30f9 fix(gateway): leave sessions without human-derived titles untitled (#120160)
deriveSessionTitle no longer falls back to an 8-hex session-id prefix
plus date; derived titles are human content only, so consumers'
key-based fallbacks (Control UI "New thread", TUI formatted key, ACP
displayName/label/key) render instead of an opaque machine title.
2026-08-06 23:44:53 -07:00
Peter Steinberger f87d8bb72d refactor(test): compress repetitive fixtures in mega-tests, batch 2 (#120124)
* refactor(test): compress incomplete-turn fixtures

* refactor(test): compress Discord voice fixtures

* refactor(test): compress restart recovery fixtures

* refactor(test): compress CLI attempt fixtures

* refactor(test): compress subagent registry fixtures

* refactor(test): compress workboard fixtures

* refactor(test): compress TUI event fixtures

* refactor(test): compress Codex turn-watch fixtures

* fix(test): tighten CLI attempt fixture types

* fix(test): widen restart transcript fixture content

* fix(test): preserve workboard status fixture type
2026-08-06 20:50:20 -07:00
Peter Steinberger b4a26783f7 refactor(test): consolidate duplicated requireRecord and provider HTTP mock helpers (#119982)
* refactor(test): consolidate duplicated test helpers

* test: remove stale record guard import

* fix(test): remove orphaned record guards

* refactor(test): keep record requirement messages exhaustively typed

* fix(test): keep packages/ai record guard package-local
2026-08-06 14:48:01 -07:00
Peter Steinberger ad80956428 fix(skills): keep installed verdicts scoped to publisher (#119672)
* fix(skills): preserve owner-qualified security verdicts

* fix(skills): keep verdict helper internal

* fix(skills): bound legacy verdict fallbacks
2026-08-05 14:57:56 -07:00
Jason (Json) 47ce26985d fix(ui): preserve profile avatars under Control UI base paths (#119308)
* fix(ui): preserve active session status layout

* fix(ui): preserve avatar paths and fork lineage

* fix(ui): preserve avatars under control UI base paths
2026-08-05 00:31:04 -06:00
Jason (Json) 4b7a989a8b fix(ui): make new-session model metadata state truthful (#119462) 2026-08-04 23:12:02 -06:00
Shakker bfba83956f test: trim redundant control ui coverage (#119286) 2026-08-04 17:48:31 +01:00
Shakker bd43c96f56 fix: keep config drafts on their gateway 2026-08-04 17:48:31 +01:00
Shakker bc0c47e901 refactor: isolate clawhub skill search 2026-08-04 17:48:31 +01:00
Shakker ed1ddb6d55 fix: guard delayed config actions across reconnects 2026-08-04 17:48:31 +01:00
Shakker bb80e50578 fix: recheck queued agent and skill access 2026-08-04 17:48:31 +01:00
Shakker 92a9cc5a94 fix: recheck config access after parsing 2026-08-04 17:48:31 +01:00
Shakker e0bda43954 fix: prevent workshop revision replay after reconnect 2026-08-04 17:48:31 +01:00
Shakker 58259c0720 fix: recheck config access before dispatch 2026-08-04 17:48:31 +01:00
Shakker 7dbeb876f9 fix: block stale default agent staging 2026-08-04 17:48:31 +01:00
Shakker c9c6edc2c1 fix: enforce gateway access for config writes 2026-08-04 17:48:31 +01:00
Peter Steinberger 36a2b5b00b fix(media): preserve bare relative attachments in ordered reply segments (#118746) 2026-08-03 09:41:36 -07:00
ml12580 1acc64b28a fix(ui): show original filename on chat history attachment cards instead of managed UUID suffix (#118628)
* fix(ui): prefer persisted fileName and strip managed UUID suffix from attachment card labels

* fix(ui): anchor managed UUID removal to terminal storage suffix

* fix(ui): preserve dotted UUID-shaped attachment names

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-08-03 06:23:00 -07:00
joshavant c5d275f8d6 refactor: internalize completion delivery seams 2026-08-03 02:48:34 -05:00
joshavant d9393bd3cb fix: make subagent completion delivery durable 2026-08-03 02:48:34 -05:00
Shakker a80fd987cb fix: honor configured main session ownership 2026-08-03 06:49:36 +01:00
Shakker ebb4eaf5ee fix: retire model state across owners 2026-08-03 06:49:36 +01:00
Shakker 5d2cc051b4 fix: retire pending model baselines 2026-08-03 06:49:36 +01:00
Shakker 3940d1f825 fix: retire stale model overrides 2026-08-03 06:49:36 +01:00
Shakker d877ae26c8 fix: fence global model picker ownership 2026-08-03 06:49:36 +01:00
Shakker 53a3f6d902 fix: preserve queued chat ownership 2026-08-03 06:49:36 +01:00
Shakker 9c021a6bb2 test: keep model patch coverage focused 2026-08-03 06:49:36 +01:00
Shakker cbf8066a0d fix: defer slash model cache ownership 2026-08-03 06:49:35 +01:00
Peter Steinberger 59cd041c37 refactor(ui): centralize gateway page lifecycle (#118243)
* refactor(ui): centralize gateway page lifecycle

* fix(ui): align gateway controller state types

* fix(ui): satisfy lifecycle lint boundaries

* fix(ui): keep usage refresh reason private

* test(ui): cover usage refresh policy surface
2026-08-02 22:31:29 -07:00