@gajae-code/coding-agent 0.18.11 → 0.19.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 (462) hide show
  1. package/CHANGELOG.md +760 -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/capability/rule.d.ts +7 -2
  7. package/dist/types/cli/accounts-cli.d.ts +2 -2
  8. package/dist/types/cli/append-system-prompt.d.ts +6 -0
  9. package/dist/types/cli/args.d.ts +7 -2
  10. package/dist/types/cli/customize-doctor-precedence.d.ts +16 -0
  11. package/dist/types/cli/customize-doctor.d.ts +4 -3
  12. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  13. package/dist/types/cli/install-activation.d.ts +10 -4
  14. package/dist/types/cli/public-command-errors.d.ts +2 -0
  15. package/dist/types/cli/root-flags.d.ts +0 -12
  16. package/dist/types/cli/update-cli.d.ts +21 -3
  17. package/dist/types/cli-main.d.ts +0 -6
  18. package/dist/types/cli-ordinary.d.ts +2 -2
  19. package/dist/types/commands/accounts.d.ts +2 -1
  20. package/dist/types/commands/launch.d.ts +0 -6
  21. package/dist/types/commands/migrate.d.ts +1 -1
  22. package/dist/types/commands/sdk.d.ts +13 -0
  23. package/dist/types/commit/changelog/index.d.ts +1 -0
  24. package/dist/types/commit/map-reduce/index.d.ts +4 -4
  25. package/dist/types/config/autorouting-tier-map.d.ts +53 -1
  26. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  27. package/dist/types/config/config-hot-reload.d.ts +44 -0
  28. package/dist/types/config/file-lock.d.ts +52 -3
  29. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  30. package/dist/types/config/model-profile-activation.d.ts +79 -9
  31. package/dist/types/config/model-registry.d.ts +72 -8
  32. package/dist/types/config/model-resolver.d.ts +7 -4
  33. package/dist/types/config/models-config-schema.d.ts +10 -0
  34. package/dist/types/config/settings-schema.d.ts +57 -4
  35. package/dist/types/config/settings.d.ts +33 -1
  36. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  37. package/dist/types/customization/import.d.ts +2 -0
  38. package/dist/types/customization/types.d.ts +1 -1
  39. package/dist/types/dap/config.d.ts +8 -4
  40. package/dist/types/dap/session.d.ts +11 -2
  41. package/dist/types/debug/system-info.d.ts +6 -1
  42. package/dist/types/discovery/helpers.d.ts +7 -2
  43. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  44. package/dist/types/edit/index.d.ts +5 -0
  45. package/dist/types/edit/modes/patch.d.ts +14 -0
  46. package/dist/types/edit/modes/replace.d.ts +3 -0
  47. package/dist/types/eval/py/runtime.d.ts +9 -0
  48. package/dist/types/exec/bash-executor.d.ts +12 -0
  49. package/dist/types/export/ttsr.d.ts +19 -0
  50. package/dist/types/extensibility/extensions/types.d.ts +5 -1
  51. package/dist/types/extensibility/slash-commands.d.ts +1 -0
  52. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  53. package/dist/types/gjc-runtime/ralplan-current-final.d.ts +54 -0
  54. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +5 -0
  55. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  56. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  57. package/dist/types/gjc-runtime/tmux-sessions.d.ts +24 -0
  58. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +6 -0
  59. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  60. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  61. package/dist/types/hindsight/content.d.ts +5 -6
  62. package/dist/types/internal-urls/types.d.ts +2 -0
  63. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -4
  64. package/dist/types/main.d.ts +23 -18
  65. package/dist/types/migrate/action-planner.d.ts +10 -1
  66. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  67. package/dist/types/migrate/adapters/index.d.ts +42 -1
  68. package/dist/types/migrate/executor.d.ts +3 -1
  69. package/dist/types/migrate/hook-module.d.ts +23 -0
  70. package/dist/types/migrate/report.d.ts +2 -1
  71. package/dist/types/migrate/types.d.ts +82 -3
  72. package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
  73. package/dist/types/modes/components/model-selector.d.ts +43 -0
  74. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  75. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  76. package/dist/types/modes/prompt-suggestion-controller.d.ts +1 -1
  77. package/dist/types/modes/theme/theme.d.ts +1 -0
  78. package/dist/types/modes/utils/host-status.d.ts +15 -11
  79. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  80. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  81. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  82. package/dist/types/runtime-mcp/project-host-values.d.ts +11 -5
  83. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  84. package/dist/types/sdk/broker/broker-exit.d.ts +3 -3
  85. package/dist/types/sdk/broker/broker.d.ts +29 -2
  86. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  87. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  88. package/dist/types/sdk/broker/ensure.d.ts +141 -9
  89. package/dist/types/sdk/broker/hop.d.ts +45 -0
  90. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  91. package/dist/types/sdk/broker/lifecycle.d.ts +22 -0
  92. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  93. package/dist/types/sdk/broker/session-index.d.ts +6 -1
  94. package/dist/types/sdk/broker/transport.d.ts +2 -0
  95. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  96. package/dist/types/sdk/bus/index.d.ts +44 -0
  97. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  98. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -1
  99. package/dist/types/sdk/bus/telegram-daemon.d.ts +2 -0
  100. package/dist/types/sdk/bus/threaded-render.d.ts +2 -1
  101. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  102. package/dist/types/sdk/host/control/operations.d.ts +5 -1
  103. package/dist/types/sdk/host/events.d.ts +4 -0
  104. package/dist/types/sdk/host/host.d.ts +2 -1
  105. package/dist/types/sdk/host/prompt-image-upload.d.ts +43 -0
  106. package/dist/types/sdk/host/session-runtime.d.ts +40 -8
  107. package/dist/types/sdk/host/surface-policy.d.ts +2 -1
  108. package/dist/types/sdk/lifecycle/service.d.ts +12 -0
  109. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  110. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  111. package/dist/types/sdk/prompt-status.d.ts +11 -4
  112. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  113. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  114. package/dist/types/sdk/session-list.d.ts +1 -1
  115. package/dist/types/session/agent-session.d.ts +107 -9
  116. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  117. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  118. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  119. package/dist/types/session/messages.d.ts +5 -1
  120. package/dist/types/session/session-manager.d.ts +29 -3
  121. package/dist/types/session/startup-auth-config.d.ts +24 -2
  122. package/dist/types/session/streaming-output.d.ts +11 -0
  123. package/dist/types/session/terminal-abort.d.ts +3 -1
  124. package/dist/types/session-import/service.d.ts +1 -1
  125. package/dist/types/skill-state/workflow-mutation-guard.d.ts +20 -4
  126. package/dist/types/slash-commands/helpers/mcp.d.ts +5 -0
  127. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  128. package/dist/types/ssh/ssh-executor.d.ts +8 -1
  129. package/dist/types/system-prompt.d.ts +3 -2
  130. package/dist/types/task/executor.d.ts +19 -2
  131. package/dist/types/task/role-body.d.ts +11 -0
  132. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  133. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  134. package/dist/types/tools/awaiting-input.d.ts +28 -0
  135. package/dist/types/tools/bash-allowed-prefixes.d.ts +17 -0
  136. package/dist/types/tools/bash-skill-urls.d.ts +4 -0
  137. package/dist/types/tools/bash.d.ts +7 -0
  138. package/dist/types/tools/descriptors.d.ts +15 -2
  139. package/dist/types/tools/fetch.d.ts +7 -1
  140. package/dist/types/tools/index.d.ts +2 -0
  141. package/dist/types/tools/irc.d.ts +5 -3
  142. package/dist/types/tools/python.d.ts +1 -1
  143. package/dist/types/tools/report-issue.d.ts +41 -0
  144. package/dist/types/tools/subagent.d.ts +23 -0
  145. package/dist/types/tools/tmux-self-injection-guard.d.ts +2 -0
  146. package/dist/types/tools/ultragoal-ask-guard.d.ts +1 -1
  147. package/dist/types/tools/write.d.ts +2 -0
  148. package/dist/types/utils/file-mentions.d.ts +5 -0
  149. package/dist/types/utils/image-limits.d.ts +7 -0
  150. package/dist/types/utils/image-loading.d.ts +0 -1
  151. package/dist/types/utils/open.d.ts +0 -1
  152. package/dist/types/utils/pasted-image-loading.d.ts +1 -5
  153. package/dist/types/utils/prompt-suggestion.d.ts +2 -2
  154. package/dist/types/utils/shell-snapshot.d.ts +2 -0
  155. package/dist/types/utils/title-generator.d.ts +13 -3
  156. package/dist/types/web/scrapers/types.d.ts +8 -1
  157. package/dist/types/web/search/providers/codex.d.ts +6 -7
  158. package/dist/types/web/search/providers/insane.d.ts +7 -1
  159. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  160. package/package.json +10 -9
  161. package/scripts/acp-conformance-agent.ts +12 -2
  162. package/scripts/build-binary.ts +2 -1
  163. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  164. package/scripts/generate-docs-index.ts +8 -1
  165. package/scripts/generate-sdk-operation-inventory.ts +38 -4
  166. package/src/async/job-manager.ts +356 -56
  167. package/src/async/result-formatting.ts +40 -0
  168. package/src/autoresearch/git.ts +9 -2
  169. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  170. package/src/capability/fs.ts +58 -22
  171. package/src/capability/index.ts +2 -2
  172. package/src/capability/rule.ts +11 -2
  173. package/src/cli/accounts-cli.ts +176 -8
  174. package/src/cli/append-system-prompt.ts +12 -0
  175. package/src/cli/args.ts +11 -7
  176. package/src/cli/auth-broker-cli.ts +21 -11
  177. package/src/cli/customize-doctor-precedence.ts +31 -0
  178. package/src/cli/customize-doctor.ts +49 -39
  179. package/src/cli/doctor/install-repairs.ts +35 -5
  180. package/src/cli/fast-help.ts +1 -3
  181. package/src/cli/install-activation.ts +47 -4
  182. package/src/cli/migrate-cli.ts +19 -6
  183. package/src/cli/public-command-errors.ts +6 -0
  184. package/src/cli/root-flags.ts +2 -4
  185. package/src/cli/stats-cli.ts +9 -5
  186. package/src/cli/update-cli.ts +471 -13
  187. package/src/cli-ordinary.ts +7 -2
  188. package/src/commands/accounts.ts +10 -5
  189. package/src/commands/harness.ts +25 -15
  190. package/src/commands/migrate.ts +3 -3
  191. package/src/commands/sdk.ts +277 -50
  192. package/src/commands/ultragoal.ts +16 -8
  193. package/src/commit/agentic/agent.ts +6 -6
  194. package/src/commit/analysis/conventional.ts +14 -5
  195. package/src/commit/changelog/index.ts +39 -1
  196. package/src/commit/map-reduce/index.ts +7 -7
  197. package/src/commit/message.ts +10 -3
  198. package/src/commit/pipeline.ts +12 -12
  199. package/src/config/autorouting-tier-map.ts +50 -1
  200. package/src/config/config-file.ts +106 -3
  201. package/src/config/config-hot-reload-trust.ts +148 -0
  202. package/src/config/config-hot-reload.ts +742 -0
  203. package/src/config/file-lock.ts +1615 -328
  204. package/src/config/keybindings.ts +154 -7
  205. package/src/config/model-bindings-applier.ts +85 -47
  206. package/src/config/model-discovery-manager.ts +10 -0
  207. package/src/config/model-profile-activation.ts +889 -148
  208. package/src/config/model-registry.ts +1706 -205
  209. package/src/config/model-resolver.ts +52 -22
  210. package/src/config/models-config-schema.ts +6 -0
  211. package/src/config/settings-schema.ts +73 -4
  212. package/src/config/settings.ts +460 -24
  213. package/src/coordinator-mcp/policy.ts +26 -1
  214. package/src/coordinator-mcp/server.ts +37 -2
  215. package/src/crash/sanitize.ts +7 -1
  216. package/src/customization/import.ts +279 -8
  217. package/src/customization/inventory.ts +24 -8
  218. package/src/customization/types.ts +1 -0
  219. package/src/dap/client.ts +3 -2
  220. package/src/dap/config.ts +31 -11
  221. package/src/dap/defaults.json +1 -1
  222. package/src/dap/session.ts +161 -36
  223. package/src/debug/crash-diagnostics.ts +89 -6
  224. package/src/debug/report-bundle.ts +90 -2
  225. package/src/debug/system-info.ts +8 -3
  226. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  227. package/src/discovery/agents-md.ts +1 -1
  228. package/src/discovery/builtin.ts +4 -3
  229. package/src/discovery/helpers.ts +25 -16
  230. package/src/discovery/mcp-compat.ts +120 -17
  231. package/src/edit/apply-patch/index.ts +12 -1
  232. package/src/edit/index.ts +204 -22
  233. package/src/edit/modes/patch.ts +214 -8
  234. package/src/edit/modes/replace.ts +136 -0
  235. package/src/eval/js/context-manager.ts +29 -3
  236. package/src/eval/js/worker-entry.ts +51 -18
  237. package/src/eval/py/executor.ts +14 -4
  238. package/src/eval/py/runner.py +144 -5
  239. package/src/eval/py/runtime.ts +44 -4
  240. package/src/exec/bash-executor.ts +81 -4
  241. package/src/exec/bash-shell-guardian.ts +4 -1
  242. package/src/exec/bash-shell-supervisor.ts +8 -4
  243. package/src/exec/isolated-shell.ts +5 -1
  244. package/src/exec/non-interactive-env.ts +0 -1
  245. package/src/export/html/index.ts +86 -6
  246. package/src/export/ttsr.ts +176 -1
  247. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  248. package/src/extensibility/extensions/loader.ts +10 -1
  249. package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +63 -1
  250. package/src/extensibility/extensions/types.ts +5 -1
  251. package/src/extensibility/hooks/loader.ts +10 -2
  252. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  253. package/src/extensibility/plugins/marketplace/manager.ts +36 -10
  254. package/src/extensibility/slash-commands.ts +5 -0
  255. package/src/gjc-runtime/gc-runtime.ts +37 -7
  256. package/src/gjc-runtime/launch-tmux.ts +30 -15
  257. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  258. package/src/gjc-runtime/launch-worktree.ts +101 -14
  259. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  260. package/src/gjc-runtime/ralplan-current-final.ts +294 -0
  261. package/src/gjc-runtime/ralplan-runtime.ts +95 -1
  262. package/src/gjc-runtime/session-resolution.ts +38 -6
  263. package/src/gjc-runtime/session-state-lock.ts +59 -14
  264. package/src/gjc-runtime/state-runtime.ts +23 -19
  265. package/src/gjc-runtime/state-writer.ts +109 -5
  266. package/src/gjc-runtime/tmux-sessions.ts +93 -13
  267. package/src/gjc-runtime/ultragoal-change-set.ts +90 -11
  268. package/src/gjc-runtime/ultragoal-guard.ts +9 -1
  269. package/src/gjc-runtime/ultragoal-runtime.ts +15 -5
  270. package/src/harness-control-plane/finalize.ts +11 -0
  271. package/src/harness-control-plane/receipt-spool.ts +105 -28
  272. package/src/harness-control-plane/storage.ts +124 -6
  273. package/src/hindsight/content.ts +116 -16
  274. package/src/hindsight/mental-models.ts +22 -10
  275. package/src/hindsight/state.ts +7 -4
  276. package/src/hooks/native-skill-hook.ts +17 -12
  277. package/src/internal-urls/artifact-protocol.ts +3 -1
  278. package/src/internal-urls/docs-index.generated.ts +23 -22
  279. package/src/internal-urls/local-protocol.ts +167 -8
  280. package/src/internal-urls/types.ts +2 -0
  281. package/src/lsp/client.ts +2 -1
  282. package/src/lsp/clients/biome-client.ts +2 -0
  283. package/src/lsp/clients/swiftlint-client.ts +2 -0
  284. package/src/lsp/index.ts +29 -0
  285. package/src/lsp/workspace-path.ts +23 -0
  286. package/src/main.ts +330 -92
  287. package/src/memories/index.ts +25 -2
  288. package/src/migrate/action-planner.ts +574 -2
  289. package/src/migrate/adapters/claude-code.ts +162 -5
  290. package/src/migrate/adapters/codex.ts +77 -7
  291. package/src/migrate/adapters/index.ts +258 -5
  292. package/src/migrate/adapters/opencode.ts +10 -1
  293. package/src/migrate/executor.ts +222 -7
  294. package/src/migrate/hook-module.ts +193 -0
  295. package/src/migrate/report.ts +63 -2
  296. package/src/migrate/types.ts +84 -4
  297. package/src/modes/DESIGN.md +51 -0
  298. package/src/modes/acp/acp-agent.ts +10 -1
  299. package/src/modes/acp/permission-mode.ts +18 -1
  300. package/src/modes/components/agent-dashboard.ts +20 -4
  301. package/src/modes/components/assistant-message.ts +55 -1
  302. package/src/modes/components/customization/customization-dashboard.ts +7 -0
  303. package/src/modes/components/customization/import-wizard.ts +29 -3
  304. package/src/modes/components/model-selector.ts +157 -103
  305. package/src/modes/components/settings-selector.ts +103 -37
  306. package/src/modes/components/welcome.ts +3 -1
  307. package/src/modes/controllers/command-controller.ts +300 -9
  308. package/src/modes/controllers/event-controller.ts +1 -1
  309. package/src/modes/controllers/extension-ui-controller.ts +31 -1
  310. package/src/modes/controllers/goal-mode-controller.ts +79 -10
  311. package/src/modes/controllers/input-controller.ts +2 -0
  312. package/src/modes/controllers/plan-mode-controller.ts +66 -11
  313. package/src/modes/controllers/runtime-mcp-command-controller.ts +7 -6
  314. package/src/modes/controllers/selector-controller.ts +76 -7
  315. package/src/modes/interactive-mode.ts +123 -4
  316. package/src/modes/prompt-suggestion-controller.ts +1 -1
  317. package/src/modes/runtime-init.ts +5 -1
  318. package/src/modes/theme/theme.ts +15 -0
  319. package/src/modes/utils/host-status.ts +21 -10
  320. package/src/prompts/agent-fragments/browser-aside.md +2 -2
  321. package/src/prompts/system/irc-incoming.md +3 -1
  322. package/src/prompts/tools/debug.md +1 -1
  323. package/src/prompts/tools/irc.md +1 -1
  324. package/src/prompts/tools/read.md +1 -1
  325. package/src/prompts/tools/report-issue.md +13 -0
  326. package/src/prompts/tools/task.md +1 -1
  327. package/src/runtime-credential-selector.ts +2 -2
  328. package/src/runtime-mcp/content-limits.ts +7 -0
  329. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  330. package/src/runtime-mcp/manager.ts +40 -3
  331. package/src/runtime-mcp/oauth-flow.ts +32 -6
  332. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  333. package/src/runtime-mcp/project-host-values.ts +12 -8
  334. package/src/runtime-mcp/render.ts +16 -1
  335. package/src/runtime-mcp/tool-bridge.ts +194 -21
  336. package/src/runtime-mcp/transports/stdio.ts +2 -1
  337. package/src/sdk/broker/broker-exit.ts +10 -5
  338. package/src/sdk/broker/broker.ts +484 -85
  339. package/src/sdk/broker/daemon-entry.ts +338 -116
  340. package/src/sdk/broker/doctor-restart.ts +2 -1
  341. package/src/sdk/broker/ensure.ts +1214 -268
  342. package/src/sdk/broker/hop.ts +286 -0
  343. package/src/sdk/broker/lifecycle-ledger.ts +38 -11
  344. package/src/sdk/broker/lifecycle.ts +102 -6
  345. package/src/sdk/broker/lock-host-identity.ts +29 -0
  346. package/src/sdk/broker/session-index.ts +91 -16
  347. package/src/sdk/broker/transport.ts +17 -1
  348. package/src/sdk/bus/chat-command-policy.ts +16 -3
  349. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  350. package/src/sdk/bus/index.ts +460 -35
  351. package/src/sdk/bus/reconciliation-store.ts +201 -8
  352. package/src/sdk/bus/session-control.ts +2 -0
  353. package/src/sdk/bus/slack-daemon.ts +105 -9
  354. package/src/sdk/bus/telegram-daemon-contract.ts +9 -1
  355. package/src/sdk/bus/telegram-daemon.ts +10 -2
  356. package/src/sdk/bus/threaded-render.ts +20 -1
  357. package/src/sdk/cli/session-cli.ts +23 -6
  358. package/src/sdk/host/control/dispatch.ts +13 -1
  359. package/src/sdk/host/control/operations.ts +10 -1
  360. package/src/sdk/host/events.ts +67 -4
  361. package/src/sdk/host/host.ts +8 -2
  362. package/src/sdk/host/prompt-image-upload.ts +438 -0
  363. package/src/sdk/host/sdk-surface-parity.test.ts +15 -0
  364. package/src/sdk/host/session-runtime.test.ts +1737 -129
  365. package/src/sdk/host/session-runtime.ts +684 -83
  366. package/src/sdk/host/surface-policy.ts +4 -0
  367. package/src/sdk/host/websocket-transport.lifecycle.test.ts +90 -2
  368. package/src/sdk/host/websocket-transport.ts +19 -7
  369. package/src/sdk/lifecycle/service.ts +15 -1
  370. package/src/sdk/prompt-deadline-flush.ts +78 -5
  371. package/src/sdk/prompt-deadline-manager.ts +68 -14
  372. package/src/sdk/prompt-status.ts +6 -4
  373. package/src/sdk/protocol/adapter-validation.ts +81 -12
  374. package/src/sdk/protocol/operation-inventory.generated.json +261 -2
  375. package/src/sdk/protocol/operation-registry.ts +33 -3
  376. package/src/sdk/reconciliation-extensions.ts +1 -0
  377. package/src/sdk/session-list.ts +1 -0
  378. package/src/sdk/session.ts +237 -97
  379. package/src/session/agent-session.ts +2726 -479
  380. package/src/session/history-storage.ts +182 -12
  381. package/src/session/internal/managed-session-scope.ts +173 -57
  382. package/src/session/internal/managed-session-storage.ts +85 -12
  383. package/src/session/internal/native-publish-outcome.ts +5 -1
  384. package/src/session/messages.ts +47 -6
  385. package/src/session/session-manager.ts +326 -19
  386. package/src/session/startup-auth-config.ts +116 -8
  387. package/src/session/streaming-output.ts +262 -4
  388. package/src/session/terminal-abort.ts +14 -2
  389. package/src/session-import/redact.ts +53 -2
  390. package/src/session-import/service.ts +1 -0
  391. package/src/skill-state/workflow-mutation-guard.ts +2145 -206
  392. package/src/slash-commands/builtin-registry.ts +21 -6
  393. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  394. package/src/slash-commands/helpers/mcp.ts +11 -3
  395. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  396. package/src/ssh/ssh-executor.ts +9 -2
  397. package/src/stt/recorder.ts +26 -9
  398. package/src/system-prompt.ts +61 -16
  399. package/src/task/executor.ts +115 -20
  400. package/src/task/index.ts +389 -175
  401. package/src/task/role-body.ts +84 -0
  402. package/src/task/token-log-mode.test.ts +162 -0
  403. package/src/task/token-log.ts +91 -2
  404. package/src/tools/archive-reader.ts +650 -37
  405. package/src/tools/ask.ts +1 -0
  406. package/src/tools/ast-edit-write-path.ts +64 -0
  407. package/src/tools/ast-edit.ts +18 -1
  408. package/src/tools/ast-grep.ts +7 -2
  409. package/src/tools/atomic-file-write.ts +46 -15
  410. package/src/tools/auto-generated-guard.ts +15 -3
  411. package/src/tools/awaiting-input.ts +114 -0
  412. package/src/tools/bash-allowed-prefixes.ts +214 -6
  413. package/src/tools/bash-interactive.ts +14 -2
  414. package/src/tools/bash-skill-urls.ts +58 -5
  415. package/src/tools/bash.ts +113 -26
  416. package/src/tools/browser/tab-worker.ts +39 -13
  417. package/src/tools/browser.ts +17 -7
  418. package/src/tools/cron.ts +10 -1
  419. package/src/tools/debug.ts +16 -8
  420. package/src/tools/descriptors.test.ts +44 -0
  421. package/src/tools/descriptors.ts +50 -6
  422. package/src/tools/eval.ts +15 -0
  423. package/src/tools/fetch.ts +93 -4
  424. package/src/tools/gh.ts +27 -12
  425. package/src/tools/image-gen.ts +20 -6
  426. package/src/tools/index.ts +2 -0
  427. package/src/tools/irc.ts +5 -3
  428. package/src/tools/monitor.ts +9 -1
  429. package/src/tools/output-meta.ts +74 -5
  430. package/src/tools/python.ts +1 -1
  431. package/src/tools/read.ts +26 -37
  432. package/src/tools/recipe/runner.ts +23 -12
  433. package/src/tools/render-utils.ts +2 -2
  434. package/src/tools/report-issue.ts +184 -0
  435. package/src/tools/search.ts +3 -2
  436. package/src/tools/ssh.ts +274 -8
  437. package/src/tools/subagent-render.ts +114 -12
  438. package/src/tools/subagent.ts +118 -5
  439. package/src/tools/tmux-self-injection-guard.ts +3301 -122
  440. package/src/tools/todo-write.ts +41 -3
  441. package/src/tools/tool-catalog.generated.ts +32 -4
  442. package/src/tools/ultragoal-ask-guard.ts +13 -1
  443. package/src/tools/write.ts +42 -3
  444. package/src/tui/tree-list.ts +15 -1
  445. package/src/utils/commit-message-generator.ts +12 -4
  446. package/src/utils/external-editor.ts +21 -7
  447. package/src/utils/file-mentions.ts +75 -7
  448. package/src/utils/git.ts +38 -7
  449. package/src/utils/image-limits.ts +8 -0
  450. package/src/utils/image-loading.ts +1 -1
  451. package/src/utils/open.ts +73 -4
  452. package/src/utils/pasted-image-loading.ts +9 -8
  453. package/src/utils/prompt-suggestion.ts +5 -4
  454. package/src/utils/shell-snapshot.ts +9 -1
  455. package/src/utils/title-generator.ts +72 -22
  456. package/src/web/scrapers/index.ts +3 -1
  457. package/src/web/scrapers/types.ts +8 -0
  458. package/src/web/scrapers/youtube.ts +3 -2
  459. package/src/web/search/index.ts +2 -1
  460. package/src/web/search/providers/codex.ts +29 -32
  461. package/src/web/search/providers/insane.ts +91 -28
  462. package/src/web/search/providers/searxng.ts +62 -10
