@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
@@ -70,10 +70,13 @@ export interface ForkContextSeedOptions {
70
70
  import type { AuthCredentialSelector } from "@gajae-code/ai/core";
71
71
  import { type AsyncJob, type AsyncJobDeliveryState, AsyncJobManager, type FoldReason, type JobFoldEvent, type SubagentLifecycle } from "../async";
72
72
  import type { Rule } from "../capability/rule";
73
+ import type { ConfigHotReloadCandidate, ConfigHotReloadPaths } from "../config/config-hot-reload";
73
74
  import { type ModelRegistry } from "../config/model-registry";
74
75
  import { type ResolvedModelRoleValue, type ScopedModelSelection } from "../config/model-resolver";
76
+ import { type ModelSelectorValue } from "../config/model-selector-value";
75
77
  import { type PromptTemplate } from "../config/prompt-templates";
76
78
  import type { Settings, SkillsSettings } from "../config/settings";
79
+ import { type SettingPath } from "../config/settings-schema";
77
80
  import { RawSseDebugBuffer } from "../debug/raw-sse-buffer";
78
81
  import { type PythonResult } from "../eval/py/executor";
79
82
  import { type BashArtifactSaveResult, type BashResult } from "../exec/bash-executor";
@@ -99,11 +102,12 @@ import type { NetworkPrewarmRuntime } from "../runtime/network-prewarm-service";
99
102
  import type { WorkspaceTreeRuntime } from "../runtime/workspace-tree-service";
100
103
  import { type ExactMcpServerControlResult, MCPManager } from "../runtime-mcp/manager";
101
104
  import type { NotificationSessionController } from "../sdk/bus/session-control";
102
- import type { SecretObfuscator } from "../secrets/obfuscator";
105
+ import { type SecretObfuscator } from "../secrets/obfuscator";
103
106
  import { type DiscoverableTool, type DiscoverableToolSearchIndex } from "../tool-discovery/tool-index";
104
107
  import type { AskAnswerSource, ToolSession } from "../tools";
105
108
  import type { CheckpointState } from "../tools/checkpoint";
106
109
  import { type TodoItem, type TodoPhase } from "../tools/todo-write";
110
+ import { type EditMode } from "../utils/edit-mode";
107
111
  import { type WorkspaceTree } from "../workspace-tree";
108
112
  import { type DefaultModelSelectionResult } from "./default-model-selection";
109
113
  import { type ConfiguredFallbackChain, type FallbackChainRuntimeState } from "./fallback-chain-controller";
@@ -301,6 +305,8 @@ export interface AgentSessionConfig {
301
305
  workflowGatePublication?: "endpoint" | "local";
302
306
  /** Tool registry for LSP and settings */
303
307
  toolRegistry?: Map<string, AgentTool>;
308
+ /** Publish committed active tool names to tool execution contexts. */
309
+ onToolNamesChanged?: (toolNames: string[]) => void;
304
310
  /**
305
311
  * Tool objects this session's builder constructed from built-in descriptors, captured
306
312
  * before any extension, MCP, or dynamically registered tool could claim their registry
@@ -368,6 +374,8 @@ export interface AgentSessionConfig {
368
374
  defaultSelectedMCPServerNames?: string[];
369
375
  /** MCP tool names that should seed brand-new sessions created from this AgentSession. */
370
376
  defaultSelectedMCPToolNames?: string[];
377
+ /** Conventional autoload MCP names for the current catalog when autoload is not deferred. */
378
+ defaultSelectedConventionalMCPToolNames?: string[];
371
379
  /** MCP capabilities that are always active and never part of persisted user selection. */
372
380
  mandatoryMCPToolNames?: string[];
373
381
  /** TTSR manager for time-traveling stream rules */
@@ -481,6 +489,10 @@ export interface PromptOptions {
481
489
  /** Internal host capability; ordinary package callers cannot construct the branded value. */
482
490
  sdkRunCapability?: unknown;
483
491
  }
492
+ export type QueuedRunStartFailure = {
493
+ readonly disposition: "not-started";
494
+ readonly error: unknown;
495
+ };
484
496
  export interface SendUserMessageOptions {
485
497
  deliverAs?: QueuedInputDelivery;
486
498
  /** Preserve a busy SDK dispatch as queued work across an admission fence. */
@@ -494,6 +506,8 @@ export interface SendUserMessageOptions {
494
506
  startsOwnRun?: boolean;
495
507
  removed?: boolean;
496
508
  }) => void;
509
+ /** Internal positive core refusal, never a provider or teardown failure. */
510
+ onQueuedRunStartFailed?: (failure: QueuedRunStartFailure) => void;
497
511
  /** Internal dispatch disposition used before actual queue consumption. */
498
512
  onDispatchDisposition?: (promotion: {
499
513
  startsOwnRun: boolean;
@@ -726,6 +740,41 @@ export interface DefaultFallbackRuntimeState {
726
740
  controller: FallbackChainRuntimeState;
727
741
  exhaustedLastTurn: boolean;
728
742
  }
743
+ export interface AgentSessionProfileInstalledOverrideState {
744
+ modelRoles: ReadonlyMap<string, ModelSelectorValue | undefined>;
745
+ agentModelOverrides: ReadonlyMap<string, ModelSelectorValue | undefined>;
746
+ installedModelRoles: ReadonlyMap<string, ModelSelectorValue>;
747
+ installedAgentModelOverrides: ReadonlyMap<string, ModelSelectorValue>;
748
+ manualModelRoles: ReadonlySet<string>;
749
+ manualAgentModelOverrides: ReadonlySet<string>;
750
+ configuredAgentModelOverrides: ReadonlySet<string>;
751
+ configuredDefaultChain?: readonly string[];
752
+ preProfileModel: Model | undefined;
753
+ }
754
+ export interface PreparedProfileModelSelection {
755
+ readonly sessionId: string;
756
+ readonly model: Model;
757
+ readonly thinkingLevel: ThinkingLevel | undefined;
758
+ readonly committedThinkingLevel: ThinkingLevel | undefined;
759
+ readonly previousModel: Model | undefined;
760
+ readonly previousThinkingLevel: ThinkingLevel | undefined;
761
+ readonly previousEditMode: EditMode;
762
+ readonly signal: AbortSignal | undefined;
763
+ }
764
+ export interface ConfigurationReloadResult {
765
+ readonly applied: boolean;
766
+ readonly settingsChanged: boolean;
767
+ readonly modelsChanged: boolean;
768
+ readonly changedSettings: readonly SettingPath[];
769
+ }
770
+ export type ConfigurationReloadErrorCode = "SESSION_UNAVAILABLE" | "PATH_CHANGED" | "SETTINGS_INVALID" | "MODELS_INVALID" | "MODEL_UNAVAILABLE" | "ACTIVE_PROFILE_INVALID" | "PUBLICATION_FAILED" | "VALIDATION_CLEANUP_FAILED";
771
+ export declare class ConfigurationReloadError extends Error {
772
+ readonly code: ConfigurationReloadErrorCode;
773
+ readonly retryable: boolean;
774
+ constructor(code: ConfigurationReloadErrorCode, cause?: unknown, options?: {
775
+ readonly retryable?: boolean;
776
+ });
777
+ }
729
778
  /** A lost continuation may only settle the emitter/session pair that opened it. */
730
779
  export declare function isCurrentWorkflowGateContinuation(currentSessionId: string, expectedSessionId: string, currentEmitter: WorkflowGateEmitter | undefined, expectedEmitter: WorkflowGateEmitter): boolean;
731
780
  export declare class AgentSession {
@@ -779,19 +828,27 @@ export declare class AgentSession {
779
828
  session_id?: string;
780
829
  } | undefined;
781
830
  /**
782
- * Live prompt marker or restored durable workflow — the effective state the
783
- * cwd-local mutation guard must honor after resume.
831
+ * Live prompt marker or durable workflow identity — the effective state the
832
+ * cwd-local mutation guard must honor during and after a workflow prompt.
784
833
  */
785
834
  getEffectiveActiveWorkflowSkillState(): {
786
835
  skill: string;
787
836
  sessionId: string;
788
837
  } | undefined;
838
+ /** Refresh durable workflow identity before a terminal or safety-sensitive operation. */
839
+ refreshEffectiveActiveWorkflowSkillState(): Promise<{
840
+ skill: string;
841
+ sessionId: string;
842
+ } | undefined>;
789
843
  /** Replace the session-owned MCP manager after a cwd rescope. */
790
844
  replaceOwnedMcpManager(next: MCPManager | undefined): Promise<void>;
791
- /** Swap named custom tools and their optional mandatory MCP selection. */
845
+ /** Swap named custom tools and restore authoritative MCP selections as late tools arrive. */
792
846
  replaceNamedCustomTools(previousNames: readonly string[], nextTools: readonly CustomTool[], options?: {
793
847
  mandatoryMCPToolNames?: readonly string[];
848
+ defaultSelectedConventionalMCPToolNames?: readonly string[];
794
849
  activateNewTools?: boolean;
850
+ inactiveNewToolNames?: readonly string[];
851
+ persistMCPSelection?: boolean;
795
852
  }): Promise<void>;
796
853
  /** Best-effort accessor for the active skill's `current_phase` field from
797
854
  * its persisted mode-state file. Used by the `skill` tool to enforce the
@@ -855,6 +912,8 @@ export declare class AgentSession {
855
912
  * manager's stable control-plane records (they outlive AsyncJob eviction).
856
913
  */
857
914
  getSubagentLifecycleStatuses(): SubagentLifecycle[];
915
+ /** Notify UI projections after a committed session-identity transition. */
916
+ notifySessionIdentityChanged(): Promise<void>;
858
917
  /**
859
918
  * Emit a UI-only notice to the session. Surfaces in interactive mode as a
860
919
  * `showWarning` / `showError` / `showStatus` line; non-interactive modes
@@ -873,6 +932,8 @@ export declare class AgentSession {
873
932
  * Multiple listeners can be added. Returns unsubscribe function for this listener.
874
933
  */
875
934
  subscribe(listener: AgentSessionEventListener): () => void;
935
+ /** Subscribe to committed session identity changes that affect UI projections. */
936
+ subscribeSessionIdentityChanges(listener: () => void | Promise<void>): () => void;
876
937
  /**
877
938
  * Remove all listeners, flush pending writes, and disconnect from agent.
878
939
  * Call this when completely done with the session.
@@ -958,6 +1019,7 @@ export declare class AgentSession {
958
1019
  type: "agent_end";
959
1020
  }>): void;
960
1021
  flushParkedAgentEndForCoordinatorPersistForTests(): void;
1022
+ waitForAgentEndHandlingForTests(): Promise<void>;
961
1023
  drainAsyncJobDeliveriesForAcp(options?: {
962
1024
  timeoutMs?: number;
963
1025
  }): Promise<boolean>;
@@ -1059,6 +1121,11 @@ export declare class AgentSession {
1059
1121
  * deliberately bypassed: suppression is runtime state, not user authority.
1060
1122
  */
1061
1123
  controlExactMcpServer(action: ExactMcpControlAction, name: string): Promise<ExactMcpControlResult | undefined>;
1124
+ /** Whether the current context has committed persisted, constructor, or caller MCP selection authority. */
1125
+ hasCommittedMCPToolSelectionAuthority(): boolean;
1126
+ /** Whether the current context has committed or pending caller MCP selection authority. */
1127
+ hasMCPToolSelectionAuthority(): boolean;
1128
+ getActiveMCPToolNames(): string[];
1062
1129
  getSelectedMCPToolNames(): string[];
1063
1130
  isToolDiscoveryEnabled(): boolean;
1064
1131
  getDiscoverableTools(filter?: {
@@ -1066,7 +1133,9 @@ export declare class AgentSession {
1066
1133
  }): DiscoverableTool[];
1067
1134
  getDiscoverableToolSearchIndex(): DiscoverableToolSearchIndex;
1068
1135
  getSelectedDiscoveredToolNames(): string[];
1069
- activateDiscoveredTools(toolNames: string[]): Promise<string[]>;
1136
+ activateDiscoveredTools(toolNames: string[], options?: {
1137
+ persistMCPSelection?: boolean;
1138
+ }): Promise<string[]>;
1070
1139
  /**
1071
1140
  * Reload the SSH tool from disk-backed capability discovery and make the
1072
1141
  * refreshed definition visible to the next model call without restarting.
@@ -1079,8 +1148,15 @@ export declare class AgentSession {
1079
1148
  * Only tools in the registry can be enabled. Unknown tool names are ignored.
1080
1149
  * Also rebuilds the system prompt to reflect the new tool set.
1081
1150
  * Changes take effect before the next model call.
1151
+ * Use `explicit: false` for internal filtering and `persistMCPSelection: false` when the live
1152
+ * selection must not be written to the session transcript. Internal mode transitions may set
1153
+ * `retryOnMcpCatalogChange` when a catalog publication must not leave their tool swap unapplied.
1082
1154
  */
1083
- setActiveToolsByName(toolNames: string[]): Promise<void>;
1155
+ setActiveToolsByName(toolNames: string[], options?: {
1156
+ explicit?: boolean;
1157
+ persistMCPSelection?: boolean;
1158
+ retryOnMcpCatalogChange?: boolean;
1159
+ }): Promise<void>;
1084
1160
  /** Rebuild the base system prompt using the current active tool set. */
1085
1161
  refreshBaseSystemPrompt(): Promise<void>;
1086
1162
  /**
@@ -1479,8 +1555,12 @@ export declare class AgentSession {
1479
1555
  cause?: ModelChangeCause;
1480
1556
  onMutationStarted?: () => void;
1481
1557
  }): Promise<void>;
1482
- setActiveModelProfile(name: string | undefined): void;
1558
+ /** History may restore the identity without proving this process activated the profile. */
1559
+ setActiveModelProfile(name: string | undefined, activatedByThisProcess?: boolean): void;
1560
+ markProfileRoleOverrideManual(path: "modelRoles" | "task.agentModelOverrides", role: string): void;
1483
1561
  getActiveModelProfile(): string | undefined;
1562
+ /** A restored profile identity is not eligible for role-only materialization until activation succeeds. */
1563
+ getActivatedModelProfile(): string | undefined;
1484
1564
  setUnavailableModelProfile(name: string | undefined): void;
1485
1565
  getUnavailableModelProfile(): string | undefined;
1486
1566
  /** Revision fence for deferred activation after a user model selection. */
@@ -1492,6 +1572,9 @@ export declare class AgentSession {
1492
1572
  };
1493
1573
  /** Fence deferred startup profile recovery before an explicit control-surface selection. */
1494
1574
  markUserModelSelection(): void;
1575
+ getConfigurationPaths(): ConfigHotReloadPaths | undefined;
1576
+ validateConfiguration(candidate: ConfigHotReloadCandidate): Promise<void>;
1577
+ reloadConfiguration(candidate: ConfigHotReloadCandidate, signal: AbortSignal): Promise<ConfigurationReloadResult>;
1495
1578
  /**
1496
1579
  * Re-apply vendor-separated delegation after a profile activation changed the
1497
1580
  * role layer. `eagerTasks` is resolved at prompt build time, but under
@@ -1502,7 +1585,18 @@ export declare class AgentSession {
1502
1585
  */
1503
1586
  syncEagerDelegation(): Promise<void>;
1504
1587
  /** Record runtime override keys installed by a profile activation. */
1505
- noteProfileInstalledOverrides(modelRoles: readonly string[], agentModelOverrides: readonly string[], preProfileModel: Model | undefined): void;
1588
+ noteProfileInstalledOverrides(modelRoles: readonly string[], agentModelOverrides: readonly string[], preProfileModel: Model | undefined, baseline?: {
1589
+ modelRoles: Readonly<Record<string, ModelSelectorValue>>;
1590
+ agentModelOverrides: Readonly<Record<string, ModelSelectorValue>>;
1591
+ }, installed?: {
1592
+ modelRoles: Readonly<Record<string, ModelSelectorValue>>;
1593
+ agentModelOverrides: Readonly<Record<string, ModelSelectorValue>>;
1594
+ }, manual?: {
1595
+ modelRoles: readonly string[];
1596
+ agentModelOverrides: readonly string[];
1597
+ }, configuredDefaultChain?: readonly string[]): void;
1598
+ getProfileInstalledOverrideState(): AgentSessionProfileInstalledOverrideState;
1599
+ restoreProfileInstalledOverrideState(state: AgentSessionProfileInstalledOverrideState): void;
1506
1600
  /** Drop the recorded profile-installed override keys after materialization. */
1507
1601
  clearProfileInstalledOverrides(): void;
1508
1602
  /** Current profile-installed override keys, for deriving the activation base. */
@@ -1628,6 +1722,9 @@ export declare class AgentSession {
1628
1722
  shouldMutate?: () => boolean;
1629
1723
  onMutationStarted?: () => void;
1630
1724
  }): Promise<TemporaryProviderSessionScope | void>;
1725
+ prepareModelSelectionForProfileActivation(model: Model, thinkingLevel: ThinkingLevel | undefined, signal?: AbortSignal): Promise<PreparedProfileModelSelection>;
1726
+ commitPreparedProfileModelSelection(prepared: PreparedProfileModelSelection, onThinkingLevelApplied?: (mutationRevision: number) => void): void;
1727
+ finishPreparedProfileModelSelection(prepared: PreparedProfileModelSelection): Promise<void>;
1631
1728
  /** Restore the exact live-model state captured before a failed selector transaction. */
1632
1729
  restoreModelSelectionForRollback(model: Model | undefined, thinkingLevel: ThinkingLevel | undefined): Promise<void>;
1633
1730
  /** Set a durable per-session model from a control surface without exposing credential errors. */
@@ -1882,7 +1979,8 @@ export declare class AgentSession {
1882
1979
  * the reply is generated, both the incoming question and the auto-reply are
1883
1980
  * queued for injection into the recipient's persisted history so the model
1884
1981
  * sees the exchange on its next turn. Injection happens immediately when the
1885
- * session is idle, otherwise it is deferred until streaming ends.
1982
+ * session is idle; a busy session steers the exchange into the live run, which
1983
+ * commits it at its next tool boundary.
1886
1984
  */
1887
1985
  respondAsBackground(args: {
1888
1986
  from: string;
@@ -87,7 +87,7 @@ export declare function managedDirectoryIdentityForScope(scope: ManagedScope): {
87
87
  };
88
88
  export declare function managedRootForScope(scope: ManagedScope): ManagedDirectoryRoot;
89
89
  export type ManagedMigrationPolicy = "copy-retain" | "disabled";
90
- export type ManagedScopeErrorCode = "cwd_missing" | "cwd_not_directory" | "identity_unavailable" | "network_unsupported" | "sessions_root_unavailable" | "binding_conflict" | "binding_invalid" | "migration_busy" | "managed_gc_journal_capacity_exceeded" | "atomic_unavailable" | "invalid_request" | "durability_failed" | "durability_not_provable" | "capacity_exceeded";
90
+ export type ManagedScopeErrorCode = "cwd_missing" | "cwd_not_directory" | "identity_unavailable" | "network_unsupported" | "sessions_root_unavailable" | "binding_conflict" | "binding_invalid" | "migration_busy" | "managed_gc_journal_capacity_exceeded" | "atomic_unavailable" | "invalid_request" | "permission_denied" | "durability_failed" | "durability_not_provable" | "capacity_exceeded";
91
91
  export type ManagedScopeResolution = {
92
92
  kind: "resolved";
93
93
  scope: ManagedScope;
@@ -122,7 +122,7 @@ export type ManagedCandidateListing = {
122
122
  code: "scan_failed" | "unsafe_root" | "invalid_candidate";
123
123
  message: string;
124
124
  };
125
- export type ManagedOpenFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "artifact_capacity_exceeded" | "managed_gc_journal_capacity_exceeded" | "durability_failed" | "atomic_unavailable" | "invalid_request" | "durability_not_provable" | "migration_retired" | "legacy_migration_disabled" | "managed_storage_unsupported";
125
+ export type ManagedOpenFailure = "migration_busy" | "binding_conflict" | "binding_invalid" | "destination_conflict" | "source_changed" | "unsafe_artifacts" | "artifact_capacity_exceeded" | "managed_gc_journal_capacity_exceeded" | "durability_failed" | "atomic_unavailable" | "permission_denied" | "invalid_request" | "durability_not_provable" | "migration_retired" | "legacy_migration_disabled" | "managed_storage_unsupported";
126
126
  export type ManagedOpenCandidateResult = {
127
127
  kind: "opened";
128
128
  path: string;
@@ -15,7 +15,7 @@ export declare class ManagedAppendIdentityMismatchError extends Error {
15
15
  constructor(relativePath: string);
16
16
  }
17
17
  export declare class ManagedPublishError extends Error {
18
- readonly classification: "destination_conflict" | "atomic_unavailable" | "invalid_request" | "durability_not_provable" | "identity_mismatch" | "io_error" | "durability_failed";
18
+ readonly classification: "destination_conflict" | "atomic_unavailable" | "invalid_request" | "durability_not_provable" | "identity_mismatch" | "permission_denied" | "io_error" | "durability_failed";
19
19
  readonly diagnostic: string;
20
20
  readonly stagingCleanupSafe: boolean;
21
21
  constructor(classification: ManagedPublishError["classification"], outcome: NativePublishOutcome);
@@ -1,6 +1,6 @@
1
1
  export type NativePublishMutationState = "not_committed" | "committed" | "unknown";
2
2
  export type NativePublishDurabilityState = "not_attempted" | "proven" | "not_provable";
3
- export type NativePublishReason = "none" | "destination_exists" | "atomic_unavailable" | "cross_device" | "permission_denied" | "io_failure" | "interrupted" | "invalid_request" | "identity_violation" | "durability_not_provable" | "unknown";
3
+ export type NativePublishReason = "none" | "destination_exists" | "atomic_unavailable" | "cross_device" | "permission_denied" | "access_denied" | "io_failure" | "interrupted" | "invalid_request" | "identity_violation" | "durability_not_provable" | "unknown";
4
4
  export type NativePublishOperation = "direct_rename" | "retained_file" | "retained_tree";
5
5
  export type NativePublishPrimitive = "renameat2_noreplace" | "linkat_noreplace" | "mkdirat_renameat_noreplace" | "renameatx_np_excl" | "windows_rename_noreplace" | "unsupported" | "unknown";
6
6
  export type NativePublishPhase = "preflight" | "file_sync" | "rename" | "source_unlink" | "source_parent_sync" | "destination_parent_sync" | "terminal_identity" | "complete" | "unknown";
@@ -72,8 +72,12 @@ export declare const PRE_ADMISSION_ARTIFACT_SPILL_TAIL_BYTES = 4096;
72
72
  * Build the deterministic inline receipt for a tool result saved before the
73
73
  * next provider context is constructed. Byte boundaries never split UTF-8
74
74
  * code points, so head/tail recovery remains readable for emoji and CJK text.
75
+ *
76
+ * `redact` runs on the complete text before the cut. The digest stays the
77
+ * caller's hash of the stored artifact; the omitted count is the redacted
78
+ * preview's omitted bytes.
75
79
  */
76
- export declare function createPreAdmissionArtifactSpillPreview(fullText: string, artifactId: string, digest: string): string;
80
+ export declare function createPreAdmissionArtifactSpillPreview(fullText: string, artifactId: string, digest: string, redact?: (text: string) => string): string;
77
81
  /**
78
82
  * Message type for bash executions via the ! command.
79
83
  */
@@ -41,6 +41,17 @@ export interface PreparedNewSession {
41
41
  readonly artifactsDir: string | null;
42
42
  readonly managedLegacyLocalMigrationSource: ManagedLegacyLocalMigrationSource | null;
43
43
  }
44
+ /**
45
+ * Resident text is a second plaintext copy of assistant and tool output.
46
+ * A cache root inside a Git worktree can be staged by a later `git add`, so
47
+ * that root stays in memory. Both the lexical directory and the canonical
48
+ * directory are classified: a symlink outside the worktree must not hide a
49
+ * target inside it, and a lexical worktree path stays refused when its
50
+ * canonical target is outside. A missing or non-directory root still reaches
51
+ * the resident-cache trust check when both views are outside a worktree.
52
+ * No existing directory within 64 ancestors, or a resolver error, stays in memory.
53
+ */
54
+ export declare function residentTextCacheRootAllowsDisk(cacheRoot: string): boolean;
44
55
  export interface SessionEntryBase {
45
56
  type: string;
46
57
  id: string;
@@ -1092,6 +1103,11 @@ export interface ResolvedSessionMatch {
1092
1103
  session: SessionInfo;
1093
1104
  scope: "local" | "global";
1094
1105
  }
1106
+ /**
1107
+ * Equal session id first, the same `id ===` check managed resume already uses.
1108
+ * Prefix matching stays for every other argument, in list order.
1109
+ */
1110
+ export declare function pickResumableSession(sessions: readonly SessionInfo[], sessionArg: string): SessionInfo | undefined;
1095
1111
  export declare function resolveResumableSession(sessionArg: string, cwd: string, sessionDir?: string, storage?: SessionStorage, managedAgentDir?: string): Promise<ResolvedSessionMatch | undefined>;
1096
1112
  interface SessionManagerStateSnapshot {
1097
1113
  sessionId: string;
@@ -1152,14 +1168,14 @@ export declare const SessionManagerTestHooks: {
1152
1168
  /**
1153
1169
  * Freshness snapshot captured with every async whole-session persistence
1154
1170
  * preparation. Immediately before the synchronous persistence transaction, the
1155
- * live values are compared: a `sessionFile`/`lifecycleId` change aborts (lifecycle
1156
- * switch); a revision change discards the prepared bytes and re-prepares (bounded),
1171
+ * live values are compared: a logical lifecycle change aborts; a verified storage
1172
+ * relocation or revision change discards prepared bytes and re-prepares (bounded),
1157
1173
  * so a stale snapshot is never published.
1158
1174
  */
1159
1175
  export interface PersistenceInputToken {
1160
1176
  /** Canonical session file path the prepared bytes target. */
1161
1177
  sessionFile: string;
1162
- /** Per-manager lifecycle identity (`sessionId@sessionFile`); changes on switch/open/reset. */
1178
+ /** Logical lifecycle identity; storage-only relocation preserves its verified origin. */
1163
1179
  lifecycleId: string;
1164
1180
  /** Revision of #fileEntries affecting persisted bytes. */
1165
1181
  entryRevision: number;
@@ -1377,6 +1393,16 @@ export declare class SessionManager {
1377
1393
  }): Promise<void>;
1378
1394
  /** Ownership loss remains observable even when an agent event listener aborts the turn. */
1379
1395
  getAppendIdentityMismatch(): ManagedAppendIdentityMismatchError | undefined;
1396
+ /**
1397
+ * Register the same-owner task capability used to follow a parent's managed
1398
+ * artifact root after its session move. The synchronous resolver must return
1399
+ * only the current ArtifactManager for the same parent ID and parent transcript
1400
+ * basename; it retains the last verified manager on a logical successor.
1401
+ * Registration captures the exact original manager identity. Unchanged identity
1402
+ * keeps using the child's retained store; a changed identity triggers strict
1403
+ * destination transcript verification before re-rooting.
1404
+ */
1405
+ registerManagedTranscriptRelocationResolver(resolver: () => ArtifactManager): () => void;
1380
1406
  isPersisted(): boolean;
1381
1407
  stageDefaultModelSelection(model: string, thinkingLevel: string | undefined, options?: {
1382
1408
  readonly appendThinkingLevel: boolean;
@@ -6,7 +6,7 @@
6
6
  * performed. Environment values are trusted credential sources and take
7
7
  * precedence over global config values.
8
8
  */
9
- import type { AuthCredentialSelector, CredentialRankingMode } from "@gajae-code/ai/core";
9
+ import type { AuthCredentialSelector, ConfiguredCredentialPreference, CredentialRankingMode } from "@gajae-code/ai/core";
10
10
  export interface AuthBrokerClientConfig {
11
11
  url: string;
12
12
  token: string;
@@ -19,8 +19,10 @@ export interface StartupAuthConfigSnapshot {
19
19
  credentialPinStoreIdentity?: string;
20
20
  credentialRankingMode: CredentialRankingMode;
21
21
  credentialPins: Readonly<Record<string, string>>;
22
+ /** Ordered soft per-provider preferences; only portable email/`account:` selectors are accepted. */
23
+ credentialPreferences: Readonly<Record<string, readonly ConfiguredCredentialPreference[]>>;
22
24
  }
23
- export type StartupAuthConfigErrorKind = "unreadable" | "invalid-yaml" | "non-mapping-root" | "invalid-auth" | "invalid-broker" | "invalid-gateway" | "invalid-ranking-mode" | "invalid-credential-pins";
25
+ export type StartupAuthConfigErrorKind = "unreadable" | "invalid-yaml" | "non-mapping-root" | "invalid-auth" | "invalid-broker" | "invalid-gateway" | "invalid-ranking-mode" | "invalid-credential-pins" | "invalid-credential-preferences";
24
26
  /** A malformed startup-auth config aborts resolution rather than downgrading to local authority. */
25
27
  export declare class StartupAuthConfigError extends Error {
26
28
  readonly kind: StartupAuthConfigErrorKind;
@@ -31,11 +33,31 @@ export declare class StartupAuthConfigError extends Error {
31
33
  }
32
34
  /** JSON-schema pattern shared with the runtime persisted-selector grammar. */
33
35
  export declare const PERSISTED_CREDENTIAL_SELECTOR_PATTERN = "^(id:[1-9][0-9]*|email:[^@\\s]+@[^@\\s]+|account:\\S+)$";
36
+ export declare function startupAuthConfigError(agentDir: string, kind: StartupAuthConfigErrorKind): StartupAuthConfigError;
34
37
  /** Path to the local bearer token file. Created on the broker host by `gjc auth-broker token`. */
35
38
  export declare function getAuthBrokerTokenFilePath(): string;
36
39
  /** Validate the persisted selector grammar used by `auth.credentialPins`. */
37
40
  export declare function parsePersistedCredentialSelector(value: string): AuthCredentialSelector | undefined;
38
41
  export declare function isValidPersistedCredentialSelector(value: string): boolean;
42
+ /** JSON-schema pattern for a preference account; shared with {@link parsePreferenceAccount}. */
43
+ export declare const PREFERENCE_ACCOUNT_PATTERN = "^(email:[^@\\s]+@[^@\\s]+|account:\\S+|[^@\\s:]+@[^@\\s]+)$";
44
+ /**
45
+ * Parse one `auth.credentialPreferences` account: a bare email, `email:<address>`, or `account:<id>`. Numeric row ids
46
+ * are excluded: they are bound to one credential store, and a preference has no store-identity binding to detect a
47
+ * retargeted row.
48
+ */
49
+ export declare function parsePreferenceAccount(value: string): AuthCredentialSelector | undefined;
50
+ /** A preference cap accepts (0, 100]; 100 moves past the account only once it is blocked. */
51
+ export declare function isValidCredentialPreferenceCap(value: unknown): value is number;
52
+ /** Canonical config text for one preference entry: the account, or a one-key `{ account: cap }` mapping. */
53
+ export type CredentialPreferenceEntryValue = string | Readonly<Record<string, number>>;
54
+ /**
55
+ * Parse one provider's `auth.credentialPreferences` value: a single account, or a non-empty ordered list whose
56
+ * entries are an account (`me@example.com`) or an account with a usage cap in percent (`me@example.com: 75`).
57
+ * Returns undefined for any invalid value, including an account listed twice, so a typo fails closed instead of
58
+ * silently changing the order.
59
+ */
60
+ export declare function parseCredentialPreferenceList(value: unknown): ConfiguredCredentialPreference[] | undefined;
39
61
  /**
40
62
  * Resolve one typed startup-auth snapshot from trusted env and global config.
41
63
  * Project settings are intentionally not read here, so project-scoped pins
@@ -3,6 +3,8 @@ export declare const DEFAULT_MAX_LINES = 3000;
3
3
  export declare const DEFAULT_MAX_BYTES: number;
4
4
  export declare const DEFAULT_MAX_COLUMN = 1024;
5
5
  export declare const DEFAULT_ARTIFACT_MAX_BYTES: number;
6
+ /** Run `fn` while column caps can see these plain secrets. */
7
+ export declare function runWithOutputRedaction<T>(plainSecrets: readonly string[], fn: () => T): T;
6
8
  /**
7
9
  * Terminal publisher used when managed artifact storage exposes an ID but no
8
10
  * writable pathname. The sink supplies raw content retained up to its artifact
@@ -167,6 +169,15 @@ export declare function truncateLine(line: string, maxChars?: number): {
167
169
  text: string;
168
170
  wasTruncated: boolean;
169
171
  };
172
+ /**
173
+ * Truncate each line to max characters without leaving a configured plain-secret
174
+ * prefix in the retained text. Prior uncapped lines remain in scope because a
175
+ * later line's cut can split a multiline secret.
176
+ */
177
+ export declare function truncateTextWithSecretAwareness(text: string, maxChars?: number, secrets?: readonly string[]): {
178
+ text: string;
179
+ wasTruncated: boolean;
180
+ };
170
181
  /** Shared helper to build a no-truncation result. */
171
182
  export declare function noTruncResult(content: string, totalLines?: number, totalBytes?: number): TruncationResult;
172
183
  /**
@@ -114,6 +114,8 @@ export declare function registerOwnedRegistration(key: TurnRegistrationKey, opti
114
114
  * scope:"owned" abort of that exact attempt must fail closed to uncertainty
115
115
  * (review thread P2). */
116
116
  export declare function isOwnedAttemptRegistrationIncomplete(lineageIdHash: string, attemptEpoch: number): boolean;
117
+ /** Move fail-closed saturation authority with all ownership state during endpoint rekey. */
118
+ export declare function migrateOwnedAttemptSaturationsForEndpoint(predecessorEndpointId: string, successorEndpointId: string): void;
117
119
  /** Exact (jobId, jobGeneration) lookup for completion-origin classification. */
118
120
  export declare function lookupOwnedRegistration(jobId: string, jobGeneration: string, endpointId?: string): TurnRegistrationKey | undefined;
119
121
  export declare function unregisterOwnedRegistration(key: TurnRegistrationKey): void;
@@ -231,7 +233,7 @@ export declare function registerOwnedIfLineaged(manager: {
231
233
  generation?: string;
232
234
  status?: string;
233
235
  } | undefined;
234
- }, toolCallId: string | undefined, jobId: string, endpointId?: string): void;
236
+ }, toolCallId: string | undefined, jobId: string, endpointId?: string, ownedRegistrationEndpointId?: string): void;
235
237
  /** Retire the exact (endpoint, jobId, jobGeneration) owned registration when
236
238
  * its completion delivery is dead-lettered by the manager (delivery-queue
237
239
  * overflow or retry exhaustion): no message is injected and no later
@@ -1,5 +1,5 @@
1
1
  import { CodexImportError } from "./codex";
2
- export type SessionImportErrorCode = CodexImportError["code"] | "invalid_request" | "binding_invalid" | "content_too_large" | "destination_conflict" | "publish_uncertain" | "atomic_unavailable" | "durability_not_provable" | "durability_failed" | "identity_mismatch" | "validation_failed" | "io_failed" | "internal_failed";
2
+ export type SessionImportErrorCode = CodexImportError["code"] | "invalid_request" | "binding_invalid" | "content_too_large" | "destination_conflict" | "publish_uncertain" | "atomic_unavailable" | "permission_denied" | "durability_not_provable" | "durability_failed" | "identity_mismatch" | "validation_failed" | "io_failed" | "internal_failed";
3
3
  export interface SessionImportFailure {
4
4
  status: "failed";
5
5
  provider: "codex";
@@ -1,12 +1,16 @@
1
1
  import type { AgentTool } from "@gajae-code/agent-core";
2
- import { readVisibleSkillActiveState } from "./active-state";
2
+ import { readVisibleSkillActiveState, type SkillActiveEntry } from "./active-state";
3
3
  export declare const DEEP_INTERVIEW_MUTATION_BLOCK_MESSAGE = "Deep-interview phase boundary: continue gathering context/questions/risks and emit a handoff/spec before code edits. Mutation tools and patch execution are blocked while deep-interview is active; finalize specs through `gjc deep-interview --write --stage final` or hand off to an execution phase.";
4
4
  export declare const WORKFLOW_STATE_MUTATION_BLOCK_MESSAGE = ".gjc workflow state and artifacts are runtime-owned. Agent mutation tools cannot edit `.gjc/**`; use the sanctioned `gjc` CLI instead.";
5
5
  export declare const RALPLAN_MUTATION_BLOCK_MESSAGE = "Ralplan planning phase boundary: keep refining the consensus plan and persist plan artifacts through `gjc ralplan --write` (stage scratch files under a temp dir if needed). Product-code mutation tools and patch execution are blocked while ralplan is active; mutate only after the plan is approved and execution begins.";
6
6
  export declare const ULTRAGOAL_GOAL_PLANNING_MUTATION_BLOCK_MESSAGE = "Ultragoal goal-planning phase boundary: finish goal planning and record goals through `gjc ultragoal` before editing code. Product-code mutation tools and patch execution are blocked until goal planning completes and execution begins.";
7
- export declare const AUTORESEARCH_MUTATION_BLOCK_MESSAGE = "Autoresearch research-only boundary: this workflow produces findings, evidence, and a verdict \u2014 never product code. Product-code mutation tools and patch execution are blocked everywhere, on every branch. Mission research artifacts (`autoresearch.sh` at the workdir root and mission state through the sanctioned `gjc autoresearch` CLI) stay writable; run experiments through the `python` tool, or finish the mission and hand off to an approved implementation workflow.";
8
- /** Tools whose execute path can mutate product state. `github` is included so side-effect ops share this guard. */
9
- export declare const WORKFLOW_MUTATION_TOOL_NAMES: readonly ["edit", "write", "ast_edit", "bash", "github"];
7
+ export declare const AUTORESEARCH_MUTATION_BLOCK_MESSAGE = "Autoresearch research-only boundary: this workflow produces findings, evidence, and a verdict \u2014 never product code. Product-code mutation tools and patch execution are blocked everywhere, on every branch. Write the root `autoresearch.sh` only with direct file tools; mission state stays writable through the sanctioned `gjc autoresearch` CLI. Run experiments through the `python` tool, or finish the mission and hand off to an approved implementation workflow.";
8
+ /**
9
+ * Tools whose execute path can mutate product state. `github` is included so
10
+ * side-effect ops share this guard. `eval` and `python` run code that can write
11
+ * files without going through edit, write, or bash.
12
+ */
13
+ export declare const WORKFLOW_MUTATION_TOOL_NAMES: readonly ["edit", "write", "ast_edit", "bash", "github", "eval", "python"];
10
14
  export declare function isWorkflowMutationTool(name: string): boolean;
11
15
  type ToolWithEditMode = AgentTool & {
12
16
  mode?: unknown;
@@ -45,6 +49,18 @@ export declare function readWorkflowGuardContext(cwd: string, options?: {
45
49
  sessionId?: string;
46
50
  threadId?: string;
47
51
  }): Promise<WorkflowGuardContext>;
52
+ /**
53
+ * Pick the single CURRENT workflow entry among active entries.
54
+ *
55
+ * Steady state has exactly one active workflow skill (handoff demotes the prior
56
+ * to `active:false`, which `listActiveSkills` already filters out). If several
57
+ * are momentarily active, prefer the most-recently-updated entry so a stale
58
+ * planning row (e.g. a still-active ralplan `final`) can never be selected over a
59
+ * newer executor (ultragoal/autoresearch), and a planning *return* (newer `updated_at`)
60
+ * reliably wins. Ties fall back to the resolved top-level `skill`, then to the
61
+ * first entry, matching how the HUD/chain guard pick `activeSkills[0]`.
62
+ */
63
+ export declare function resolveCurrentWorkflowEntry(entries: SkillActiveEntry[], topLevelSkill: string): SkillActiveEntry;
48
64
  export declare function assertWorkflowMutationRawPathsAllowed(input: {
49
65
  cwd: string;
50
66
  sessionId?: string;
@@ -1,3 +1,8 @@
1
1
  import type { ParsedSlashCommand, SlashCommandResult, SlashCommandRuntime } from "../types";
2
+ /**
3
+ * One terminal row for an untrusted MCP server or tool name.
4
+ * Ordinary names are unchanged. Controls, OSC, and line breaks are not.
5
+ */
6
+ export declare function mcpTerminalLabel(value: string): string;
2
7
  /** ACP/text-mode `/mcp` handler. Shared by both dispatchers via the spec. */
3
8
  export declare function handleMcpAcp(command: ParsedSlashCommand, runtime: SlashCommandRuntime): Promise<SlashCommandResult>;
@@ -0,0 +1,8 @@
1
+ import type { ModelRegistry } from "../../config/model-registry";
2
+ import type { AgentSession } from "../../session/agent-session";
3
+ type ProviderAuthStatusSession = Pick<AgentSession, "credentialSessionId"> & {
4
+ modelRegistry: Pick<ModelRegistry, "authStorage" | "getAll" | "getAvailable" | "getConfiguredProviderIds" | "getAuthStorageOwner" | "getProviderConfigApiKeySources" | "getProviderRuntimeApiKeyEnvName" | "hasRuntimeProviderApiKey">;
5
+ };
6
+ /** Format credential provenance for `/provider status` without returning credential values. */
7
+ export declare function buildProviderAuthStatusText(session: ProviderAuthStatusSession): Promise<string>;
8
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { Settings } from "../config/settings";
2
+ import { type TerminalArtifactPublisher } from "../session/streaming-output";
2
3
  import { type SSHConnectionTarget } from "./connection-manager";
3
4
  export interface SSHExecutorOptions {
4
5
  /** Session settings used for output policy. */
@@ -16,6 +17,8 @@ export interface SSHExecutorOptions {
16
17
  /** Artifact path/id for full output storage */
17
18
  artifactPath?: string;
18
19
  artifactId?: string;
20
+ /** Session-owned publisher for managed sessions without a writable artifact path. */
21
+ artifactPublisher?: TerminalArtifactPublisher;
19
22
  }
20
23
  export interface SSHResult {
21
24
  /** Combined stdout + stderr output (sanitized, possibly truncated) */
@@ -34,7 +37,11 @@ export interface SSHResult {
34
37
  outputLines: number;
35
38
  /** Number of bytes included in the output text */
36
39
  outputBytes: number;
37
- /** Artifact ID if full output was saved to artifact storage */
40
+ /** Artifact ID if output was saved to artifact storage. */
38
41
  artifactId?: string;
42
+ /** Bytes omitted from artifact storage after its hard cap was reached. */
43
+ artifactTruncatedBytes?: number;
44
+ /** Bounded diagnostic when artifact storage failed. */
45
+ artifactFailureDiagnostic?: string;
39
46
  }
40
47
  export declare function executeSSH(host: SSHConnectionTarget, command: string, options?: SSHExecutorOptions): Promise<SSHResult>;
@@ -59,8 +59,9 @@ export declare function loadProjectContextFiles(options?: LoadContextFilesOption
59
59
  depth?: number;
60
60
  }>>;
61
61
  /**
62
- * Load the effective system prompt customization from SYSTEM.md.
63
- * Project-level SYSTEM.md overrides user-level SYSTEM.md.
62
+ * Load the user system prompt customization from SYSTEM.md.
63
+ * A repository SYSTEM.md is untrusted project text. It must not replace the
64
+ * user file or become the customization block.
64
65
  */
65
66
  export declare function loadSystemPromptFiles(options?: LoadContextFilesOptions): Promise<string | null>;
66
67
  export interface SystemPromptToolMetadata {