@gajae-code/coding-agent 0.12.21 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/CHANGELOG.md +67 -2
  2. package/dist/types/cli/args.d.ts +5 -2
  3. package/dist/types/cli/root-flags.d.ts +246 -0
  4. package/dist/types/cli.d.ts +11 -19
  5. package/dist/types/commands/daemon.d.ts +0 -30
  6. package/dist/types/commands/launch.d.ts +11 -19
  7. package/dist/types/commands/quick-lane.d.ts +32 -0
  8. package/dist/types/commands/sdk.d.ts +21 -15
  9. package/dist/types/config/file-lock-gc.d.ts +2 -0
  10. package/dist/types/config/model-equivalence.d.ts +20 -0
  11. package/dist/types/config/model-profile-activation.d.ts +62 -17
  12. package/dist/types/config/model-profiles.d.ts +10 -0
  13. package/dist/types/config/model-registry.d.ts +68 -1
  14. package/dist/types/config/model-resolver.d.ts +15 -4
  15. package/dist/types/config/models-config-schema.d.ts +7 -2
  16. package/dist/types/config/provider-selection-policy.d.ts +62 -0
  17. package/dist/types/config/settings-schema.d.ts +36 -78
  18. package/dist/types/config/settings.d.ts +2 -0
  19. package/dist/types/edit/renderer.d.ts +5 -2
  20. package/dist/types/edit/streaming.d.ts +13 -0
  21. package/dist/types/extensibility/custom-tools/types.d.ts +2 -0
  22. package/dist/types/extensibility/extensions/compact-handler.d.ts +2 -1
  23. package/dist/types/extensibility/extensions/types.d.ts +3 -0
  24. package/dist/types/gjc-runtime/gc-runtime.d.ts +19 -5
  25. package/dist/types/internal-urls/local-protocol.d.ts +1 -0
  26. package/dist/types/modes/components/model-selector.d.ts +0 -2
  27. package/dist/types/modes/components/provider-order-context.d.ts +45 -0
  28. package/dist/types/modes/components/provider-order-editor.d.ts +24 -0
  29. package/dist/types/modes/components/settings-defs.d.ts +5 -1
  30. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  31. package/dist/types/quick-lane/classify.d.ts +40 -0
  32. package/dist/types/runtime/stt-settings-setup.d.ts +18 -0
  33. package/dist/types/sdk/broker/broker.d.ts +56 -2
  34. package/dist/types/sdk/broker/operation-receipt-ledger.d.ts +25 -0
  35. package/dist/types/sdk/broker/session-index.d.ts +83 -2
  36. package/dist/types/sdk/broker/state-version.d.ts +1 -1
  37. package/dist/types/sdk/bus/notification-service.d.ts +6 -0
  38. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +8 -1
  39. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +4 -1
  40. package/dist/types/sdk/bus/telegram-daemon.d.ts +26 -0
  41. package/dist/types/sdk/cli/rows.d.ts +98 -0
  42. package/dist/types/sdk/cli/session-cli.d.ts +35 -3
  43. package/dist/types/sdk/elevation/allowlist.d.ts +20 -0
  44. package/dist/types/sdk/elevation/audit.d.ts +93 -0
  45. package/dist/types/sdk/elevation/capability.d.ts +3 -0
  46. package/dist/types/sdk/elevation/digest.d.ts +72 -0
  47. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +85 -0
  48. package/dist/types/sdk/elevation/grant-ledger.d.ts +163 -0
  49. package/dist/types/sdk/elevation/owner.d.ts +48 -0
  50. package/dist/types/sdk/guides/cache.d.ts +98 -0
  51. package/dist/types/sdk/guides/catalog.d.ts +156 -0
  52. package/dist/types/sdk/guides/cli.d.ts +39 -0
  53. package/dist/types/sdk/guides/manifest.d.ts +66 -0
  54. package/dist/types/sdk/guides/verify.d.ts +66 -0
  55. package/dist/types/sdk/host/control/dispatch.d.ts +8 -0
  56. package/dist/types/sdk/host/control/index.d.ts +1 -1
  57. package/dist/types/sdk/host/control/operations.d.ts +3 -2
  58. package/dist/types/sdk/host/query/cursor.d.ts +10 -0
  59. package/dist/types/sdk/host/query/handlers.d.ts +21 -0
  60. package/dist/types/sdk/host/session-runtime.d.ts +9 -0
  61. package/dist/types/sdk/mcp/server.d.ts +2 -2
  62. package/dist/types/sdk/prompt-status.d.ts +11 -0
  63. package/dist/types/sdk/session.d.ts +4 -0
  64. package/dist/types/sdk/transport/index.d.ts +1 -0
  65. package/dist/types/sdk/transport/relay.d.ts +1 -0
  66. package/dist/types/sdk/transport/serve-cli.d.ts +20 -1
  67. package/dist/types/session/agent-session.d.ts +32 -18
  68. package/dist/types/session/blob-store.d.ts +13 -7
  69. package/dist/types/session/fallback-chain-controller.d.ts +15 -0
  70. package/dist/types/session/internal/managed-session-storage.d.ts +25 -1
  71. package/dist/types/session/internal/session-memory-sidecar.d.ts +5 -5
  72. package/dist/types/session/session-manager.d.ts +139 -10
  73. package/dist/types/session/session-storage.d.ts +48 -0
  74. package/dist/types/setup/provider-onboarding.d.ts +7 -1
  75. package/dist/types/slash-commands/builtin-registry.d.ts +14 -0
  76. package/dist/types/stt/setup.d.ts +2 -0
  77. package/dist/types/task/executor.d.ts +10 -2
  78. package/dist/types/tools/browser/runtime-diagnostics.d.ts +65 -0
  79. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  80. package/dist/types/tools/browser/tab-supervisor.d.ts +2 -0
  81. package/dist/types/tools/browser/tab-worker.d.ts +2 -0
  82. package/dist/types/tools/browser.d.ts +2 -0
  83. package/dist/types/tools/image-gen.d.ts +14 -18
  84. package/dist/types/tools/index.d.ts +2 -0
  85. package/dist/types/tools/resource-gc.d.ts +2 -0
  86. package/dist/types/utils/pasted-image-path.d.ts +6 -0
  87. package/package.json +9 -9
  88. package/scripts/generate-sdk-operation-inventory.ts +8 -0
  89. package/scripts/run-test-manifest.ts +61 -21
  90. package/scripts/verify-gjc-sdk-canonicalization.ts +9 -4
  91. package/src/cli/args.ts +62 -9
  92. package/src/cli/completion-cli.ts +1 -0
  93. package/src/cli/fast-help.ts +1 -0
  94. package/src/cli/root-flags.ts +100 -0
  95. package/src/cli/setup-cli.ts +6 -2
  96. package/src/cli.ts +42 -65
  97. package/src/commands/acp.ts +1 -1
  98. package/src/commands/daemon.ts +2 -31
  99. package/src/commands/gc.ts +1 -1
  100. package/src/commands/launch.ts +8 -129
  101. package/src/commands/quick-lane.ts +51 -0
  102. package/src/commands/sdk.ts +200 -26
  103. package/src/commands/setup.ts +4 -2
  104. package/src/config/file-lock-gc.ts +4 -1
  105. package/src/config/model-equivalence.ts +76 -7
  106. package/src/config/model-profile-activation.ts +1115 -265
  107. package/src/config/model-profiles.ts +134 -2
  108. package/src/config/model-registry.ts +352 -50
  109. package/src/config/model-resolver.ts +289 -38
  110. package/src/config/models-config-schema.ts +11 -4
  111. package/src/config/provider-selection-policy.ts +146 -0
  112. package/src/config/settings-schema.ts +50 -77
  113. package/src/config/settings.ts +40 -0
  114. package/src/coordinator-mcp/server.ts +32 -2
  115. package/src/edit/renderer.ts +175 -223
  116. package/src/edit/streaming.ts +108 -1
  117. package/src/export/html/index.ts +57 -7
  118. package/src/extensibility/custom-tools/types.ts +2 -0
  119. package/src/extensibility/extensions/compact-handler.ts +3 -2
  120. package/src/extensibility/extensions/runner.ts +6 -0
  121. package/src/extensibility/extensions/types.ts +3 -0
  122. package/src/gjc-runtime/gc-runtime.ts +379 -20
  123. package/src/gjc-runtime/launch-worktree.ts +5 -1
  124. package/src/gjc-runtime/team-runtime.ts +59 -2
  125. package/src/gjc-runtime/tmux-owner-isolation.ts +19 -0
  126. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +16 -1
  127. package/src/internal-urls/docs-index.generated.ts +17 -13
  128. package/src/internal-urls/local-protocol.ts +1 -0
  129. package/src/main.ts +40 -3
  130. package/src/memories/index.ts +4 -2
  131. package/src/modes/acp/acp-agent.ts +235 -91
  132. package/src/modes/components/model-selector.ts +206 -42
  133. package/src/modes/components/provider-order-context.ts +197 -0
  134. package/src/modes/components/provider-order-editor.ts +441 -0
  135. package/src/modes/components/settings-defs.ts +21 -1
  136. package/src/modes/components/settings-selector.ts +45 -2
  137. package/src/modes/components/tool-execution.ts +47 -15
  138. package/src/modes/controllers/command-controller.ts +6 -3
  139. package/src/modes/controllers/extension-ui-controller.ts +2 -0
  140. package/src/modes/controllers/input-controller.ts +73 -2
  141. package/src/modes/controllers/selector-controller.ts +260 -153
  142. package/src/modes/prompt-suggestion-controller.ts +1 -1
  143. package/src/modes/runtime-init.ts +1 -0
  144. package/src/modes/utils/ui-helpers.ts +18 -0
  145. package/src/prompts/tools/browser.md +1 -0
  146. package/src/quick-lane/classify.ts +257 -0
  147. package/src/rlm/index.ts +1 -1
  148. package/src/runtime/stt-settings-setup.ts +57 -0
  149. package/src/sdk/acp/adapter.ts +2 -1
  150. package/src/sdk/broker/broker.ts +780 -12
  151. package/src/sdk/broker/lifecycle.ts +70 -29
  152. package/src/sdk/broker/operation-receipt-ledger.ts +144 -0
  153. package/src/sdk/broker/session-index.ts +463 -48
  154. package/src/sdk/broker/state-version.ts +13 -9
  155. package/src/sdk/broker/transport.ts +14 -1
  156. package/src/sdk/bus/index.ts +34 -13
  157. package/src/sdk/bus/kind-aware-reconciliation.ts +21 -2
  158. package/src/sdk/bus/notification-service.ts +47 -1
  159. package/src/sdk/bus/prompt-reconciliation.ts +22 -3
  160. package/src/sdk/bus/telegram-daemon-contract.ts +4 -1
  161. package/src/sdk/bus/telegram-daemon.ts +54 -3
  162. package/src/sdk/cli/rows.ts +247 -0
  163. package/src/sdk/cli/session-cli.ts +930 -79
  164. package/src/sdk/elevation/allowlist.ts +54 -0
  165. package/src/sdk/elevation/audit.ts +208 -0
  166. package/src/sdk/elevation/capability.ts +41 -0
  167. package/src/sdk/elevation/digest.ts +129 -0
  168. package/src/sdk/elevation/dispatch-receipt.ts +184 -0
  169. package/src/sdk/elevation/grant-ledger.ts +1142 -0
  170. package/src/sdk/elevation/owner.ts +109 -0
  171. package/src/sdk/guides/cache.ts +363 -0
  172. package/src/sdk/guides/catalog.ts +554 -0
  173. package/src/sdk/guides/cli.ts +235 -0
  174. package/src/sdk/guides/manifest.ts +152 -0
  175. package/src/sdk/guides/verify.ts +178 -0
  176. package/src/sdk/host/control/dispatch.ts +49 -1
  177. package/src/sdk/host/control/index.ts +1 -0
  178. package/src/sdk/host/control/operations.ts +8 -1
  179. package/src/sdk/host/query/cursor.ts +47 -3
  180. package/src/sdk/host/query/handlers.ts +155 -2
  181. package/src/sdk/host/sdk-surface-parity.test.ts +1 -0
  182. package/src/sdk/host/session-runtime.test.ts +391 -1
  183. package/src/sdk/host/session-runtime.ts +308 -73
  184. package/src/sdk/host/surface-policy.ts +3 -0
  185. package/src/sdk/host/websocket-transport.ts +7 -1
  186. package/src/sdk/mcp/server.ts +88 -15
  187. package/src/sdk/prompt-status.ts +8 -0
  188. package/src/sdk/protocol/operation-inventory.generated.json +62 -0
  189. package/src/sdk/protocol/operation-registry.ts +3 -2
  190. package/src/sdk/session.ts +87 -39
  191. package/src/sdk/transport/index.ts +1 -0
  192. package/src/sdk/transport/relay.ts +3 -0
  193. package/src/sdk/transport/serve-cli.ts +111 -24
  194. package/src/secrets/obfuscator.ts +92 -12
  195. package/src/session/agent-session.ts +322 -93
  196. package/src/session/blob-store.ts +60 -8
  197. package/src/session/fallback-chain-controller.ts +35 -0
  198. package/src/session/internal/managed-session-scope.ts +25 -3
  199. package/src/session/internal/managed-session-storage.ts +574 -73
  200. package/src/session/internal/session-memory-sidecar.ts +19 -29
  201. package/src/session/session-manager.ts +2166 -743
  202. package/src/session/session-storage.ts +715 -48
  203. package/src/setup/provider-onboarding.ts +19 -3
  204. package/src/setup/provider-presets.json +3 -1
  205. package/src/slash-commands/builtin-registry.ts +85 -3
  206. package/src/stt/downloader.ts +2 -3
  207. package/src/stt/setup.ts +29 -4
  208. package/src/task/executor.ts +22 -18
  209. package/src/task/index.ts +24 -1
  210. package/src/tools/archive-reader.ts +11 -2
  211. package/src/tools/browser/runtime-diagnostics.ts +249 -0
  212. package/src/tools/browser/tab-protocol.ts +4 -0
  213. package/src/tools/browser/tab-supervisor.ts +5 -0
  214. package/src/tools/browser/tab-worker.ts +36 -1
  215. package/src/tools/browser.ts +7 -0
  216. package/src/tools/image-gen.ts +110 -166
  217. package/src/tools/index.ts +2 -0
  218. package/src/tools/read.ts +1 -1
  219. package/src/tools/resource-gc.ts +6 -1
  220. package/src/tools/tool-catalog.generated.ts +5 -1
  221. package/src/utils/pasted-image-path.ts +93 -0
  222. package/src/web/search/index.ts +3 -3
