@gajae-code/coding-agent 0.17.2 → 0.17.5

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 (390) hide show
  1. package/CHANGELOG.md +267 -0
  2. package/dist/types/cli/daemon-cli.d.ts +3 -1
  3. package/dist/types/cli/github-release.d.ts +17 -0
  4. package/dist/types/cli/public-command-entry.d.ts +56 -0
  5. package/dist/types/cli/public-command-errors.d.ts +126 -0
  6. package/dist/types/cli/public-command-evidence.d.ts +99 -0
  7. package/dist/types/cli/public-command-help.d.ts +65 -0
  8. package/dist/types/cli/public-command-registry.d.ts +69 -0
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -0
  11. package/dist/types/cli/skills-cli.d.ts +5 -0
  12. package/dist/types/cli.d.ts +3 -0
  13. package/dist/types/commands/daemon.d.ts +4 -50
  14. package/dist/types/commands/sdk.d.ts +20 -37
  15. package/dist/types/commands/setup.d.ts +3 -0
  16. package/dist/types/commands/skills.d.ts +9 -0
  17. package/dist/types/config/autorouting-tier-map.d.ts +1049 -3
  18. package/dist/types/config/file-lock.d.ts +13 -3
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +14 -3
  21. package/dist/types/config/model-resolver.d.ts +1 -1
  22. package/dist/types/config/settings-schema.d.ts +11 -0
  23. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  24. package/dist/types/daemon/operator-contract.d.ts +5 -1
  25. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  26. package/dist/types/exec/bash-executor.d.ts +2 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  28. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  29. package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +11 -2
  30. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  31. package/dist/types/extensibility/shared-events.d.ts +3 -1
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  33. package/dist/types/gjc-runtime/state-writer.d.ts +14 -1
  34. package/dist/types/harness-control-plane/control-endpoint.d.ts +4 -1
  35. package/dist/types/harness-control-plane/finalize.d.ts +14 -3
  36. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  37. package/dist/types/internal-urls/index.d.ts +1 -0
  38. package/dist/types/internal-urls/parse.d.ts +9 -1
  39. package/dist/types/main.d.ts +23 -1
  40. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  41. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  42. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  43. package/dist/types/modes/components/session-selector.d.ts +5 -2
  44. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  45. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  46. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  47. package/dist/types/modes/interactive-mode.d.ts +1 -1
  48. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  49. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  50. package/dist/types/modes/types.d.ts +2 -2
  51. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  52. package/dist/types/runtime-mcp/loader.d.ts +2 -0
  53. package/dist/types/runtime-mcp/manager.d.ts +69 -6
  54. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  55. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  56. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  57. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  58. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  59. package/dist/types/sdk/broker/broker.d.ts +17 -4
  60. package/dist/types/sdk/broker/ensure.d.ts +3 -0
  61. package/dist/types/sdk/broker/identity.d.ts +5 -1
  62. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  63. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  64. package/dist/types/sdk/broker/managed-task-dag.d.ts +1335 -0
  65. package/dist/types/sdk/broker/managed-task-verification.d.ts +37 -0
  66. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  67. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  68. package/dist/types/sdk/broker/spawn-authority.d.ts +12 -0
  69. package/dist/types/sdk/broker/startup-failure.d.ts +4 -0
  70. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  71. package/dist/types/sdk/bus/index.d.ts +19 -0
  72. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +7 -1
  73. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  74. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  75. package/dist/types/sdk/cli/rows.d.ts +19 -1
  76. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  77. package/dist/types/sdk/client/client.d.ts +2 -0
  78. package/dist/types/sdk/guides/cli.d.ts +3 -4
  79. package/dist/types/sdk/guides/verify.d.ts +2 -0
  80. package/dist/types/sdk/host/host.d.ts +9 -0
  81. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  82. package/dist/types/sdk/host/types.d.ts +10 -0
  83. package/dist/types/sdk/index.d.ts +1 -0
  84. package/dist/types/sdk/prompt-deadline-flush.d.ts +85 -0
  85. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  86. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  87. package/dist/types/sdk/router/session-router.d.ts +2 -0
  88. package/dist/types/sdk/session.d.ts +3 -3
  89. package/dist/types/sdk/startup-capability.d.ts +2 -0
  90. package/dist/types/sdk/transport/relay.d.ts +1 -0
  91. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  92. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  93. package/dist/types/session/agent-session.d.ts +175 -23
  94. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  95. package/dist/types/session/fold-coordinator.d.ts +17 -3
  96. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  97. package/dist/types/session/session-manager.d.ts +64 -1
  98. package/dist/types/session/session-work-lease.d.ts +14 -0
  99. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  100. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  101. package/dist/types/task/types.d.ts +2 -0
  102. package/dist/types/tools/bash-interactive.d.ts +1 -0
  103. package/dist/types/tools/bash.d.ts +37 -11
  104. package/dist/types/tools/fetch.d.ts +10 -1
  105. package/dist/types/tools/job.d.ts +1 -1
  106. package/dist/types/tools/steer-fold.d.ts +31 -0
  107. package/dist/types/tools/subagent.d.ts +8 -1
  108. package/dist/types/utils/git.d.ts +28 -2
  109. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  110. package/dist/types/utils/mupdf.d.ts +4 -0
  111. package/dist/types/utils/session-title-generation.d.ts +6 -0
  112. package/dist/types/utils/title-generator.d.ts +11 -2
  113. package/dist/types/web/scrapers/types.d.ts +3 -0
  114. package/package.json +18 -10
  115. package/scripts/build-binary.ts +9 -3
  116. package/scripts/compile-args.ts +0 -9
  117. package/scripts/embed-mupdf.ts +52 -0
  118. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  119. package/scripts/vendor-markit.ts +196 -0
  120. package/src/async/job-manager.ts +22 -1
  121. package/src/cli/daemon-cli.ts +53 -18
  122. package/src/cli/github-release.ts +87 -5
  123. package/src/cli/mcp-cli.ts +38 -4
  124. package/src/cli/public-command-entry.ts +450 -0
  125. package/src/cli/public-command-errors.ts +581 -0
  126. package/src/cli/public-command-evidence.ts +717 -0
  127. package/src/cli/public-command-help.ts +360 -0
  128. package/src/cli/public-command-registry.ts +541 -0
  129. package/src/cli/session-picker.ts +2 -1
  130. package/src/cli/setup-cli.ts +10 -1
  131. package/src/cli/skills-cli.ts +46 -2
  132. package/src/cli/stats-cli.ts +11 -1
  133. package/src/cli.ts +61 -1
  134. package/src/commands/daemon.ts +65 -69
  135. package/src/commands/sdk.ts +175 -117
  136. package/src/commands/setup.ts +2 -0
  137. package/src/commands/skills.ts +11 -0
  138. package/src/config/autorouting-tier-map.ts +543 -3
  139. package/src/config/file-lock.ts +206 -65
  140. package/src/config/model-discovery-manager.ts +4 -4
  141. package/src/config/model-profile-activation.ts +417 -66
  142. package/src/config/model-registry.ts +254 -36
  143. package/src/config/model-resolver.ts +6 -1
  144. package/src/config/settings-schema.ts +26 -2
  145. package/src/coordinator-mcp/policy.ts +10 -5
  146. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  147. package/src/coordinator-mcp/question-state.ts +179 -9
  148. package/src/coordinator-mcp/server.ts +521 -87
  149. package/src/coordinator-mcp/session-reaper.ts +6 -4
  150. package/src/crash/record-loader.ts +6 -2
  151. package/src/daemon/operator-contract.ts +26 -12
  152. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  153. package/src/eval/js/context-manager.ts +8 -8
  154. package/src/eval/js/worker-core.ts +9 -4
  155. package/src/eval/js/worker-protocol.ts +2 -0
  156. package/src/exec/bash-executor.ts +3 -0
  157. package/src/extensibility/extensions/runner.ts +52 -4
  158. package/src/extensibility/extensions/types.ts +10 -0
  159. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  160. package/src/extensibility/gjc-plugins/runtime-adapters.ts +46 -8
  161. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  162. package/src/extensibility/shared-events.ts +3 -1
  163. package/src/gjc-runtime/session-state-lock.ts +165 -24
  164. package/src/gjc-runtime/state-writer.ts +317 -6
  165. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  166. package/src/harness-control-plane/control-endpoint.ts +24 -6
  167. package/src/harness-control-plane/finalize.ts +312 -25
  168. package/src/harness-control-plane/owner.ts +323 -89
  169. package/src/internal-urls/docs-index.generated.ts +23 -20
  170. package/src/internal-urls/embedded-protocol.ts +83 -0
  171. package/src/internal-urls/index.ts +1 -0
  172. package/src/internal-urls/parse.ts +21 -1
  173. package/src/internal-urls/router.ts +4 -2
  174. package/src/main.ts +192 -74
  175. package/src/modes/acp/acp-agent.ts +973 -56
  176. package/src/modes/acp/startup-provenance.ts +59 -0
  177. package/src/modes/components/custom-provider-wizard.ts +308 -7
  178. package/src/modes/components/gjc-bundle-settings.ts +21 -1
  179. package/src/modes/components/oauth-selector.ts +9 -0
  180. package/src/modes/components/session-selector.ts +47 -4
  181. package/src/modes/components/tool-status-header.ts +72 -6
  182. package/src/modes/components/user-message-selector.ts +57 -15
  183. package/src/modes/controllers/command-controller.ts +58 -32
  184. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  185. package/src/modes/controllers/input-controller.ts +4 -0
  186. package/src/modes/controllers/runtime-mcp-command-controller.ts +1 -1
  187. package/src/modes/controllers/selector-controller.ts +161 -15
  188. package/src/modes/interactive-mode.ts +21 -7
  189. package/src/modes/runtime-init.ts +1 -0
  190. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  191. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  192. package/src/modes/types.ts +2 -2
  193. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  194. package/src/prompts/system/title-system.md +1 -1
  195. package/src/prompts/tools/bash.md +1 -1
  196. package/src/prompts/tools/job.md +1 -1
  197. package/src/prompts/tools/read.md +2 -0
  198. package/src/runtime/network-prewarm-service.test.ts +36 -1
  199. package/src/runtime/network-prewarm-service.ts +28 -3
  200. package/src/runtime/process-lifecycle.ts +22 -11
  201. package/src/runtime-mcp/config.ts +16 -1
  202. package/src/runtime-mcp/loader.ts +6 -3
  203. package/src/runtime-mcp/manager.ts +845 -109
  204. package/src/runtime-mcp/pool.test.ts +31 -0
  205. package/src/runtime-mcp/pool.ts +304 -28
  206. package/src/runtime-mcp/redaction.ts +42 -0
  207. package/src/runtime-mcp/startup-policy.ts +7 -0
  208. package/src/runtime-mcp/tool-bridge.ts +71 -0
  209. package/src/runtime-mcp/transports/http.ts +108 -25
  210. package/src/sdk/acp/adapter.ts +27 -8
  211. package/src/sdk/broker/broker.ts +1431 -198
  212. package/src/sdk/broker/ensure.ts +21 -3
  213. package/src/sdk/broker/identity.ts +22 -1
  214. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  215. package/src/sdk/broker/lifecycle.ts +690 -141
  216. package/src/sdk/broker/managed-task-dag.ts +1927 -0
  217. package/src/sdk/broker/managed-task-verification.ts +642 -0
  218. package/src/sdk/broker/runtime.ts +1 -1
  219. package/src/sdk/broker/session-index.ts +97 -4
  220. package/src/sdk/broker/spawn-authority.ts +175 -14
  221. package/src/sdk/broker/startup-failure.ts +80 -1
  222. package/src/sdk/broker/stderr-drainer.ts +59 -0
  223. package/src/sdk/broker/transport.ts +1 -0
  224. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  225. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  226. package/src/sdk/bus/index.ts +707 -81
  227. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  228. package/src/sdk/bus/telegram-daemon-contract.ts +7 -1
  229. package/src/sdk/bus/telegram-daemon.ts +10 -3
  230. package/src/sdk/cli/master-cli.ts +47 -36
  231. package/src/sdk/cli/rows.ts +30 -7
  232. package/src/sdk/cli/session-cli.ts +705 -184
  233. package/src/sdk/client/client.ts +18 -0
  234. package/src/sdk/guides/catalog.ts +2 -2
  235. package/src/sdk/guides/cli.ts +20 -62
  236. package/src/sdk/guides/verify.ts +14 -0
  237. package/src/sdk/host/host.ts +49 -5
  238. package/src/sdk/host/session-runtime.test.ts +184 -2
  239. package/src/sdk/host/session-runtime.ts +322 -101
  240. package/src/sdk/host/types.ts +12 -1
  241. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  242. package/src/sdk/host/websocket-transport.ts +40 -6
  243. package/src/sdk/index.ts +11 -0
  244. package/src/sdk/lifecycle/service.ts +2 -0
  245. package/src/sdk/prompt-deadline-flush.ts +356 -0
  246. package/src/sdk/prompt-deadline-manager.ts +133 -1
  247. package/src/sdk/prompt-tool-boundary.ts +121 -0
  248. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  249. package/src/sdk/router/session-router.ts +9 -1
  250. package/src/sdk/session.ts +763 -116
  251. package/src/sdk/startup-capability.ts +1 -1
  252. package/src/sdk/transport/relay.ts +71 -6
  253. package/src/sdk/transport/serve-cli.ts +397 -42
  254. package/src/sdk/transport/socket.ts +12 -11
  255. package/src/sdk/transport/stdio.ts +7 -3
  256. package/src/session/agent-session.ts +2472 -407
  257. package/src/session/fallback-chain-controller.ts +6 -7
  258. package/src/session/fold-coordinator.ts +24 -5
  259. package/src/session/internal/managed-session-scope.ts +68 -18
  260. package/src/session/internal/managed-session-storage.ts +334 -12
  261. package/src/session/session-manager.ts +382 -44
  262. package/src/session/session-work-lease.ts +34 -0
  263. package/src/setup/model-onboarding-guidance.ts +1 -1
  264. package/src/setup/provider-onboarding.ts +397 -24
  265. package/src/setup/provider-presets.json +2 -1
  266. package/src/slash-commands/builtin-registry.ts +259 -15
  267. package/src/task/executor.ts +46 -17
  268. package/src/task/index.ts +14 -2
  269. package/src/task/types.ts +2 -0
  270. package/src/tools/bash-interactive.ts +2 -0
  271. package/src/tools/bash.ts +118 -78
  272. package/src/tools/fetch.ts +140 -25
  273. package/src/tools/job.ts +151 -25
  274. package/src/tools/output-meta.ts +15 -2
  275. package/src/tools/path-utils.ts +27 -3
  276. package/src/tools/read.ts +3 -3
  277. package/src/tools/steer-fold.ts +107 -0
  278. package/src/tools/subagent-render.ts +24 -1
  279. package/src/tools/subagent.ts +27 -1
  280. package/src/tools/tool-catalog.generated.ts +29 -2
  281. package/src/tools/tool-errors.ts +4 -0
  282. package/src/utils/git.ts +53 -3
  283. package/src/utils/markit.ts +55 -41
  284. package/src/utils/mupdf-assets.d.ts +4 -0
  285. package/src/utils/mupdf-embedded.ts +4 -0
  286. package/src/utils/mupdf.ts +136 -0
  287. package/src/utils/session-title-generation.ts +29 -0
  288. package/src/utils/title-generator.ts +46 -2
  289. package/src/web/scrapers/types.ts +24 -3
  290. package/vendor/markit-ai/LICENSE +21 -0
  291. package/vendor/markit-ai/MANIFEST.json +412 -0
  292. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  293. package/vendor/markit-ai/dist/commands/config.js +139 -0
  294. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  295. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  296. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  297. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  298. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  299. package/vendor/markit-ai/dist/commands/init.js +29 -0
  300. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  301. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  302. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  303. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  304. package/vendor/markit-ai/dist/config.d.ts +26 -0
  305. package/vendor/markit-ai/dist/config.js +42 -0
  306. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  307. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  308. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  309. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  310. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  312. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  313. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  314. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  315. package/vendor/markit-ai/dist/converters/github.js +148 -0
  316. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  317. package/vendor/markit-ai/dist/converters/html.js +30 -0
  318. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  319. package/vendor/markit-ai/dist/converters/image.js +124 -0
  320. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  321. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  322. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  323. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  324. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  325. package/vendor/markit-ai/dist/converters/json.js +21 -0
  326. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  327. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  328. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  329. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  330. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  331. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  332. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  333. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  334. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  335. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  336. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  337. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  338. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  339. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  340. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  341. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  342. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  343. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  344. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  345. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  346. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  347. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  348. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  349. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  350. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  351. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  352. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  353. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  354. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  355. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  356. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  357. package/vendor/markit-ai/dist/index.d.ts +30 -0
  358. package/vendor/markit-ai/dist/index.js +26 -0
  359. package/vendor/markit-ai/dist/main.d.ts +2 -0
  360. package/vendor/markit-ai/dist/main.js +191 -0
  361. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  362. package/vendor/markit-ai/dist/markit.js +267 -0
  363. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  364. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  365. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  366. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  367. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  368. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  369. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  370. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  371. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  372. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  373. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  374. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  375. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  376. package/vendor/markit-ai/dist/providers/index.js +56 -0
  377. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  378. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  379. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  380. package/vendor/markit-ai/dist/providers/types.js +1 -0
  381. package/vendor/markit-ai/dist/types.d.ts +36 -0
  382. package/vendor/markit-ai/dist/types.js +1 -0
  383. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  384. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  385. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  386. package/vendor/markit-ai/dist/utils/output.js +31 -0
  387. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  388. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  389. package/vendor/markit-ai/package.json +74 -0
  390. package/vendor/markit-ai.patch +49 -0
