@gajae-code/coding-agent 0.18.11 → 0.18.12

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 (270) hide show
  1. package/CHANGELOG.md +293 -0
  2. package/dist/types/async/job-manager.d.ts +7 -3
  3. package/dist/types/async/result-formatting.d.ts +2 -0
  4. package/dist/types/autoresearch/git.d.ts +1 -1
  5. package/dist/types/capability/fs.d.ts +2 -2
  6. package/dist/types/cli/accounts-cli.d.ts +2 -2
  7. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  8. package/dist/types/cli/install-activation.d.ts +10 -4
  9. package/dist/types/cli/public-command-errors.d.ts +1 -0
  10. package/dist/types/cli/update-cli.d.ts +14 -1
  11. package/dist/types/cli-ordinary.d.ts +2 -2
  12. package/dist/types/commands/accounts.d.ts +2 -1
  13. package/dist/types/commands/migrate.d.ts +1 -1
  14. package/dist/types/commands/sdk.d.ts +5 -0
  15. package/dist/types/commit/changelog/index.d.ts +1 -0
  16. package/dist/types/config/autorouting-tier-map.d.ts +30 -0
  17. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  18. package/dist/types/config/config-hot-reload.d.ts +39 -0
  19. package/dist/types/config/file-lock.d.ts +8 -1
  20. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  21. package/dist/types/config/model-profile-activation.d.ts +62 -6
  22. package/dist/types/config/model-registry.d.ts +56 -5
  23. package/dist/types/config/model-resolver.d.ts +2 -0
  24. package/dist/types/config/models-config-schema.d.ts +10 -0
  25. package/dist/types/config/settings-schema.d.ts +46 -3
  26. package/dist/types/config/settings.d.ts +33 -1
  27. package/dist/types/dap/config.d.ts +8 -4
  28. package/dist/types/debug/system-info.d.ts +6 -1
  29. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  30. package/dist/types/edit/modes/patch.d.ts +5 -0
  31. package/dist/types/edit/modes/replace.d.ts +3 -0
  32. package/dist/types/exec/bash-executor.d.ts +12 -0
  33. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  35. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  36. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  37. package/dist/types/migrate/adapters/index.d.ts +10 -1
  38. package/dist/types/migrate/executor.d.ts +3 -1
  39. package/dist/types/migrate/types.d.ts +15 -3
  40. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  41. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  42. package/dist/types/modes/theme/theme.d.ts +1 -0
  43. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  44. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  45. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  46. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  47. package/dist/types/sdk/broker/broker-exit.d.ts +2 -2
  48. package/dist/types/sdk/broker/broker.d.ts +7 -1
  49. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  50. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  51. package/dist/types/sdk/broker/ensure.d.ts +136 -7
  52. package/dist/types/sdk/broker/hop.d.ts +36 -0
  53. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  54. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +4 -1
  56. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  57. package/dist/types/sdk/bus/index.d.ts +23 -0
  58. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  59. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  60. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  61. package/dist/types/sdk/host/session-runtime.d.ts +32 -0
  62. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  63. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  64. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  65. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  66. package/dist/types/sdk/session-list.d.ts +1 -1
  67. package/dist/types/session/agent-session.d.ts +58 -2
  68. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  69. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  70. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  71. package/dist/types/session/messages.d.ts +5 -1
  72. package/dist/types/session/session-manager.d.ts +13 -3
  73. package/dist/types/session/startup-auth-config.d.ts +24 -2
  74. package/dist/types/session/streaming-output.d.ts +11 -0
  75. package/dist/types/session/terminal-abort.d.ts +3 -1
  76. package/dist/types/session-import/service.d.ts +1 -1
  77. package/dist/types/skill-state/workflow-mutation-guard.d.ts +7 -3
  78. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  79. package/dist/types/task/executor.d.ts +19 -2
  80. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  81. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  82. package/dist/types/tools/bash-allowed-prefixes.d.ts +11 -0
  83. package/dist/types/tools/descriptors.d.ts +2 -0
  84. package/dist/types/tools/fetch.d.ts +1 -1
  85. package/dist/types/tools/index.d.ts +2 -0
  86. package/dist/types/tools/python.d.ts +1 -1
  87. package/dist/types/tools/report-issue.d.ts +41 -0
  88. package/dist/types/tools/subagent.d.ts +23 -0
  89. package/dist/types/web/scrapers/types.d.ts +8 -1
  90. package/dist/types/web/search/providers/insane.d.ts +7 -1
  91. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  92. package/package.json +8 -8
  93. package/scripts/build-binary.ts +2 -1
  94. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  95. package/scripts/generate-docs-index.ts +8 -1
  96. package/scripts/generate-sdk-operation-inventory.ts +22 -4
  97. package/src/async/job-manager.ts +356 -56
  98. package/src/async/result-formatting.ts +40 -0
  99. package/src/autoresearch/git.ts +9 -2
  100. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  101. package/src/capability/fs.ts +27 -19
  102. package/src/capability/index.ts +2 -2
  103. package/src/cli/accounts-cli.ts +176 -8
  104. package/src/cli/auth-broker-cli.ts +21 -11
  105. package/src/cli/doctor/install-repairs.ts +35 -5
  106. package/src/cli/fast-help.ts +1 -1
  107. package/src/cli/install-activation.ts +47 -4
  108. package/src/cli/migrate-cli.ts +7 -5
  109. package/src/cli/public-command-errors.ts +4 -0
  110. package/src/cli/root-flags.ts +2 -2
  111. package/src/cli/stats-cli.ts +9 -5
  112. package/src/cli/update-cli.ts +224 -7
  113. package/src/cli-ordinary.ts +7 -2
  114. package/src/commands/accounts.ts +10 -5
  115. package/src/commands/migrate.ts +3 -3
  116. package/src/commands/sdk.ts +199 -42
  117. package/src/commands/ultragoal.ts +16 -8
  118. package/src/commit/changelog/index.ts +39 -1
  119. package/src/commit/message.ts +10 -3
  120. package/src/config/autorouting-tier-map.ts +30 -0
  121. package/src/config/config-hot-reload-trust.ts +148 -0
  122. package/src/config/config-hot-reload.ts +734 -0
  123. package/src/config/file-lock.ts +216 -56
  124. package/src/config/model-bindings-applier.ts +85 -47
  125. package/src/config/model-discovery-manager.ts +10 -0
  126. package/src/config/model-profile-activation.ts +716 -113
  127. package/src/config/model-registry.ts +1334 -158
  128. package/src/config/model-resolver.ts +3 -1
  129. package/src/config/models-config-schema.ts +6 -0
  130. package/src/config/settings-schema.ts +60 -3
  131. package/src/config/settings.ts +458 -24
  132. package/src/coordinator-mcp/policy.ts +26 -1
  133. package/src/crash/sanitize.ts +4 -0
  134. package/src/customization/import.ts +3 -1
  135. package/src/dap/config.ts +31 -11
  136. package/src/dap/defaults.json +1 -1
  137. package/src/debug/crash-diagnostics.ts +2 -1
  138. package/src/debug/report-bundle.ts +19 -0
  139. package/src/debug/system-info.ts +8 -3
  140. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  141. package/src/discovery/agents-md.ts +1 -1
  142. package/src/discovery/helpers.ts +1 -2
  143. package/src/discovery/mcp-compat.ts +120 -17
  144. package/src/edit/apply-patch/index.ts +12 -1
  145. package/src/edit/index.ts +13 -17
  146. package/src/edit/modes/patch.ts +187 -8
  147. package/src/edit/modes/replace.ts +136 -0
  148. package/src/eval/js/context-manager.ts +29 -3
  149. package/src/eval/js/worker-entry.ts +51 -18
  150. package/src/eval/py/executor.ts +14 -4
  151. package/src/eval/py/runner.py +144 -5
  152. package/src/exec/bash-executor.ts +81 -4
  153. package/src/exec/bash-shell-guardian.ts +4 -1
  154. package/src/exec/bash-shell-supervisor.ts +8 -4
  155. package/src/exec/isolated-shell.ts +5 -1
  156. package/src/export/html/index.ts +46 -6
  157. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  158. package/src/extensibility/extensions/loader.ts +8 -1
  159. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  160. package/src/gjc-runtime/gc-runtime.ts +33 -6
  161. package/src/gjc-runtime/launch-tmux.ts +7 -2
  162. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  163. package/src/gjc-runtime/launch-worktree.ts +101 -14
  164. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  165. package/src/gjc-runtime/session-resolution.ts +38 -6
  166. package/src/gjc-runtime/session-state-lock.ts +59 -14
  167. package/src/gjc-runtime/state-runtime.ts +23 -19
  168. package/src/hooks/native-skill-hook.ts +14 -11
  169. package/src/internal-urls/docs-index.generated.ts +14 -13
  170. package/src/internal-urls/local-protocol.ts +142 -8
  171. package/src/lsp/index.ts +29 -0
  172. package/src/lsp/workspace-path.ts +23 -0
  173. package/src/migrate/action-planner.ts +57 -0
  174. package/src/migrate/adapters/claude-code.ts +23 -4
  175. package/src/migrate/adapters/codex.ts +22 -4
  176. package/src/migrate/adapters/index.ts +22 -4
  177. package/src/migrate/adapters/opencode.ts +6 -1
  178. package/src/migrate/executor.ts +84 -7
  179. package/src/migrate/report.ts +19 -2
  180. package/src/migrate/types.ts +14 -4
  181. package/src/modes/DESIGN.md +51 -0
  182. package/src/modes/acp/permission-mode.ts +18 -1
  183. package/src/modes/components/assistant-message.ts +55 -1
  184. package/src/modes/components/settings-selector.ts +103 -37
  185. package/src/modes/controllers/command-controller.ts +38 -2
  186. package/src/modes/controllers/plan-mode-controller.ts +17 -7
  187. package/src/modes/controllers/selector-controller.ts +62 -6
  188. package/src/modes/interactive-mode.ts +68 -0
  189. package/src/modes/theme/theme.ts +15 -0
  190. package/src/prompts/tools/debug.md +1 -1
  191. package/src/prompts/tools/read.md +1 -1
  192. package/src/prompts/tools/report-issue.md +13 -0
  193. package/src/prompts/tools/task.md +1 -1
  194. package/src/runtime-credential-selector.ts +2 -2
  195. package/src/runtime-mcp/content-limits.ts +7 -0
  196. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  197. package/src/runtime-mcp/manager.ts +32 -0
  198. package/src/runtime-mcp/oauth-flow.ts +32 -6
  199. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  200. package/src/runtime-mcp/render.ts +16 -1
  201. package/src/runtime-mcp/tool-bridge.ts +126 -17
  202. package/src/sdk/broker/broker-exit.ts +8 -5
  203. package/src/sdk/broker/broker.ts +342 -82
  204. package/src/sdk/broker/daemon-entry.ts +338 -116
  205. package/src/sdk/broker/doctor-restart.ts +2 -1
  206. package/src/sdk/broker/ensure.ts +1143 -265
  207. package/src/sdk/broker/hop.ts +274 -0
  208. package/src/sdk/broker/lifecycle-ledger.ts +35 -11
  209. package/src/sdk/broker/lock-host-identity.ts +29 -0
  210. package/src/sdk/broker/session-index.ts +62 -12
  211. package/src/sdk/bus/chat-command-policy.ts +16 -3
  212. package/src/sdk/bus/index.ts +52 -21
  213. package/src/sdk/bus/reconciliation-store.ts +201 -8
  214. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  215. package/src/sdk/cli/session-cli.ts +21 -6
  216. package/src/sdk/host/session-runtime.test.ts +118 -23
  217. package/src/sdk/host/session-runtime.ts +352 -47
  218. package/src/sdk/lifecycle/service.ts +1 -0
  219. package/src/sdk/prompt-deadline-flush.ts +78 -5
  220. package/src/sdk/prompt-deadline-manager.ts +68 -14
  221. package/src/sdk/protocol/adapter-validation.ts +53 -11
  222. package/src/sdk/protocol/operation-inventory.generated.json +101 -2
  223. package/src/sdk/reconciliation-extensions.ts +1 -0
  224. package/src/sdk/session-list.ts +1 -0
  225. package/src/sdk/session.ts +114 -61
  226. package/src/session/agent-session.ts +1043 -81
  227. package/src/session/internal/managed-session-scope.ts +126 -39
  228. package/src/session/internal/managed-session-storage.ts +14 -11
  229. package/src/session/internal/native-publish-outcome.ts +5 -1
  230. package/src/session/messages.ts +47 -6
  231. package/src/session/session-manager.ts +236 -14
  232. package/src/session/startup-auth-config.ts +116 -8
  233. package/src/session/streaming-output.ts +262 -4
  234. package/src/session/terminal-abort.ts +14 -2
  235. package/src/session-import/service.ts +1 -0
  236. package/src/skill-state/workflow-mutation-guard.ts +491 -32
  237. package/src/slash-commands/builtin-registry.ts +15 -3
  238. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  239. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  240. package/src/task/executor.ts +103 -12
  241. package/src/task/index.ts +389 -175
  242. package/src/tools/ast-edit-write-path.ts +64 -0
  243. package/src/tools/ast-edit.ts +18 -1
  244. package/src/tools/atomic-file-write.ts +46 -15
  245. package/src/tools/auto-generated-guard.ts +3 -0
  246. package/src/tools/bash-allowed-prefixes.ts +153 -5
  247. package/src/tools/bash-interactive.ts +14 -2
  248. package/src/tools/bash.ts +14 -0
  249. package/src/tools/debug.ts +7 -6
  250. package/src/tools/descriptors.test.ts +44 -0
  251. package/src/tools/descriptors.ts +34 -2
  252. package/src/tools/fetch.ts +3 -2
  253. package/src/tools/index.ts +2 -0
  254. package/src/tools/output-meta.ts +23 -2
  255. package/src/tools/python.ts +1 -1
  256. package/src/tools/read.ts +17 -35
  257. package/src/tools/report-issue.ts +184 -0
  258. package/src/tools/subagent-render.ts +114 -12
  259. package/src/tools/subagent.ts +108 -1
  260. package/src/tools/todo-write.ts +41 -3
  261. package/src/tools/tool-catalog.generated.ts +31 -3
  262. package/src/tools/write.ts +35 -3
  263. package/src/utils/commit-message-generator.ts +9 -2
  264. package/src/utils/file-mentions.ts +29 -1
  265. package/src/utils/title-generator.ts +7 -2
  266. package/src/web/scrapers/index.ts +3 -1
  267. package/src/web/scrapers/types.ts +8 -0
  268. package/src/web/scrapers/youtube.ts +3 -2
  269. package/src/web/search/providers/insane.ts +91 -28
  270. package/src/web/search/providers/searxng.ts +62 -10