package/CHANGELOG.md CHANGED
@@ -2,6 +2,41 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ### Added
6
+ - `/model <preset>` and `/model gajae-code/<preset>` now activate a known model profile immediately instead of failing with "Unknown model". Unknown names still fall through to model resolution, and `/model <role> <preset>` keeps assigning a model to the named role.
7
+ - Browser `act` and `run` responses can now surface an opt-in (`open(..., { diagnostics: true })`), bounded mailbox of page exceptions and `console.error` metadata. Entries carry only kind, timestamp, origin-only URL, line/column, and an allowlisted built-in error class; path segments, query strings, messages, arguments, values, and stacks are never retained. Serialization is byte-bounded with an explicit truncation marker.
8
+ - A generated, host-neutral `sdk-skills/` bundle now provides namespaced external-agent skills for direct GJC SDK session discovery, approved trusted-local operations, and TypeScript/Python script authoring, with deterministic drift checks and credential-safe fail-closed templates. The bundle carries a versioned `manifest.json` (format version 1) so installed bundles fail closed on missing or unsupported layouts, and the skill prompts are authored as static Markdown sources under `scripts/gjc-sdk-skills/prompts/` that the generator copies and validates.
9
+ - `GJC_SESSION_CONTEXT_BUDGET_BYTES` now overrides the synchronous session-context materialization budget that backs `SessionContextTooLargeError` (previously hardcoded to 64 MiB, now a 512 MiB default). The override parses fail-closed: only a canonical positive-integer value is honored, while empty, non-numeric, negative, zero, safe-integer-overflowing, or above-ceiling (8 GiB) values fall back to the 512 MiB default with a warning, so a malformed value can never silently raise or lower the memory guard. Raise it above your measured session size to suppress the preflight, or lower it to restore the old tight bound.
10
+
11
+ ### Fixed
12
+ - Option+Q verification now supports normal macOS Terminal.app profiles and fails with an actionable Settings > Profiles > Keyboard > Use Option as Meta key diagnostic when the profile cannot forward Option as Meta/Esc.
13
+ - Enabling Speech-to-Text from `/settings` now checks and configures its local dependencies immediately instead of deferring setup until the first recording. Setup progress is shown in the status line; failures disable STT again rather than leaving an unusable enabled toggle. Setup also reports platform-correct recorder commands, detects Ghostty's `macos-option-as-alt` requirement, and documents the Ctrl+P command-palette fallback, permissions, models, troubleshooting, and remapping.
14
+ - Queued-message selection now accepts the actual macOS Terminal.app Option+Up/Down byte sequence from either physical Option key, enabling multi-message restore, delete, and reorder flows.
15
+ - Keybinding configuration now normalizes `option`/`meta` to Option and `command`/`cmd` to Command, while Terminal.app guidance covers both physical Option keys and explicit Command profile mappings.
16
+ - ACP prompts now settle when a terminal frame arrives before prompt acknowledgement with correlation split between the frame envelope and event payload. Live and deferred frames share strict ownership derivation, correlated nonterminals wait for exact acknowledgement ownership, and watchdog or cancel settlement no longer waits for a missing acknowledgement. Incomplete or foreign terminals emit structured error logs, unrelated session traffic cannot keep a wedged turn alive, and correlationless session events remain publishable without contaminating prompt-owned final-text state. Deferred terminal replay failures are contained by the session frame queue.
17
+ - `bun run restart:sdk-broker --close-session-hosts` no longer fails against session hosts whose workspace was deleted while they kept running. The teardown fence proved a pid's identity only from the spawn-time marker inside the session's own workspace state root, so deleting that workspace (a removed worktree, a cleaned scratch directory) destroyed the only evidence the broker would accept: `session.close` answered `close_refused` forever, the host stayed resident serving the source it started with, and every restart exited non-zero naming the same unkillable orphans. Hosts now publish their OS start incarnation into the broker-owned session index at registration — and reconciliation preserves it — so the pid stays provable after its workspace is gone, while a marker naming a different process still refuses the signal and an incarnation that no longer matches the live pid still fails closed. A host that dies before withdrawing its own registration is now retired by the broker on the same evidence its dead-registration sweep already uses, so a completed teardown is reported as one instead of surfacing as `endpoint_stale` or `terminal_uncertain`.
18
+ - Bounded cold-session resume now uses automatic size routing, keeps ordinary sessions eager, admits two-GiB transcripts with fork-header headroom, and reduces first-open work with reusable scanning, buffered sidecar writes, pressure-based GC, one full transcript JSON pass plus a bounded authenticated suffix read, owner-bound concurrent publication, fail-closed post-admission tamper handling, deferred secondary artifacts, and split reservation/residency/disk accounting.
19
+ - Session resume entrypoints now share size-aware bounded admission without weakening strict small-session validation, and hard-link fallback cleanup uses identity-bound native retirement instead of a pathname `lstat`/`unlink` pair.
20
+ - OpenCode Go Responses completions that carry a response id but no output items or token usage are now treated as typed retryable failures instead of successful turns; untyped proxy empty responses retain the existing context-overflow promotion and compaction path.
21
+ - Memory-pressure sweeps now request asynchronous garbage collection instead of forcing a stop-the-world collection on the main event loop, preventing periodic input and rendering stalls under the opt-in memory guard.
22
+ - `gjc gc --disk --prune` now fences the blob mark/sweep so a session transcript that keeps changing under the mark can never cause unsafe reclamation: each transcript's references are bound to a stat snapshot taken before and after its read, the store must be observed completely quiet across a quiescence window before the sweep may act, and the fence is re-verified immediately before every removal. A store that still moves withholds the sweep with `keep:withheld_evidence_incomplete: sessions_changed_during_mark` instead of reclaiming on evidence it could not prove stable (#4158).
23
+ - Follow-up queue auto-continuation now waits for compaction and foreground bash/eval work to settle, preventing queued prompts from starting a model turn concurrently with those operations.
24
+ - Scheduled continuations no longer route through `continueQueuedMessages()` merely because the last message is a non-assistant execution tail. The queue-consuming continuation is now used only for the explicit follow-up/steer drains (post-execution settlement, auto-compaction `queued_continue` recovery, and user-interrupt steering), so retry, fallback, auto-compaction, deep-interview, active-goal, TTSR, and reminder continuations keep `continue()` semantics and no longer fail with "No queued messages to continue" when no prompt is queued.
25
+ - Follow-up queue submissions now defer slash/skill text during foreground bash/eval work instead of invoking a competing custom-message turn.
26
+ - Follow-up queues now resume through a dedicated queued-message continuation after Python/Bash execution tails, avoiding an extra stale-turn replay.
27
+ - Post-maintenance continuation now resumes the current non-assistant tail when no queued messages exist, while consuming queued steering/follow-ups only when present; overflow recovery no longer fails with `No queued messages to continue`, and accepted queued successors reset fallback accounting exactly once.
28
+ - Superseded lifecycle SDK startups are now treated as expected cancellation during background notification reconciliation, preventing a red extension error while fail-closed `/notify on` admission and later same-session replacement recovery remain intact.
29
+ - Streamed edit preview coalescing now keys on the complete partial-JSON payload rather than its length, so same-size in-place argument replacements recompute and render while repeated payloads remain cached.
30
+ - CLI parsing now fails closed by default, while launch and ACP explicitly defer only their owned startup options; this preserves ACP-specific diagnostics, SDK startup forwarding, real ACP subprocess framing, and RLM typo rejection without exposing retired flags in root help or completion.
31
+ - Read-tool code summarization and ZIP extraction now run asynchronously instead of blocking the TUI event loop during structural parsing or decompression.
32
+ - `secrets.yml` entries with `mode: "replace"` and no explicit `replacement` now derive their substitute from a keyed, domain-separated HMAC-SHA256 construction over the process key instead of an unkeyed public `Bun.hash`. Derived replacements are no longer confirmable offline without the key (issue #4166); same-process determinism, same-length output, and alphanumeric character behavior are preserved, and explicit `replacement` values are unchanged. Note: derived replacements differ across processes/key rotations — set an explicit `replacement` when a stable value is required.
33
+ - Managed scope preparation now reaps scrubbed write-protocol remnants. The POSIX exact-unlink fallback detaches and scrubs but never deletes, and macOS has no retained directory authority to complete deletion, so every managed replacement leaked zero-length `.gjc-exact-unlink-placeholder-*`, `.gjc-receipt-remove-*`, and `.gjc-exact-replace-destination-*` entries; scope directories grew without bound (observed at 83k dirents), degrading every per-mutation receipt scan and widening the quarantine-collision window behind intermittent `Could not prepare managed session scope (binding_invalid: prepare:binding_publish)` launch crashes. Preparation now removes zero-length, single-link remnants older than 15 minutes; non-zero displaced predecessors and detached receipts are retained as evidence, and in-flight protocol steps are protected by the age gate.
34
+
35
+ ### Added
36
+ - `gjc setup provider` now ships parameterized proxy presets: `--preset litellm` and `--preset openai-compatible-proxy` (aliases `litellm-proxy`, `openai-proxy`, `compatible-proxy`, `custom-proxy`) with a required `--base-url`, configurable `--api-key-env`, and live model discovery (#4123).
37
+ - New `modelProfile.proxyProvider` and `modelProfile.proxyMode` settings route built-in model-preset selectors through an authenticated OpenAI-compatible proxy (e.g. `xai/grok-4.3` → `litellm/xai/grok-4.3`). `fallback` preserves directly authenticated providers by default; `always` forces every proxy-routable built-in selector through the configured gateway. Routing fails closed for unconfigured or unauthenticated proxies and missing or ambiguous proxy models (#4123).
38
+ - SDK-only session hosts now publish their session ID and register their endpoint lifecycle with the broker, matching its identity and staleness fences. This restores broker/coordinator resolution for durable workflow-gate controls (`workflow.gates.list` and `workflow.gate_answer`) without relying on tmux pane input; broker unavailability leaves non-lifecycle local hosts usable and retries publication later.
39
+
5
40
  ## [0.12.21] - 2026-08-09
6
41
 
7
42
  ### Fixed
@@ -18,14 +53,25 @@
18
53
 
19
54
  - Shadow-mode cold-session builds now compare the actual sidecar-derived provider context against the authoritative eager context and expose check/mismatch counters in `/session`; corrupt provider metadata produces a counted mismatch without weakening transcript authority. Cold branch activation now resolves compacted 10k-entry branches through one bounded ordinal-index scan and one bounded transcript range read instead of scanning a dictionary partition for every ancestor, and cold dictionary lookup skips unrelated JSON decoding while retaining full partition-digest verification. Bounded first-open, exact-reopen, and lazy cold-entry paths apply the same stale OpenAI Responses replay-metadata sanitation as eager resume.
20
55
  - ACP startup now rejects unrecognized command flags and incompatible terminal-auth modes through the normal CLI usage-error path, while preserving separate dash-leading system-prompt text.
56
+ - ACP now rejects `--tools` by presence. A comma-only filter such as `--tools ,,` normalized to an empty list, which passed the length-based startup check and then set `toolNames` to `[]` because an empty array is truthy, starting an ACP session with every tool disabled instead of failing closed.
21
57
 
58
+ - Ultragoal per-goal completion receipts no longer go permanently stale when a later `record-critic-verdict` call names that (already-`complete`, therefore immutable) goal's id — for example while re-confirming an earlier goal's evidence during a subsequent goal's terminal-critic gate. `critic_verdict` ledger rows are purely additive audit evidence that never mutate a goal's `goals.json` row, but the receipt-freshness check previously treated any ledger row carrying a goal's id as proof that goal had changed; one such `critic_verdict` row permanently staled the earlier goal's own per-goal receipt, which in turn blocked every later `final-aggregate` receipt that depends on it — with no actionable diagnostic identifying the actual cause. `critic_verdict` now joins `nudge` as a receipt-freshness bookkeeping event.
22
59
  - `gjc --mode acp` no longer aborts on flags it advertises in `--help`. `parseArgs` never recognized `--extension`/`-e`, `--hook`, `--no-extensions`, `--no-skills`, or `--skills`, so every one of them landed in `unknownFlags`; once unknown flags became a hard ACP failure, launching ACP with `--no-extensions` crashed at startup with `Unsupported under SDK-backed ACP: extension flags`. All five are parsed again, so `--no-extensions` starts normally while `--extension`, `--hook`, `--no-skills`, and `--skills` are rejected under ACP by their own names — the rejection list in `resolveAcpStartupOptions` had been dead code because nothing ever populated the fields it tested. A genuinely unknown flag is now reported as `unknown flags: --typo` instead of being mislabeled an extension flag.
60
+ - Strict session resume now sanitizes stale replay metadata in memory without mutating the selected transcript, then publishes the terminal resume breadcrumb only after the first durable user-visible write. Declined auto-continuations restore their deferred predecessor terminal instead of dropping client settlement evidence.
61
+ - Todo completion reminders now honor `todo.reminders.max` across an interactive turn rather than stopping after the first reminder.
62
+ - A transient Windows `io_error` while detaching a managed replacement cleanup receipt now defers that receipt for later reconciliation instead of aborting the current session mutation. Invalid receipt and non-I/O cleanup failures remain fail-closed.
63
+
64
+ - Attached image placeholders such as `[image 1]`, including the `[image N] source="…"` pasted-path reference form, are now deleted atomically with Backspace when the cursor sits at the placeholder boundary or the end of the full reference, instead of being erased one character at a time.
65
+ - Root CLI help and shell completion now share the launch flag table instead of maintaining divergent copies, advertise the working `--fork` and `--worktree` options, omit retired extension/skill flags, and reject unknown options instead of silently dropping typos (#4023).
23
66
 
24
67
  ### Added
68
+ - Added a deterministic quick-lane task classifier (`classifyQuickLane`) exposed through a read-only `gjc quick-lane classify` command. It is an auditable classification surface that performs no routing and is NOT wired into runtime routing: it only prints whether a task request carries quick-lane eligibility signals (explicit file paths, issue/PR numbers, named symbols, explicit tests, numbered steps, acceptance criteria, error references, code blocks, or an explicit `force:`/`!` override) or deep-lane exclusions (vague, ambiguous, exploratory, risk-sensitive, or multi-file/cross-contract scope), and it never alters deep-path defaults. The classifier is deterministic and fail-closed: any exclusion forces the deep lane even when a concrete anchor is present. The #3984 routing decision remains open.
25
69
 
70
+ - `session.list` now supports bounded pages with opaque continuation cursors and stable snapshot sequences. Internal ACP, coordinator, CLI, and broker-restart consumers drain every page so existing session discovery remains complete.
26
71
  - Bounded-memory cold-session disk offloading is rollout-ready behind the `sessionMemory` settings namespace. `sessionMemory.mode` (default `"shadow"`) selects `off`/`shadow`/`enabled`: shadow measures without changing observable session behavior, and canary/default-on remain release-channel decisions rather than user-facing enum values. Fixed implementation budgets preserve the ≤64 MiB steady-state guarantee; transcript v5 stays authoritative and derived `.spill.*` sidecars remain disposable. Context materialization uses the typed `SessionContextTooLargeError` preflight, while `sessionMemory.contextOverflowRecovery` independently controls the async compact-once recovery path.
27
- - Enabled explicit-path resumes validate descriptor-bound commit metadata, base/tail hashes, terminal proof, and hot-record digests before loading only the authenticated post-compaction tail. Fresh-process gates cover 120k compaction cycles, direct/captured forks, and one-million-record first build plus exact lazy reopen. Managed retained-authority startup remains on the eager compatibility path pending retained-authority range support.
72
+ - Enabled explicit-path and managed-session resumes validate descriptor-bound commit metadata, base/tail hashes, terminal proof, and hot-record digests before retaining only the authenticated post-compaction tail. Managed TUI and nested review-subagent sessions read authoritative transcript ranges through retained/no-follow descriptor checks while keeping disposable sidecars in a verified per-process resident cache outside the managed tree. Fresh-process gates cover 120k compaction cycles, direct/captured forks, and one-million-record first build plus exact lazy reopen.
28
73
  - Enabled canary sessions fail closed to shadow/eager behavior after repeated sidecar build failures or failed adoption, expose the live auto-disable reason through `/session`, and clear the session-local latch through the existing `off` rollback mode. Live `enabled` → `shadow`/`off` rollback keeps existing cold entries lazily readable for the current process; the next `off`-mode start ignores derived state and restores eager compatibility.
74
+ - `gjc team` no longer rejects every successful native tmux startup with `tmux_layout_postproof_failed` and then, after passing layout verification, `tmux_window_option_postproof_failed`. tmux reports `#{window_layout}` as an encoded layout string rather than the requested preset name, so Team now verifies the encoded readback and the non-mutating `main-vertical` pane geometry without replaying the readback. Window-option readback now also uses `show-window-options -v`; unlike `show-options`, native tmux does not support the quiet `-q` flag on that command.
29
75
 
30
76
  ## [0.12.19] - 2026-08-08
31
77
 
@@ -37,7 +83,6 @@
37
83
 
38
84
  ### Fixed
39
85
  - Repeated provider idle-stream stalls now stop after `retry.maxRetries` instead of inheriting the unbounded transient-error retry path. A one-off stall still retries normally, while a persistently silent stream surfaces its error rather than resubmitting the same billable context indefinitely.
40
-
41
86
  - SDK snapshot spill writes now retry once with a fresh temporary file when Bun reports `EBADF` during write or `fsync` under heavily contended descriptor teardown, and no longer fail when `close()` reports `EBADF` after a successful write and sync. The atomic writer removes the abandoned attempt before retrying, preserves primary I/O failures, accepts only the proven already-closed close case, and keeps every non-`EBADF` error or repeated descriptor failure fatal.
42
87
  - Discord Gateway ingestion now decodes text and binary WebSocket payloads, resolves a thread's missing parent-channel metadata through Discord's REST API, and stops reconnecting after terminal authentication, sharding, version, or intent close codes.
43
88
 
@@ -47,12 +92,30 @@
47
92
 
48
93
  ### Added
49
94
 
95
+ - Added provider-agnostic model presets that resolve bare model-family aliases across authenticated bundled and custom providers while preserving concrete provider/model identity, session stickiness, and exact provider pins. Settings now includes a durable global Provider Priority Order editor, and the preset catalog includes a curated Open Weight Models group for GLM, DeepSeek, Kimi, Luna, and mixed-role combinations.
50
96
  - `gjc gc` now reports managed session scope capacity when a scope is at or past 75% of the managed byte budget. A scope is snapshotted in full on every session start and fails closed once it exceeds the budget, but it is filled by GJC's own session records, so a working directory in sustained use can cross the limit with no prior signal — the first symptom is a launch that aborts. The probe is read-only and never fails a gc run: an absent, unreadable, or non-directory scope is reported as `unavailable`, an unreadable subtree is skipped so a partial walk still answers "am I near the budget?", and scopes below the threshold are omitted entirely so existing output is unchanged. `gc` still reclaims nothing here; the report names the scope path so stale session directories can be moved out by hand.
51
97
  - `--clipboard-transport <auto|native|osc52|ssh>` and `--clipboard-ssh-host <alias>` CLI flags, plus persisted `clipboard.transport` / `clipboard.sshHost` settings (CLI overrides config, config overrides the `auto` default). `ssh` mode routes text copy/paste through `ssh -o BatchMode=yes -o ConnectTimeout=3 -- <host> pbcopy/pbpaste` via argv spawn (never a shell string) with a 5-second hard timeout covering the whole operation lifecycle, a 1 MiB payload cap enforced during streaming (never fully buffered before the check), fatal UTF-8 decoding on the inbound side (invalid bytes are rejected, not silently normalized to U+FFFD), and outbound NUL-byte/unpaired-surrogate rejection. Explicit `ssh` failures (nonzero exit, timeout, invalid host, oversize/invalid payload) surface a sanitized error and never silently fall back to native clipboard or OSC 52 — clipboard payloads are never written to logs or artifacts. `auto`/`native`/`osc52` behave exactly as before. New `app.clipboard.pasteText` action (no default key; command palette only, so it never collides with the existing image-paste binding) reads the configured `ssh` clipboard and inserts it at the cursor.
98
+ - `gjc sdk session` is the new broker-bound CLI for operating live SDK sessions: `list`, `inspect`, `send`, `status`, and `tail` plus the explicit `raw control|query|global` hatch. Every semantic verb resolves sessions through the SDK broker (validated endpoint identity, credentials used and never printed), output is a versioned credential-free row DTO, `send --wait` polls `turn.prompt_status` to a terminal state without ever cancelling, `tail` replays retained history from the durable checkpoint with `--strict` failing closed on `retention_gap`, and `--until-idle`/`--all-events`/`--cursor` bound and widen the follow. The removed `gjc daemon session` route is not aliased; the new surface is documented in `docs/sdk-session-cli.md` and referenced from `docs/sdk.md`.
99
+
100
+ ### Changed
101
+
102
+ - Edit cards now keep live calls concise when collapsed and show per-file results, diff statistics, diagnostics availability, and full details consistently when expanded.
52
103
 
53
104
  ### Fixed
54
105
 
55
106
  - SDK snapshot shutdown now reserves a revision write synchronously before any asynchronous serialization work, so an immediate `close()` cannot begin terminal cleanup ahead of an in-progress spill write under heavily contended CI scheduling. The coordinator owner-intent negative matrix also receives the same 30-second contention budget used by other filesystem-backed integration cases; its assertions and four-case coverage are unchanged.
107
+ - Provider-agnostic preset ranking now uses AuthStorage's effective selectable credential type. Unusable stored command keys no longer misclassify OAuth-backed providers, and session-selected OAuth, fail-closed selectors, blocked/expired OAuth retry, and `openai-codex-device` aliases now follow the same precedence and normalization as request dispatch.
108
+ - Customizing one assignment in an active provider-agnostic model profile now concretizes every remaining bare profile alias before clearing profile ownership, matching profile deletion and preventing untouched roles from losing their equivalent-provider resolution semantics.
109
+ - Opening or refreshing the `/model` profile preview no longer passes the live canonical session ID while resolving role badges, so display-only alias resolution cannot overwrite the default model's provider affinity; credential-session ranking remains intact.
110
+ - SDK/ACP Q10 synthetic preset rows now resolve provider-agnostic defaults with the same authenticated equivalent-provider fallback as activation while using a read-only canonical scope; custom preset snapshots likewise keep credential context without mutating live provider affinity.
111
+ - Bare model selectors in custom profiles now distinguish configuration from authentication across both scalar and fallback-array forms: typos report unknown catalog models, while known aliases whose entire fallback array lacks usable credentials remain recoverable authentication errors with login guidance.
112
+ - Command-palette cycle availability checks and role metadata lookups no longer let read-only resolution mutate an active profile's canonical provider affinity; actual user-initiated cycling and fallback transitions still use the live canonical scope. Bare profile aliases now clamp explicit thinking suffixes against the authenticated concrete model while preserving the alias itself.
113
+ - Profile customization now snapshots canonical affinity before alias concretization and restores it if any later persistence step fails. Colon-bearing bare aliases keep their full route identity through equivalent-provider auth retry and diagnostics. Subagents inherit the parent credential-selection session separately from their child-owned provider transport/cache identity, aligning preflight ranking with request dispatch without sharing mutable provider state.
114
+ - SDK/ACP synthetic profile availability now validates every bare default and role assignment through authenticated preset-equivalent resolution, so partially available combined profiles are not advertised as selectable. Partial profiles grant equivalent-provider alias intent only to default, role, and role-agent assignments they actually own across task dispatch, cycling, compaction, resume, and fallback; pre-existing manual assignments remain exact.
115
+ - Credential-session identity is now propagated through profile catalog availability, startup/default resolution, metadata account UUIDs, temporary model preflight, auth-error invalidation, quota/auth rotation, compaction provenance, and `/btw` turns while provider transport/cache identity remains separate. Failed profile activation also restores the prior persisted resume-default selector or explicit absence.
116
+ - Profile activation/materialization, memory maintenance, interactive selectors, slash-command assignment, model-profile previews, and SDK extension contexts now use the same explicit credential identity as request dispatch; canonical session IDs remain reserved for sticky routing and provider transport/cache identities remain isolated.
117
+ - Task subagents and branch commit-message generation now inherit the parent's credential identity separately from logical/canonical state. Extension model preflight, custom tools (including image generation and web search), title/prompt maintenance, background ephemeral metadata, and profile materialization use the same credential scope. Preset landing auth now requires usable effective credentials rather than catalog presence alone.
118
+ - SDK tool sessions, deferred SDK selectors, slash-command aliases, memory role resolution, and provider-order status now carry credential identity. Provider alias invalidation updates canonical storage/backoff/session state, and preset landing availability is derived from actual credential-scoped `getApiKey` results (including keyless providers) rather than credential-type metadata.
56
119
  - `todo_write` and `ask` no longer reject valid calls before the tool loads. Both tools carried two independent copies of their raw-argument rules — one in the loaded tool, one in the cold descriptor registry that runs first — and the deferred copies had drifted: `todo_write`'s dropped the `content` synonym for `task` and the `complete`/`completed` aliases for `done`, accepted targetless `complete` entries the loaded tool rejects, and returned every rejection without its correction code, so the model saw a bare "raw arguments rejected before coercion" with nothing to fix and retried the same shape until the turn died. Both also rejected the harness's own injected `_i` intent field, failing any call carrying it with an unknown-root-key error the model could not repair. `todo_write` validation now lives in a single shared contract module (`tools/todo-contract.ts`) used by both paths, and both tools tolerate `_i` at the root while still rejecting genuinely unknown keys.
57
120
  - A stalled ACP session is no longer unrecoverable. The SDK host drops a session whose client has not ponged within `HEARTBEAT_TTL_MS` (20s), but the ACP client inherited the transport's one-shot reconnect defaults — 3 attempts at a 25ms base backoff, a total budget of 175ms — so any event-loop stall long enough for the host to reap the session exceeded the client's entire retry window by two orders of magnitude and surfaced as a terminal `-32603 ACP session transport was lost: SDK WebSocket reconnect attempts exhausted`. Under machine load this killed long-running agent sessions outright while their processes stayed alive. The ACP adapter and the broker connection now share an explicit `ACP_SESSION_RECONNECT` budget derived from `HEARTBEAT_TTL_MS` rather than a magic number: backoff ramps 250ms → 500ms → 1s and holds at a 2s cap for 23 attempts (~41.75s), so the client outlives twice the host TTL while individual sleeps stay short enough to reattach promptly once the host answers again.
58
121
  - Managed scope prepare and legacy-local resume no longer report success while group/other-readable descendants remain on disk (e.g. mode `0o036`/`0o644`): prepare uses a mode-only walk (not `snapshotManagedTree("")`, which races concurrent writers and broke `/move`) to detect drift, re-secures with apply+verify, and retries once; legacy-local capture uses the same resecure helper.
@@ -71,6 +134,7 @@
71
134
  - Added plugin registry v2 as the single execution authority for plugin tools, subskills, and prompt appendices, with digest verification at final use.
72
135
  - Added module-trace and process-tree RSS verification harnesses for startup-memory regressions.
73
136
  - Added `bun run clean` / `bun run clean:native` (`scripts/clean.ts`) to remove build output — `dist/`, `binaries/`, `coverage/`, stray `*.bun-build`, `*.tsbuildinfo`, and with `--native` compiled `.node` addons. Sources, `node_modules/`, `.gjc/` runtime state, and `artifacts/` test evidence are refused as targets rather than silently skipped, and `--dry-run` lists targets without deleting.
137
+ - Codex GPT-5.6 OAuth context-window overrides are honored instead of silently re-clamped: explicit `modelOverrides.<id>.contextWindow` values survive the bundled 372K cap when positive and finite, non-positive values are ignored with a warning, and the precedence/fallback contract is codified in the Codex context-cap policy (#3987).
74
138
 
75
139
  ### Changed
76
140
 
@@ -296,6 +360,7 @@
296
360
 
297
361
  ### Fixed
298
362
 
363
+ - Managed session forks no longer fail with `managed_nested_path_unsupported` on platforms without retained root authority. Nested reads verify each intermediate directory component as a real same-device directory instead of being rejected outright, restoring artifact copying during `fork()` and `moveTo()`.
299
364
  - Terminal input now normalizes Option/Meta navigation and psmux modified-Enter encodings through the native key parser, keeping legacy, Kitty CSI-u, and modifyOtherKeys behavior consistent.
300
365
  - Ultragoal CLI replay no longer executes model-authored test source or trusts `replaySafe: true` as arbitrary command authority. Runtime replay is limited to the pinned Bun runtime for `--version` and literal `-e "console.log(...)"`; shells, interpreter code strings, path-qualified executables, tests, install/publish/network/git mutation commands, and arbitrary argv are rejected. Replay cwd/artifact files are realpath-confined, ambiguous rows fail closed, stdout and stderr are checked, and POSIX timeout cleanup signals the process group. Structured test-report fallback remains deliberately unsupported pending a separate trusted-provenance design (#3533).
301
366
  - Ultragoal CLI replay evidence now reads the replay file referenced by an `executorQa.artifactRefs` entry whose `kind` is `cli-replay`. Inline, nested, and file-backed replay forms are disambiguated explicitly; mixed or malformed rows fail closed (#3533).
@@ -1,5 +1,6 @@
1
1
  import { type Effort } from "@gajae-code/ai/core";
2
2
  export type Mode = "text" | "json" | "acp";
3
+ export type ParseArgsAuthority = "local" | "acp" | "deferred";
3
4
  export interface Args {
4
5
  cwd?: string;
5
6
  allowHome?: boolean;
@@ -48,9 +49,11 @@ export interface Args {
48
49
  noTitle?: boolean;
49
50
  messages: string[];
50
51
  fileArgs: string[];
51
- /** Retained for test/runtime compatibility; extension-defined flags are no longer parsed. */
52
+ /** Flags unknown to every launch parser; their consumer supplies the diagnostic. */
52
53
  unknownFlags: Map<string, boolean | string>;
53
54
  /** Exact interactive startup login intent, recognized before model-profile activation. */
54
55
  authBootstrap?: true;
55
56
  }
56
- export declare function parseArgs(args: string[]): Args;
57
+ export declare function parseArgs(args: string[], authority?: ParseArgsAuthority): Args;
58
+ /** Reject flags whose only owners are non-local startup consumers. */
59
+ export declare function assertLocalLaunchArgs(parsed: Args): void;
@@ -0,0 +1,246 @@
1
+ import { type FlagDescriptor } from "@gajae-code/utils/cli";
2
+ /** Public launch flags shared by root help, completion, and the launch command. */
3
+ export declare const ROOT_LAUNCH_FLAGS: {
4
+ model: FlagDescriptor<"string"> & {
5
+ description: string;
6
+ };
7
+ smol: FlagDescriptor<"string"> & {
8
+ description: string;
9
+ };
10
+ slow: FlagDescriptor<"string"> & {
11
+ description: string;
12
+ };
13
+ plan: FlagDescriptor<"string"> & {
14
+ description: string;
15
+ };
16
+ mpreset: FlagDescriptor<"string"> & {
17
+ description: string;
18
+ };
19
+ default: FlagDescriptor<"boolean"> & {
20
+ description: string;
21
+ };
22
+ provider: FlagDescriptor<"string"> & {
23
+ description: string;
24
+ };
25
+ "api-key": FlagDescriptor<"string"> & {
26
+ description: string;
27
+ };
28
+ credential: FlagDescriptor<"string"> & {
29
+ description: string;
30
+ };
31
+ "system-prompt": FlagDescriptor<"string"> & {
32
+ description: string;
33
+ };
34
+ "append-system-prompt": FlagDescriptor<"string"> & {
35
+ description: string;
36
+ };
37
+ "mcp-config": FlagDescriptor<"string"> & {
38
+ description: string;
39
+ };
40
+ "clipboard-transport": FlagDescriptor<"string"> & {
41
+ description: string;
42
+ options: string[];
43
+ };
44
+ "clipboard-ssh-host": FlagDescriptor<"string"> & {
45
+ description: string;
46
+ };
47
+ "allow-home": FlagDescriptor<"boolean"> & {
48
+ description: string;
49
+ };
50
+ mode: FlagDescriptor<"string"> & {
51
+ description: string;
52
+ options: string[];
53
+ };
54
+ print: FlagDescriptor<"boolean"> & {
55
+ char: string;
56
+ description: string;
57
+ };
58
+ continue: FlagDescriptor<"boolean"> & {
59
+ char: string;
60
+ description: string;
61
+ };
62
+ resume: FlagDescriptor<"string"> & {
63
+ char: string;
64
+ description: string;
65
+ optionalValue: true;
66
+ };
67
+ fork: FlagDescriptor<"string"> & {
68
+ description: string;
69
+ };
70
+ worktree: FlagDescriptor<"string"> & {
71
+ char: string;
72
+ description: string;
73
+ optionalValue: true;
74
+ };
75
+ "session-dir": FlagDescriptor<"string"> & {
76
+ description: string;
77
+ };
78
+ "no-session": FlagDescriptor<"boolean"> & {
79
+ description: string;
80
+ };
81
+ models: FlagDescriptor<"string"> & {
82
+ description: string;
83
+ };
84
+ "no-tools": FlagDescriptor<"boolean"> & {
85
+ description: string;
86
+ };
87
+ "no-lsp": FlagDescriptor<"boolean"> & {
88
+ description: string;
89
+ };
90
+ "no-pty": FlagDescriptor<"boolean"> & {
91
+ description: string;
92
+ };
93
+ tmux: FlagDescriptor<"boolean"> & {
94
+ description: string;
95
+ };
96
+ tools: FlagDescriptor<"string"> & {
97
+ description: string;
98
+ };
99
+ thinking: FlagDescriptor<"string"> & {
100
+ description: string;
101
+ options: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
102
+ };
103
+ "no-rules": FlagDescriptor<"boolean"> & {
104
+ description: string;
105
+ };
106
+ export: FlagDescriptor<"string"> & {
107
+ description: string;
108
+ };
109
+ "list-models": FlagDescriptor<"string"> & {
110
+ description: string;
111
+ optionalValue: true;
112
+ };
113
+ "no-title": FlagDescriptor<"boolean"> & {
114
+ description: string;
115
+ };
116
+ };
117
+ export type ConsumerLaunchFlagName = "hook" | "extension" | "no-extensions" | "no-skills" | "skills";
118
+ export type LaunchFlagConsumer = "acp" | "local";
119
+ /**
120
+ * Flags accepted only so their owning startup consumer can classify them. They
121
+ * deliberately stay out of root help and completion.
122
+ */
123
+ export declare const CONSUMER_LAUNCH_FLAGS: Record<ConsumerLaunchFlagName, FlagDescriptor>;
124
+ /** Every flag understood by the launch argument parser, including hidden consumer-owned flags. */
125
+ export declare const LAUNCH_PARSE_FLAGS: {
126
+ model: FlagDescriptor<"string"> & {
127
+ description: string;
128
+ };
129
+ smol: FlagDescriptor<"string"> & {
130
+ description: string;
131
+ };
132
+ slow: FlagDescriptor<"string"> & {
133
+ description: string;
134
+ };
135
+ plan: FlagDescriptor<"string"> & {
136
+ description: string;
137
+ };
138
+ mpreset: FlagDescriptor<"string"> & {
139
+ description: string;
140
+ };
141
+ default: FlagDescriptor<"boolean"> & {
142
+ description: string;
143
+ };
144
+ provider: FlagDescriptor<"string"> & {
145
+ description: string;
146
+ };
147
+ "api-key": FlagDescriptor<"string"> & {
148
+ description: string;
149
+ };
150
+ credential: FlagDescriptor<"string"> & {
151
+ description: string;
152
+ };
153
+ "system-prompt": FlagDescriptor<"string"> & {
154
+ description: string;
155
+ };
156
+ "append-system-prompt": FlagDescriptor<"string"> & {
157
+ description: string;
158
+ };
159
+ "mcp-config": FlagDescriptor<"string"> & {
160
+ description: string;
161
+ };
162
+ "clipboard-transport": FlagDescriptor<"string"> & {
163
+ description: string;
164
+ options: string[];
165
+ };
166
+ "clipboard-ssh-host": FlagDescriptor<"string"> & {
167
+ description: string;
168
+ };
169
+ "allow-home": FlagDescriptor<"boolean"> & {
170
+ description: string;
171
+ };
172
+ mode: FlagDescriptor<"string"> & {
173
+ description: string;
174
+ options: string[];
175
+ };
176
+ print: FlagDescriptor<"boolean"> & {
177
+ char: string;
178
+ description: string;
179
+ };
180
+ continue: FlagDescriptor<"boolean"> & {
181
+ char: string;
182
+ description: string;
183
+ };
184
+ resume: FlagDescriptor<"string"> & {
185
+ char: string;
186
+ description: string;
187
+ optionalValue: true;
188
+ };
189
+ fork: FlagDescriptor<"string"> & {
190
+ description: string;
191
+ };
192
+ worktree: FlagDescriptor<"string"> & {
193
+ char: string;
194
+ description: string;
195
+ optionalValue: true;
196
+ };
197
+ "session-dir": FlagDescriptor<"string"> & {
198
+ description: string;
199
+ };
200
+ "no-session": FlagDescriptor<"boolean"> & {
201
+ description: string;
202
+ };
203
+ models: FlagDescriptor<"string"> & {
204
+ description: string;
205
+ };
206
+ "no-tools": FlagDescriptor<"boolean"> & {
207
+ description: string;
208
+ };
209
+ "no-lsp": FlagDescriptor<"boolean"> & {
210
+ description: string;
211
+ };
212
+ "no-pty": FlagDescriptor<"boolean"> & {
213
+ description: string;
214
+ };
215
+ tmux: FlagDescriptor<"boolean"> & {
216
+ description: string;
217
+ };
218
+ tools: FlagDescriptor<"string"> & {
219
+ description: string;
220
+ };
221
+ thinking: FlagDescriptor<"string"> & {
222
+ description: string;
223
+ options: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
224
+ };
225
+ "no-rules": FlagDescriptor<"boolean"> & {
226
+ description: string;
227
+ };
228
+ export: FlagDescriptor<"string"> & {
229
+ description: string;
230
+ };
231
+ "list-models": FlagDescriptor<"string"> & {
232
+ description: string;
233
+ optionalValue: true;
234
+ };
235
+ "no-title": FlagDescriptor<"boolean"> & {
236
+ description: string;
237
+ };
238
+ extension: FlagDescriptor<"boolean" | "integer" | "string">;
239
+ hook: FlagDescriptor<"boolean" | "integer" | "string">;
240
+ "no-extensions": FlagDescriptor<"boolean" | "integer" | "string">;
241
+ "no-skills": FlagDescriptor<"boolean" | "integer" | "string">;
242
+ skills: FlagDescriptor<"boolean" | "integer" | "string">;
243
+ };
244
+ /** Startup consumers that may receive a hidden launch flag. */
245
+ export declare const LAUNCH_FLAG_CONSUMERS: Record<ConsumerLaunchFlagName, readonly LaunchFlagConsumer[]>;
246
+ export declare function launchFlagIsOwnedBy(name: ConsumerLaunchFlagName, consumer: LaunchFlagConsumer): boolean;
@@ -85,6 +85,15 @@ export declare class RootHelpCommand extends Command {
85
85
  resume: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
86
86
  char: string;
87
87
  description: string;
88
+ optionalValue: true;
89
+ };
90
+ fork: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
91
+ description: string;
92
+ };
93
+ worktree: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
94
+ char: string;
95
+ description: string;
96
+ optionalValue: true;
88
97
  };
89
98
  "session-dir": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
90
99
  description: string;
@@ -112,25 +121,7 @@ export declare class RootHelpCommand extends Command {
112
121
  };
113
122
  thinking: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
114
123
  description: string;
115
- options: ("high" | "low" | "max" | "medium" | "minimal" | "xhigh")[];
116
- };
117
- hook: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
118
- description: string;
119
- multiple: true;
120
- };
121
- extension: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
122
- char: string;
123
- description: string;
124
- multiple: true;
125
- };
126
- "no-extensions": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
127
- description: string;
128
- };
129
- "no-skills": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
130
- description: string;
131
- };
132
- skills: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
133
- description: string;
124
+ options: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
134
125
  };