@@ -1,4 +1,8 @@
1
1
  export declare const MCP_MAX_CONTENT_BYTES: number;
2
+ export declare const MCP_MAX_IMAGES = 16;
3
+ export declare const MCP_MAX_IMAGE_SOURCE_DIMENSION = 8192;
4
+ export declare const MCP_MAX_IMAGE_SOURCE_PIXELS = 16000000;
5
+ export declare const MCP_MAX_IMAGE_OUTPUT_BYTES: number;
2
6
  export declare const MCP_MAX_ERROR_BYTES: number;
3
7
  export declare const MCP_MAX_SSE_REQUEST_MESSAGES = 1024;
4
8
  export declare const MCP_MAX_SSE_BATCH_MESSAGES = 1024;
@@ -71,6 +71,8 @@ export interface MCPToolCatalogSnapshot {
71
71
  publication: MCPToolCatalogPublication;
72
72
  generation: number;
73
73
  }
74
+ /** Drop project stdio servers unless the user/global opt-in is set. */
75
+ export declare function omitUnapprovedProjectStdio(configs: Record<string, MCPServerConfig>, sources: Record<string, SourceMeta>, allowProjectStdio: boolean, toolsOnly?: boolean): void;
74
76
  /** Options for discovering and connecting to MCP servers */