@@ -5,6 +5,7 @@
5
5
  * createAgentSession() options. The SDK does the heavy lifting.
6
6
  */
7
7
  import type { ImageContent } from "@gajae-code/ai/core";
8
+ import { postmortem } from "@gajae-code/utils";
8
9
  import type { Args } from "./cli/args";
9
10
  import { ModelRegistry } from "./config/model-registry";
10
11
  import { Settings } from "./config/settings";
@@ -17,6 +18,8 @@ import { initTheme } from "./modes/theme/theme";
17
18
  import type { SubmittedUserInput } from "./modes/types";
18
19
  import type { MCPManager } from "./runtime-mcp";
19
20
  import { type CreateAgentSessionOptions, type CreateAgentSessionResult, createAgentSession, discoverAuthStorage } from "./sdk";
21
+ import { processIncarnation } from "./sdk/broker/process-incarnation";
22
+ import { SessionIndex } from "./sdk/broker/session-index";
20
23
  import type { AgentSession } from "./session/agent-session";
21
24
  import { type ResumeSessionIdentity, type SessionDestination, type SessionDirectoryMigrationPolicy, type SessionInfo, SessionManager, type StrictSessionOpenResult } from "./session/session-manager";
22
25
  import { resolveStartupAuthConfig } from "./session/startup-auth-config";