135
126
  "no-rules": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
136
127
  description: string;
@@ -140,6 +131,7 @@ export declare class RootHelpCommand extends Command {
140
131
  };
141
132
  "list-models": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
142
133
  description: string;
134
+ optionalValue: true;
143
135
  };
144
136
  "no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
145
137
  description: string;
@@ -49,36 +49,6 @@ export default class Daemon extends Command {
49
49
  "agent-dir": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
50
50
  description: string;
51
51
  };
52
- op: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
53
- description: string;
54
- };
55
- "idempotency-key": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
56
- description: string;
57
- };
58
- "json-input": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
59
- description: string;
60
- };
61
- "json-input-file": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
62
- description: string;
63
- };
64
- "json-input-stdin": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
65
- description: string;
66
- };
67
- confirm: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
68
- description: string;
69
- };
70
- query: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
71
- description: string;
72
- };
73
- cursor: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
74
- description: string;
75
- };
76
- "show-endpoint-credential": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
77
- description: string;
78
- };
79
- yes: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
80
- description: string;
81
- };
82
52
  };
83
53
  run(): Promise<void>;
84
54
  }
@@ -75,6 +75,15 @@ export default class Index extends Command {
75
75
  resume: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
76
76
  char: string;
77
77
  description: string;
78
+ optionalValue: true;
79
+ };
80
+ fork: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
81
+ description: string;
82
+ };
83
+ worktree: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
84
+ char: string;
85
+ description: string;
86
+ optionalValue: true;
78
87
  };
