@gajae-code/coding-agent 0.15.5 → 0.16.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 (272) hide show
  1. package/CHANGELOG.md +85 -1
  2. package/dist/types/async/job-manager.d.ts +83 -0
  3. package/dist/types/cli/args.d.ts +2 -0
  4. package/dist/types/cli/auth-gateway-cli.d.ts +17 -0
  5. package/dist/types/cli/model-presets-cli.d.ts +9 -0
  6. package/dist/types/cli/root-flags.d.ts +14 -0
  7. package/dist/types/cli/update-cli.d.ts +15 -0
  8. package/dist/types/cli.d.ts +7 -0
  9. package/dist/types/commands/auth-gateway.d.ts +3 -0
  10. package/dist/types/commands/gc.d.ts +13 -0
  11. package/dist/types/commands/launch.d.ts +10 -0
  12. package/dist/types/commands/model-presets.d.ts +21 -0
  13. package/dist/types/config/autorouting-tier-map.d.ts +120 -0
  14. package/dist/types/config/file-lock.d.ts +54 -2
  15. package/dist/types/config/internal/model-preset-registry-test-state.d.ts +4 -0
  16. package/dist/types/config/internal/model-preset-registry-test-support.d.ts +3 -0
  17. package/dist/types/config/keybindings.d.ts +3 -2
  18. package/dist/types/config/model-preset-registry.d.ts +368 -0
  19. package/dist/types/config/model-profile-activation.d.ts +39 -0
  20. package/dist/types/config/model-profiles.d.ts +5 -3
  21. package/dist/types/config/model-registry.d.ts +17 -5
  22. package/dist/types/config/settings-schema.d.ts +19 -1
  23. package/dist/types/config/settings.d.ts +2 -0
  24. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -5
  25. package/dist/types/coordinator-mcp/projection-scan.d.ts +54 -0
  26. package/dist/types/crash/record-loader.d.ts +15 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +2 -5
  28. package/dist/types/gjc-runtime/empty-delete-gc.d.ts +58 -0
  29. package/dist/types/gjc-runtime/gc-runtime.d.ts +2 -0
  30. package/dist/types/gjc-runtime/launch-worktree-reservation.d.ts +21 -0
  31. package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +2 -0
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +35 -6
  33. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +72 -1
  34. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +1 -0
  35. package/dist/types/gjc-runtime/tmux-sessions.d.ts +27 -0
  36. package/dist/types/index.d.ts +1 -0
  37. package/dist/types/main.d.ts +3 -1
  38. package/dist/types/master-mode/context.d.ts +21 -0
  39. package/dist/types/master-mode/first-request.d.ts +34 -0
  40. package/dist/types/master-mode/snapshot.d.ts +32 -0
  41. package/dist/types/modes/components/frictionless-onboarding-selector.d.ts +10 -0
  42. package/dist/types/modes/components/jobs-overlay-model.d.ts +4 -2
  43. package/dist/types/modes/components/oauth-selector.d.ts +1 -0
  44. package/dist/types/modes/components/status-line/model-name.d.ts +18 -0
  45. package/dist/types/modes/components/status-line/priority-row.d.ts +34 -0
  46. package/dist/types/modes/components/status-line/segments.d.ts +10 -0
  47. package/dist/types/modes/jobs-observer.d.ts +36 -0
  48. package/dist/types/modes/print-mode.d.ts +17 -0
  49. package/dist/types/modes/ui-language.d.ts +7 -1
  50. package/dist/types/sdk/broker/broker.d.ts +80 -1
  51. package/dist/types/sdk/broker/endpoint-authority.d.ts +24 -0
  52. package/dist/types/sdk/broker/index.d.ts +3 -0
  53. package/dist/types/sdk/broker/lifecycle.d.ts +26 -0
  54. package/dist/types/sdk/broker/master-capability.d.ts +10 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +40 -11
  56. package/dist/types/sdk/broker/session-scope.d.ts +72 -0
  57. package/dist/types/sdk/broker/spawn-authority.d.ts +201 -0
  58. package/dist/types/sdk/broker/spawn-substrate.d.ts +30 -0
  59. package/dist/types/sdk/broker/state-version.d.ts +4 -1
  60. package/dist/types/sdk/broker/worktree-occupancy.d.ts +28 -0
  61. package/dist/types/sdk/bus/chat-daemon-control.d.ts +3 -0
  62. package/dist/types/sdk/bus/index.d.ts +6 -0
  63. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +3 -0
  64. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +4 -0
  65. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +1 -1
  66. package/dist/types/sdk/cli/index.d.ts +1 -0
  67. package/dist/types/sdk/cli/master-cli.d.ts +63 -0
  68. package/dist/types/sdk/cli/rows.d.ts +4 -3
  69. package/dist/types/sdk/cli/session-cli.d.ts +18 -2
  70. package/dist/types/sdk/client/client.d.ts +3 -2
  71. package/dist/types/sdk/client/discovery.d.ts +1 -0
  72. package/dist/types/sdk/host/control/dispatch.d.ts +10 -0
  73. package/dist/types/sdk/host/control/index.d.ts +1 -1
  74. package/dist/types/sdk/host/control/operations.d.ts +2 -0
  75. package/dist/types/sdk/host/control/runtime-gate.d.ts +21 -7
  76. package/dist/types/sdk/host/host.d.ts +10 -0
  77. package/dist/types/sdk/host/model-pin.d.ts +7 -2
  78. package/dist/types/sdk/host/sdk-run-capability.d.ts +1 -0
  79. package/dist/types/sdk/host/session-runtime.d.ts +67 -1
  80. package/dist/types/sdk/lifecycle/broker-client.d.ts +6 -0
  81. package/dist/types/sdk/lifecycle/service.d.ts +15 -3
  82. package/dist/types/sdk/lifecycle-session.d.ts +2 -0
  83. package/dist/types/sdk/prompt-deadline-manager.d.ts +11 -1
  84. package/dist/types/sdk/protocol/adapter-validation.d.ts +2 -0
  85. package/dist/types/sdk/router/session-router.d.ts +11 -0
  86. package/dist/types/sdk/session.d.ts +16 -0
  87. package/dist/types/sdk/startup-capability.d.ts +2 -1
  88. package/dist/types/session/account-inventory.d.ts +1 -0
  89. package/dist/types/session/agent-session.d.ts +24 -7
  90. package/dist/types/session/credential-store-errors.d.ts +1 -0
  91. package/dist/types/session/fold-coordinator.d.ts +201 -0
  92. package/dist/types/session/sdk-run-capability-internal.d.ts +7 -0
  93. package/dist/types/session/sdk-run-capability.d.ts +2 -0
  94. package/dist/types/session/session-manager.d.ts +65 -0
  95. package/dist/types/session/yield-queue.d.ts +5 -4
  96. package/dist/types/setup/frictionless-onboarding.d.ts +1 -0
  97. package/dist/types/telemetry/control.d.ts +11 -0
  98. package/dist/types/telemetry/events.d.ts +20 -0
  99. package/dist/types/telemetry/index.d.ts +3 -0
  100. package/dist/types/telemetry/transport.d.ts +22 -0
  101. package/dist/types/tools/bash-interactive.d.ts +23 -0
  102. package/dist/types/tools/bash.d.ts +4 -0
  103. package/dist/types/tools/gh.d.ts +8 -0
  104. package/dist/types/tools/index.d.ts +10 -5
  105. package/dist/types/web/search/providers/base.d.ts +9 -4
  106. package/dist/types/web/search/providers/xai.d.ts +2 -1
  107. package/dist/types/web/search/types.d.ts +14 -0
  108. package/package.json +10 -7
  109. package/scripts/generate-hotkeys-docs.ts +4 -0
  110. package/scripts/generate-sdk-operation-inventory.ts +9 -3
  111. package/scripts/verify-gjc-sdk-canonicalization.ts +35 -1
  112. package/src/async/job-manager.ts +671 -39
  113. package/src/cli/accounts-cli.ts +9 -5
  114. package/src/cli/args.ts +17 -0
  115. package/src/cli/auth-broker-cli.ts +40 -12
  116. package/src/cli/auth-gateway-cli.ts +273 -97
  117. package/src/cli/config-cli.ts +2 -2
  118. package/src/cli/fast-help.ts +4 -0
  119. package/src/cli/model-presets-cli.ts +100 -0
  120. package/src/cli/root-flags.ts +5 -0
  121. package/src/cli/update-cli.ts +117 -16
  122. package/src/cli.ts +6 -2
  123. package/src/commands/auth-gateway.ts +12 -8
  124. package/src/commands/gc.ts +19 -0
  125. package/src/commands/launch.ts +86 -18
  126. package/src/commands/model-presets.ts +24 -0
  127. package/src/commands/sdk.ts +113 -21
  128. package/src/config/autorouting-tier-map.ts +44 -0
  129. package/src/config/file-lock-gc.ts +9 -4
  130. package/src/config/file-lock.ts +890 -99
  131. package/src/config/internal/model-preset-registry-test-state.ts +28 -0
  132. package/src/config/internal/model-preset-registry-test-support.ts +11 -0
  133. package/src/config/keybindings.ts +6 -2
  134. package/src/config/model-preset-registry.ts +2795 -0
  135. package/src/config/model-profile-activation.ts +115 -28
  136. package/src/config/model-profile-contract.ts +4 -1
  137. package/src/config/model-profiles.ts +56 -14
  138. package/src/config/model-registry.ts +1044 -122
  139. package/src/config/model-resolver.ts +5 -0
  140. package/src/config/settings-schema.ts +19 -1
  141. package/src/config/settings.ts +11 -1
  142. package/src/coordinator-mcp/model-preset.ts +32 -17
  143. package/src/coordinator-mcp/projection-scan.ts +592 -0
  144. package/src/coordinator-mcp/question-state.ts +9 -11
  145. package/src/coordinator-mcp/server.ts +111 -42
  146. package/src/coordinator-mcp/session-reaper.ts +9 -3
  147. package/src/crash/index-store.ts +2 -0
  148. package/src/crash/record-loader.ts +10 -0
  149. package/src/extensibility/extensions/loader.ts +0 -1
  150. package/src/extensibility/extensions/types.ts +2 -3
  151. package/src/extensibility/gjc-plugins/runtime-adapters.ts +1 -0
  152. package/src/gjc-runtime/empty-delete-gc.ts +301 -0
  153. package/src/gjc-runtime/gc-render.ts +29 -0
  154. package/src/gjc-runtime/gc-runtime.ts +174 -11
  155. package/src/gjc-runtime/launch-worktree-reservation.ts +242 -0
  156. package/src/gjc-runtime/managed-owner-supervisor.ts +63 -51
  157. package/src/gjc-runtime/session-state-lock.ts +1321 -147
  158. package/src/gjc-runtime/session-state-sidecar.ts +1004 -25
  159. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +4 -7
  160. package/src/gjc-runtime/tmux-owner-isolation.ts +2 -2
  161. package/src/gjc-runtime/tmux-sessions.ts +252 -13
  162. package/src/hooks/skill-state.ts +6 -0
  163. package/src/index.ts +1 -0
  164. package/src/internal-urls/docs-index.generated.ts +14 -13
  165. package/src/internal-urls/issue-pr-protocol.ts +4 -2
  166. package/src/lsp/config.ts +4 -3
  167. package/src/lsp/path-trust.ts +12 -6
  168. package/src/main.ts +66 -4
  169. package/src/master-mode/context.ts +50 -0
  170. package/src/master-mode/first-request.ts +65 -0
  171. package/src/master-mode/snapshot.ts +205 -0
  172. package/src/modes/acp/acp-agent.ts +616 -161
  173. package/src/modes/components/footer.ts +4 -2
  174. package/src/modes/components/frictionless-onboarding-selector.ts +48 -2
  175. package/src/modes/components/jobs-overlay-model.ts +99 -16
  176. package/src/modes/components/model-selector.ts +158 -18
  177. package/src/modes/components/oauth-selector.ts +6 -1
  178. package/src/modes/components/settings-selector.ts +1 -0
  179. package/src/modes/components/status-line/model-name.ts +53 -0
  180. package/src/modes/components/status-line/priority-row.ts +107 -0
  181. package/src/modes/components/status-line/segments.ts +29 -10
  182. package/src/modes/components/tool-status-header.ts +151 -15
  183. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  184. package/src/modes/controllers/input-controller.ts +51 -6
  185. package/src/modes/controllers/selector-controller.ts +191 -96
  186. package/src/modes/interactive-mode.ts +14 -1
  187. package/src/modes/jobs-observer.ts +149 -16
  188. package/src/modes/print-mode.ts +64 -0
  189. package/src/modes/runtime-init.ts +1 -1
  190. package/src/modes/ui-language.ts +49 -2
  191. package/src/modes/utils/injected-user-submission.ts +15 -1
  192. package/src/prompts/system/master-mode.md +28 -0
  193. package/src/prompts/tools/bash.md +2 -2
  194. package/src/prompts/tools/fold-receipt.md +3 -0
  195. package/src/prompts/tools/job.md +1 -1
  196. package/src/sdk/acp/adapter.ts +17 -2
  197. package/src/sdk/broker/broker.ts +1671 -34
  198. package/src/sdk/broker/endpoint-authority.ts +86 -0
  199. package/src/sdk/broker/ensure.ts +5 -0
  200. package/src/sdk/broker/index.ts +3 -0
  201. package/src/sdk/broker/lifecycle.ts +217 -46
  202. package/src/sdk/broker/master-capability.ts +232 -0
  203. package/src/sdk/broker/session-index.ts +121 -17
  204. package/src/sdk/broker/session-scope.ts +272 -0
  205. package/src/sdk/broker/spawn-authority.ts +1031 -0
  206. package/src/sdk/broker/spawn-substrate.ts +548 -0
  207. package/src/sdk/broker/state-version.ts +26 -14
  208. package/src/sdk/broker/transport.ts +1 -0
  209. package/src/sdk/broker/worktree-occupancy.ts +90 -0
  210. package/src/sdk/bus/chat-daemon-control.ts +5 -2
  211. package/src/sdk/bus/chat-daemon-runtime.ts +46 -5
  212. package/src/sdk/bus/index.ts +51 -4
  213. package/src/sdk/bus/kind-aware-reconciliation.ts +36 -6
  214. package/src/sdk/bus/prompt-reconciliation.ts +28 -4
  215. package/src/sdk/bus/slack-conversation.ts +5 -1
  216. package/src/sdk/bus/telegram-daemon-contract.ts +1 -1
  217. package/src/sdk/cli/index.ts +1 -0
  218. package/src/sdk/cli/master-cli.ts +259 -0
  219. package/src/sdk/cli/rows.ts +11 -8
  220. package/src/sdk/cli/session-cli.ts +276 -6
  221. package/src/sdk/client/client.ts +14 -8
  222. package/src/sdk/client/discovery.ts +3 -1
  223. package/src/sdk/host/control/dispatch.ts +101 -37
  224. package/src/sdk/host/control/index.ts +2 -0
  225. package/src/sdk/host/control/operations.ts +2 -0
  226. package/src/sdk/host/control/runtime-gate.ts +203 -11
  227. package/src/sdk/host/host.ts +27 -2
  228. package/src/sdk/host/model-pin.ts +185 -25
  229. package/src/sdk/host/sdk-run-capability.ts +1 -0
  230. package/src/sdk/host/session-runtime.test.ts +581 -43
  231. package/src/sdk/host/session-runtime.ts +655 -101
  232. package/src/sdk/lifecycle/broker-client.ts +28 -0
  233. package/src/sdk/lifecycle/service.ts +279 -20
  234. package/src/sdk/lifecycle-session.ts +10 -2
  235. package/src/sdk/prompt-deadline-manager.ts +16 -1
  236. package/src/sdk/protocol/adapter-validation.ts +27 -0
  237. package/src/sdk/protocol/operation-inventory.generated.json +53 -2
  238. package/src/sdk/protocol/operation-registry.ts +17 -4
  239. package/src/sdk/router/session-router.ts +294 -154
  240. package/src/sdk/session.ts +440 -167
  241. package/src/sdk/startup-capability.ts +1 -0
  242. package/src/session/account-inventory.ts +27 -11
  243. package/src/session/agent-session.ts +1292 -180
  244. package/src/session/blob-store.ts +15 -5
  245. package/src/session/credential-store-errors.ts +2 -0
  246. package/src/session/fold-coordinator.ts +433 -0
  247. package/src/session/internal/managed-session-storage.ts +153 -78
  248. package/src/session/sdk-run-capability-internal.ts +15 -0
  249. package/src/session/sdk-run-capability.ts +2 -0
  250. package/src/session/session-manager.ts +342 -28
  251. package/src/session/yield-queue.ts +24 -10
  252. package/src/setup/frictionless-onboarding.ts +2 -0
  253. package/src/setup/provider-presets.json +1 -1
  254. package/src/slash-commands/helpers/credential-switch.ts +6 -1
  255. package/src/task/executor.ts +19 -3
  256. package/src/telemetry/control.ts +26 -0
  257. package/src/telemetry/events.ts +1268 -0
  258. package/src/telemetry/index.ts +3 -0
  259. package/src/telemetry/transport.ts +87 -0
  260. package/src/tools/bash-interactive.ts +182 -85
  261. package/src/tools/bash.ts +1028 -109
  262. package/src/tools/gh.ts +104 -48
  263. package/src/tools/github-cache.ts +2 -2
  264. package/src/tools/index.ts +11 -5
  265. package/src/tools/tool-catalog.generated.ts +1 -1
  266. package/src/web/search/provider.ts +120 -11
  267. package/src/web/search/providers/anthropic.ts +89 -17
  268. package/src/web/search/providers/base.ts +9 -4
  269. package/src/web/search/providers/gemini.ts +87 -15
  270. package/src/web/search/providers/openai-compatible.ts +23 -8
  271. package/src/web/search/providers/xai.ts +98 -12
  272. package/src/web/search/types.ts +16 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,90 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.16.0] - 2026-09-02