75
77
  export interface MCPDiscoverOptions {
76
78
  /** Whether to load project-level config (default: true) */
@@ -97,6 +99,11 @@ export interface MCPDiscoverOptions {
97
99
  export interface MCPManagerOptions {
98
100
  /** Restrict this instance to tools from an explicit MCP config. */
99
101
  toolsOnly?: boolean;
102
+ /**
103
+ * Spawn stdio servers loaded from a project MCP file. Default false.
104
+ * User-scope servers and an explicit `--mcp-config` file are unaffected.
105
+ */
106
+ allowUntrustedProjectStdio?: boolean;
100
107
  /**
101
108
  * Ceiling for the startup wait, in milliseconds. ACP lifecycle launches and
102
109
  * plugin MCP startup use bounded caller-owned budgets; other consumers keep
@@ -0,0 +1,22 @@
1
+ export declare const GJC_PLUGIN_MCP_PROVIDER = "gjc-plugins";
2
+ /**
3
+ * A repository plugin MCP server must not occupy a normalized tool name that a
4
+ * non-plugin server already published. The whole plugin server is omitted so a
5
+ * sibling tool from that server is not left registered. Non-plugin collisions
6
+ * and the input order stay unchanged.
7
+ */
8
+ export declare function omitPluginMcpNameShadows<T extends {
9
+ name: string;
10
+ }>(tools: readonly T[]): T[];
11
+ /** Normalized names of plugin tools that remain after shadow omission. */
12
+ export declare function survivingPluginMcpToolNames<T extends {
13
+ name: string;
14
+ }>(tools: readonly T[]): string[];
15
+ /**
16
+ * The required-name list is the plugin tools that survived the name filter,
17
+ * plus requested names this batch did not omit. An omitted plugin tool, including
18
+ * a sibling that does not itself collide, is not required.
19
+ */
20
+ export declare function retainPluginMcpMandatoryNames(tools: readonly {
21
+ name: string;
22
+ }[], requested: readonly string[]): string[];
@@ -2,14 +2,20 @@
2
2
  * Host-value policy for MCP config that comes from an untrusted project file.
3
3
  *
4
4
  * User mcp.json and an explicit `--mcp-config` file may still substitute
5
- * secret-named environment variables and run `!` shell commands. A project
6
- * file (native `.gjc/mcp.json` or a repo-root `mcp.json`) uses the same
7
- * sensitive-name rule as project `ssh.json`: do not copy those host values
8
- * into server env or headers, and do not execute `!`.
5
+ * secret-named environment variables and run `!` shell commands. Any
6
+ * project-level source, including providers other than native `.gjc/mcp.json`
7
+ * and repo-root `mcp.json`, uses the same sensitive-name rule as project
8
+ * `ssh.json`: do not copy those host values into server env or headers, and
9
+ * do not execute `!`.
9
10
  */
10
11
  import type { SourceMeta } from "../capability/types";
11
12
  export declare function nativeMcpSource(level: "user" | "project", filePath: string): SourceMeta;
12
- /** True when this server was loaded from untrusted project MCP config. */
13
+ /**
14
+ * True when this server was loaded from untrusted project MCP config.
15
+ * Every project-level provider is untrusted, including providers other than
16
+ * native `.gjc/mcp.json` and repo-root `mcp.json`. User scope and a tools-only
17
+ * load stay on the previous path.
18
+ */
13
19
  export declare function isUntrustedProjectMcpSource(source: SourceMeta | undefined, toolsOnly: boolean): boolean;
14
20
  export type ProjectHostValueDecision = {
15
21
  action: "resolve";
@@ -72,6 +72,8 @@ export declare class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
72
72
  readonly mcpToolName: string;
73
73
  /** Server name */
74
74
  readonly mcpServerName: string;
75
+ /** True when this tool came from a repository GJC plugin bundle. */
76
+ readonly gjcPluginBundle: boolean;
75
77
  private connection;
76
78
  invalidateForSessionControl(): void;
77
79
  /** Create MCPTool instances for all tools from an MCP server lease/connection. */
@@ -98,6 +100,8 @@ export declare class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetai
98
100
  readonly mcpToolName: string;
99
101
  /** Server name */
100
102
  readonly mcpServerName: string;
103
+ /** True when this tool came from a repository GJC plugin bundle. */
104
+ readonly gjcPluginBundle: boolean;
101
105
  invalidateForSessionControl(): void;
102
106
  /** Create DeferredMCPTool instances for all tools from an MCP server */
103
107
  static fromTools(serverName: string, tools: MCPToolDefinition[], getConnection: () => Promise<MCPServerConnection>, source?: SourceMeta, reconnect?: MCPReconnect, options?: MCPToolOptions): DeferredMCPTool[];
@@ -4,7 +4,7 @@ export type { BrokerExitWriterTestBarrier } from "./broker-exit-writer-worker";
4
4
  export declare function setBrokerExitWriterBarrierForTest(barrier?: BrokerExitWriterTestBarrier): void;
5
5
  export type BrokerExitMode = "owned-root" | "lost-root";
6
6
  export type BrokerFenceReason = "suspect-unpublished" | "observation-ambiguous" | "heartbeat-ambiguous";
7
- export type BrokerExitReason = "ownership-fence-expired" | "publication-liveness-timeout" | "heartbeat-renewal-blocked" | "restart-committed" | "shutdown-request" | "startup-failure" | "signal";
7
+ export type BrokerExitReason = "ownership-fence-expired" | "publication-liveness-timeout" | "heartbeat-renewal-blocked" | "restart-committed" | "shutdown-request" | "startup-failure" | "abandoned" | "signal";
8
8
  export type BrokerStopRequest = {
9
9
  kind: "shutdown-request";
10
10
  } | {
@@ -29,7 +29,7 @@ export interface BrokerExitRecord {
29
29
  export interface BrokerStartupExitRecord {
30
30
  version: 1;
31
31
  mode: "startup";
32
- reason: "startup-deadline" | "startup-signal" | "startup-lock-blocked";
32
+ reason: "startup-deadline" | "startup-signal" | "startup-lock-blocked" | "startup-lock-unavailable";
33
33
  fenceReason: null;
34
34
  fencedForMs: 0;
35
35
  uptimeMs: number;
@@ -38,7 +38,7 @@ export interface BrokerStartupExitRecord {
38
38
  exitCode: 1 | 130 | 143;
39
39
  timeoutMs: number | null;
40
40
  writtenAt: number;
41
- /** For lock-blocked reason: path to the retained removal transition. */
41
+ /** For lock refusal reasons: path to the transition or lock that blocked startup. */
42
42
  blockingLockPath?: string;
43
43
  }
44
44
  export type BrokerStartupExitWriteStatus = {
@@ -1,4 +1,4 @@
1
- import type { NativeDirectoryTreeSnapshot } from "@gajae-code/natives";
1
+ import { type NativeDirectoryTreeSnapshot } from "@gajae-code/natives";
2
2
  import type { ModelProfileErrorDetails } from "../../config/model-profile-contract";
3
3
  import type { TaskArtifactOwnerDeletionEvidence, TaskArtifactOwnerRetirementContinuation } from "../../session/task-artifact-owner-codec";
4
4
  import { type SdkHostModelResolver } from "../host/model-pin";
@@ -26,6 +26,21 @@ export interface BrokerSettings {
26
26
  masterCapabilityVerifier?: MasterCapabilityVerifier;
27
27
  /** Grace before an orphaned spawn child closes; schema-bounded in production. */
28
28
  masterOrphanGraceMs?: number;
29
+ /**
30
+ * Grace before a broker nobody is left to use exits on its own. The clock only
31
+ * runs while the index proves no live session host and no open spawn authority,
32
+ * so a broker whose client died without closing exits instead of holding its
33
+ * port, its publication, and its lock for the life of the machine.
34
+ */
35
+ abandonedGraceMs?: number;
36
+ /**
37
+ * Whether this broker may end itself once nobody is left to use it. Only the
38
+ * detached autostart entry point enables this: an operator-supervised
39
+ * `gjc sdk broker run` service owns its own lifetime, and its supervisor reads an
40
+ * owned-root completion as a clean exit, so self-reaping would quietly retire a
41
+ * service that was meant to keep serving.
42
+ */
43
+ reapWhenAbandoned?: boolean;
29
44
  /** Host model resolver override for lifecycle tests and embedders. */
30
45
  resolveModelPin?: SdkHostModelResolver;
31
46
  /**
@@ -62,10 +77,12 @@ type ResolvedBrokerSettings = {
62
77
  spawnSubstrateProvider?: SpawnSubstrateProvider;
63
78
  spawnPromptLayer?: SpawnPromptLayer;
64
79
  masterOrphanGraceMs: number;
80
+ abandonedGraceMs: number;
81
+ reapWhenAbandoned: boolean;
65
82
  restartRequestId?: string;
66
83
  };
67
84
  export declare function resolveBrokerPackageGeneration(): string;
68
- export type BrokerErrorCode = "idempotency_conflict" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "ready_then_exited" | "endpoint_unreadable" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "worktree_preparation_timeout" | "dependency_preparation_timeout" | "worktree_in_use" | "incarnation_unavailable" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
85
+ export type BrokerErrorCode = "idempotency_conflict" | "legacy_lifecycle_ambiguous" | "terminal_uncertain" | "broker_restarting" | "unavailable" | "endpoint_stale" | "resource_gone" | "invalid_input" | "spawn_failed" | "ready_then_exited" | "endpoint_unreadable" | "startup_admission_timeout" | "startup_admission_refused" | "readiness_timeout" | "worktree_preparation_timeout" | "dependency_preparation_timeout" | "worktree_in_use" | "incarnation_unavailable" | "close_refused" | "not_found" | "live_session" | "cleanup_pending" | (string & {});
69
86
  export type BrokerCleanupIdentity = {
70
87
  dev: string;
71
88
  ino: string;
@@ -283,6 +300,7 @@ export declare function reapStaleBrokerLockArtifacts(input: {
283
300
  now?: number;
284
301
  graceMs?: number;
285
302
  pidAlive?: (pid: number) => boolean;
303
+ processIncarnation?: (pid: number) => string | undefined;
286
304
  }): Promise<BrokerLockArtifactReapResult>;
287
305
  export interface StartupAdmissionTiming {
288
306
  now(): number;
@@ -372,6 +390,8 @@ export declare class Broker {
372
390
  runStartup<T>(queueWaitMs: number, timing: StartupAdmissionTiming, task: (admittedAt: number) => Promise<T>): Promise<StartupAdmissionResult<T>>;
373
391
  start(): Promise<BrokerDiscovery>;
374
392
  get ownsDiscovery(): boolean;
393
+ /** Whether this broker completed its initial retained discovery publication. */
394
+ get hasPublishedDiscovery(): boolean;
375
395
  get completion(): Promise<void>;
376
396
  /** Why this broker completed, or null while it is still running. */
377
397
  get terminalExit(): {
@@ -412,6 +432,13 @@ export declare function setTerminalPersistenceHookForTest(broker: Broker, hook:
412
432
  export declare function setAmbiguityGraceForTest(broker: Broker, graceMs: number | undefined): void;
413
433
  /** Test-only hook for shortening the startup lock-artifact reap bound. */
414
434
  export declare function setLockArtifactGraceForTest(broker: Broker, graceMs: number | undefined): void;
435
+ /** Test-only barriers for exercising the cross-process broker-lock reclaim fence. */
436
+ export declare function setBrokerLockReclaimHooksForTest(broker: Broker, hooks: {
437
+ beforeQuarantine?: () => Promise<void>;
438
+ onContended?: () => void;
439
+ } | undefined): void;
440
+ /** Test-only hook for shortening the bounded abandonment grace. */
441
+ export declare function setAbandonedGraceForTest(broker: Broker, graceMs: number | undefined): void;
415
442
  /** Test-only hook for shortening the bounded liveness deadline. */
416
443
  export declare function setLivenessGraceForTest(broker: Broker, graceMs: number | undefined): void;
417
444
  /** Test-only hook for shortening the bounded wait before a deferred managed close is queued. */
@@ -1,4 +1,6 @@
1
+ import type * as childProcess from "node:child_process";
1
2
  import { type BrokerDiscovery } from "./discovery";
3
+ import { type BrokerLaunchHandoff, type BrokerLaunchResult } from "./ensure";
2
4
  export interface AuthorizedBrokerSuccessorOptions {
3
5
  agentDir: string;
4
6
  requestId: string;
@@ -11,10 +13,14 @@ export type AuthorizedBrokerSuccessorResult = {
11
13
  discovery: BrokerDiscovery;
12
14
  } | {
13
15
  kind: "spawned";
16
+ child: childProcess.ChildProcess;
17
+ realBrokerPid: number | undefined;
18
+ realBrokerIncarnation: string | undefined;
19
+ handoff: BrokerLaunchHandoff | undefined;
14
20
  discovery: BrokerDiscovery;
15
21
  } | {
16
22
  kind: "refused";
17
- reason: "deadline_elapsed" | "intent_not_committed" | "spawn_failed" | "spawn_exited_before_publication" | "publication_timeout";
23
+ reason: "deadline_elapsed" | "intent_not_committed" | "spawn_failed" | "spawn_exited_before_publication" | "publication_timeout" | "startup_lock_unavailable";
18
24
  detail?: string;
19
25
  };
20
26
  /**
@@ -30,6 +36,10 @@ export type AuthorizedBrokerSuccessorResult = {
30
36
  * has been released.
31
37
  */
32
38
  export declare function launchAuthorizedBrokerSuccessor(options: AuthorizedBrokerSuccessorOptions): Promise<AuthorizedBrokerSuccessorResult>;
39
+ /** Test hook: retries exact cleanup before mapping a launch error to refusal. */
40
+ export declare function refuseFailedBrokerLaunchForTest(launched: BrokerLaunchResult): Promise<Extract<AuthorizedBrokerSuccessorResult, {
41
+ kind: "refused";
42
+ }>>;
33
43
  /**
34
44
  * Positive OS-confirmed absence of the exact prior owner, distinguished from
35
45
  * every merely-inconclusive outcome (permission denial, PID reuse ambiguity,
@@ -44,7 +44,7 @@ export type DoctorBrokerRestartOutcome = {
44
44
  kind: "successor_refused";
45
45
  requestId: string;
46
46
  oldOwner: BrokerRestartOwnerIdentity;
47
- reason: "deadline_elapsed" | "intent_not_committed" | "spawn_failed" | "spawn_exited_before_publication" | "publication_timeout";
47
+ reason: "deadline_elapsed" | "intent_not_committed" | "spawn_failed" | "spawn_exited_before_publication" | "publication_timeout" | "startup_lock_unavailable";
48
48
  detail?: string;
49
49
  };
50
50
  export declare function prepareDoctorBrokerRestart(client: SdkClient, discovery: BrokerDiscovery, options: DoctorBrokerRestartOptions & {
@@ -1,9 +1,102 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
2
  import type { FileHandle } from "node:fs/promises";
3
+ import { type ProjectEnvSnapshot } from "@gajae-code/utils/env-file";
3
4
  import { type FileLockOptions } from "../../config/file-lock";
5
+ import { type BrokerStartupExitRecord } from "./broker-exit";
4
6
  import { type BrokerDiscovery } from "./discovery";
7
+ import { type ProcessIncarnationObservation } from "./process-incarnation";
5
8
  import { type SdkInternalSpawnCommand } from "./runtime";
6
9
  import { type BrokerStartupFailureMarker } from "./startup-failure";
10
+ /** Result of launching a broker through a hop/trampoline or as an exact fixture child. */
11
+ export interface BrokerSpawnResult {
12
+ /** The launcher process, or the exact broker process for fixture leases. */
13
+ process: ChildProcess;
14
+ /** The real broker's pid (from the launcher reply or exact child). */
15
+ realBrokerPid: number | undefined;
16
+ /** Kernel identity returned by the POSIX trampoline when available. */
17
+ realBrokerIncarnation?: string;
18
+ handoff?: BrokerLaunchHandoff;
19
+ }
20
+ export interface BrokerLaunchHandoff {
21
+ release(): Promise<void>;
22
+ terminate(): Promise<void>;
23
+ }
24
+ /**
25
+ * Typed error returned when a Windows broker hop fails.
26
+ * The hop is mandatory on Windows for broker detachment; failure is unrecoverable.
27
+ */
28
+ export declare class BrokerHopError extends Error {
29
+ readonly code = "broker_hop_failed";
30
+ readonly hopExitCode: number | null;
31
+ readonly hopStdout: string;
32
+ readonly hopStderr: string;
33
+ readonly reason: string;
34
+ constructor(fields: {
35
+ exitCode: number | null;
36
+ stdout: string;
37
+ stderr: string;
38
+ reason: string;
39
+ });
40
+ }
41
+ export declare function resolveBrokerLaunchMode(platform: NodeJS.Platform, initiator: "discovery" | "fixture-lease"): "windows-hop" | "posix-trampoline" | "darwin-trampoline" | "direct";
42
+ /** What the parent sends the Windows hop. The broker environment is never serialized here. */
43
+ export interface BrokerHopMessage {
44
+ command: {
45
+ file: string;
46
+ args: string[];
47
+ };
48
+ cwd?: string;
49
+ /** Path (never an inherited fd number) the hop opens for the broker's stderr. */
50
+ stderrLogPath?: string;
51
+ }
52
+ export interface BrokerLaunchResult {
53
+ process: ChildProcess;
54
+ realBrokerPid: number | undefined;
55
+ realBrokerIncarnation?: string;
56
+ error: Error | undefined;
57
+ handoff?: BrokerLaunchHandoff;
58
+ }
59
+ /** Test hook: proves a stuck launcher is terminated at its deadline. */
60
+ export declare function awaitBrokerLauncherForTest(child: ChildProcess, timeoutMs: number, onTimeout?: () => void): Promise<{
61
+ kind: "closed";
62
+ } | {
63
+ kind: "timeout";
64
+ terminated: boolean;
65
+ }>;
66
+ /**
67
+ * Windows only: launch the broker through the internal hop and await its reply.
68
+ *
69
+ * `taskkill /T /F` walks ParentProcessId, so a broker spawned directly by the client
70
+ * dies with it even when detached. The hop spawns the broker and exits after
71
+ * the parent acknowledges the complete reply, leaving the broker without a
72
+ * live parent in the client's tree. The broker inherits the environment set on
73
+ * the hop, never passed on the command line; stderr is passed as a path because
74
+ * a parent fd number does not exist inside the hop.
75
+ */
76
+ export declare function launchBrokerViaHop(message: BrokerHopMessage, options: {
77
+ env: NodeJS.ProcessEnv;
78
+ cwd?: string;
79
+ timeoutMs?: number;
80
+ }): Promise<BrokerLaunchResult>;
81
+ /** Parses the hop's single-line pid/incarnation reply into broker identity or a typed error. */
82
+ export declare function parseBrokerHopReply(code: number | null, stdout: string, spawnError?: Error, stderr?: string): {
83
+ realBrokerPid: number | undefined;
84
+ realBrokerIncarnation?: string;
85
+ error: Error | undefined;
86
+ };
87
+ /** POSIX only: the trampoline holds its exact broker child until the publication decision. */
88
+ export declare function launchBrokerViaPosixTrampoline(agentDir: string, options: {
89
+ env: NodeJS.ProcessEnv;
90
+ cwd?: string;
91
+ stderrFd?: number;
92
+ timeoutMs?: number;
93
+ retainChildUntilPublication?: boolean;
94
+ }): Promise<BrokerLaunchResult>;
95
+ export declare function parseBrokerTrampolineReply(code: number | null, stdout: string, spawnError?: Error): {
96
+ realBrokerPid: number | undefined;
97
+ realBrokerIncarnation?: string;
98
+ error: Error | undefined;
99
+ };
7
100
  export declare function isBrokerGenerationCompatible(discovery: BrokerDiscovery | null): boolean;
8
101
  /**
9
102
  * A live incumbent stops being reusable once the runtime image it launches
@@ -29,14 +122,16 @@ export interface EnsureBrokerSettings {
29
122
  */
30
123
  env?: NodeJS.ProcessEnv;
31
124
  }
32
- export interface BrokerStartupLockTestHooks {
125
+ export interface BrokerStartupLockOptions {
126
+ /** Stop waiting for the startup lock at this absolute wall-clock deadline. */
127
+ deadlineAt?: number;
33
128
  onAcquired?: () => void;
34
129
  onContended?: () => void;
35
130
  }
36
131
  /**
37
132
  * Test-only phase observation for detached broker startup regressions. The
38
- * signal is opt-in through the child environment and never affects broker
39
- * ownership or error handling when the test seam is absent.
133
+ * directory is opt-in through a trusted operator environment and never affects
134
+ * broker ownership or error handling when the seam is absent.
40
135
  */
41
136
  export declare function emitBrokerStartupTestSignal(signal: string): Promise<void>;
42
137
  /**
@@ -48,7 +143,7 @@ export declare function emitBrokerStartupTestSignal(signal: string): Promise<voi
48
143
  */
49
144
  export declare const BROKER_DISCOVERY_BUDGET: {
50
145
  readonly staleRetirementMs: 5000;
51
- readonly startupLockWaitMs: 9000;
146
+ readonly startupLockWaitMs: number;
52
147
  readonly publicationMs: 15000;
53
148
  /** What the startup fence grants its holder: retirement plus one publication attempt. */
54
149
  readonly fenceOperationMs: number;
@@ -94,7 +189,7 @@ declare function acquireSpawnLock(agentDir: string, options?: SpawnLockOptions):
94
189
  * The parent-held spawn lock prevents ordinary stampedes; this second fence keeps
95
190
  * startup single-flight if that detached child's launcher dies and its lock is reclaimed.
96
191
  */
97
- export declare function withBrokerStartupLock<T>(agentDir: string, operation: (deadline: number) => Promise<T>, testHooks?: BrokerStartupLockTestHooks): Promise<T>;
192
+ export declare function withBrokerStartupLock<T>(agentDir: string, operation: (deadline: number) => Promise<T>, options?: BrokerStartupLockOptions): Promise<T>;
98
193
  /**
99
194
  * Tail of the detached broker's stderr folded into a discovery failure.
100
195
  *
@@ -138,13 +233,27 @@ export interface StartedFixtureBroker {
138
233
  interface BrokerOwner {
139
234
  stop(): Promise<void>;
140
235
  canReuse(discovery: BrokerDiscovery | null): boolean;
141
- markReady(discovery: BrokerDiscovery): boolean;
142
- setTarget(pid: number, incarnation: string): void;
236
+ markReady(discovery: BrokerDiscovery): Promise<boolean>;
143
237
  }
144
238
  interface ReapTiming {
145
239
  gracefulMs: number;
146
240
  killVerifyMs: number;
147
241
  }
242
+ type DetachedBrokerSignal = (pid: number, brokerIncarnation: string, signal: NodeJS.Signals) => boolean;
243
+ /**
244
+ * Reap a broker launched by a short-lived hop or trampoline. The launcher has
245
+ * already exited, so its ChildProcess carries no signal to await: the real broker
246
+ * is targeted by the reported pid, and every poll is fenced by incarnation.
247
+ * Signals use a pinned OS process handle; unsupported platforms fail closed.
248
+ */
249
+ interface PinnedBrokerProcess {
250
+ readonly incarnation: string;
251
+ signalRoot(signal: number): boolean;
252
+ }
253
+ /** Reap a failed launch through its pending trampoline lease or retained broker handle. */
254
+ export declare function reapFailedBrokerLaunch(launch: Pick<BrokerLaunchResult, "process" | "realBrokerPid" | "realBrokerIncarnation" | "handoff">): Promise<void>;
255
+ /** Reap the direct broker child held by the startup trampoline before publication. */
256
+ export declare function reapBrokerTrampolineChild(child: ChildProcess, brokerPid: number | undefined, brokerIncarnation?: string): Promise<void>;
148
257
  type BrokerOwnerIdentity = Pick<BrokerDiscovery, "ownerId" | "pid" | "incarnation">;
149
258
  /** Start client teardown, but never await it past the retirement operation's absolute deadline. */
150
259
  export declare function closeBrokerClientBeforeDeadline(client: {
@@ -173,6 +282,10 @@ export declare function startFixtureBrokerWithLeaseForTest(settings: EnsureBroke
173
282
  * Test-only launch surface for topology fixtures. It accepts an already-resolved
174
283
  * command and retains the exact spawned child; no production selection path
175
284
  * reaches this function.
285
+ *
286
+ * Note: This function does NOT use the Windows broker hop. Fixtures are test-only
287
+ * and do not require Windows process-tree detachment; the fixture needs to retain
288
+ * exact ownership of the actual broker process to control its stdio[3] control pipe.
176
289
  */
177
290
  export declare function startFixtureBrokerCommandWithLeaseForTest(command: FixtureBrokerCommand): StartedFixtureBrokerCommand;
178
291
  /** Test hook: returns a stop handle for the detached broker this process spawned. */
@@ -183,11 +296,30 @@ export declare function brokerOwnerForTest(agentDir: string): BrokerOwner | unde
183
296
  /** Test hook: verifies the complete broker owner identity used during stale retirement. */
184
297
  export declare function brokerOwnerIdentityMatchesForTest(left: BrokerOwnerIdentity | null, right: BrokerOwnerIdentity): boolean;
185
298
  /** Test hook: drives the detached-broker reap on a controllable child surface. */
186
- export declare function reapSpawnedBrokerForTest(child: ChildProcess, timing?: ReapTiming): Promise<void>;
299
+ export declare function reapSpawnedBrokerForTest(child: ChildProcess, realBrokerPid?: number, brokerIncarnation?: string, timing?: ReapTiming): Promise<void>;
300
+ /** Test hook: verifies detached PID reaping fences every signal and poll by incarnation. */
301
+ export declare function reapDetachedBrokerPidForTest(pid: number, brokerIncarnation: string | undefined, timing?: ReapTiming, observe?: (pid: number) => ProcessIncarnationObservation, signalProcess?: DetachedBrokerSignal): Promise<void>;
302
+ /** Test hook: verifies a pinned process handle matches before sending a signal. */
303
+ export declare function signalPinnedBrokerProcessForTest(reference: PinnedBrokerProcess | null, expectedIncarnation: string, signal: NodeJS.Signals): boolean;
304
+ /** Test hook: verifies platforms without identity-bound signaling fail closed. */
305
+ export declare function signalDetachedBrokerProcessForTest(pid: number, brokerIncarnation: string, signal: NodeJS.Signals, platform: NodeJS.Platform): boolean;
306
+ /** Test hook: the signal directory accepted from this environment and snapshot. */
307
+ export declare function trustedBrokerSignalDirectoryForTest(env: NodeJS.ProcessEnv, snapshot: ProjectEnvSnapshot | readonly ProjectEnvSnapshot[]): string | undefined;
187
308
  /** Test hook: resolves the complete broker environment without spawning. */
188
309
  export declare function brokerSpawnEnvironmentForTest(command: SdkInternalSpawnCommand, override?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
189
310
  /** Test hook: installs an exact controllable owner to exercise replacement fencing. */
190
- export declare function registerBrokerOwnerForTest(agentDir: string, child: ChildProcess, timing?: ReapTiming): BrokerOwner;
311
+ export declare function registerBrokerOwnerForTest(agentDir: string, child: ChildProcess, realBrokerPid?: number, brokerIncarnation?: string, timing?: ReapTiming): BrokerOwner;
191
312
  /** Test hook: exercises the same trusted-marker reason reconstruction used by ensureBroker. */
192
313
  export declare function brokerStartupFailureReasonForTest(marker: BrokerStartupFailureMarker | undefined): string;
314
+ /** Test hook: verifies typed hop errors survive ensureBroker's spawn-failure mapping. */
315
+ export declare function brokerSpawnFailureErrorForTest(spawnError: Error): Error;
316
+ /** Test hook: preserves and reaps a verified broker reply captured at the hop deadline. */
317
+ export declare function brokerHopTimeoutResultForTest(hop: ChildProcess, stdout: string, stderr: string, timeoutMs: number, launcherTerminated: boolean): Promise<BrokerLaunchResult>;
318
+ /** Test hook: preserves and reaps a verified POSIX trampoline reply at its deadline. */
319
+ export declare function brokerTrampolineTimeoutResultForTest(trampoline: ChildProcess, stdout: string, timeoutMs: number, trampolineTerminated: boolean): Promise<BrokerLaunchResult>;
320
+ /** Test hook: verifies broker exit evidence takes precedence over the launcher's status. */
321
+ export declare function brokerStartupExitStatusForTest(childExitCode: number | null, childSignal: NodeJS.Signals | null, startupExitRecord: Pick<BrokerStartupExitRecord, "exitCode" | "signal"> | undefined, startupFailureMarker: Pick<BrokerStartupFailureMarker, "exitCode" | "signal"> | undefined): {
322
+ exitCode: number | null;
323
+ signal: string | null;
324
+ };
193
325
  export {};
@@ -0,0 +1,45 @@
1
+ import * as childProcess from "node:child_process";
2
+ import type * as stream from "node:stream";
3
+ import type { Process } from "@gajae-code/natives";
4
+ /** Handoff protocol frames written to the trampoline's stdin. */
5
+ export declare const BROKER_HANDOFF_ACKNOWLEDGEMENT = "GJC_BROKER_HANDOFF_ACK\n";
6
+ export declare const BROKER_HANDOFF_COMMIT = "GJC_BROKER_HANDOFF_COMMIT\n";
7
+ export declare const BROKER_HANDOFF_ABORT = "GJC_BROKER_HANDOFF_ABORT\n";
8
+ /**
9
+ * Backstop for a retained trampoline whose parent never sends a decision. It must
10
+ * outlive the parent's own broker discovery deadline (which is derived from the
11
+ * publication budget and can double across a guarded retry), otherwise the
12
+ * trampoline reaps the broker first and the parent misreports its own discovery
13
+ * timeout as an "exited before discovery" startup failure.
14
+ */
15
+ export declare const BROKER_HANDOFF_DECISION_TIMEOUT_MS = 120000;
16
+ /**
17
+ * Windows broker hop: spawns the real broker with detached:true and reports its pid.
18
+ *
19
+ * The hop is needed because a broker spawned with detached:true IS still killed when the
20
+ * parent process tree is terminated (e.g., by taskkill /T /F on Windows). Using an
21
+ * intermediate hop process that exits after spawning the real broker allows the broker
22
+ * to survive, because the hop's parent (the initiating client) can be killed without
23
+ * affecting the broker (the hop's pid is no longer valid).
24
+ *
25
+ * Invoked by gjc internals only. Usage:
26
+ * gjc internal broker-hop <json-encoded-args>
27
+ *
28
+ * Exits with code 0 after writing the broker pid/incarnation to stdout and
29
+ * receiving the parent's acknowledgement. If stdin closes first, it terminates
30
+ * the pinned broker and exits with code 1.
31
+ */
32
+ export declare function runBrokerHopFromArgv(argv: string[]): Promise<void>;
33
+ type BrokerHopWriteCallback = (error?: Error | null) => void;
34
+ type BrokerHopWriter = (chunk: string, callback: BrokerHopWriteCallback) => void;
35
+ type BrokerHopAcknowledger = () => Promise<boolean>;
36
+ export declare function writeBrokerHopReplyForTest(child: childProcess.ChildProcess, reference: Process, pid: number, write: BrokerHopWriter, waitForAcknowledgement?: BrokerHopAcknowledger): Promise<{
37
+ kind: "written";
38
+ } | {
39
+ kind: "failed";
40
+ reason: string;
41
+ }>;
42
+ export declare function waitForBrokerHandoffAcknowledgement(input: stream.Readable): Promise<boolean>;
43
+ /** Wait for a validated identity ACK followed by the parent's publication decision. */
44
+ export declare function waitForBrokerHandoffDecision(input: stream.Readable, timeoutMs?: number): Promise<"commit" | "abort">;
45
+ export {};
@@ -144,19 +144,27 @@ export declare class LifecycleLedger {
144
144
  findByOperationKey(operationKey: string, fingerprint?: string): LifecycleLedgerEntry | undefined;
145
145
  findAnyByOperationKey(operationKey: string): LifecycleLedgerEntry | undefined;
146
146
  /**
147
- * Live or uncertain legacy rows predate the operation/key index. Their opaque
148
- * identities cannot establish that a different target is safe, so callers
149
- * must reject rather than create a second admission. A fresh session.create
150
- * may ignore completed terminal legacy rows so old successful operations do
151
- * not block coordinator startup. Other operations retain the legacy fence
152
- * because target-bound legacy identities cannot prove key uniqueness. For
153
- * target-bound terminal creates, the opaque legacy identity also cannot reveal
154
- * the original caller key, so this exception retires that legacy key history;
155
- * exact key-only legacy creates are still rejected by the earlier lookup.
147
+ * Live legacy rows predate the operation/key index. Their opaque identities
148
+ * cannot establish that a different target is safe, so callers must reject
149
+ * rather than create a second admission. A fresh session.create may ignore
150
+ * final legacy rows: exact legacy identities are still resolved before this
151
+ * check, and uncertain rows retain their session-scoped fences.
152
+ *
153
+ * A session-targeted request passes `sessionTarget` to ignore terminal legacy
154
+ * rows that record only other sessions, unless the row is the caller's key
155
+ * reused across targets (`keyReuseIdentities`). Terminal rows recording the
156
+ * target or no session, uncertain rows, and live rows keep the fence because
157
+ * they cannot prove the requested target is unrelated.
156
158
  */
157
159
  hasLegacyIdentity(excludedIdentities?: ReadonlySet<string>, options?: {
158
- ignoreTerminalRows?: boolean;
160
+ ignoreFinalRows?: boolean;
161
+ sessionTarget?: {
162
+ sessionId: string;
163
+ keyReuseIdentities: ReadonlySet<string>;
164
+ };
159
165
  }): boolean;
166
+ /** Sessions recorded by terminal legacy rows, for deriving key-reuse identities. */
167
+ terminalLegacySessionIds(): Set<string>;
160
168
  migrateIdentity(from: string, to: string, metadata: {
161
169
  operationKey: string;
162
170
  fingerprint: string;
@@ -133,6 +133,28 @@ export type SessionLifecycleLaunchRequest = SessionLifecycleLaunchRequestBase &
133
133
  coordinatorSidecarSigningKey?: undefined;
134
134
  });
135
135
  export declare function readSessionLifecycleLaunchRequest(value: string | undefined, now?: number): SessionLifecycleLaunchRequest;
136
+ /**
137
+ * Validates the optional per-session `env`/`unsetEnv` pair (#6735). Returns
138
+ * null when either is malformed so the caller fails the launch closed.
139
+ */
140
+ export declare function lifecycleSessionEnv(input: {
141
+ env?: unknown;
142
+ unsetEnv?: unknown;
143
+ }): {
144
+ env?: Record<string, string>;
145
+ unsetEnv?: string[];
146
+ } | null;
147
+ /**
148
+ * Composes the inherited part of a lifecycle session host's environment:
149
+ * drops the process-local master capability, every `unsetEnv` name, and any
150
+ * inherited name an explicit per-session `env` entry replaces (case-folded on
151
+ * Windows so `Path` and `PATH` never both reach the child), then layers the
152
+ * per-session `env` on top. Broker-issued `GJC_*` keys are applied after this.
153
+ */
154
+ export declare function lifecycleSessionHostBaseEnv(inherited: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>>, launch: {
155
+ env?: Readonly<Record<string, string>>;
156
+ unsetEnv?: readonly string[];
157
+ }): Record<string, string>;
136
158
  type CleanupEvidence = BrokerCleanupEvidence;
137
159
  export declare function validateBrokerModelPresetSync(agentDir: string, requestedProfile: string): string | BrokerResponse;
138
160
  export declare function validateBrokerModelPresetForTest(agentDir: string, requestedProfile: string): string | BrokerResponse;
@@ -0,0 +1,5 @@
1
+ export interface BrokerLockHostIdentity {
2
+ ownerHostId: string;
3
+ previousOwnerHostIds: readonly string[];
4
+ }
5
+ export declare function brokerLockHostIdentity(agentDir: string): Promise<BrokerLockHostIdentity>;
@@ -1,3 +1,4 @@
1
+ import { type FileLockOptions } from "../../config/file-lock";
1
2
  import { SDK_STATE_VERSION, SESSION_INDEX_EVENT_VERSION } from "./state-version";
2
3
  export type SessionIndexEventType = "host_registered" | "host_heartbeat" | "host_unregistered" | "lifecycle_started" | "lifecycle_terminal" | "session_closed" | "session_deleted" | "record_reconciled";
3
4
  export type SessionActivityState = "active" | "idle";
@@ -182,10 +183,14 @@ export declare const SESSION_HEARTBEAT_INTERVAL_MS = 60000;
182
183
  export declare const DEAD_HOST_HEARTBEAT_SILENCE_MS: number;
183
184
  export declare const DEFAULT_SESSION_RETENTION_MAX_AGE_MS: number;
184
185
  export declare const DEFAULT_SESSION_RETENTION_MAX_ROWS = 25000;
186
+ /** Bound ordinary bootstrap waits; authorized doctor successors may use the full prepared window. */
187
+ export declare function sessionIndexStartupLockOptions(deadline: number, signal?: AbortSignal, policy?: "ordinary" | "authorized-successor"): FileLockOptions;
188
+ /** One elapsed budget for queueing, probing and every reacquisition in a pass. */
189
+ export declare const SESSION_HEARTBEAT_CHECKPOINT_BUDGET_MS = 15000;
185
190
  export declare class SessionIndex {
186
191
  #private;
187
192
  constructor(agentDir: string, policy?: RetentionPolicy, observationDeps?: SessionIndexObservationDeps);
188
- open(): Promise<this>;
193
+ open(options?: FileLockOptions): Promise<this>;
189
194
  replay(): Promise<void>;
190
195
  /**
191
196
  * Polling-path refresh (#4689): when both index files carry the exact change
@@ -6,6 +6,8 @@ export declare class BrokerTransport {
6
6
  #private;
7
7
  constructor(broker: Broker, token: string, port?: number);
8
8
  get port(): number;
9
+ /** Sockets a client holds open right now; the broker outlives every one of them. */
10
+ get clientCount(): number;
9
11
  start(): Promise<number>;
10
12
  stop(): Promise<void>;
11
13
  }
@@ -1,8 +1,9 @@
1
+ import { type AdapterValidationError } from "../protocol/adapter-validation";
1
2
  import { type Adapter, type OperationKind } from "../protocol/operation-registry";
2
3
  export type ChatTransport = Extract<Adapter, "telegram" | "discord" | "slack">;
3
4
  export type ChatOperationDisposition = "allowed" | "unsupported_on_chat";
4
5
  export interface ChatCommandError {
5
- code: "unsupported_on_chat" | "secret_input_forbidden";
6
+ code: "unsupported_on_chat" | "secret_input_forbidden" | "ultrafast_tier_forbidden" | AdapterValidationError["code"];
6
7
  message: string;
7
8
  }
8
9
  export type ChatCommandDecision = {