package/CHANGELOG.md CHANGED
@@ -2,6 +2,299 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.18.12] - 2026-10-16
6
+
7
+ ### Added
8
+
9
+ - Added the `task.compactSubagentPanel` setting. When it is on, live subagent await progress collapses into one summary line such as `12 subagents running · 3 idle >30s`, plus any provider-degradation warning and an expand hint, until tool output is expanded. Await progress then refreshes only when that summary changes, so redraw cost and frequency no longer grow with the number of live subagents. Final results, including timeout guidance and failure receipts, still render in full (#6774).
10
+
11
+ - `--credential`, `--prefer-credential`, `/credential`, `gjc accounts pin`, and `gjc accounts logout --account` accept `org:<organization id or name>` to choose one organization of an Anthropic account that belongs to several. Account lists show the organization name next to the email, and `gjc accounts logout --account <email>` refuses when that email matches more than one organization instead of guessing.
12
+
13
+ - Reload user settings and model configuration in open Linux interactive sessions with verified private configuration directories at safe request boundaries, with validated changes, preserved session overrides, and refreshed model/status displays. macOS and Windows require a session restart after configuration edits until equivalent permission verification is available.
14
+
15
+ - Added global `auth.credentialPreferences`: an ordered list of preferred OAuth accounts per provider, each optionally capped by a usage percent (`- low-cost@example.com` then `- shared@example.com: 75`). The first listed account that is usable and under its cap is used; once every listed account is rate-limited or at its cap, the remaining accounts are ranked normally. Unlike `auth.credentialPins`, a preference never blocks the provider. The key is global-only and ignored in project settings. Startup fails closed when two entries name the same stored account, including through different selectors such as an email and `account:<id>`.
16
+ - Added `gjc accounts prefer <provider> <account>[=<percent>]...` to write that list without editing YAML. It checks every account against the stored OAuth rows, stores portable email/account selectors in a form startup reads back (`email:<address>` when the bare text would not read back as the same address), and writes nothing when any account is missing, ambiguous, duplicated, or has an invalid cap. `gjc accounts prefer <provider> --clear` removes the list.
17
+
18
+ - `gjc migrate` now imports Claude Code `CLAUDE.md` and Codex `AGENTS.md` into the selected GJC scope's `AGENTS.md`, with collision-aware dry-run reporting and symlink-safe destination writes.
19
+
20
+ - `models.yml` accepts provider-level and per-model `streamIdleTimeoutMs` settings for OpenAI-compatible Completions and Responses models, with environment overrides retaining precedence. Provider defaults also apply to registry models without conflating per-model timeout differences with transport identity. Values above the platform timer limit and model-configured timeouts on `pi-native` transports are rejected explicitly.
21
+
22
+ - Document project-scoped Parallel Search MCP setup for free, keyless web search and page fetching through the native HTTP MCP loader.
23
+
24
+ - Add `/provider status` to show each configured provider's active credential source and non-active sources that are shadowed, without displaying credential values (issue #6530).
25
+
26
+ - `report_issue` tool (opt-in via `reportIssue.enabled`): the model records tool behavior that contradicts the tool's description into the local `~/.gjc/tool-issues.db`. Reports are never uploaded; read them with `gjc read '~/.gjc/tool-issues.db:tool_issues'`.
27
+
28
+ - Added `ultrafast` as a valid service tier value in user settings (`serviceTier` enum)
29
+ - Added `ultrafast` to SDK protocol validation for service tier operations
30
+
31
+ ### Changed
32
+
33
+ - Settings schema now recognizes and validates `ultrafast` alongside existing tiers (auto, default, flex, scale, priority, openai-only, claude-only)
34
+ - Trusted local SDK controls may set `ultrafast`; model-facing and chat adapter inputs remain restricted
35
+
36
+ ### Fixed
37
+
38
+ - Keep SDK deadline recovery leased while owned tools are pending; bounded retries wait for exact tool-settlement evidence before publishing the prompt's terminal outcome (#6508).
39
+
40
+ - The Bash tool's `read` builtin now decodes valid UTF-8 as text and preserves Windows ANSI-code-page text from native pipelines instead of replacing it, so `while IFS= read -r line` loops pass non-ASCII text through intact, `read -n`/`-N` count UTF-8 characters rather than bytes, and timed-out reads retain consumed partial input (#6543).
41
+ - `mapfile` into a readonly array now fails before reading, leaving piped input for the next reader as bash does.
42
+ - Terminal-backed custom shell streams are now recognized by `read` and `mapfile`, preserving terminal mode and control-key handling.
43
+
44
+ - Allow dead retained Python sessions to recover after unconfirmed shutdown while retaining the old kernel for explicit cleanup retries.
45
+
46
+ - The embedded shell reads its own standard input without buffering, so input that a builtin such as `read -n1` did not consume is still available to the next command that inherits stdin, and `read -t` no longer times out on input that was already read into the buffer.
47
+
48
+ - Session listing, including `/resume`, reads a project's retired-session tombstones once per listing instead of once per session candidate. It used to open and parse every tombstone again for each candidate, so listing slowed down as sessions were deleted. With 116 sessions and 252 tombstone files that was 29,232 file reads and 8–10 s. It is now 252 reads and 1–3 s, and the same sessions are hidden (#6757).
49
+
50
+ - Report a denied Windows open of the staged update or the live `gjc.exe` during `gjc update` as `access_denied` with its NTSTATUS code instead of a misleading `owner_mismatch`, so the activation is kept pending for a safe retry (#6760).
51
+
52
+ - Preserve lifecycle input refusals in public JSON and text errors with a fixed `lifecycle_input_refused` diagnostic for invalid request payloads, without exposing broker-supplied error text.
53
+
54
+ - Load the multisession characterization harness's bench-mock extension from its isolated user agent directory without enabling automatic project extension imports.
55
+
56
+ - Mid-run context maintenance no longer ends the turn with `Context maintenance could not commit a compaction before the next model request.` when compaction has nothing to summarize but the unchanged context still fits the model window with its reserve. It sends the request, as the end-of-turn threshold check already does. This was common on 1M-window models when a session started with one very large message (#6813).
57
+
58
+ - A project `.env` declaration of `GJC_ACP_PERMISSION_MODE` no longer switches ACP gated tools to allow; a launching-shell value that does not repeat that declaration is still honored.
59
+
60
+ - The python tool now uses the same ACP and SDK permission gate as eval. Prompt mode asks before it runs, and deny mode rejects it. Allow mode is unchanged, and tool names outside that gate still run without a prompt.
61
+
62
+ - `gjc accounts logout --account org:<value>` and `gjc accounts pin <provider> org:<value>` prefer the organization whose id matches exactly over display-name matches, and refuse a display name shared by several organizations while listing the candidate row ids.
63
+
64
+ - Execution handoff no longer treats a pre-append approval index as sanctioned while the approval transaction journal is still pending.
65
+
66
+ - Ralplan and deep-interview execution approval no longer fails at the ultragoal handoff with `execution approval transcript identity changed` after the session transcript is rewritten. Session persistence replaces the transcript file by atomic rename on full rewrites, which changes its inode, so the approval boundary now binds the approved transcript content (prefix length and SHA-256, leaf, and Ask tool call) instead of the file's device and inode. Edited, rewound, or newly user-bearing transcripts are still rejected, and approval records written before this change remain readable.
67
+
68
+ - Assistant SVG fences now respect `terminal.showImages`, including changes made while a message is already rendered.
69
+
70
+ - `ast_edit` refuses a single-file path whose real path leaves its reference root, so a symlink cannot rewrite a file outside that root.
71
+
72
+ - Preserve ordinary SDK and folded ACP completion delivery when secured output storage is unavailable, with truthful bounded previews and artifact completeness notices.
73
+
74
+ - The auto-generated edit guard now blocks `*.generated.ts` names and leading `Generated by scripts/` or `Auto-generated by` stamps.
75
+
76
+ - Require direct file tools to write the root `autoresearch.sh` during active research missions, rejecting symlinks and preventing compound commands from retargeting the harness; new and regular harnesses remain writable.
77
+
78
+ - Keep the autorouting tier-map gate passing for new Gemini 4 Argon and India-region Bedrock catalog entries without assigning unreviewed Gemini tier ordering.
79
+
80
+ - Restore fast capture of large multi-line command output with bounded column-cap batches, while preserving secret-aware clipping.
81
+
82
+ - `--continue` no longer resumes a terminal breadcrumb whose session file is absent from the selected continuation inventory. A project-local session already in that inventory is still resumed ahead of a newer sibling. A breadcrumb that names a session the managed listing owns is unchanged, and an explicit session directory still prefers its own terminal breadcrumb when that file stays inside the directory.
83
+
84
+ - Recover SDK broker startup when a stale lock's PID has been reused by a different process incarnation, serialize concurrent reclamation, and reap aged PID-reuse tombstones without weakening fail-closed behavior when incarnation evidence is unavailable. Lock reclamation now requires host qualification: only same-host owners are reclaimed using PID/incarnation evidence; foreign-host and host-unqualified (legacy) owners are never reclaimed from local PID evidence alone (#6719).
85
+
86
+ - The Codex native hook no longer reads a session transcript from a `GJC_SESSION_FILE` value that the repository dotenv planted. An operator path the project does not declare is still used.
87
+
88
+ - Codex MCP import no longer writes a resolved secret into `.gjc/mcp.json`. An import into the project config omits `bearer_token_env_var`, `env_vars`, and `env_http_headers` references, including a user config imported into the project, so a later load cannot expand a host value. An import into the global config keeps a local name as `${NAME}`. An entry whose source is not local is skipped.
89
+
90
+ - Column caps in streamed tool output and file reads no longer return partial configured plain secrets across a cut, including shorter overlapping prefixes and secrets that continue across newline boundaries. Raw reads and hashline output remain unchanged.
91
+
92
+ - Redact credentials in the formatted commit header and detail lines before they are passed to git commit.
93
+
94
+ - Redact changelog-shaped credentials and npm tokens in generated task commit messages before the provider request and before the message is returned.
95
+
96
+ - Stopped showing "Configuration watching could not start because directory ownership and privacy could not be verified" on every interactive launch on macOS and other non-Linux platforms, where configuration hot reload is unsupported; the warning now appears only when a supported platform finds untrusted configuration directories.
97
+
98
+ - Prevent watcher startup and configuration application after interactive stop or shutdown, including when a directory trust check is still pending.
99
+ - Preserve successive manual model selections, completed provider discovery, and unchanged credential discovery restrictions during configuration reload. Validate reload credentials without rejecting refreshable OAuth accounts or registering API keys that conflict with a credential pin in any live session.
100
+ - Preserve live model, thinking-level, and newer profile-owned selection state across asynchronous reload preparation and rollback after publication failures.
101
+ - Re-stage an immutable reload snapshot after a catalog refresh invalidates preflight, and re-arm failed directory watches so ordinary later saves are still observed.
102
+
103
+ - Coordinator managed-worktree roots no longer grow from a repository `.env` `GJC_WORKTREE_DIR`. An operator value the project does not declare is unchanged.
104
+
105
+ - Crash egress now refuses a leftover 40-character AWS secret or percent-encoded `sessionid` cookie that the scrubber did not mask.
106
+
107
+ - Custom and MCP tools that declare `strict` or `concurrency` no longer crash MCP tool refresh with "Attempted to assign to readonly property". The adapter now sets those fields before proxying the rest of the tool.
108
+
109
+ - The debug tool refuses an adapter binary controlled by the session workspace when `cwd` points at a different directory, matching the check already applied to the command cwd.
110
+
111
+ - The debugpy adapter starts with `python -I`, so a repository `debugpy` package in the working directory is not imported in place of the installed adapter.
112
+
113
+ - The debug tool prompt names `python -I -m debugpy.adapter`, matching the adapter command that already starts with `-I`.
114
+
115
+ - A JavaScript eval cell can no longer forge a tool call or a successful result by posting on the worker `parentPort`. A tool reply from the host still returns that tool's value.
116
+
117
+ - Atomic writes inside an explicit artifacts local root now use that root as the trust boundary. A symlink there whose target was moved outside is refused, and a normal file inside the root is still written.
118
+
119
+ - A live session no longer leaves `sessions/index.jsonl.lock` behind when its release collides with the previous lock generation's `.removing.owner` record, which that remover clears only after its tree is gone. The collision was reported as `owner_changed`, which release treats as final, so the lock stayed on disk under a live owner until the same process acquired it again; idle sessions never did, and every other session failed with `FileLockAcquireError ... after 600 attempts ... a live owner is never displaced`. The collision is now reported as the retryable `removal_record_busy`, and a release that still fails is retried in the background (250 ms to 60 s, five attempts) with the same owner and identity checks, so it can only remove its own generation.
120
+ - Pending release retries preserve the original root and owner-file identity instead of authorizing whatever occupies the lock path later. A replacement directory cannot inherit removal authority by copying the original owner metadata; retries also refuse removal if the initial identity capture failed.
121
+ - A foreign host's remover record is also retryable contention when its transition directory is already gone. Successors wait for the foreign remover to clear its own record without probing its PID or deleting its metadata; an existing foreign transition remains protected.
122
+
123
+ - Stop `@word` mentions that name no file (chat handles such as `(@handle)` in gateway speaker headers, email addresses) from auto-attaching an unrelated workspace file: the fuzzy fallback now requires the query to spell prefixes of path segments in order instead of any scattered subsequence.
124
+
125
+ - Preserve mandatory MCP ownership for validated plugin-bundle tools across startup and late catalog updates; caller-owned source metadata cannot grant mandatory status. Keep colliding user tools selectable.
126
+
127
+ - A project `.gjc` file can no longer satisfy the explicit `sdk.flushWorktreeOnDeadline` opt-in that autosaves a primary checkout when a prompt deadline fires.
128
+
129
+ - `gjc gc` ignores a project `.env` value for `GJC_CODING_AGENT_DIR` and `PI_CODING_AGENT_DIR`, and still uses an operator value the project does not declare. For the process environment that decision uses the dotenv provenance captured when the environment was loaded, so deleting or rewriting the declaration afterward cannot make the loaded value trusted.
130
+
131
+ - The default `/share` gist upload no longer forwards a project `.env` `GH_HOST` or `GH_CONFIG_DIR` to `gh`; an operator value the project does not declare is kept.
132
+
133
+ - Grok Build ignores a project dotenv declaration of its credential base URL and unsafe opt-in, including a quoted value whose suffix follows the closing quote and a quoted value that keeps spaces inside the quotes. Other repository `.env` entries are unchanged.
134
+
135
+ - A project settings file can no longer choose `hindsight.apiUrl`. The Hindsight client keeps the user config endpoint, so a repository cannot redirect the operator API token or retained conversation text.
136
+
137
+ - Session HTML export scrubs credential-shaped text inside embedded session values before base64 encoding, including any value stored under a credential JSON key.
138
+
139
+ - Insane public-route fetches re-validate each redirect and refuse private or loopback targets instead of following them.
140
+
141
+ - Keep accepted SDK prompt terminal outcomes private until exact run/tool settlement evidence is available.
142
+ - Preserve queued subagent owner and generation identity, plus fail-closed saturation evidence across endpoint rekeys, shutdown cancellation, and queue draining.
143
+
144
+ - Keep SDK broker heartbeat checkpoint work within its monotonic budget by avoiding redundant process probes during structural projection and stopping further synchronous identity probes after the deadline expires (issue #6624).
145
+
146
+ - Allow new SDK session creation past unrelated legacy `terminal_uncertain` lifecycle rows while preserving exact-key handling and session-scoped uncertainty fences (issue #6665).
147
+
148
+ - Allow SDK `session.close`, `session.resume`, `session.delete`, and `session.reconcile_uncertain` requests past unrelated final legacy lifecycle rows recorded for other sessions, while keeping live, same-session, unrecorded-session, and reused-key legacy rows fenced (issue #6708).
149
+
150
+ - Retry transient Windows replacement failures only while the installed binary remains published; after a retained-publication denial, restore the predecessor before returning. Preserve and reuse verified candidates, surface retained cleanup paths even during rollback, and preserve the structured error code through `doctor install.restore-binary`.
151
+
152
+ - Honor broker-authorized operator terminal aborts across SDK connections so they can stop another connection's active turn without weakening terminal-settlement checks (issue #6772).
153
+
154
+ - Launch worktree cleanup no longer deletes through a symlinked worktree path, or through an in-repo bucket path that resolves outside the repository.
155
+
156
+ - A gitignored `.worktrees` symlink that points outside the repository is refused before launch, so `git worktree add` cannot materialize the worktree through that link.
157
+
158
+ - Redact known secrets in generated changelog entries before they are written to CHANGELOG.md.
159
+
160
+ - On POSIX, a managed local:// root and its temp parent are adopted only when this user owns them and they are not group- or world-writable, and a later resolve refuses that root when the directory has been replaced. A root this process recreated can finish initialization after a failed marker write. Windows does not apply the owner and mode checks.
161
+
162
+ - Session title debug logs and marketplace clone debug logs scrub credential text with the existing crash redactor before they are written.
163
+
164
+ - Resuming managed sessions now ignores legacy directory names that exceed the filesystem filename limit.
165
+
166
+ - A project dotenv declaration no longer chooses the managed-owner recovery transcript; an operator value the project does not declare is still forwarded.
167
+
168
+ - Forward MCP tool-result images and embedded image resources to image-capable models on providers that support tool-result images, using bounded built-in image resizing and source-dimension limits while preserving untrusted text markers and text-only error results. Attached images carry an explicit untrusted-content notice.
169
+ - Honor cancellation during MCP image processing and use the detected image MIME type for mislabeled images.
170
+
171
+ - MCP server tool text is marked with the same untrusted-content boundary already used for remote URL output, while the original server content stays on `rawContent` and the tool view still shows the body.
172
+
173
+ - Migration refuses to write project MCP config through a symlinked `.gjc` directory.
174
+
175
+ - Saving a custom model profile refuses a symlink at `models.yml`, creates the file as owner-only (`0600`), and creates a missing parent directory as mode `0700`.
176
+
177
+ - Planning and autoresearch mutation checks now cover recognized eval and python writes, including the destination of a qualified `os`/`shutil` copy or rename and `renameSync`/`copyFileSync`, even when whitespace or a line continuation precedes the attribute. Dynamic path expressions and non-literal `open` modes fail closed. A `Path` write inspects every constructor argument before `write_text` or `write_bytes`. Non-mutating code and the autoresearch.sh research artifact stay allowed. Alias imports and `Path.open` are not scanned.
178
+
179
+ - MCP OAuth token exchange, dynamic client registration, and authorization-server metadata requests are pinned to the validated public address and no longer follow redirects. Those fetches are refused when a proxy environment variable is set.
180
+
181
+ - Patch delete checks the real parent directory before unlinking, so a directory symlink cannot remove a file outside the workspace or the session local root.
182
+
183
+ - Patch create and move check the real parent directory before mkdir, so a directory symlink cannot create a directory outside the workspace or the session local root.
184
+
185
+ - Planning-phase bash now allows `.gjc/_session-*` specs and plans only for the current session's encoded directory. Another session's specs and plans are refused. The current session's own specs and plans, and unscoped `.gjc/specs` and `.gjc/plans`, stay writable.
186
+
187
+ - The plan review external editor now refuses to save through a symlink that leaves the session local root, while a normal plan file inside that root is still updated.
188
+
189
+ - Kept a user MCP tool registered when a GJC plugin bundle server normalizes to the same name, without leaving that user tool or an omitted plugin tool on the required-name list.
190
+
191
+ - Configuration reload preserves the role mappings of an active model profile, and successor profiles rebase configured agent-role bindings from the current configuration instead of stale values captured before reload. Removed configured bindings are no longer revived from an active profile's baseline.
192
+
193
+ - Subagent shutdown proofs preserve queued records while their owners are fenced and restart that work after live failures reconnect the predecessor and release the fence. Queued restarts wait for prior backing executions to settle; committed purges publish terminal evidence for queued waiters, and proofs validate captured record identity and generation.
194
+
195
+ - A repository `.gjc/extensions` module and a project `extensions` setting are no longer imported at session startup. An extension in the user agent directory, a user `extensions` setting, and an explicit extension path still load.
196
+
197
+ - A project `.gjc/mcp.json` stdio server is no longer spawned unless the user config sets `mcp.enableProjectConfig` to true. A project settings file cannot turn that opt-out back on. A stdio server in the user `mcp.json` still starts.
198
+
199
+ - A persistent Python kernel cell can no longer forge a control frame by writing a raw NDJSON line to stdout. Those bytes are cell output, and a normal runner frame still completes the cell.
200
+
201
+ - Let departing Python owners finish their own cleanup without waiting for another owner's shared startup or inheriting its later cleanup errors, while retaining actual owned shutdown obligations.
202
+
203
+ - Read-only bash rejects `rg --hostname-bin`, which runs an arbitrary program to supply a hostname.
204
+
205
+ - Read-only bash blocks `file -C` / `--compile` and its long-option abbreviations while preserving inspection option arguments.
206
+
207
+ - Avoid one redundant inventory count during read-only GC receipt verification while retaining fresh evidence checks, existing work limits and unchanged writer/deletion behavior.
208
+
209
+ - The recipe tool now uses the same ACP and SDK permission gate as bash. Prompt mode asks before it runs, and deny mode rejects it. Allow mode is unchanged, and tool names outside that gate still run without a prompt.
210
+
211
+ - `lsp` `rename_file` checks the source, destination, and every `willRenameFiles` edit path with the existing workspace check before it writes any of them. A Windows drive root still allows that volume and rejects another drive or share. POSIX `/` stays unchecked.
212
+
213
+ - Replace-mode edits refuse auto-generated files when that guard is enabled, and a multi-entry replace is published only after every entry passes.
214
+
215
+ - Debug report bundles remove credential shapes from the session, log, artifact, and subagent copies, and from environment values whose names are not already replaced.
216
+
217
+ - Restricted role-agent bash binds `gjc` session selectors to the tool session or its credential session, and binds `--worktree-root` to that session's repository.
218
+
219
+ - Continue file-lock acquisition after a refused orphan-transition adoption and preserve paths for every retained transition state. Keep startup-fence acquisition open through the orphan-adoption age, and retry session-index lock timeouts up to twice within the fence, releasing the spawn lock before retrying. Refuse ordinary or mismatched starts during an unexpired committed restart; authorize successors only against its matching expiry across child-fence acquisition, startup, and parent acceptance.
220
+ - Preserve a verified successor publication when trampoline handoff release crosses its lease deadline, and return a typed startup-lock-unavailable refusal when contention outlasts that deadline.
221
+ - Retry successor validation when its short operation deadline expires but the committed lease remains live; bound post-spawn discovery reads by lease expiry and clean up unpublished children on timeout; and consume one-shot restart credentials before the broker launches session hosts.
222
+
223
+ - Wait for same-process SDK broker discovery retirement after shutdown RPC failure; keep startup blocked while the incumbent owner remains published.
224
+
225
+ - SDK lifecycle sessions ignore a project dotenv `GJC_SDK_TEST_IN_MEMORY_SESSION` line, so a repository `.env` cannot disable transcript persistence; an operator value the project does not declare is still honored.
226
+
227
+ - SearXNG no longer attaches an operator environment credential (`SEARXNG_TOKEN` or basic-auth username and password) to an endpoint that came from the project settings layer. A complete credential set in that project layer is still sent. An incomplete project basic-auth pair is not filled from the environment and does not fail the search. An endpoint and credential that both come from the operator environment are still sent.
228
+
229
+ - Latest-session auto-detect skips an activity timestamp more than two minutes ahead, so a planted future `updated_at` cannot replace a real session.
230
+
231
+ - Latest-session auto-detect skips a session directory whose name decodes to a separator or `..`, so one such directory no longer stops discovery of the other sessions.
232
+
233
+ - Coordinator session state persistence no longer wedges permanently when a process is killed while an owner record is being rewritten in place. The rewrite used to `truncate(0)` before writing, so every rewrite passed through a zero-length record — and an empty record carries no `owner_host_id`, which made the leftover transition claim unattributable, unreclaimable, and fatal: every later contender timed out after 60s with `transition_claim_timeout (reclaim refused: claim_or_owner_unreadable)` and the session's runtime-state snapshot stopped advancing for good. The replacement bytes are now written over the head of the record and its previous length is preserved with trailing whitespace, which JSON ignores, so the bytes on disk always carry the full ownership preamble a later contender needs to prove the dead owner and reclaim the claim (#5159, #5216).
234
+ - An owner record's bytes now land on the descriptor before `chmod` in the create path. `chmod` is a metadata round-trip that a File Provider, NFS, or CIFS mount can hold for seconds, and every syscall in front of the write is a window in which a freshly created record is empty and its claim unattributable; the create's own mode argument already excludes anything more permissive than `0o600`.
235
+
236
+ - A repository `.gjc/settings.json` `shellMinimizer.settingsPath` no longer rewrites command output. The minimizer loads that TOML file only when a user/global `shellMinimizer.settingsHash` matches it. A settings path in the user settings file, and a runtime override of that path, are still used.
237
+
238
+ - A repository `.gjc/settings.json` `shellPath` no longer selects the shell. A `shellPath` in the user settings file is still used. Bash runs that shell. The Python executor uses the shell environment from the same resolver and runs its own Python path.
239
+
240
+ - A project settings file can no longer set `skills.trustProjectSkills` or the legacy `skills.enablePiProject` alias. The user config keeps that consent, so a repository cannot turn a disabled project-skill gate back on.
241
+
242
+ - Pre-admission artifact spill redacts configured secrets on the full tool result before the head/tail cut, so a secret that straddles the cut is not sent to the provider as plaintext.
243
+
244
+ - SQLite row updates refuse a database whose real path is outside the workspace, so a symlink inside the project cannot change an outside file.
245
+
246
+ - Flatten control characters in `gjc stats --summary` labels so a session model or folder cannot forge a row or emit a terminal escape.
247
+
248
+ - Crash reports scrub stderr with the existing crash redactor before the preview is trimmed to 4096 bytes, so a token that sits in that window is not stored.
249
+
250
+ - Subagent receipt guidance, such as the await-timeout instruction to inspect progress before cancelling, now wraps to the terminal width instead of being cut to one 80-column preview line. At 60 or 80 columns the instruction used to end mid-sentence before `Inspect progress` or `never cancel`.
251
+
252
+ - Compaction, handoff, and branch-summary requests obfuscate registered secrets in text blocks, including a stored summary copied into the next summary prompt.
253
+
254
+ - Refresh built-in Task authority after committed session moves without weakening repository checks, and retain admitted execution inputs for queued and resumed work.
255
+
256
+ - Keep queued and live resident Task transcripts and outputs on verified same-owner managed storage after session moves, without changing admitted child cwd, identity, or conversation.
257
+ - Refresh derived artifact authority after physical move rollback and re-prepare pending metadata writes across verified storage-only relocation.
258
+
259
+ - Task subagents now copy an enabled parent plan mode before the first prompt, so a product-file write on the child is refused the same way as on the parent. Writes outside plan mode, and writes of the plan file, stay allowed.
260
+
261
+ - Resumed task runs recompute the current tier map, disabled-provider policy, and credentials, and fail closed when a matched tier has no authenticated candidate.
262
+
263
+ - Task subagents now copy the parent ACP/SDK approval mode. Deny still rejects a child tool call, and prompt still asks through the parent permission callback. Allow is unchanged, and terminal or filesystem routing is not copied onto the child.
264
+
265
+ - Planning-phase mutation checks ignore a project dotenv `TMPDIR` and still allow writes under the real OS temp directories.
266
+
267
+ - `todo_write` returns a tool result instead of a raw `TypeError` when a task holds a non-string note (for example from a persisted session or a bridged caller), and a note body that is not a string is rejected with a message naming the `text` field instead of crashing the call.
268
+
269
+ - Ultragoal no longer appends goal-mode state to a session transcript whose path a repository `.env` planted in `GJC_SESSION_FILE`. An operator-supplied path the project does not declare is still used.
270
+
271
+ - Ultragoal no longer writes a goal-mode request into a session whose id a repository `.env` planted in `GJC_SESSION_ID`. An operator-supplied id the project does not declare is still used.
272
+
273
+ - File identity comparisons for user-agent and containment-root isolation now use exact bigint precision end-to-end: stat calls capture full 64-bit device and inode IDs, and comparisons are direct bigint equality without rounding. This prevents a security regression on Windows where replaced directories in the same double-rounding bucket could pass isolation checks.
274
+
275
+ - Windows SDK broker now uses an intermediate 'hop' process to spawn with `detached:true`, allowing the broker to survive parent tree termination (taskkill /T /F). The hop exits immediately after spawning the real broker with detached mode and windowsHide, breaking the process tree chain. This avoids cmd.exe wrapping complexity (quoting, variable expansion, discovery matching) while ensuring broker survival across force-termination scenarios (issue #6007).
276
+ - On macOS, SDK broker startup retains its acknowledged trampoline until discovery is published, then hands the broker to launchd and uses authenticated shutdown for cleanup instead of detached-PID signaling.
277
+
278
+ - Prevent Windows file-lock staging cleanup from opening live publishers' metadata, use liveness-probed legacy names when process identity is unavailable, retry sharing violations as contention, preserve permanent access-denied publication errors in file locks and managed sessions, and show a manual cleanup command for ambiguous empty locks (issue #6603).
279
+
280
+ - Detect project-declared `TMPDIR` from the workflow guard caller's cwd while retaining startup dotenv declarations after `.env` is removed or the process changes directories.
281
+ - Bound workflow-guard dotenv provenance reads to regular files no larger than 64 KiB; unsafe layers fail closed for non-system temp roots.
282
+
283
+ - The YouTube scraper reads `providers.parallelFetch` from the settings of the caller that dispatched it instead of the process-global settings singleton. A runtime that never calls `Settings.init()` — the SDK/ACP host path and workflow lanes that drive `read`/`fetch` — threw `Settings not initialized. Call Settings.init() first.` on every YouTube URL before any fetch was attempted. Special handlers now receive `settings` alongside `storage`, and the registry exposes the real `handleYouTube` instead of a wrapper that dropped both trailing arguments, so Parallel extract is reachable and no scraper needs the global singleton.
284
+
285
+ ### Security
286
+
287
+ - The computer tool now uses the same ACP and SDK permission gate as other side-effect tools. Prompt mode asks before it runs, and deny mode rejects it. Allow mode is unchanged, and tool names outside that gate still run without a prompt.
288
+
289
+ ### Notes
290
+
291
+ The ultrafast tier works like flex/scale/priority — it's a cost and processing priority tier, not an Anthropic fast-mode tier. Fast-mode predicates (`isFastModeEnabled`, `isFastForProvider`) correctly exclude ultrafast, maintaining the semantic distinction that ultrafast is a pure cost/priority layer.
292
+
293
+ Users can configure ultrafast via:
294
+ - Settings: `serviceTier: "ultrafast"`
295
+ - SDK: `service_tier.set` with tier value `"ultrafast"` on trusted local control routes
296
+ - Command line: future `/fast ultrafast` or UI tier selector additions
297
+
5
298
  ## [0.18.11] - 2026-10-12
6
299
 
7
300
  ## [0.18.10] - 2026-10-12
@@ -155,6 +155,8 @@ export interface SubagentRecord {
155
155
  seq: number;
156
156
  message?: string;
157
157
  resumeToolCallId?: string;
158
+ admissionEndpointId?: string;
159
+ ownedRegistrationEndpointId?: string;
158
160
  createdAt: number;
159
161
  };
160
162
  /** Last queued-resume seq for a CANCELLED queued resume (rec.queued is
@@ -187,7 +189,7 @@ export interface ResumeDescriptor {
187
189
  * In-memory resume runner bound to the session that originally launched a
188
190
  * subagent. Never serialized: process restart drops it so resume fails closed.
189
191
  */
190
- export type ResumeRunner = (subagentId: string, message?: string, descriptor?: ResumeDescriptor, resumeToolCallId?: string) => string | undefined;
192
+ export type ResumeRunner = (subagentId: string, message?: string, descriptor?: ResumeDescriptor, resumeToolCallId?: string, admissionEndpointId?: string, ownedRegistrationEndpointId?: string) => string | undefined;
191
193
  export interface AsyncJobManagerOptions {
192
194
  onJobComplete: (jobId: string, text: string, job?: AsyncJob) => void | Promise<void>;
193
195
  maxRunningJobs?: number;
@@ -361,7 +363,7 @@ export declare class AsyncJobManager {
361
363
  * resume can neither resolve its lineage nor register its owned tuple
362
364
  * (review thread P1). Returns TRUE when the mapping was moved (or no move
363
365
  * was needed); returns FALSE when the successor endpoint is owned by a
364
- * FOREIGN live manager — the transition must then abort or roll back
366
+ /**
365
367
  * BEFORE retiring predecessor state, because leaving this manager under
366
368
  * the predecessor while tools resolve the successor to the foreign
367
369
  * manager sends jobs to the wrong session and owned aborts lose their
@@ -447,7 +449,9 @@ export declare class AsyncJobManager {
447
449
  cancelAndProveOwnerSubagents(lease: OwnerSubagentShutdownLease, options?: {
448
450
  timeoutMs?: number;
449
451
  }): Promise<OwnerSubagentShutdownProof>;
450
- finishOwnerSubagentShutdown(lease: OwnerSubagentShutdownLease, outcome: "commit" | "release"): void;
452
+ finishOwnerSubagentShutdown(lease: OwnerSubagentShutdownLease, outcome: "commit" | "release", options?: {
453
+ drainResumeQueue?: boolean;
454
+ }): void;
451
455
  /** Request a graceful safe-boundary pause of a running subagent. */
452
456
  pauseSubagent(subagentId: string, filter?: AsyncJobFilter): {
453
457
  ok: boolean;
@@ -0,0 +1,2 @@
1
+ import type { SessionManager } from "../session/session-manager";
2
+ export declare function formatAsyncResultForFollowUp(sessionManager: SessionManager, result: string, allowArtifact?: boolean): Promise<string>;
@@ -21,7 +21,7 @@ export declare function getCurrentAutoresearchBranch(workDir: string): Promise<s
21
21
  * Mission state under `.gjc/**` is intentionally NOT listed here: it is
22
22
  * runtime-owned and only the sanctioned `gjc autoresearch` CLI writes it.
23
23
  */
24
- export declare function isAutoresearchAuthorizedResearchPath(_cwd: string, rawPath: string): boolean;
24
+ export declare function isAutoresearchAuthorizedResearchPath(cwd: string, rawPath: string): boolean;
25
25
  /**
26
26
  * Ensure the working tree is on an `autoresearch/*` branch when possible.
27
27
  *
@@ -2,8 +2,8 @@ import * as fs from "node:fs";
2
2
  /** Authority used when reading from an explicit-home discovery context. */
3
3
  export type ReadScope = "project" | "user" | "native";
4
4
  export interface FileIdentity {
5
- readonly dev: number;
6
- readonly ino: number;
5
+ readonly dev: bigint;
6
+ readonly ino: bigint;
7
7
  }
8
8
  export interface ReadFileOptions {
9
9
  /** Canonicalize the file and enforce the supplied home/profile boundary. */
@@ -1,9 +1,9 @@
1
- export declare const ACCOUNTS_ACTIONS: readonly ["list", "check", "pin", "logout"];
1
+ export declare const ACCOUNTS_ACTIONS: readonly ["list", "check", "pin", "prefer", "logout"];
2
2
  export type AccountsAction = (typeof ACCOUNTS_ACTIONS)[number];
3
3
  export interface AccountsCommandArgs {
4
4
  action: AccountsAction;
5
5
  provider?: string;
6
- selector?: string;
6
+ selectors?: readonly string[];
7
7
  flags: {
8
8
  json?: boolean;
9
9
  persistent?: boolean;
@@ -10,6 +10,7 @@
10
10
  * `reconcileActivationRecord`.
11
11
  */
12
12
  import { type DirectoryIdentity, type FileIdentity } from "../install-activation";
13
+ import { InstallationAccessDeniedError } from "../update-cli";
13
14
  export type InstallSourceKind = "standalone" | "source" | "npm-wrapper" | "unknown";
14
15
  /**
15
16
  * The trust anchor for "this target is the exact binary the current process
@@ -62,8 +63,10 @@ export interface InstallRepairResult {
62
63
  readonly reason?: string;
63
64
  readonly recordPath?: string;
64
65
  readonly sideEffectStarted: boolean;
65
- /** Present only for a pre-mutation Windows sharing violation (nothing was renamed). */
66
+ /** Native Windows status returned by exact replacement. */
66
67
  readonly windowsErrorCode?: string;
68
+ readonly stagingCleanupWarning?: string;
69
+ readonly retainedPaths?: InstallationAccessDeniedError["retainedPaths"];
67
70
  readonly before?: {
68
71
  readonly identity?: FileIdentity;
69
72
  readonly digest?: string;
@@ -134,8 +134,12 @@ export interface ReconcileResult {
134
134
  readonly record?: ActivationRecordV1;
135
135
  readonly recordIdentity?: FileIdentity;
136
136
  readonly reason?: string;
137
- /** Present only for a pre-mutation Windows sharing violation on the destination open. */
137
+ /** Present only for a pre-mutation Windows exact-replacement failure. */
138
138
  readonly windowsErrorCode?: string;
139
+ readonly detachedPath?: string;
140
+ readonly retainedSuccessorPath?: string;
141
+ readonly retainedPlaceholderPath?: string;
142
+ readonly retainedUnknownPath?: string;
139
143
  }
140
144
  /**
141
145
  * Reconcile the activation record for `targetPath` against durable state.
@@ -148,9 +152,11 @@ export interface ReconcileResult {
148
152
  * records are re-verified and advanced to `verified` once the target
149
153
  * digest/identity matches the candidate. `verified` records are read-only
150
154
  * re-confirmations. Anything else (target/parent drift, missing staged
151
- * candidate, an already-occupied backup name, a pre-mutation Windows
152
- * sharing violation) is reported as `conflict` with the exact reason and
153
- * never silently promoted.
155
+ * candidate, an already-occupied backup name) is reported as `conflict` with
156
+ * the exact reason and never silently promoted. A pre-mutation Windows
157
+ * sharing violation becomes `pending_activation`; an access-denied result is
158
+ * also recorded as pending for safe reuse but remains a `conflict` so the
159
+ * caller reports the publication failure.
154
160
  */
155
161
  export declare function reconcileActivationRecord(targetPath: string, options?: {
156
162
  readonly allowPromotion?: boolean;
@@ -81,6 +81,7 @@ export declare const PUBLIC_COMMAND_DIAGNOSTICS: {
81
81
  readonly router_cleanup_failed: "SDK session Router cleanup failed.";
82
82
  readonly broker_cleanup_failed: "SDK broker client cleanup failed.";
83
83
  readonly lifecycle_idempotency_conflict: "The broker reported an idempotency conflict. Reconcile existing lifecycle state before deciding whether another request is safe.";
84
+ readonly lifecycle_input_refused: "The broker refused the request as invalid input. Correct the request payload and reconcile existing lifecycle state before deciding whether another request is safe.";
84
85
  readonly usage_transport_exclusive: "Specify exactly one of --stdio or --socket <path>.";
85
86
  readonly usage_duplicate_option: "Each option on this command may occur at most once.";
86
87
  readonly usage_unknown_argument: "An unrecognized argument was supplied; re-read the command help for its accepted grammar.";
@@ -10,7 +10,7 @@ import { type UpdateChannel } from "../config/update-channel";
10
10
  import { type NotificationProvider } from "../sdk/bus/config";
11
11
  import type { TelemetryDetails, TelemetryEventName } from "../telemetry";
12
12
  import { type GithubReleaseLookupOptions } from "./github-release";
13
- import { type DirectoryIdentity, type FileIdentity } from "./install-activation";
13
+ import { type DirectoryIdentity, type FileIdentity, type ReconcileResult } from "./install-activation";
14
14
  import { offerMacosCommunityApp } from "./macos-community-app";
15
15
  export interface UpdateCommandOptions {
16
16
  force: boolean;
@@ -63,6 +63,19 @@ export interface BinaryReplacementOptions {
63
63
  verifyStagedVersion?: (stagingPath: string, expectedVersion: string) => Promise<void>;
64
64
  verifyInstalledVersion: (expectedVersion: string) => Promise<InstalledVersionVerification>;
65
65
  }
66
+ export declare class InstallationAccessDeniedError extends Error {
67
+ readonly targetPath: string;
68
+ readonly windowsErrorCode?: string | undefined;
69
+ readonly stagingCleanupWarning?: string | undefined;
70
+ readonly retainedPaths?: Pick<ReconcileResult, "detachedPath" | "retainedSuccessorPath" | "retainedPlaceholderPath" | "retainedUnknownPath"> | undefined;
71
+ readonly code = "access_denied";
72
+ constructor(targetPath: string, windowsErrorCode?: string | undefined, stagingCleanupWarning?: string | undefined, retainedPaths?: Pick<ReconcileResult, "detachedPath" | "retainedSuccessorPath" | "retainedPlaceholderPath" | "retainedUnknownPath"> | undefined);
73
+ }
74
+ export declare class ActivationRetryCandidateRepointError extends Error {
75
+ readonly candidatePath: string;
76
+ readonly reasonCode: string;
77
+ constructor(candidatePath: string, cause: unknown);
78
+ }
66
79
  /**
67
80
  * Parse update subcommand arguments.
68
81
  * Returns undefined if not an update command.
@@ -3,8 +3,8 @@
3
3
  * This module owns the effectful bootstrap (startup timing, stderr drainer,
4
4
  * bash-shell worker protocol) plus the unchanged ordinary routing order:
5
5
  * bash-shell workers -> darwin malloc re-exec -> internal smoke -> tmux owner
6
- * isolation -> managed-owner supervisor/admission/recovery -> private sdk
7
- * stderr drainer -> public family dispatch -> community app -> doctor worker /
6
+ * isolation -> managed-owner supervisor/admission/recovery -> broker hop ->
7
+ * private sdk stderr drainer -> public family dispatch -> community app -> doctor worker /
8
8
  * probe / cli -> full registry. `cli.ts` imports it lazily, only after argv has
9
9
  * been proven not to be a `sdk diagnostics` observation. */
10
10
  import { commands } from "./cli-commands";
@@ -7,7 +7,7 @@ export default class Accounts extends Command {
7
7
  action: import("@gajae-code/utils/cli").ArgDescriptor & {
8
8
  description: string;
9
9
  required: false;
10
- options: ("check" | "list" | "logout" | "pin")[];
10
+ options: ("check" | "list" | "logout" | "pin" | "prefer")[];
11
11
  };
12
12
  provider: import("@gajae-code/utils/cli").ArgDescriptor & {
13
13
  description: string;
@@ -16,6 +16,7 @@ export default class Accounts extends Command {
16
16
  selector: import("@gajae-code/utils/cli").ArgDescriptor & {
17
17
  description: string;
18
18
  required: false;
19
+ multiple: true;
19
20
  };
20
21
  };
21
22
  static flags: {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Import MCP servers and skills from other coding agents into GJC.
2
+ * Import MCP servers, skills, and instructions from other coding agents into GJC.
3
3
  */
4
4
  import { Command } from "@gajae-code/utils/cli";
5
5
  export default class Migrate extends Command {
@@ -150,3 +150,8 @@ export default class Sdk extends Command {
150
150
  static delegateHelp: boolean;
151
151
  run(): Promise<void>;
152
152
  }
153
+ /** Captures and removes one-shot restart credentials before the broker forks descendants. */
154
+ export declare function consumeBrokerRestartEnvironment(environment: NodeJS.ProcessEnv): {
155
+ requestIdEnv: string | undefined;
156
+ restartDeadlineAt: number | undefined;
157
+ };
@@ -28,3 +28,4 @@ export declare function runChangelogFlow({ cwd, model, apiKey, thinkingLevel, st
28
28
  * Apply changelog entries provided by the commit agent.
29
29
  */
30
30
  export declare function applyChangelogProposals({ cwd, proposals, dryRun, onProgress, }: ChangelogProposalInput): Promise<string[]>;
31
+ export declare function redactChangelogEntry(text: string): string;
@@ -135,12 +135,42 @@ export declare const TIER_MAP_SKIP_LIST: {
135
135
  readonly "amazon-bedrock/au.anthropic.claude-sonnet-5-5": {
136
136
  readonly rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated";
137
137
  };
138
+ readonly "amazon-bedrock/in.anthropic.claude-haiku-4-5-20251001-v1:0": {
139
+ readonly rationale: "India-region Bedrock Anthropic catalog addition (#6731); not yet curated";
140
+ };
141
+ readonly "amazon-bedrock/in.anthropic.claude-opus-5": {
142
+ readonly rationale: "India-region Bedrock Anthropic catalog addition (#6731); not yet curated";
143
+ };
144
+ readonly "amazon-bedrock/in.anthropic.claude-sonnet-5": {
145
+ readonly rationale: "India-region Bedrock Anthropic catalog addition (#6731); not yet curated";
146
+ };
138
147
  readonly "amazon-bedrock/jp.anthropic.claude-sonnet-5-5": {
139
148
  readonly rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated";
140
149
  };
141
150
  readonly "amazon-bedrock/us.anthropic.claude-sonnet-5-5": {
142
151
  readonly rationale: "Sonnet 5.5 catalog addition (#6111); not yet curated";
143
152
  };
153
+ readonly "github-copilot/gemini-4-argon": {
154
+ readonly rationale: "Gemini 4 Argon provider catalog addition (#6731); not yet curated";
155
+ };
156
+ readonly "google/gemini-4-argon": {
157
+ readonly rationale: "Gemini 4 Argon catalog addition (#6731); tier ordering not yet reviewed";
158
+ };
159
+ readonly "kilo/google/gemini-4-argon": {
160
+ readonly rationale: "Gemini 4 Argon provider catalog addition (#6731); not yet curated";
161
+ };
162
+ readonly "opencode-zen/gemini-4-argon": {
163
+ readonly rationale: "Gemini 4 Argon provider catalog addition (#6731); not yet curated";
164
+ };
165
+ readonly "openrouter/google/gemini-4-argon": {
166
+ readonly rationale: "Gemini 4 Argon provider catalog addition (#6731); not yet curated";
167
+ };
168
+ readonly "openrouter/google/gemini-4-argon:batch": {
169
+ readonly rationale: "Gemini 4 Argon batch provider catalog addition (#6731); not yet curated";
170
+ };
171
+ readonly "vercel-ai-gateway/google/gemini-4-argon": {
172
+ readonly rationale: "Gemini 4 Argon provider catalog addition (#6731); not yet curated";
173
+ };
144
174
  readonly "kiro/claude-opus-5-5": {
145
175
  readonly rationale: "post-rebase catalog addition from dev; not yet curated";
146
176
  };
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Hot reload requires a privacy check that only Linux can perform: its
3
+ * directory modes include the POSIX ACL mask, so denying group/other access
4
+ * also denies named ACL grants. Node does not expose enough ACL state on other
5
+ * platforms to establish equivalent privacy, so they do not watch at all.
6
+ */
7
+ export declare function isConfigHotReloadSupported(): boolean;
8
+ /** Returns whether both configuration paths live in private, safely owned directories. */
9
+ export declare function isConfigHotReloadTrusted(paths: {
10
+ readonly configPath: string;
11
+ readonly modelsPath: string;
12
+ }): Promise<boolean>;