6
+
7
+ - Added master mode (`gjc --master [--scope repo|pwd|global]`) with authenticated, broker-authoritative child orchestration: `gjc sdk spawn` creates task-seeded children, scoped `gjc sdk search` discovers broker-visible sessions with paginated results, and locator v2 session rows carry canonical cwd, worktree-root, and state-root identity.
8
+ - SDK master-mode authority now selects the newest retained master epoch, binds worktree occupancy to canonical worktree roots with positive process-exit proof, keeps master capabilities out of ordinary Bash descendants, bounds authenticated nonce replay state, and preserves scoped search rows across pagination beyond the probe budget.
9
+ - `move_session`, TUI `/move`, and SDK/ACP `session.cwd.move` no longer strand coordinator runtime-state persistence for the rest of the session. All three surfaces now cross one `SessionManager.moveTo` lifecycle: admitted old-cwd sidecar writes drain before commit, later queued writes are generation-fenced, and a durable rescope journal records the exact old/new cwd and session-file identities before publication so restart can finish an interrupted migration. Relocation holds both canonical state paths' process, namespace, and state-file locks in deterministic order across read/authenticate/write/remove; signed predecessors and destinations require the matching key id plus a valid Ed25519 signature, unsigned rows require complete exact cwd/workdir/session-file identity, and coordinator bootstrap or partial rows are never laundered into authoritative state. No-follow descriptor reads and native identity-bound orphan retirement reject symlink/path replacement, a valid self-healed destination is preserved while its authenticated old marker is removed, and rejected/tampered evidence stays intact with the journal retained for recovery. Rollback clears the prepared journal, committed metadata failures still run relocation, and postmortem finalizer rebinding is unconditional even when repair fails, so unexpected exit targets the live cwd/session file. (#4629)
10
+ - `move_session` and `session.cwd.move` now report an unreadable target as `Directory identity or access unavailable` on macOS too. Darwin's `realpath(3)` fails with `EACCES` on a mode-0 directory where Linux resolves it and fails later at the access probe, so the same refusal was previously misreported as `Directory does not exist or is not a directory`.
11
+ - The status rail no longer collapses to a bare `…+N` overflow marker on very small terminals. Context %, the goal indicator and the model name are now the last segments evicted (in that order), and once ordinary telemetry is gone they degrade through shortened and single-glyph forms before being dropped — context % is never dropped, keeps `18.3%/200K` while it fits, falls back to an integer `18%`, and retains its usage-level color. The overflow marker is suppressed at those widths so its cells go to the priority items instead. Rails with no context window and no active goal evict exactly as before.
12
+ - Model names now render in their shortest recognizable id-derived form (`anthropic/claude-sonnet-4-5-20250929` → `sonnet-4.5`) in both the status rail and the footer telemetry line, replacing the raw id in the footer and the previous Anthropic-only `"Claude "` prefix strip in the rail. The rule is a pure heuristic — provider prefix, vendor family word and trailing date/build stamp removed — with no curated override table, and never yields an empty label. Model pickers and selectors keep full ids.
13
+ - The `claude-fable` and `fable-opus-codex` built-in presets now use `anthropic/claude-fable-5-1` instead of `anthropic/claude-fable-5`, with effort suffixes preserved (`claude-fable` default/architect `xhigh`, critic `high`, planner `low`; `fable-opus-codex` default `high`). Fable 5.1 exposes the identical effort ladder, so no role mapping changed shape, and the non-fable roles (`anthropic/claude-sonnet-5` executor, `anthropic/claude-opus-5` planner/critic, the Codex executor/architect) are untouched. The extragoal reviewer template moves to `anthropic/claude-fable-5-1:xhigh` for the same reason. `claude-fable-5` remains in the catalog for pinned selectors and for gateways that do not serve 5.1.
14
+ - Fresh interactive onboarding now asks for an interface language before showing guidance, supports English, Korean, Simplified Chinese, and Japanese, persists the choice through `ui.language`, and uses a documented English fallback for noninteractive, invalid, cancelled, or unwritable startup.
15
+ - Coordinator projection consumers now retry a bounded number of fresh authoritative scans when concurrent session churn races a candidate. Cap exhaustion, owner disappearance, unsupported authority, and parse failures remain fail-closed, while settled concurrent SDK sessions no longer permanently starve the session reaper or coordinator mutations. (#5168)
16
+
17
+ - Coordinator session-state locks now reclaim an empty, identity-qualified released transition tombstone on POSIX after a short release grace period. Live, foreign, malformed, non-empty, or identity-changed claims remain fail-closed, while persistent macOS/File Provider debris no longer burns the full transition timeout on every state write. (#5159)
18
+
19
+ - A runtime-state marker recorded against a different workspace path now reports that mismatch instead of claiming the file is unreadable, and a terminal, not-live marker that travelled into the current workspace with its session directory is adopted rather than refused. Live, non-terminal, and out-of-workspace markers are still refused untouched.
20
+ - An unavailable provider-qualified `modelRoles.default` selection now reports the requested model instead of silently starting on another provider's baseline. This keeps signed-registry omissions and failed catalog admission actionable rather than routing requests to an unrelated retired model. (#5144)
21
+
22
+ - Headless SDK substrate close now reports success when exact teardown observes the recorded process gone even if cleanup unlinks the durable proof first; live or identity-ambiguous substrates still report `substrate_mismatch`. (#5130)
23
+
24
+ - Windows session-state locks now drain late terminal reconciliation writes before disposal returns and safely reclaim valid dead transition claims during resume. (#5102)
25
+
26
+ - Deferred MCP startup now releases queued idle yields as soon as readiness settles without bypassing prompt admission. Barrier extensions remain gated, rejected startup drops the wake without prompting, settled sessions retain the normal idle merge window, and readiness stays session-local. (#5085)
27
+ - ACP deep-interview's real subprocess fixture now retires its owned lifecycle sessions before broker/root cleanup, preventing detached session hosts from recreating the fixture root after teardown. (#5086)
28
+ - The ACP fixture tracks broker startup through its full producer deadline and tracks session creation before awaiting responses, keeps its independent broker fallback client available when runtime shutdown fails, and retires sessions first seen in either broker inventory phase directly through that fallback across cleanup retries. Verified broker-startup rejection no longer strands the root, while an unverified child-reap failure retains cleanup authority. Reconciliation recognizes the real ACP `terminal_uncertain` after-send wire envelope as transport uncertainty while preserving semantic close diagnostics, then accepts terminal races only after strict inventory proves unambiguous and certain retirement. A stalled broker-client transport close no longer blocks authoritative lease/root cleanup, and the child environment confines Windows profile and temporary paths to the fixture root. (#5086)
29
+ - Telemetry install IDs are now staged in private temporary files and published atomically, so concurrent startup readers cannot observe a partial UUID payload; stale temporary files are never adopted and malformed persisted IDs still fail closed. Publication also falls back through native no-replace links and an exclusive claim protocol when rename-no-replace is unavailable, Windows reads and claim mutations use identity-bracketed opens, transient claimed payloads are retried, and every winner is tightened to mode 0600. (#5048)
30
+
31
+ - An install with no configured model no longer starts on a model its provider has already withdrawn. The startup fallback now applies the configured provider-priority policy, skips bundled defaults disproved by fresh provider discovery, and only then preserves catalog order for remaining candidates. Explicit model and profile selections, enabled-model allowlists, credential selectors, disabled providers, and provider/id collision-safe candidate membership remain unchanged.
32
+
33
+ ### Fixed
34
+
35
+ - File locks now use a descriptor-relative exclusive directory-publication fallback
36
+ when a filesystem returns `EINVAL` for `renameat2(RENAME_NOREPLACE)` (for example
37
+ WSL2 DrvFs), so `edit` and terminal persistence no longer surface `Failed to publish
38
+ file lock: invalid_request` on valid paths. The native fallback preserves no-follow
39
+ path containment, owner identity, no-replace contention, and fail-closed stale-owner
40
+ checks. (#5164)
41
+
42
+ - The first Esc on a streaming turn with a queued steering message again consumes that steer and auto-continues instead of aborting the turn and dumping the queue back into the composer. The busy-indicator recovery branch counted the same drainable queue as cancellable work and, because a streaming turn always has that indicator mounted, it short-circuited before the steer-on-interrupt branch could run. Stale busy-indicator recovery, pending-submission cancellation, and the loud second-Esc abort are unchanged.
43
+
44
+ - Print and JSON turns now fail closed when the provider/agent produces no readable assistant text: JSON emits a bounded `agent_failed` disposition and failures exit nonzero, while tool-only terminal output can no longer masquerade as success. (#5153)
45
+ - Interactive `/login`, `/logout`, and account inventory commands now keep the TUI alive when the credential database reports `SQLITE_CORRUPT` or `SQLITE_NOTADB`. They show a bounded, payload-free recovery message and never auto-repair or delete the database. (#5070)
46
+ - `session.last_assistant` now reads the public transcript projection, skips trailing tool-only, thinking-only, empty, and whitespace-only assistant rows, and returns the most recent readable assistant text or an empty string when none exists. (#5078)
47
+ - Chat-daemon same-generation successor attachments now wait for predecessor provider retirement before admitting frames. Retired attachment frames remain fenced, successor frames resume after retirement, queue waiters settle during takeover and shutdown, and cross-generation replacement remains isolated. (#5120)
48
+
49
+ - SDK lifecycle readiness now uses the same descriptor-bound endpoint identity tolerance as broker endpoint reads and selects owners by scoped state root, process incarnation, and lifecycle marker instead of bare session ID. This restores default source-host startup, shipped SDK lifecycle topology, shared-agent saved-source isolation, cold resume/fork cleanup, local SDK-only broker recovery, and generated operation-matrix closure after the master-mode merge. (#5114)
50
+
51
+ - Coordinator event watchers now advertise the exact supported event-kind enum, while outbox entity validation and durable WAL/active-turn cleanup reuse their existing authority helpers instead of leaving those checks disconnected. (#5115)
52
+ - Post-install update verification now preserves a bounded, secret-redacted stderr/stdout cause when the newly installed `gjc --version` exits unsuccessfully, so runtime guards such as Bun version incompatibilities remain actionable instead of collapsing to a generic verification failure. (#5108)
53
+ - Concurrent coordinator mutations sharing one idempotency key now join the same in-process flight before taking the durable key lock, so a slow accepted prompt cannot make its retry time out as unavailable. Conflicting in-flight requests still fail closed, completed responses remain durably replayable, and different keys remain isolated. (#5110)
54
+ - Custom providers declaring `transport: pi-native` in `models.yml` now actually dispatch through the auth-gateway native endpoint. The provider-level transport was silently dropped for models.yml-declared models, so requests went to `<baseUrl>/chat/completions` and the gateway answered 404; and the pi-native client now serializes only wire-safe tool fields, so runtime tool state carrying fs-stat BigInts no longer aborts request serialization with `JSON.stringify cannot serialize BigInt`.
55
+ - ACP prompts now settle immediately on correlated explicit failure outcomes without waiting for a later `agent_end`; generic error-only `agent_failed` events remain additive diagnostics until an authoritative terminal, while late duplicates and unrelated correlations stay isolated. (#5107)
56
+
57
+ - Managed-session file identities now use one canonical unsigned 64-bit representation across stat/native boundaries and replacement cleanup receipts. Native Windows file IDs surfaced as signed negative bigints no longer create double-hyphen receipt names that block persistence or reopen; already-written signed receipt names and interrupted pending receipts are recovered only through the existing identity-bound, fail-closed reconciliation paths. (#5095)
58
+
59
+ - `gh` PR diffs decode git's C-style quoted paths as UTF-8 bytes instead of Latin-1 code points, so non-ASCII file names (`docs/\355\225\234\352\270\200.md`) no longer surface as mojibake in the file list, and quoted `rename from`/`rename to` lines are unquoted the same way instead of keeping their literal quotes and escapes.
60
+ - Confirmed operator `turn.abort` requests now travel through a dedicated local Broker route instead of trusting caller-supplied `operator:true` and `confirm:true` on ordinary SDK frames. The Broker revalidates the exact live endpoint identity, injects a process-bound private capability, preserves post-send uncertainty, and the host uses one capability-free canonical identity for dispatch idempotency, durable admission, and delivery receipts, so forged, stale, dropped, and replayed requests fail closed consistently across restart boundaries.
61
+
62
+ - Blob references and filesystem-backed blob reads now accept only exact lowercase SHA-256 names before resolving a disk path; canonical references and valid missing-blob behavior are unchanged.
63
+
64
+ ## [0.15.6] - 2026-08-30
65
+
66
+ - Auth metadata remains session-only when a compatibility registry has auth storage but no owner accessor, preventing an unscoped OAuth account lookup from attributing a registry-scoped API-key request to the wrong account.
67
+
68
+ - Every prompt no longer throws inside the session metadata resolver when the model registry does not implement `getAuthStorageOwner`. `80bbc96192` added the lookup as a required call in the resolver that runs on every prompt, but `buildSessionMetadata` takes `owner?: object` and 65 test files construct `AgentSession` with a deliberately minimal `modelRegistry` stub, so the resolver raised `TypeError: this.#modelRegistry.getAuthStorageOwner is not a function`. The throw stranded session admission, which then reported the misleading `Agent session admission is busy due to same-session reentrancy` on every following prompt, so a single missing method surfaced as ~45 failures and 5-second timeouts across six CI test shards in ten unrelated suites (IRC roster delivery, `respondAsBackground` visibility, deferred shell publication, coordinator activity labels, and others). The two optional-argument resolver call sites are now optional calls, matching the existing defensive convention in `account-inventory.ts`; the auth-credential call sites (`resolveOAuthPinTarget`, `invalidateCredentialMatching`, `markUsageLimitReached`) deliberately keep the strict call because they genuinely require a real registry owner and passing `undefined` there would change credential ownership scoping.
69
+ - SDK prompt controls now reject empty and whitespace-only text before client correlation, turn allocation, transcript mutation, or provider activity across CLI, MCP, ACP, and direct session controls; multiline and Unicode prompts remain valid. (#5059)
70
+ - Added disabled-by-default privacy-preserving update telemetry with a versioned allowlist, random local UUIDv4 install ID, bounded nonblocking HTTPS transport, explicit `telemetry.enabled` control, and the `GJC_DISABLE_TELEMETRY` emergency kill switch. Events never include prompts, argv, paths, environment, secrets, account/model/provider/repository identity, arbitrary errors, hostname, username, machine ID, or IP-derived identity. (#5046)
71
+ - A running foreground command can now be folded into a background job with the fold chord (default `Alt+Shift+B`, plus `Cmd+B` on macOS; remappable via `app.tool.backgroundFold`). The turn ends as a clean stop-after-result rather than an abort, and the folded job's completion automatically wakes a fresh turn carrying a receipt — the command's output, a retrieval handle, and the original request — so the interrupted task is finished instead of abandoned. All three command surfaces fold — managed non-PTY bash, editor/ACP client-terminal commands, and PTY-mode commands — and a folded command is never killed or restarted by folding (a folded PTY continues output-only, so it stops accepting input). Folded jobs keep their original deadlines, folded work is visible in the status line and jobs overlay with its delivery state, completions arriving close together merge into one wake turn, and `task`/`subagent` waits are deliberately not foldable. The previous `Ctrl+B` default could never work: `Ctrl+B` is already `tui.editor.cursorLeft` (and is tmux's default prefix), so the keypress fell through to cursor movement whenever nothing was foldable.
72
+ - Background job results are no longer silently lost in two pre-existing cases that also affected plain `async: true` bash. A job id with a queued or in-flight delivery is no longer recycled, which previously gave the pending delivery a mismatched generation and discarded it before it was ever delivered; and a delivery callback that fails after its job record was evicted is now retried, with a retry-cap failure recorded as visibly failed instead of vanishing with no dead letter.
73
+ - Fixed `AsyncJobManager.dispose()` ordering: it marked itself disposed before running owner cleanups, and the delivery loop is inert once disposed, so a failure an owner cleanup settled could never be drained. Registration is now closed by its own flag, which keeps cleanups from registering fresh work without disabling delivery.
74
+ - ACP prompt terminal publication no longer waits behind post-prompt worker integration or recovery work. SDK prompts pass the correlated `agent_end` boundary through immediately, while the existing bounded integration drain continues independently, preventing streamed turns from remaining pending until `sdk.promptDeadlineMs` when owned subagent work lingers. (#5030)
75
+
76
+ ### Fixed
77
+
78
+ - Session resume no longer spends minutes in a CPU-hot 5ms loop when `runtime-state.json.lock` contains corrupt or unprovenanced debris. Session-state acquisition now uses a two-second monotonic wall-time budget with capped exponential backoff and typed exact-path diagnostics; stale malformed records are reclaimed only when their local host provenance and dead PID are proved, old empty legacy lock directories are removed only through exact tree identity, and live, foreign, or replacement owners remain fail-closed. (#5062)
79
+
80
+ - `gjc sdk session tail` no longer rejects the host's `event_replay_result` control frame when its response position includes `generation` and `lastSeq` but no event `seq`; replay metadata is kept out of the event-ring tail while malformed event positions remain fail-closed. (#5055)
81
+
82
+ - Coordinator no longer treats native exact-unlink placeholders (empty `.gjc-delete-*.json`) as live projection JSON. Directory scans skip dotfiles before open; truncated canonical projections remain parse candidates and fail closed, while the parse cap applies only after filtering debris. Session-state lock reclaim reuses one quarantine name per acquire cycle and removes a verified-empty leftover at that name before exchange — deletion is the native identity-bound `exactUnlinkDirect`, so a replacement planted at the reserved name is refused instead of deleted. `gjc gc --empty-delete-receipts --root/--manifest` validates every operand before any store can prune, reports or prunes only operator-supplied empty receipts matching the strict UUID namespace (inode identity + symlink-root reject; no hardcoded host paths), and surfaces native retained recovery paths and discovery failures as report errors. Receipt discovery is fail-closed under concurrent cleanup: a candidate that vanishes between `readdir` and `lstat` is recorded as a `skipped`/`raced` row instead of silently shrinking the report.
83
+
84
+ - Fold control operations now report success only after the foreground fold transaction commits, while rejected fold requests follow the existing warning path; cleanup-triggered delivery failures remain eligible for bounded retry and visible dead-letter recording during manager disposal, and folded jobs expose read-only detail rows in the jobs overlay.
85
+ - Generic file-lock release now retries transient Windows sharing denials and quarantines a verified self-owned lock when deletion remains unavailable, using an in-process acquisition generation rather than reclaiming every live lock with the same PID. Terminal `agent_end` publication remains independent of coordinator sidecar persistence, and a repeated interactive exit escalates through bounded postmortem cleanup. (#4943)
86
+
87
+ - A one-shot `gjc sdk` command no longer idles for five seconds after its response is written. `SessionRouter` bounded four waits with `Bun.sleep` inside `Promise.race`; the race settles on the winner but does not cancel the loser, and a pending `Bun.sleep` keeps the event loop alive, so work that finished in milliseconds still owed the rest of the budget before the process could exit. `gjc sdk session list` wrote its result at 0.50s and exited at 5.51s. The startup attach budget, shutdown timeout, bounded notification work, and replay backoff now use the existing `cancellableSleep` helper with an `AbortController` cancelled once the race settles, and the reconcile interval is unref'd so a Router started without a matching `stop()` does not hold a host proce…
88
+
5
89
  ## [0.15.5] - 2026-08-29
6
90
 
7
91
  - Bash now blocks tmux input commands that resolve to the agent's own pane before spawning the shell, including direct pane targets, session aliases, explicit socket forms, shell wrappers, and inspected script indirection. Read-only inspection and cross-session orchestration remain available, while blocked input cannot reach the transcript as a user turn. (#5039)
@@ -653,7 +737,7 @@
653
737
  ### Added
654
738
 
655
739
  - The SDK `models.list/current` (Q10) catalog now lists model profiles as synthetic `gajae-code/<profile>` entries (e.g. `gajae-code/codex-eco`), and selecting one through `model.set` (or the ACP Model picker) activates the profile for the live session only; global persistence remains the explicit `gjc --mpreset <name> --default` or TUI default-selection path. ACP/SDK clients such as Paseo can therefore offer presets like ordinary models; only availability-filtered profiles are advertised, the reserved `gajae-code` namespace fails closed on collision, and `config.patch` serializes with profile activation through the session admission boundary.
656
- - Added first-class `cline-pass` and `commandcode-goat` provider presets with documented API endpoints, environment-variable credentials, non-hardcoded live model discovery from models.dev and the Command Code Provider API, and prefix-based Claude routing.
740
+ - Added first-class `cline-pass` and `commandcode-goat` provider presets with documented API endpoints, environment-variable credentials, non-hardcoded live model discovery from models.dev and the Command Code Provider API; Command Code models stay on its documented OpenAI-compatible transport regardless of model name.
657
741
  - Registered the `jetbrains-junie` provider in the famous-provider ordering and the `JUNIE_API_KEY` credential help so JetBrains AI (Junie) Claude models surface in `/model`, `--list-models` and `gjc --help` alongside the other first-class providers (#3626).
658
742
  - Added lease-backed MCP connection pooling with typed recovery, shared HTTP/SSE sessions, per-lease callback demultiplexing, and authorization binding scopes that keep credential secrets out of pool keys.
659
743
  - Added plugin registry v2 as the single execution authority for plugin tools, subskills, and prompt appendices, with digest verification at final use.
@@ -21,6 +21,12 @@ export interface AsyncJob {
21
21
  setupFailureSummary?: string;
22
22
  /** Safe, bounded summary of a terminal local (non-provider) failure kind. */
23
23
  localErrorSummary?: LocalErrorSummary;
24
+ /** Compact delivery-failure marker retained while the job row remains live. */
25
+ deliveryFailure?: {
26
+ attempt: number;
27
+ lastError?: string;
28
+ recordedAt: number;
29
+ };
24
30
  metadata?: AsyncJobMetadata;
25
31
  /**
26
32
  * Registry id of the agent that registered the job (e.g. "0-Main",
@@ -38,6 +44,8 @@ export interface AsyncJob {
38
44
  */
39
45
  export declare function jobElapsedMs(job: Pick<AsyncJob, "startTime" | "endTime">, now?: number): number;
40
46
  export interface AsyncJobMetadata {
47
+ /** Set once a foreground wait has been folded, so surfacing can show folded work. */
48
+ backgrounded?: boolean;
41
49
  subagent?: {
42
50
  id: string;
43
51
  agent: string;
@@ -170,11 +178,50 @@ export interface AsyncJobManagerOptions {
170
178
  onJobComplete: (jobId: string, text: string, job?: AsyncJob) => void | Promise<void>;
171
179
  maxRunningJobs?: number;
172
180
  retentionMs?: number;
181
+ maxDeadLetterOverflowOwners?: number;
182
+ }
183
+ export interface AsyncJobAdmission {
184
+ readonly manager: AsyncJobManager;
173
185
  }
174
186
  export interface AsyncJobDisposeDiagnostics {
175
187
  stuckJobIds: string[];
176
188
  deliveriesDrained: boolean;
177
189
  }
190
+ /** Per-job public delivery classification. Exactly one value per terminal job. */
191
+ export type JobDeliveryState = "pending" | "delivered" | "failed-visible";
192
+ /** One job as projected by {@link AsyncJobManager.getJobsSnapshot}. */
193
+ export interface AsyncJobSnapshotEntry {
194
+ id: string;
195
+ kind: string;
196
+ label: string;
197
+ status: AsyncJob["status"];
198
+ generation: string;
199
+ backgrounded: boolean;
200
+ deliveryState: JobDeliveryState;
201
+ }
202
+ /** Scalar delivery-failure evidence that may outlive its AsyncJob record. */
203
+ export interface DeadLetteredJobSnapshotEntry {
204
+ jobId: string;
205
+ generation: string;
206
+ ownerId?: string;
207
+ /** Whether the failed delivery originated from a backgrounded job. */
208
+ backgrounded?: boolean;
209
+ attempt: number;
210
+ lastError?: string;
211
+ recordedAt: number;
212
+ }
213
+ /**
214
+ * One atomic projection of job + delivery state.
215
+ *
216
+ * Computed in a single synchronous pass with no interleaved awaits so it cannot
217
+ * tear, and consumed verbatim: a UI that re-derives delivery classification from
218
+ * separate getters can disagree with this and produce a job that is in no public
219
+ * state at all.
220
+ */
221
+ export interface AsyncJobsSnapshot {
222
+ jobs: AsyncJobSnapshotEntry[];
223
+ deadLettered: DeadLetteredJobSnapshotEntry[];
224
+ }
178
225
  export interface AsyncJobDeliveryState {
179
226
  queued: number;
180
227
  delivering: boolean;
@@ -209,6 +256,8 @@ export interface AsyncJobRegisterOptions {
209
256
  metadata?: AsyncJobMetadata;
210
257
  onProgress?: (text: string, details?: Record<string, unknown>) => void | Promise<void>;
211
258
  lifecycle?: AsyncJobLifecycleCleanup;
259
+ /** Reserved capacity consumed atomically by this registration. */
260
+ admissionToken?: AsyncJobAdmission;
212
261
  }
213
262
  /**
214
263
  * Filter applied to job query/cancel APIs. With `ownerId`, results are
@@ -411,6 +460,10 @@ export declare class AsyncJobManager {
411
460
  */
412
461
  getJobPromise(id: string, generation: string): Promise<void> | undefined;
413
462
  getRunningJobs(filter?: AsyncJobFilter): AsyncJob[];
463
+ /** Whether a new running job can be admitted without starting side effects. */
464
+ hasCapacity(filter?: AsyncJobFilter): boolean;
465
+ reserveCapacity(): AsyncJobAdmission;
466
+ releaseCapacity(token: AsyncJobAdmission): void;
414
467
  getRecentJobs(limit?: number, filter?: AsyncJobFilter): AsyncJob[];
415
468
  getAllJobs(filter?: AsyncJobFilter): AsyncJob[];
416
469
  /**
@@ -450,6 +503,18 @@ export declare class AsyncJobManager {
450
503
  /** Run producer cleanups, then perform the legacy destructive subagent purge. */
451
504
  runOwnerCleanups(filter?: AsyncJobFilter): void;
452
505
  getDeliveryState(filter?: AsyncJobFilter): AsyncJobDeliveryState;
506
+ /**
507
+ * One synchronous pass over jobs plus delivery state.
508
+ *
509
+ * Every returned job carries exactly one {@link JobDeliveryState}, and
510
+ * dead-lettered evidence is included even when its record is already gone, so
511
+ * no terminal job can end up invisible to the UI.
512
+ */
513
+ getJobsSnapshot(filter?: AsyncJobFilter): AsyncJobsSnapshot;
514
+ retainParkedDelivery(job: AsyncJob, text: string): void;
515
+ retainDeliveryClaim(job: AsyncJob): void;
516
+ releaseDeliveryClaim(generation: string): void;
517
+ clearParkedDelivery(generation: string): void;
453
518
  hasPendingDeliveries(filter?: AsyncJobFilter): boolean;
454
519
  watchJobGenerations(jobIds: string[]): AsyncJobWatchHandle;
455
520
  watchJobs(jobIds: string[]): number;
@@ -460,6 +525,19 @@ export declare class AsyncJobManager {
460
525
  * matching agent registered; with no filter, cancels every running job
461
526
  * (used by `dispose()` to nuke the manager's state).
462
527
  */
528
+ /**
529
+ * Synchronously fail a running job AND enqueue its delivery, exactly once.
530
+ *
531
+ * An externally owned wait -- an ACP client terminal, say -- can fail while its
532
+ * owner is being torn down. `cancel()` is the wrong tool there: it marks the job
533
+ * cancelled, and the cancelled path deliberately enqueues NO delivery, so the
534
+ * failure would never become visible to anyone. This is the single transition
535
+ * that both fails the job and delivers that failure in one synchronous block, so
536
+ * it cannot lose the race against disposal.
537
+ */
538
+ failNow(jobId: string, generation: string, errorText: string, options?: {
539
+ abort?: boolean;
540
+ }): boolean;
463
541
  cancelAll(filter?: AsyncJobFilter): void;
464
542
  waitForOwnerInFlightDeliveries(ownerId: string, options?: {
465
543
  timeoutMs?: number;
@@ -468,6 +546,11 @@ export declare class AsyncJobManager {
468
546
  timeoutMs?: number;
469
547
  }): Promise<boolean>;
470
548
  getLastDisposeDiagnostics(): AsyncJobDisposeDiagnostics;
549
+ /**
550
+ * Mark a running job as backgrounded (folded out of its foreground call).
551
+ * Read by getJobsSnapshot so folded work stays visible; safe to call twice.
552
+ */
553
+ markBackgrounded(jobId: string, generation: string): boolean;
471
554
  waitForAll(): Promise<void>;
472
555
  drainDeliveries(options?: {
473
556
  timeoutMs?: number;
@@ -50,6 +50,8 @@ export interface Args {
50
50
  noRules?: boolean;
51
51
  listModels?: string | true;
52
52
  noTitle?: boolean;
53
+ master?: true;
54
+ masterScope?: "repo" | "pwd" | "global";
53
55
  messages: string[];
54
56
  fileArgs: string[];
55
57
  /** Flags unknown to every launch parser; their consumer supplies the diagnostic. */
@@ -1,9 +1,11 @@
1
+ import { type AuthCredentialSnapshot, type CredentialHealthResult } from "@gajae-code/ai/core";
1
2
  export type AuthGatewayAction = "serve" | "token" | "status" | "check";
2
3
  export interface AuthGatewayCommandArgs {
3
4
  action: AuthGatewayAction;
4
5
  flags: {
5
6
  json?: boolean;
6
7
  bind?: string;
8
+ provider?: string;
7
9
  regenerate?: boolean;
8
10
  /**
9
11
  * Disable bearer-token auth on inbound requests. Useful when the gateway
@@ -14,5 +16,20 @@ export interface AuthGatewayCommandArgs {
14
16
  };
15
17
  }
16
18
  declare const ACTIONS: readonly AuthGatewayAction[];
19
+ export declare function resolveAuthGatewayReadiness(input: {
20
+ noAuth: boolean;
21
+ tokenPresent: boolean;
22
+ credentialCount: number;
23
+ modelCount: number;
24
+ }): {
25
+ ready: boolean;
26
+ reason: "token_missing" | "provider_credential_missing" | "provider_catalog_empty" | null;
27
+ };
28
+ export declare function normalizeProviderScope(provider: string | undefined): string | undefined;
29
+ export declare function filterCredentialCheckResults(results: readonly CredentialHealthResult[], provider: string | undefined): CredentialHealthResult[];
30
+ export declare function redactBrokerUrl(rawUrl: string): string;
31
+ export declare function hasEnabledProviderCredential(snapshot: Pick<AuthCredentialSnapshot, "credentials">, provider: string): boolean;
32
+ export declare function matchesProviderCredential(entry: AuthCredentialSnapshot["credentials"][number], apiKey: string): boolean;
33
+ export declare function assertEnabledProviderCredential(snapshot: Pick<AuthCredentialSnapshot, "credentials">, provider: string): void;
17
34
  export declare function runAuthGatewayCommand(cmd: AuthGatewayCommandArgs): Promise<void>;
18
35
  export { ACTIONS as AUTH_GATEWAY_ACTIONS };
@@ -0,0 +1,9 @@
1
+ export declare const MODEL_PRESETS_ACTIONS: readonly ["status", "refresh", "rollback", "pin", "unpin", "disable", "enable"];
2
+ export type ModelPresetsAction = (typeof MODEL_PRESETS_ACTIONS)[number];
3
+ export interface ModelPresetsCommandArgs {
4
+ action: ModelPresetsAction;
5
+ revision?: string;
6
+ json?: boolean;
7
+ agentDir?: string;
8
+ }
9
+ export declare function runModelPresetsCommand(args: ModelPresetsCommandArgs): Promise<void>;
@@ -119,6 +119,13 @@ export declare const ROOT_LAUNCH_FLAGS: {
119
119
  "no-title": FlagDescriptor<"boolean"> & {
120
120
  description: string;
121
121
  };
122
+ master: FlagDescriptor<"boolean"> & {
123
+ description: string;
124
+ };
125
+ scope: FlagDescriptor<"string"> & {
126
+ description: string;
127
+ options: string[];
128
+ };
122
129
  };
123
130
  export type ConsumerLaunchFlagName = "hook" | "extension" | "no-extensions" | "no-skills" | "skills";
124
131
  export type LaunchFlagConsumer = "acp" | "local";
@@ -247,6 +254,13 @@ export declare const LAUNCH_PARSE_FLAGS: {
247
254
  "no-title": FlagDescriptor<"boolean"> & {
248
255
  description: string;
249
256
  };
257
+ master: FlagDescriptor<"boolean"> & {
258
+ description: string;
259
+ };
260
+ scope: FlagDescriptor<"string"> & {
261
+ description: string;
262
+ options: string[];
263
+ };
250
264
  extension: FlagDescriptor<"boolean" | "integer" | "string">;
251
265
  hook: FlagDescriptor<"boolean" | "integer" | "string">;
252
266
  "no-extensions": FlagDescriptor<"boolean" | "integer" | "string">;
@@ -1,6 +1,7 @@
1
1
  import { Settings } from "../config/settings";
2
2
  import { type UpdateChannel } from "../config/update-channel";
3
3
  import { type NotificationProvider } from "../sdk/bus/config";
4
+ import type { TelemetryDetails, TelemetryEventName } from "../telemetry";
4
5
  import { type GithubReleaseLookupOptions } from "./github-release";
5
6
  export interface UpdateCommandOptions {
6
7
  force: boolean;
@@ -20,6 +21,7 @@ export interface InstalledVersionVerification {
20
21
  ok: boolean;
21
22
  actual?: string;
22
23
  path?: string;
24
+ versionOutput?: string;
23
25
  smokeTestFailed?: boolean;
24
26
  smokeTestOutput?: string;
25
27
  cleanupWarning?: string;
@@ -86,6 +88,18 @@ export declare function resolveGjcPathForTest(options: {
86
88
  whichPath: string | undefined;
87
89
  }): string | undefined;
88
90
  export declare function parseReportedVersionForTest(output: string): string | undefined;
91
+ export declare function sanitizeVerificationOutputForTest(stderr: string | undefined, stdout: string | undefined): string | undefined;
92
+ interface InstalledVersionCommandResult {
93
+ exitCode: number | null;
94
+ stdout: string;
95
+ stderr: string;
96
+ }
97
+ type InstalledVersionCommandRunner = (runtimePath: string) => Promise<InstalledVersionCommandResult>;
98
+ export declare function verifyInstalledVersionForTest(options: {
99
+ expectedVersion: string;
100
+ runtimePath: string | undefined;
101
+ runVersion: InstalledVersionCommandRunner;
102
+ }): Promise<InstalledVersionVerification>;
89
103
  interface MigrationTargetVerificationOptions {
90
104
  runtimePath: string;
91
105
  verifyChecksum: () => Promise<void>;
@@ -150,6 +164,7 @@ export interface UpdateCommandDependencies {
150
164
  restartDaemon?: (settings: Settings) => Promise<void>;
151
165
  recoverNotifications?: (settings: Settings) => Promise<void>;
152
166
  runPostUpdateRecovery?: (runtimePath: string) => Promise<void>;
167
+ recordTelemetryEvent?: (event: TelemetryEventName, details: TelemetryDetails) => unknown;
153
168
  exit?: (code: number) => never;
154
169
  }
155
170
  export type PostUpdateRecoverySpawn = (argv: string[]) => Promise<number>;
@@ -142,6 +142,13 @@ export declare class RootHelpCommand extends Command {
142
142
  "no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
143
143
  description: string;
144
144
  };
145
+ master: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
146
+ description: string;
147
+ };
148
+ scope: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
149
+ description: string;
150
+ options: string[];
151
+ };
145
152
  };
146
153
  static examples: string[];
147
154
  static strict: boolean;
@@ -20,6 +20,9 @@ export default class AuthGateway extends Command {
20
20
  description: string;
21
21
  char: string;
22
22
  };
23
+ provider: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
24
+ description: string;
25
+ };
23
26
  regenerate: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
24
27
  description: string;
25
28
  };
@@ -2,6 +2,7 @@ import { Command } from "@gajae-code/utils/cli";
2
2
  export default class Gc extends Command {
3
3
  static description: string;
4
4
  static strict: boolean;
5
+ static delegateHelp: boolean;
5
6
  static flags: {
6
7
  json: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
7
8
  char: string;
@@ -28,6 +29,18 @@ export default class Gc extends Command {
28
29
  description: string;
29
30
  default: boolean;
30
31
  };
32
+ "empty-delete-receipts": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
33
+ description: string;
34
+ default: boolean;
35
+ };
36
+ root: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
37
+ description: string;
38
+ multiple: true;
39
+ };
40
+ manifest: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
41
+ description: string;
42
+ multiple: true;
43
+ };
31
44
  };
32
45
  static examples: string[];
33
46
  run(): Promise<void>;
@@ -2,7 +2,10 @@
2
2
  * Root command for the coding agent CLI.
3
3
  */
4
4
  import { Command } from "@gajae-code/utils/cli";
5
+ import { type LaunchWorktreeReservation } from "../gjc-runtime/launch-worktree-reservation";
5
6
  export declare function persistCoordinatorLaunchFailure(error: unknown, cwd: string, env?: NodeJS.ProcessEnv): Promise<void>;
7
+ /** Test seam for the path-keyed atomic reservation. */
8
+ export declare function reserveLaunchWorktreeForTest(agentDir: string, worktreePath: string): Promise<LaunchWorktreeReservation>;
6
9
  export default class Index extends Command {
7
10
  static description: string;
8
11
  static hidden: boolean;
@@ -132,6 +135,13 @@ export default class Index extends Command {
132
135
  "no-title": import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
133
136
  description: string;
134
137
  };
138
+ master: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
139
+ description: string;
140
+ };
141
+ scope: import("@gajae-code/utils/cli").FlagDescriptor<"string"> & {
142
+ description: string;
143
+ options: string[];
144
+ };
135
145
  };
136
146
  static examples: string[];
137
147
  static strict: boolean;
@@ -0,0 +1,21 @@
1
+ import { Command } from "@gajae-code/utils/cli";
2
+ export default class ModelPresets extends Command {
3
+ static description: string;
4
+ static args: {
5
+ action: import("@gajae-code/utils/cli").ArgDescriptor & {
6
+ description: string;
7
+ required: false;
8
+ options: readonly ["status", "refresh", "rollback", "pin", "unpin", "disable", "enable"];
9
+ };
10
+ revision: import("@gajae-code/utils/cli").ArgDescriptor & {
11
+ description: string;
12
+ required: false;
13
+ };
14
+ };
15
+ static flags: {
16
+ json: import("@gajae-code/utils/cli").FlagDescriptor<"boolean"> & {
17
+ description: string;
18
+ };
19
+ };
20
+ run(): Promise<void>;
21
+ }
@@ -784,12 +784,33 @@ export declare const TIER_MAP_SKIP_LIST: {
784
784
  readonly "openai-codex/gpt-daybreak-blue-latest": {
785
785
  readonly rationale: "post-rebase catalog addition from dev; not yet curated";
786
786
  };
787
+ readonly "opencode-go/deepseek-v4-flash-vision-exp": {
788
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
789
+ };
790
+ readonly "opencode-go/glm-5.3-flash": {
791
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
792
+ };
787
793
  readonly "opencode-go/gpt-5.6-luna": {
788
794
  readonly rationale: "post-rebase catalog addition from dev; not yet curated";
789
795
  };
796
+ readonly "opencode-go/grok-4.6": {
797
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
798
+ };
790
799
  readonly "opencode-go/hy3": {
791
800
  readonly rationale: "post-rebase catalog addition from dev; not yet curated";
792
801
  };
802
+ readonly "opencode-go/hy4-preview": {
803
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
804
+ };
805
+ readonly "opencode-go/longcat-2.0": {
806
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
807
+ };
808
+ readonly "opencode-go/muse-spark-1.2-contributor": {
809
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
810
+ };
811
+ readonly "opencode-go/qwen3.8-flash": {
812
+ readonly rationale: "post-rebase catalog addition from dev; not yet curated";
813
+ };
793
814
  readonly "opencode-go/qwen3.8-max": {
794
815
  readonly rationale: "post-rebase catalog addition from dev; not yet curated";
795
816
  };
@@ -1686,6 +1707,9 @@ export declare const TIER_MAP_SKIP_LIST: {
1686
1707
  readonly baseline: true;
1687
1708
  readonly rationale: "pre-feature baseline; not yet curated";
1688
1709
  };
1710
+ readonly "anthropic/claude-fable-5-1": {
1711
+ readonly rationale: "post-feature catalog addition; not yet curated";
1712
+ };
1689
1713
  readonly "anthropic/claude-haiku-4-5-20251001": {
1690
1714
  readonly baseline: true;
1691
1715
  readonly rationale: "pre-feature baseline; not yet curated";
@@ -16821,6 +16845,102 @@ export declare const TIER_MAP_SKIP_LIST: {
16821
16845
  readonly baseline: true;
16822
16846
  readonly rationale: "pre-feature baseline; not yet curated";
16823
16847
  };
16848
+ readonly "kiro/auto": {
16849
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16850
+ };
16851
+ readonly "kiro/claude-haiku-4-5": {
16852
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16853
+ };
16854
+ readonly "kiro/claude-haiku-4.5": {
16855
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16856
+ };
16857
+ readonly "kiro/claude-opus-4-5": {
16858
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16859
+ };
16860
+ readonly "kiro/claude-opus-4-6": {
16861
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16862
+ };
16863
+ readonly "kiro/claude-opus-4-7": {
16864
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16865
+ };
16866
+ readonly "kiro/claude-opus-4-8": {
16867
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16868
+ };
16869
+ readonly "kiro/claude-opus-4.5": {
16870
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16871
+ };
16872
+ readonly "kiro/claude-opus-4.6": {
16873
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16874
+ };
16875
+ readonly "kiro/claude-opus-4.7": {
16876
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16877
+ };
16878
+ readonly "kiro/claude-opus-4.8": {
16879
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16880
+ };
16881
+ readonly "kiro/claude-opus-5": {
16882
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16883
+ };
16884
+ readonly "kiro/claude-sonnet-4": {
16885
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16886
+ };
16887
+ readonly "kiro/claude-sonnet-4-5": {
16888
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16889
+ };
16890
+ readonly "kiro/claude-sonnet-4-6": {
16891
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16892
+ };
16893
+ readonly "kiro/claude-sonnet-4.5": {
16894
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16895
+ };
16896
+ readonly "kiro/claude-sonnet-4.6": {
16897
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16898
+ };
16899
+ readonly "kiro/claude-sonnet-5": {
16900
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16901
+ };
16902
+ readonly "kiro/deepseek-3-2": {
16903
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16904
+ };
16905
+ readonly "kiro/deepseek-3.2": {
16906
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16907
+ };
16908
+ readonly "kiro/glm-5": {
16909
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16910
+ };
16911
+ readonly "kiro/gpt-5-6-luna": {
16912
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16913
+ };
16914
+ readonly "kiro/gpt-5-6-sol": {
16915
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16916
+ };
16917
+ readonly "kiro/gpt-5-6-terra": {
16918
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16919
+ };
16920
+ readonly "kiro/gpt-5.6-luna": {
16921
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16922
+ };
16923
+ readonly "kiro/gpt-5.6-sol": {
16924
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16925
+ };
16926
+ readonly "kiro/gpt-5.6-terra": {
16927
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16928
+ };
16929
+ readonly "kiro/minimax-m2-1": {
16930
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16931
+ };
16932
+ readonly "kiro/minimax-m2-5": {
16933
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16934
+ };
16935
+ readonly "kiro/minimax-m2.1": {
16936
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16937
+ };
16938
+ readonly "kiro/minimax-m2.5": {
16939
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16940
+ };
16941
+ readonly "kiro/qwen3-coder-next": {
16942
+ readonly rationale: "Kiro API-key catalog addition; not yet curated";
16943
+ };
16824
16944
  };
16825
16945
  export declare const CURATED_TIER_MAP: AutoroutingCuratedTierMap;
16826
16946
  /** Canonical JSON uses sorted object keys and preserves array order. */