@@ -55,7 +58,7 @@ type StartupModelProfileArgs = {
55
58
  session: AgentSession;
56
59
  settings: Settings;
57
60
  modelRegistry: ModelRegistry;
58
- parsedArgs: Pick<Args, "default" | "model" | "mpreset" | "thinking">;
61
+ parsedArgs: Pick<Args, "continue" | "default" | "fork" | "model" | "mpreset" | "resume" | "thinking">;
59
62
  startupModel?: CreateAgentSessionOptions["model"];
60
63
  startupThinkingLevel?: CreateAgentSessionOptions["thinkingLevel"];
61
64
  preferCachedModels?: boolean;
@@ -117,6 +120,7 @@ export declare class SessionNotFoundError extends Error {
117
120
  get sessionId(): string;
118
121
  }
119
122
  export declare function operatorFacingSessionOpenMessage(value: unknown): string | undefined;
123
+ export declare function shouldNotifyModelFallback(authBootstrap: boolean | undefined, isInteractive: boolean): boolean;
120
124
  export declare function runInteractiveMode(session: AgentSession, version: string, changelogMarkdown: string | undefined, notifs: (InteractiveModeNotify | null)[], startupUpdate: StartupUpdateOrchestrator, initialMessages: string[], setExtensionUIContext: (uiContext: ExtensionUIContext, hasUI: boolean) => void, lspServers: LspStartupServerInfo[] | undefined, mcpManager: MCPManager | undefined, eventBus?: EventBus, initialMessage?: string, initialImages?: ImageContent[], createInteractiveMode?: CreateInteractiveMode, resumeAction?: "continue-tail" | "open-idle", startDeferredMcpConfig?: CreateAgentSessionResult["startDeferredMcpConfig"], startDeferredModelProfiles?: DeferredModelProfileStartup, options?: {
121
125
  stopAfterFirstPaint?: boolean;
122
126
  }): Promise<void>;
@@ -153,6 +157,24 @@ export interface RunRootCommandDependencies {
153
157
  initializeSettings?: typeof Settings.init;
154
158
  loadSettingsForScope?: typeof Settings.loadForScope;
155
159
  }
160
+ type DirectSessionManager = Pick<SessionManager, "getCwd" | "getSessionFile" | "getSessionId">;
161
+ /**
162
+ * Direct CLI liveness is meaningful only for sessions with a durable transcript.
163
+ * An in-memory manager has no artifacts for GC to fence and must not touch the
164
+ * shared SDK session-index lock.
165
+ */
166
+ export declare function directSessionRegistrationId(sessionManager: DirectSessionManager | undefined, lifecycleRequestId: string | undefined): string | undefined;
167
+ interface DirectSessionRegistrationDependencies {
168
+ createIndex?: (agentDir: string) => SessionIndex;
169
+ processIncarnation?: typeof processIncarnation;
170
+ registerPostmortem?: typeof postmortem.register;
171
+ masterRole?: {
172
+ ownerSessionId: string;
173
+ attestationEpoch: string;
174
+ };
175
+ }
176
+ /** Register a durable direct CLI session while leaving ephemeral sessions lock-free. */
177
+ export declare function registerDirectSession(sessionManager: DirectSessionManager | undefined, agentDir: string, lifecycleRequestId: string | undefined, dependencies?: DirectSessionRegistrationDependencies): Promise<void>;
156
178
  export interface ModelRoleOverrides {
157
179
  smol?: string;
158
180
  slow?: string;
@@ -1,6 +1,6 @@
1
1
  import { type Agent, type AgentSideConnection, type AuthenticateRequest, type AuthenticateResponse, type AvailableCommand, type CancelNotification, type ClientCapabilities, type CloseSessionRequest, type CloseSessionResponse, type DeleteSessionRequest, type DeleteSessionResponse, type ForkSessionRequest, type ForkSessionResponse, type InitializeRequest, type InitializeResponse, type ListSessionsRequest, type ListSessionsResponse, type LoadSessionRequest, type LoadSessionResponse, type NewSessionRequest, type NewSessionResponse, type PromptRequest, type PromptResponse, type ResumeSessionRequest, type ResumeSessionResponse, type SetSessionConfigOptionRequest, type SetSessionConfigOptionResponse, type SetSessionModeRequest, type SetSessionModeResponse } from "@agentclientprotocol/sdk";
2
2
  import { type AcpProviderRegistration, type AcpReverseConnection, AcpSdkAdapter, AcpSdkAdapterError } from "../../sdk/acp";
3
- import type { SdkPromptTerminalOutcome } from "../../sdk/prompt-status";
3
+ import type { SdkPromptFailureCategory, SdkPromptFailurePhase, SdkPromptTerminalOutcome } from "../../sdk/prompt-status";
4
4
  import { type PromptWatchdogClock } from "../../sdk/prompt-watchdog";
5
5
  import type { AcpStartupOptions } from "./startup-options";
6
6
  /**
@@ -58,6 +58,60 @@ export declare class AcpPromptFailureError extends AcpSdkAdapterError {
58
58
  readonly failure: SdkPromptFailedOutcome;
59
59
  constructor(failure: SdkPromptFailedOutcome);
60
60
  }
61
+ /**
62
+ * The wire projection of a prompt terminal's classification (issue #5615).
63
+ *
64
+ * `super(failure.code, failure.message)` above narrows the error to the generic
65
+ * `prompt_failed` plus its fixed redacted message, so the classification the
66
+ * terminal already computed used to die at the JSON-RPC boundary: an ACP client
67
+ * saw only `-32603 {code, details}` and could not tell a transient provider blip
68
+ * from a dead session without parsing English. These fields carry it across.
69
+ *
70
+ * `providerCode` is re-checked against the safe-token rule rather than trusted:
71
+ * `terminalOutcome` accepts the host's `providerCode` on a `typeof` check alone,
72
+ * and this is the first path that puts it on the wire, so an unbounded value is
73
+ * dropped instead of becoming a leak of provider text (the redaction contract in
74
+ * `sanitizePromptFailure`). A dropped or absent code is omitted, never nulled.
75
+ */
76
+ export declare const OPERATOR_UPSTREAM_LABEL = "Upstream provider failure";
77
+ export declare const OPERATOR_UPSTREAM_SUFFIX = ": the model provider ended this turn.";
78
+ /**
79
+ * `post_start` proves execution began, so tools may already have run and had effects before the
80
+ * provider died. The wording therefore qualifies the turn rather than absolving the task: saying
81
+ * the task was unaffected would assert something the bounded classifiers do not establish.
82
+ */
83
+ export declare const OPERATOR_PARTIAL_WORK_NOTE = " Work this turn had already performed may have taken effect; check before retrying.";
84
+ /**
85
+ * Operator-facing wording for a post-start terminal, assembled ONLY from bounded safe tokens: the
86
+ * classifier `phase`, the `category`, and a `providerCode` that passes `isSafePromptFailureCode`.
87
+ * Raw provider text never reaches this function and must never reach it.
88
+ *
89
+ * Gated on BOTH `phase === "post_start"` and `category === "provider_transport"`. A submission-phase
90
+ * provider failure is rejected by the phase gate: nothing executed, so wording about a turn the
91
+ * provider ended would describe an event that never occurred.
92
+ *
93
+ * It claims only what those tokens prove — that the upstream provider ended the turn — and says
94
+ * nothing about whether the operator's work survived. `post_start` proves execution began, so the
95
+ * wording qualifies that earlier work may already have taken effect instead of absolving the task.
96
+ *
97
+ * This is additive. The wire `code`/`details` pair and every `PROMPT_FAILURE_MESSAGE_*` constant
98
+ * stay exactly as they are — pinned ACP core-v1 conformance asserts on them — so this wording
99
+ * travels alongside the redacted message instead of repurposing it.
100
+ *
101
+ * It says NOTHING about the worktree, deliberately. Nothing on this path inspects the worktree, so
102
+ * any sentence about uncommitted work would assert a check that never ran — reporting an
103
+ * uninspected tree as clean is the absence-of-evidence-as-evidence-of-absence error, and an
104
+ * operator who believed it would sweep work away. Silence is the only honest option until something
105
+ * actually looks.
106
+ *
107
+ * Returns `undefined` for every other category: `phase` and `category` are already on the wire, so
108
+ * restating them in prose tells an operator nothing they do not already have.
109
+ */
110
+ export declare function postStartOperatorMessage(input: {
111
+ phase: SdkPromptFailurePhase;
112
+ category: SdkPromptFailureCategory;
113
+ providerCode?: string;
114
+ }): string | undefined;
61
115
  /**
62
116
  * What an ACP `plan` update said the turn intended to do. Structural rather than the SDK's
63
117
  * `PlanEntry` so only the fields this evidence reads are depended on.
@@ -0,0 +1,16 @@
1
+ type JsonObject = Record<string, unknown>;
2
+ export type PrimaryControlSurface = "cli" | "sdk";
3
+ /**
4
+ * Startup-control provenance is the authority record ACP needs before it may take
5
+ * permission, provider, and lifecycle ownership of a session. Hosts serving that
6
+ * record report capabilities carrying `promptTerminalOutcomeVersion`
7
+ * and `primaryControlSurface`; a host that predates the record reports neither, and a
8
+ * host that cannot answer at all reports nothing. Those are three different operator
9
+ * problems, so they get three different messages instead of one "restart the session".
10
+ */
11
+ export declare function resolveStartupProvenance(input: {
12
+ sessionId: string;
13
+ capabilities: JsonObject | undefined;
14
+ queryFailure: unknown;
15
+ }): PrimaryControlSurface;
16
+ export {};
@@ -2,10 +2,28 @@ import { Container } from "@gajae-code/tui";
2
2
  import type { ProviderSetupInput } from "../../setup/provider-onboarding";
3
3
  export type CustomProviderCredentialSource = "env" | "literal";
4
4
  export type CustomProviderWizardSubmit = ProviderSetupInput;
5
+ export interface CustomProviderWizardDiscoveryDeps {
6
+ discoverModels?: (input: {
7
+ baseUrl: string;
8
+ apiKeyEnv?: string;
9
+ apiKey?: string;
10
+ signal?: AbortSignal;
11
+ }) => Promise<{
12
+ models: string[];
13
+ }>;
14
+ }
5
15
  export declare class CustomProviderWizardComponent extends Container {
6
16
  #private;
7
- constructor(onSubmit: (input: CustomProviderWizardSubmit) => void, onCancel: () => void, onRender?: () => void);
17
+ constructor(onSubmit: (input: CustomProviderWizardSubmit) => void, onCancel: () => void, onRender?: () => void, discoveryDeps?: CustomProviderWizardDiscoveryDeps);
8
18
  setSubmitError(error: string): void;
9
19
  handleInput(keyData: string): void;
10
20
  complete(): void;
21
+ /** Generation token for the latest submit attempt. */
22
+ currentSubmitGeneration(): number;
23
+ /**
24
+ * Whether a submit attempt is still current: same generation and not
25
+ * dismissed. Revision or cancel invalidates pending completions so a
26
+ * stale refresh cannot report success or rerender over new inputs.
27
+ */
28
+ isSubmitCurrent(generation: number): boolean;
11
29
  }
@@ -19,14 +19,16 @@ declare class SessionList implements Component {
19
19
  onCancel?: () => void;
20
20
  onExit: () => void;
21
21
  onDeleteRequest?: (session: SessionInfo) => void;
22
+ onToggleStarRequest?: (session: SessionInfo) => void;
22
23
  constructor(allSessions: SessionInfo[], showCwd?: boolean);
23
24
  setInputFrozen(frozen: boolean): void;
24
25
  removeSession(sessionPath: string): void;
26
+ setSessionStarred(sessionPath: string, starred: boolean): void;
25
27
  invalidate(): void;
26
28
  render(width: number): string[];
27
29
  handleInput(keyData: string): void;
28
30
  }
29
- /** A one-shot resume consent selector. It never opens or mutates sessions. */
31
+ /** A one-shot resume consent selector with host-owned deletion and star persistence. */
30
32
  export declare class SessionSelectorComponent extends Container {
31
33
  #private;
32
34
  private readonly onSelect;
@@ -35,7 +37,8 @@ export declare class SessionSelectorComponent extends Container {
35
37
  private readonly onDelete?;
36
38
  private readonly inspector?;
37
39
  private readonly onSelection?;
38
- constructor(sessions: SessionInfo[], onSelect: (sessionPath: string) => void | Promise<void>, onCancel: () => void, onExit: () => void, onDelete?: ((session: SessionInfo) => Promise<boolean>) | undefined, inspector?: SessionInspector | undefined, onSelection?: ((selection: SessionSelectionResult) => void) | undefined);
40
+ private readonly onSetStarred?;
41
+ constructor(sessions: SessionInfo[], onSelect: (sessionPath: string) => void | Promise<void>, onCancel: () => void, onExit: () => void, onDelete?: ((session: SessionInfo) => Promise<boolean>) | undefined, inspector?: SessionInspector | undefined, onSelection?: ((selection: SessionSelectionResult) => void) | undefined, onSetStarred?: ((session: SessionInfo, starred: boolean) => Promise<void>) | undefined);
39
42
  setOnRequestRender(callback: () => void): void;
40
43
  handleInput(keyData: string): void;
41
44
  getSessionList(): SessionList;
@@ -13,16 +13,19 @@ declare class UserMessageList implements Component {
13
13
  onSelect?: (entryId: string) => void;
14
14
  onCancel?: () => void;
15
15
  constructor(messages: UserMessageItem[]);
16
+ setAvailableRows(rows: number): void;
16
17
  invalidate(): void;
17
18
  render(width: number): string[];
18
19
  handleInput(keyData: string): void;
19
20
  }
20
21
  /**
21
- * Component that renders a user message selector for branching
22
+ * Component that renders a prompt selector for creating a new session
22
23
  */
23
24
  export declare class UserMessageSelectorComponent extends Container {
24
25
  #private;
25
- constructor(messages: UserMessageItem[], onSelect: (entryId: string) => void, onCancel: () => void);
26
+ private readonly getViewportRows;
27
+ constructor(messages: UserMessageItem[], onSelect: (entryId: string) => void, onCancel: () => void, getViewportRows: () => number);
28
+ render(width: number): string[];
26
29
  getMessageList(): UserMessageList;
27
30
  }
28
31
  export {};
@@ -30,7 +30,7 @@ export declare class CommandController {
30
30
  handleDropCommand(): Promise<boolean>;
31
31
  handleForkCommand(): Promise<void>;
32
32
  handleMoveCommand(targetPath: string): Promise<void>;
33
- handleRenameCommand(title: string): Promise<void>;
33
+ handleRenameCommand(title?: string): Promise<void>;
34
34
  handleBashCommand(command: string, excludeFromContext?: boolean): Promise<void>;
35
35
  handlePythonCommand(code: string, excludeFromContext?: boolean): Promise<void>;
36
36
  handleCompactCommand(customInstructions?: string): Promise<CompactionOutcome>;
@@ -131,7 +131,7 @@ export declare class SelectorController {
131
131
  smartRoutingOnly?: boolean;
132
132
  }): void;
133
133
  showPluginSelector(mode?: "install" | "uninstall"): Promise<void>;
134
- showUserMessageSelector(): void;
134
+ showUserMessageSelector(onCommitted?: () => void): void;
135
135
  showTreeSelector(): void;
136
136
  showSessionSelector(): Promise<void>;
137
137
  handleResumeSession(sessionPath: string): Promise<void>;
@@ -257,7 +257,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
257
257
  handleDropCommand(): Promise<boolean>;
258
258
  handleForkCommand(): Promise<void>;
259
259
  handleMoveCommand(targetPath: string): Promise<void>;
260
- handleRenameCommand(title: string): Promise<void>;
260
+ handleRenameCommand(title?: string): Promise<void>;
261
261
  handleMemoryCommand(text: string): Promise<void>;
262
262
  handleSTTToggle(): Promise<void>;
263
263
  showDebugSelector(): void;
@@ -8,6 +8,8 @@ export type PersistedResolutionOrigin = {
8
8
  kind: "telegram_notification";
9
9
  interactionActionId: string;
10
10
  };
11
+ /** Keep accepted diagnostics below the coordinator's cumulative Q12 snapshot cap. */
12
+ export declare const MAX_ACCEPTED_WORKFLOW_GATE_QUERY_RECORDS = 32;
11
13
  export type PersistedAckPolicy = {
12
14
  kind: "none";
13
15
  reason: "non_telegram" | "semantic_noncommit" | "legacy_unproven";
@@ -95,7 +97,7 @@ export interface WorkflowGateEmitter {
95
97
  */
96
98
  export declare class BrokerWorkflowGateEmitter implements WorkflowGateEmitter {
97
99
  #private;
98
- constructor(runId: string, store: GateStore, emitterHooks?: Pick<BrokerHooks, "advance">);
100
+ constructor(runId: string, store: GateStore, emitterHooks?: Pick<BrokerHooks, "advance" | "continuationLost">);
99
101
  supportsRemoteGateAnswers(): boolean;
100
102
  setRuntimeTurnProvider(provider: (() => string | undefined) | null): void;
101
103
  emitGate(input: OpenGateInput): Promise<unknown>;
@@ -193,6 +195,11 @@ export type GateAuditEvent = {
193
195
  } | {
194
196
  event: "gate_response_idempotent_replay";
195
197
  gate_id: string;
198
+ }
199
+ /** An idempotent replay refused because this runtime cannot prove the continuation ran. */
200
+ | {
201
+ event: "gate_response_replay_unproven";
202
+ gate_id: string;
196
203
  } | {
197
204
  event: "gate_response_idempotency_conflict";
198
205
  gate_id: string;
@@ -225,6 +232,8 @@ export interface BrokerHooks {
225
232
  terminalizeAccepted?(record: PersistedGate): WorkflowGateTerminalProof | Promise<WorkflowGateTerminalProof>;
226
233
  /** Runs only after a successful advance has been durably marked advanced. */
227
234
  completeAccepted?(record: PersistedGate): void | Promise<void>;
235
+ /** Notifies the owning runtime when the accepted answer cannot reach its continuation. */
236
+ continuationLost?(record: PersistedGate): void;
228
237
  /** Append-only audit sink. */
229
238
  audit?(event: GateAuditEvent): void;
230
239
  }
@@ -277,6 +286,7 @@ export declare class WorkflowGateBroker {
277
286
  lookupCompletedResolution(response: WorkflowGateResponse): WorkflowGateCompletedResolutionLookup;
278
287
  private runShort;
279
288
  private hasLiveContinuation;
289
+ private recordContinuationLoss;
280
290
  hasRecoverableAcceptedGate(): boolean;
281
291
  prepareTerminalization(gateId: string, proof: WorkflowGateTerminalProof): boolean;
282
292
  clearPreparedTerminalization(gateId: string): void;
@@ -117,13 +117,26 @@ export interface WorkflowGateDiagnostic extends WorkflowGate {
117
117
  id: string;
118
118
  tag: "quarantined";
119
119
  lifecycle: WorkflowGateLifecycle;
120
+ /** Whether the durable broker retained an answer for this gate. */
121
+ answer_recorded: boolean;
122
+ }
123
+ /** Durable acceptance evidence for a gate that is no longer pending. */
124
+ export interface WorkflowGateResolutionDiagnostic extends WorkflowGate {
125
+ id: string;
126
+ tag: "accepted";
127
+ /** True when the accepted record contains the answer body. */
128
+ answer_recorded: true;
129
+ resolved_at: string;
130
+ /** Single post-accept disposition; raw answers and derived answer values stay private. */
131
+ post_accept_disposition: "accepted" | "terminalized" | "advanced" | "continuation_lost" | "unknown";
120
132
  }
121
133
  /** Stable Q12 row preserving the root WorkflowGate shape. */
122
134
  export type WorkflowGateQueryRecord = (WorkflowGate & {
123
135
  id: string;
124
136
  tag: "pending";
125
137
  lifecycle?: undefined;
126
- }) | WorkflowGateDiagnostic;
138
+ answer_recorded: false;
139
+ }) | WorkflowGateDiagnostic | WorkflowGateResolutionDiagnostic;
127
140
  /** Inbound: the agent's answer to a workflow gate. */
128
141
  export interface WorkflowGateResponse {
129
142
  gate_id: string;
@@ -303,7 +303,7 @@ export interface InteractiveModeContext {
303
303
  handleHandoffCommand(customInstructions?: string): Promise<void>;
304
304
  handleContributionPrepCommand(customInstructions?: string): Promise<void>;
305
305
  handleMoveCommand(targetPath: string): Promise<void>;
306
- handleRenameCommand(title: string): Promise<void>;
306
+ handleRenameCommand(title?: string): Promise<void>;
307
307
  handleMemoryCommand(text: string): Promise<void>;
308
308
  handleSTTToggle(): Promise<void>;
309
309
  executeCompaction(customInstructionsOrOptions?: string | CompactOptions, isAuto?: boolean): Promise<CompactionOutcome>;
@@ -367,7 +367,7 @@ export interface InteractiveModeContext {
367
367
  initHooksAndCustomTools(): Promise<void>;
368
368
  emitCustomToolSessionEvent(reason: "start" | "switch" | "branch" | "tree" | "shutdown", previousSessionFile?: string): Promise<void>;
369
369
  planModeController: Pick<import("./controllers/plan-mode-controller").PlanModeController, "enabled" | "paused" | "planFilePath" | "handleCommand" | "handleApproval" | "flushPendingModelSwitch">;
370
- goalModeController: Pick<import("./controllers/goal-mode-controller").GoalModeController, "enabled" | "paused" | "handleCommand">;
370
+ goalModeController: Pick<import("./controllers/goal-mode-controller").GoalModeController, "enabled" | "paused" | "handleCommand" | "cancelContinuation" | "scheduleContinuation">;
371
371
  setHookWidget(key: string, content: ExtensionWidgetContent, options?: ExtensionWidgetOptions): void;
372
372
  setHookStatus(key: string, text: string | undefined): void;
373
373
  showHookSelector(title: string, options: string[], dialogOptions?: ExtensionUIDialogOptions): Promise<string | undefined>;
@@ -80,6 +80,8 @@ type ResourceDisposer = () => void | Promise<void>;
80
80
  export declare function registerResourceOwner(name: string, disposer: ResourceDisposer): () => void;
81
81
  /** Number of registered resource owners. Exposed for leak assertions/tests. */
82
82
  export declare function resourceOwnerCount(): number;
83
+ /** True while a process-level resource-owner sweep is in progress. */
84
+ export declare function isResourceOwnerDisposalActive(): boolean;
83
85
  /**
84
86
  * Run and clear every registered resource disposer. Attempts all disposers even
85
87
  * if some throw, then surfaces the failures as an `AggregateError` so callers
@@ -2,6 +2,7 @@ import type { LoadedCustomTool } from "../extensibility/custom-tools/types";
2
2
  import { AgentStorage } from "../session/agent-storage";
3
3
  import type { AuthStorage } from "../session/auth-storage";
4
4
  import { MCPManager } from "./manager";
5
+ import { MCPToolCache } from "./tool-cache";
5
6
  /** Result from loading MCP tools */
6
7
  export interface MCPToolsLoadResult {
7
8
  /** MCP manager (for lifecycle management) */
@@ -37,6 +38,7 @@ export interface MCPToolsLoadOptions {
37
38
  /** Idle retention for shared MCP pool entries. */
38
39
  sharedPoolIdleMs?: number;
39
40
  }
41
+ export declare function resolveMCPToolCache(storage?: AgentStorage | null, dbPath?: string): Promise<MCPToolCache | null>;
40
42
  /**
41
43
  * Discover and load MCP tools from .mcp.json files.
42
44
  *
@@ -14,6 +14,7 @@ import type { MCPProtocolObservation } from "./protocol";
14
14
  import type { MCPToolDetails } from "./tool-bridge";
15
15
  import type { MCPToolCache } from "./tool-cache";
16
16
  import type { MCPGetPromptResult, MCPInputRequestHandler, MCPPrompt, MCPRequestOptions, MCPResource, MCPResourceReadResult, MCPResourceTemplate, MCPServerConfig, MCPServerConnection } from "./types";
17
+ export declare function isMCPStartupTimeoutError(error: unknown): boolean;
17
18
  export declare function resolveStartupTimeoutMs(configs: MCPServerConfig[], maxStartupTimeoutMs?: number): number;
18
19
  export declare function resolveExactConfigStartupTimeoutMs(configs: MCPServerConfig[]): number;
19
20
  /**
@@ -56,6 +57,20 @@ export interface MCPLoadResult {
56
57
  /** Extracted Exa API keys from filtered MCP servers */
57
58
  exaApiKeys: string[];
58
59
  }
60
+ export type MCPToolCatalogPublication = "unpublished" | "published" | "fenced";
61
+ /**
62
+ * Atomic view of the manager's fenced tool catalog and its publication state.
63
+ *
64
+ * `unpublished` is reserved for the initial deferred window where no manager
65
+ * catalog has been published and no exact control is fencing it. An empty
66
+ * `published` or `fenced` catalog is authoritative and must not be replaced
67
+ * with an in-flight discovery result.
68
+ */
69
+ export interface MCPToolCatalogSnapshot {
70
+ tools: CustomTool<TSchema, MCPToolDetails>[];
71
+ publication: MCPToolCatalogPublication;
72
+ generation: number;
73
+ }
59
74
  /** Options for discovering and connecting to MCP servers */
60
75
  export interface MCPDiscoverOptions {
61
76
  /** Whether to load project-level config (default: true) */
@@ -83,10 +98,10 @@ export interface MCPManagerOptions {
83
98
  /** Restrict this instance to tools from an explicit MCP config. */
84
99
  toolsOnly?: boolean;
85
100
  /**
86
- * Ceiling for the startup wait, in milliseconds. Only ACP lifecycle launches
87
- * set this, so a slow ACP MCP handshake gets the readiness budget while every
88
- * other consumer keeps the short default. Non-positive or non-finite values
89
- * are ignored and the default applies.
101
+ * Ceiling for the startup wait, in milliseconds. ACP lifecycle launches and
102
+ * plugin MCP startup use bounded caller-owned budgets; other consumers keep
103
+ * the short default. Non-positive or non-finite values are ignored and the
104
+ * default applies.
90
105
  */
91
106
  maxStartupTimeoutMs?: number;
92
107
  /** Connection pool used for every physical MCP open/close. */
@@ -95,11 +110,37 @@ export interface MCPManagerOptions {
95
110
  sessionId?: string;
96
111
  /** Idle retention for shared pool entries. */
97
112
  sharedPoolIdleMs?: number;
113
+ /** Limit tool-cache reads and writes to this manager's conventional servers. */
114
+ toolCacheServerNames?: ReadonlySet<string>;
98
115
  /** Test seam for deterministic reconnect backoff scheduling. */
99
116
  sleep?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
100
117
  /** Test seam for fencing the acquisition-to-registration replacement race. */
101
118
  afterLeaseAcquiredForTests?: (name: string, lease: MCPPoolLease) => void | Promise<void>;
102
119
  }
120
+ export type ExactMcpServerControlStatus = "suspended" | "already-suspended" | "resumed" | "not-suspended" | "reconnected" | "unavailable" | "unknown-server";
121
+ export interface ExactMcpServerControlResult {
122
+ readonly name: string;
123
+ readonly status: ExactMcpServerControlStatus;
124
+ readonly toolCount: number;
125
+ }
126
+ /**
127
+ * A staged catalog the caller can validate against before it is published.
128
+ * `commit` is the single publication point; `abort` releases anything the
129
+ * preparation opened and leaves the manager on its predecessor.
130
+ */
131
+ export interface PreparedExactMcpCatalog {
132
+ readonly tools: CustomTool<TSchema, MCPToolDetails>[];
133
+ canCommit(): boolean;
134
+ commit(): Promise<void>;
135
+ abort(): Promise<void>;
136
+ }
137
+ export interface PreparedExactMcpServerControl extends PreparedExactMcpCatalog {
138
+ readonly result: ExactMcpServerControlResult;
139
+ /** Validate a resumed replacement before an atomic multi-server publication. */
140
+ precommit?(): void;
141
+ /** Publish after every replacement in the catalog has passed precommit. */
142
+ publish?(): void;
143
+ }
103
144
  /**
104
145
  * MCP Server Manager.
105
146
  *
@@ -118,7 +159,10 @@ export declare class MCPManager {
118
159
  static setInstance(value: MCPManager | undefined): void;
119
160
  /** Reset the process-global instance. Test-only. */
120
161
  static resetForTests(): void;
162
+ /** Block config mutations and reloads while keeping existing servers reconnectable. */
163
+ freezeConnectionSet(): void;
121
164
  sealConnectionSet(): void;
165
+ isConnectionSetMutationBlocked(): boolean;
122
166
  isConnectionSetSealed(): boolean;
123
167
  constructor(cwd: string, toolCache?: MCPToolCache | null, options?: MCPManagerOptions);
124
168
  isToolsOnly(): boolean;
@@ -127,9 +171,11 @@ export declare class MCPManager {
127
171
  */
128
172
  setOnNotification(handler: (serverName: string, method: string, params: unknown) => void): void;
129
173
  /**
130
- * Set a callback to fire when any server's tools change.
174
+ * Set a callback to receive a read-only catalog snapshot when server tools change.
131
175
  */
132
- setOnToolsChanged(handler: (tools: CustomTool<TSchema, MCPToolDetails>[]) => void): void;
176
+ setOnToolsChanged(handler: (tools: readonly Readonly<CustomTool<TSchema, MCPToolDetails>>[]) => void): void;
177
+ /** Subscribe to readonly catalog snapshots without replacing the manager owner's callback. */
178
+ subscribeToToolsChanged(handler: (tools: readonly Readonly<CustomTool<TSchema, MCPToolDetails>>[]) => void): () => void;
133
179
  /**
134
180
  * Set a callback to fire when any server's resources change.
135
181
  */
@@ -164,6 +210,23 @@ export declare class MCPManager {
164
210
  * Get all loaded tools.
165
211
  */
166
212
  getTools(): CustomTool<TSchema, MCPToolDetails>[];
213
+ /**
214
+ * Read the fenced catalog and publication state atomically.
215
+ *
216
+ * An empty catalog is still authoritative after publication or while an
217
+ * exact control is in flight. Deferred startup may fall back to its discovery
218
+ * result only for the explicit `unpublished` state.
219
+ */
220
+ getToolCatalogSnapshot(): MCPToolCatalogSnapshot;
221
+ isExactServerSuppressed(name: string): boolean;
222
+ /**
223
+ * Prepare one exact-config control without publishing manager state. Session
224
+ * registry and prompt validation run against `tools`; commit is the single
225
+ * publication point and abort releases only an unpublished candidate.
226
+ */
227
+ prepareExactServerControl(action: "suspend" | "resume" | "reconnect", name: string): Promise<PreparedExactMcpServerControl>;
228
+ /** Clear all session-local suppression before this owner adopts a new identity. */
229
+ prepareExactServerControlReset(): Promise<PreparedExactMcpCatalog>;
167
230
  /**
168
231
  * Get a specific connection.
169
232
  */
@@ -145,6 +145,13 @@ export interface MCPPoolLease {
145
145
  onEvent(listener: LeaseListener): () => void;
146
146
  release(): Promise<void>;
147
147
  }
148
+ export interface MCPPreparedReplacement {
149
+ readonly lease: MCPPoolLease;
150
+ canCommit(): boolean;
151
+ publish(): void;
152
+ commit(): void;
153
+ abort(): Promise<void>;
154
+ }
148
155
  declare class MCPPoolLeaseImpl implements MCPPoolLease {
149
156
  #private;
150
157
  readonly generation: number;
@@ -187,7 +194,11 @@ export declare class MCPConnectionPool {
187
194
  awaitRestart(key: string): Promise<boolean>;
188
195
  finishRestart(key: string, error?: unknown): void;
189
196
  releaseRestart(key: string): void;
197
+ private retiredCleanupId;
198
+ private getRetiredAcquisitionCleanup;
199
+ private getRetiredAcquisitionCleanupForKey;
190
200
  private retainCancelledAcquireCleanup;
201
+ private retainPreparedCleanup;
191
202
  private notifyPendingAcquireCleanup;
192
203
  /** @internal Whether this pool still owns the notified abandoned-acquire flight. */
193
204
  hasPendingAcquireCleanup(error: MCPPoolAcquireAbortError): boolean;
@@ -202,6 +213,12 @@ export declare class MCPConnectionPool {
202
213
  /** @internal Join and retry one generation of abandoned acquisition cleanup. */
203
214
  closePendingAcquireCleanup(key: string, generation: number): Promise<void>;
204
215
  acquire(name: string, config: MCPServerConfig, options?: MCPPoolAcquireOptions): Promise<MCPPoolLease>;
216
+ /**
217
+ * Prepared MCP replacements fence and retain acquisition cleanup ownership
218
+ * The caller validates its catalog first, then commits the key swap
219
+ * synchronously or aborts and closes only the candidate.
220
+ */
221
+ prepareReplacement(name: string, config: MCPServerConfig, options?: MCPPoolAcquireOptions): Promise<MCPPreparedReplacement>;
205
222
  private waitForPendingEntry;
206
223
  private scheduleZeroClaimCleanup;
207
224
  private cancelPendingEntry;
@@ -1,2 +1,22 @@
1
+ import type { AgentSession } from "../session/agent-session";
1
2
  export declare function redactMCPEndpoint(value: string | undefined): string | undefined;
2
3
  export declare function redactMCPDiagnosticValue(value: unknown): unknown;
4
+ /**
5
+ * Capability granted to a session that the root interactive entry point created
6
+ * with an explicit `--mcp-config` path. Holding it is the only way to read exact
7
+ * MCP status; it carries no manager, transport, or configuration reference.
8
+ */
9
+ export interface ExactMcpControls {
10
+ readonly grantSource: "root-interactive-exact-config";
11
+ /**
12
+ * The exact config this session was started with. Status needs it because a
13
+ * tools-only manager deletes a server from its own bookkeeping when the
14
+ * connection fails, so the manager alone can never report a server that did
15
+ * not come up — the very case an operator runs `/mcp` to see.
16
+ */
17
+ readonly configPath: string;
18
+ }
19
+ export declare function attachExactMcpControls(session: AgentSession, controls: ExactMcpControls): void;
20
+ export declare function getExactMcpControls(session: AgentSession): ExactMcpControls | undefined;
21
+ /** Revoke controls when the AgentSession object adopts a new logical identity. */
22
+ export declare function revokeExactMcpControls(session: AgentSession): void;
@@ -1,4 +1,10 @@
1
1
  import type { MCPServerConfig } from "./types";
2
2
  export type AutoloadStatus = "autoload" | "autoload-off" | "disabled";
3
+ /** Ordinary standalone sessions stop blocking on MCP startup after this wait. */
4
+ export declare const DEFAULT_MCP_STARTUP_WAIT_MS = 250;
5
+ /** Grace added to the largest declared per-server startup window. */
6
+ export declare const MCP_STARTUP_WAIT_GRACE_MS = 500;
7
+ /** Ordinary startup never blocks longer than this batch ceiling. */
8
+ export declare const MAX_MCP_STARTUP_WAIT_MS = 1750;
3
9
  /** Pure startup policy shared by runtime-facing CLI inspection and doctor. */
4
10
  export declare function computeAutoloadStatus(name: string, config: Pick<MCPServerConfig, "enabled" | "autoload">, disabledServers: ReadonlySet<string>): AutoloadStatus;
@@ -22,6 +22,13 @@ export interface MCPToolOptions {
22
22
  * owning manager/runtime. Resolved per call so late registration still applies.
23
23
  */
24
24
  inputHandler?: () => MCPInputRequestHandler | undefined;
25
+ /**
26
+ * Exact MCP session control: false while the owning manager has this server
27
+ * suspended. Checked alongside `#sessionControlInvalidated` so a wrapper that
28
+ * outlives a resume/reconnect still fails locally instead of reaching the
29
+ * transport for a server this session no longer has active.
30
+ */
31
+ isAvailable?: () => boolean;
25
32
  }
26
33
  export declare function isRetriableConnectionError(error: unknown): boolean;
27
34
  /** Details included in MCP tool results for rendering */
@@ -66,6 +73,7 @@ export declare class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
66
73
  /** Server name */
67
74
  readonly mcpServerName: string;
68
75
  private connection;
76
+ invalidateForSessionControl(): void;
69
77
  /** Create MCPTool instances for all tools from an MCP server lease/connection. */
70
78
  static fromTools(target: MCPToolTarget, tools: MCPToolDefinition[], reconnect?: MCPReconnect, options?: MCPToolOptions): MCPTool[];
71
79
  constructor(target: MCPToolTarget, tool: MCPToolDefinition, reconnect?: MCPReconnect | undefined, options?: MCPToolOptions);
@@ -90,6 +98,7 @@ export declare class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetai
90
98
  readonly mcpToolName: string;
91
99
  /** Server name */
92
100
  readonly mcpServerName: string;
101
+ invalidateForSessionControl(): void;
93
102
  /** Create DeferredMCPTool instances for all tools from an MCP server */
94
103
  static fromTools(serverName: string, tools: MCPToolDefinition[], getConnection: () => Promise<MCPServerConnection>, source?: SourceMeta, reconnect?: MCPReconnect, options?: MCPToolOptions): DeferredMCPTool[];
95
104
  constructor(serverName: string, tool: MCPToolDefinition, getConnection: () => Promise<MCPServerConnection>, source?: SourceMeta, reconnect?: MCPReconnect | undefined, options?: MCPToolOptions);
@@ -1,5 +1,7 @@
1
1
  import type { MCPHttpServerConfig, MCPRequestOptions, MCPSseServerConfig, MCPTransport } from "../../runtime-mcp/types";
2
2
  import { type MCPModernClientContext, type MCPProtocolEra } from "../protocol";
3
+ /** Live HTTP/SSE MCP transports awaiting postmortem release. Exposed for leak assertions/tests. */
4
+ export declare function liveHttpTransportCount(): number;
3
5
  /**
4
6
  * HTTP transport for MCP servers.
5
7
  * Uses POST for requests, supports SSE responses.
@@ -38,6 +40,15 @@ export declare class HttpTransport implements MCPTransport {
38
40
  startSSEListener(): Promise<void>;
39
41
  request<T = unknown>(method: string, params?: Record<string, unknown>, options?: MCPRequestOptions): Promise<T>;
40
42
  notify(method: string, params?: Record<string, unknown>): Promise<void>;
43
+ /**
44
+ * Terminate the server-side session on a signal or fatal exit, without the
45
+ * reader drain `close()` does: postmortem runs inside the signal handler,
46
+ * where an aborted SSE body read is never observed by JS, so awaiting the
47
+ * readers there never settles and the DELETE stays unreachable. `onClose` is
48
+ * deliberately not fired - the manager reacts to it by reconnecting, which
49
+ * would open a fresh server session on the way out.
50
+ */
51
+ releaseForPostmortem(signal: AbortSignal): Promise<void>;
41
52
  close(): Promise<void>;
42
53
  }
43
54
  /**