79
88
  "session-dir": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
80
89
  description: string;
@@ -102,25 +111,7 @@ export default class Index extends Command {
102
111
  };
103
112
  thinking: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
104
113
  description: string;
105
- options: import("@gajae-code/ai").Effort[];
106
- };
107
- hook: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
108
- description: string;
109
- multiple: true;
110
- };
111
- extension: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
112
- char: string;
113
- description: string;
114
- multiple: true;
115
- };
116
- "no-extensions": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
117
- description: string;
118
- };
119
- "no-skills": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
120
- description: string;
121
- };
122
- skills: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
123
- description: string;
114
+ options: readonly ["minimal", "low", "medium", "high", "xhigh", "max"];
124
115
  };
125
116
  "no-rules": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
126
117
  description: string;
@@ -130,6 +121,7 @@ export default class Index extends Command {
130
121
  };
131
122
  "list-models": import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
132
123
  description: string;
124
+ optionalValue: true;
133
125
  };
134
126
  "no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
135
127
  description: string;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Quick-lane task classification (issue #3984).
3
+ *
4
+ * Read-only classification surface for the quick lane: prints whether a task
5
+ * request is eligible for the quick lane (bounded, direct execution) or must
6
+ * keep the existing deep path (planning/interview). This performs no routing
7
+ * and mutates nothing — it only exposes the deterministic classifier so task
8
+ * classification can be inspected, audited, and consumed by tooling.
9
+ */
10
+ import { Command } from "@gajae-code/utils/cli";
11
+ export default class QuickLane extends Command {
12
+ static description: string;
13
+ static args: {
14
+ action: import("@gajae-code/utils/cli").ArgDescriptor & {
15
+ description: string;
16
+ required: true;
17
+ options: string[];
18
+ };
19
+ text: import("@gajae-code/utils/cli").ArgDescriptor & {
20
+ description: string;
21
+ required: true;
22
+ multiple: true;
23
+ };
24
+ };
25
+ static flags: {
26
+ json: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
27
+ description: string;
28
+ };
29
+ };
30
+ static examples: string[];
31
+ run(): Promise<void>;
32
+ }