@gajae-code/coding-agent 0.17.2 → 0.17.4

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 (349) hide show
  1. package/CHANGELOG.md +194 -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 +18 -0
  18. package/dist/types/config/file-lock.d.ts +9 -1
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +11 -2
  21. package/dist/types/config/settings-schema.d.ts +11 -0
  22. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  23. package/dist/types/daemon/operator-contract.d.ts +5 -1
  24. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  25. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  26. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  27. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  28. package/dist/types/extensibility/shared-events.d.ts +3 -1
  29. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  30. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  31. package/dist/types/internal-urls/index.d.ts +1 -0
  32. package/dist/types/internal-urls/parse.d.ts +9 -1
  33. package/dist/types/main.d.ts +22 -0
  34. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  35. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  36. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  37. package/dist/types/modes/components/session-selector.d.ts +5 -2
  38. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  39. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  40. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  41. package/dist/types/modes/interactive-mode.d.ts +1 -1
  42. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  43. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  44. package/dist/types/modes/types.d.ts +2 -2
  45. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  46. package/dist/types/runtime-mcp/manager.d.ts +56 -0
  47. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  48. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  49. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  50. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  51. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  52. package/dist/types/sdk/broker/broker.d.ts +13 -2
  53. package/dist/types/sdk/broker/identity.d.ts +3 -1
  54. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  55. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  56. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  57. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  58. package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
  59. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  60. package/dist/types/sdk/bus/index.d.ts +19 -0
  61. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  62. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  63. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  64. package/dist/types/sdk/cli/rows.d.ts +19 -1
  65. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  66. package/dist/types/sdk/client/client.d.ts +2 -0
  67. package/dist/types/sdk/guides/cli.d.ts +3 -4
  68. package/dist/types/sdk/guides/verify.d.ts +2 -0
  69. package/dist/types/sdk/host/host.d.ts +9 -0
  70. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  71. package/dist/types/sdk/host/types.d.ts +10 -0
  72. package/dist/types/sdk/index.d.ts +1 -0
  73. package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
  74. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  75. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  76. package/dist/types/sdk/router/session-router.d.ts +2 -0
  77. package/dist/types/sdk/startup-capability.d.ts +2 -0
  78. package/dist/types/sdk/transport/relay.d.ts +1 -0
  79. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  80. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  81. package/dist/types/session/agent-session.d.ts +168 -21
  82. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  83. package/dist/types/session/fold-coordinator.d.ts +17 -3
  84. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  85. package/dist/types/session/session-manager.d.ts +64 -1
  86. package/dist/types/session/session-work-lease.d.ts +14 -0
  87. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  88. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  89. package/dist/types/tools/bash.d.ts +37 -11
  90. package/dist/types/tools/job.d.ts +1 -1
  91. package/dist/types/tools/steer-fold.d.ts +31 -0
  92. package/dist/types/utils/git.d.ts +28 -2
  93. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  94. package/dist/types/utils/mupdf.d.ts +4 -0
  95. package/dist/types/utils/session-title-generation.d.ts +6 -0
  96. package/dist/types/utils/title-generator.d.ts +11 -2
  97. package/dist/types/web/scrapers/types.d.ts +3 -0
  98. package/package.json +18 -10
  99. package/scripts/build-binary.ts +9 -3
  100. package/scripts/compile-args.ts +0 -9
  101. package/scripts/embed-mupdf.ts +52 -0
  102. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  103. package/scripts/vendor-markit.ts +196 -0
  104. package/src/async/job-manager.ts +22 -1
  105. package/src/cli/daemon-cli.ts +53 -18
  106. package/src/cli/github-release.ts +87 -5
  107. package/src/cli/mcp-cli.ts +38 -4
  108. package/src/cli/public-command-entry.ts +450 -0
  109. package/src/cli/public-command-errors.ts +581 -0
  110. package/src/cli/public-command-evidence.ts +717 -0
  111. package/src/cli/public-command-help.ts +360 -0
  112. package/src/cli/public-command-registry.ts +535 -0
  113. package/src/cli/session-picker.ts +2 -1
  114. package/src/cli/setup-cli.ts +9 -1
  115. package/src/cli/skills-cli.ts +46 -2
  116. package/src/cli.ts +61 -1
  117. package/src/commands/daemon.ts +65 -69
  118. package/src/commands/sdk.ts +175 -117
  119. package/src/commands/setup.ts +2 -0
  120. package/src/commands/skills.ts +11 -0
  121. package/src/config/autorouting-tier-map.ts +14 -0
  122. package/src/config/file-lock.ts +147 -51
  123. package/src/config/model-profile-activation.ts +334 -43
  124. package/src/config/model-registry.ts +183 -25
  125. package/src/config/settings-schema.ts +26 -2
  126. package/src/coordinator-mcp/policy.ts +10 -5
  127. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  128. package/src/coordinator-mcp/question-state.ts +175 -8
  129. package/src/coordinator-mcp/server.ts +507 -81
  130. package/src/coordinator-mcp/session-reaper.ts +6 -4
  131. package/src/crash/record-loader.ts +6 -2
  132. package/src/daemon/operator-contract.ts +26 -12
  133. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  134. package/src/eval/js/context-manager.ts +8 -8
  135. package/src/eval/js/worker-core.ts +9 -4
  136. package/src/eval/js/worker-protocol.ts +2 -0
  137. package/src/extensibility/extensions/runner.ts +52 -4
  138. package/src/extensibility/extensions/types.ts +10 -0
  139. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  140. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  141. package/src/extensibility/shared-events.ts +3 -1
  142. package/src/gjc-runtime/session-state-lock.ts +165 -24
  143. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  144. package/src/internal-urls/docs-index.generated.ts +20 -19
  145. package/src/internal-urls/embedded-protocol.ts +83 -0
  146. package/src/internal-urls/index.ts +1 -0
  147. package/src/internal-urls/parse.ts +21 -1
  148. package/src/internal-urls/router.ts +4 -2
  149. package/src/main.ts +123 -55
  150. package/src/modes/acp/acp-agent.ts +408 -35
  151. package/src/modes/acp/startup-provenance.ts +59 -0
  152. package/src/modes/components/custom-provider-wizard.ts +308 -7
  153. package/src/modes/components/oauth-selector.ts +9 -0
  154. package/src/modes/components/session-selector.ts +47 -4
  155. package/src/modes/components/user-message-selector.ts +57 -15
  156. package/src/modes/controllers/command-controller.ts +58 -32
  157. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  158. package/src/modes/controllers/input-controller.ts +4 -0
  159. package/src/modes/controllers/selector-controller.ts +161 -15
  160. package/src/modes/interactive-mode.ts +21 -7
  161. package/src/modes/runtime-init.ts +1 -0
  162. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  163. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  164. package/src/modes/types.ts +2 -2
  165. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  166. package/src/prompts/system/title-system.md +1 -1
  167. package/src/prompts/tools/bash.md +1 -1
  168. package/src/prompts/tools/job.md +1 -1
  169. package/src/prompts/tools/read.md +2 -0
  170. package/src/runtime/network-prewarm-service.test.ts +36 -1
  171. package/src/runtime/network-prewarm-service.ts +28 -3
  172. package/src/runtime/process-lifecycle.ts +22 -11
  173. package/src/runtime-mcp/config.ts +16 -1
  174. package/src/runtime-mcp/manager.ts +689 -55
  175. package/src/runtime-mcp/pool.test.ts +31 -0
  176. package/src/runtime-mcp/pool.ts +304 -28
  177. package/src/runtime-mcp/redaction.ts +42 -0
  178. package/src/runtime-mcp/startup-policy.ts +7 -0
  179. package/src/runtime-mcp/tool-bridge.ts +71 -0
  180. package/src/runtime-mcp/transports/http.ts +108 -25
  181. package/src/sdk/acp/adapter.ts +27 -8
  182. package/src/sdk/broker/broker.ts +378 -52
  183. package/src/sdk/broker/identity.ts +9 -1
  184. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  185. package/src/sdk/broker/lifecycle.ts +690 -141
  186. package/src/sdk/broker/runtime.ts +1 -1
  187. package/src/sdk/broker/session-index.ts +97 -4
  188. package/src/sdk/broker/spawn-authority.ts +35 -7
  189. package/src/sdk/broker/stderr-drainer.ts +59 -0
  190. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  191. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  192. package/src/sdk/bus/index.ts +690 -80
  193. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  194. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  195. package/src/sdk/bus/telegram-daemon.ts +10 -3
  196. package/src/sdk/cli/master-cli.ts +47 -36
  197. package/src/sdk/cli/rows.ts +30 -7
  198. package/src/sdk/cli/session-cli.ts +687 -184
  199. package/src/sdk/client/client.ts +18 -0
  200. package/src/sdk/guides/catalog.ts +2 -2
  201. package/src/sdk/guides/cli.ts +20 -62
  202. package/src/sdk/guides/verify.ts +14 -0
  203. package/src/sdk/host/host.ts +49 -5
  204. package/src/sdk/host/session-runtime.test.ts +138 -2
  205. package/src/sdk/host/session-runtime.ts +311 -97
  206. package/src/sdk/host/types.ts +12 -1
  207. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  208. package/src/sdk/host/websocket-transport.ts +40 -6
  209. package/src/sdk/index.ts +11 -0
  210. package/src/sdk/prompt-deadline-flush.ts +334 -0
  211. package/src/sdk/prompt-deadline-manager.ts +133 -1
  212. package/src/sdk/prompt-tool-boundary.ts +121 -0
  213. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  214. package/src/sdk/router/session-router.ts +9 -1
  215. package/src/sdk/session.ts +182 -7
  216. package/src/sdk/startup-capability.ts +1 -1
  217. package/src/sdk/transport/relay.ts +71 -6
  218. package/src/sdk/transport/serve-cli.ts +397 -42
  219. package/src/sdk/transport/socket.ts +12 -11
  220. package/src/sdk/transport/stdio.ts +7 -3
  221. package/src/session/agent-session.ts +2437 -400
  222. package/src/session/fallback-chain-controller.ts +6 -7
  223. package/src/session/fold-coordinator.ts +24 -5
  224. package/src/session/internal/managed-session-scope.ts +58 -18
  225. package/src/session/internal/managed-session-storage.ts +304 -11
  226. package/src/session/session-manager.ts +382 -44
  227. package/src/session/session-work-lease.ts +34 -0
  228. package/src/setup/model-onboarding-guidance.ts +1 -1
  229. package/src/setup/provider-onboarding.ts +397 -24
  230. package/src/slash-commands/builtin-registry.ts +258 -14
  231. package/src/task/index.ts +14 -2
  232. package/src/tools/bash.ts +98 -78
  233. package/src/tools/fetch.ts +119 -20
  234. package/src/tools/job.ts +151 -25
  235. package/src/tools/output-meta.ts +15 -2
  236. package/src/tools/path-utils.ts +27 -3
  237. package/src/tools/read.ts +3 -3
  238. package/src/tools/steer-fold.ts +107 -0
  239. package/src/tools/tool-catalog.generated.ts +29 -2
  240. package/src/tools/tool-errors.ts +4 -0
  241. package/src/utils/git.ts +53 -3
  242. package/src/utils/markit.ts +55 -41
  243. package/src/utils/mupdf-assets.d.ts +4 -0
  244. package/src/utils/mupdf-embedded.ts +4 -0
  245. package/src/utils/mupdf.ts +129 -0
  246. package/src/utils/session-title-generation.ts +29 -0
  247. package/src/utils/title-generator.ts +46 -2
  248. package/src/web/scrapers/types.ts +24 -3
  249. package/vendor/markit-ai/LICENSE +21 -0
  250. package/vendor/markit-ai/MANIFEST.json +412 -0
  251. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  252. package/vendor/markit-ai/dist/commands/config.js +139 -0
  253. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  254. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  255. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  256. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  257. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  258. package/vendor/markit-ai/dist/commands/init.js +29 -0
  259. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  260. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  261. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  262. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  263. package/vendor/markit-ai/dist/config.d.ts +26 -0
  264. package/vendor/markit-ai/dist/config.js +42 -0
  265. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  266. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  267. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  268. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  269. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  270. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  271. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  272. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  273. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  274. package/vendor/markit-ai/dist/converters/github.js +148 -0
  275. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  276. package/vendor/markit-ai/dist/converters/html.js +30 -0
  277. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  278. package/vendor/markit-ai/dist/converters/image.js +124 -0
  279. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  280. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  281. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  282. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  283. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  284. package/vendor/markit-ai/dist/converters/json.js +21 -0
  285. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  286. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  287. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  288. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  289. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  290. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  291. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  292. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  293. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  294. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  295. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  296. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  297. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  298. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  299. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  300. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  301. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  302. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  303. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  304. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  305. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  306. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  307. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  308. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  309. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  310. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  312. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  313. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  314. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  315. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  316. package/vendor/markit-ai/dist/index.d.ts +30 -0
  317. package/vendor/markit-ai/dist/index.js +26 -0
  318. package/vendor/markit-ai/dist/main.d.ts +2 -0
  319. package/vendor/markit-ai/dist/main.js +191 -0
  320. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  321. package/vendor/markit-ai/dist/markit.js +267 -0
  322. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  323. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  324. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  325. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  326. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  327. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  328. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  329. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  330. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  331. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  332. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  333. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  334. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  335. package/vendor/markit-ai/dist/providers/index.js +56 -0
  336. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  337. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  338. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  339. package/vendor/markit-ai/dist/providers/types.js +1 -0
  340. package/vendor/markit-ai/dist/types.d.ts +36 -0
  341. package/vendor/markit-ai/dist/types.js +1 -0
  342. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  343. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  344. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  345. package/vendor/markit-ai/dist/utils/output.js +31 -0
  346. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  347. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  348. package/vendor/markit-ai/package.json +74 -0
  349. package/vendor/markit-ai.patch +49 -0
@@ -43,6 +43,13 @@ export interface MCPToolOptions {
43
43
  * owning manager/runtime. Resolved per call so late registration still applies.
44
44
  */
45
45
  inputHandler?: () => MCPInputRequestHandler | undefined;
46
+ /**
47
+ * Exact MCP session control: false while the owning manager has this server
48
+ * suspended. Checked alongside `#sessionControlInvalidated` so a wrapper that
49
+ * outlives a resume/reconnect still fails locally instead of reaching the
50
+ * transport for a server this session no longer has active.
51
+ */
52
+ isAvailable?: () => boolean;
46
53
  }
47
54
 
48
55
  function connectionForTool(target: MCPToolTarget): MCPServerConnection {
@@ -235,6 +242,7 @@ export function parseMCPToolName(name: string): { serverName: string; toolName:
235
242
  * CustomTool wrapping an MCP tool with an active connection.
236
243
  */
237
244
  export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
245
+ // Exact MCP stale wrappers fail before transport RPC.
238
246
  readonly name: string;
239
247
  readonly label: string;
240
248
  readonly description: string;
@@ -247,6 +255,14 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
247
255
  private connection: MCPServerConnection;
248
256
  #noReplay = false;
249
257
  #inputHandlerResolver: (() => MCPInputRequestHandler | undefined) | undefined;
258
+ #isAvailable: (() => boolean) | undefined;
259
+ #sessionControlInvalidated = false;
260
+ invalidateForSessionControl(): void {
261
+ this.#sessionControlInvalidated = true;
262
+ }
263
+ #isAvailableForSessionControl(): boolean {
264
+ return !this.#sessionControlInvalidated && this.#isAvailable?.() !== false;
265
+ }
250
266
 
251
267
  #callOptions(signal?: AbortSignal): MCPRequestOptions {
252
268
  const inputHandler = this.#inputHandlerResolver?.();
@@ -272,6 +288,7 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
272
288
  this.connection = resolvedConnection;
273
289
  this.#noReplay = options?.noReplay === true;
274
290
  this.#inputHandlerResolver = options?.inputHandler;
291
+ this.#isAvailable = options?.isAvailable;
275
292
  this.name = createMCPToolName(resolvedConnection.name, tool.name);
276
293
  this.label = `${resolvedConnection.name}/${tool.name}`;
277
294
  this.description = tool.description ?? `MCP tool from ${resolvedConnection.name}`;
@@ -299,6 +316,15 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
299
316
  const args = normalizeToolArgs(params);
300
317
  const provider = this.connection._source?.provider;
301
318
  const providerName = this.connection._source?.providerName;
319
+ if (!this.#isAvailableForSessionControl()) {
320
+ return buildErrorResult(
321
+ new Error("MCP server is suspended for this session"),
322
+ this.connection.name,
323
+ this.tool.name,
324
+ provider,
325
+ providerName,
326
+ );
327
+ }
302
328
 
303
329
  try {
304
330
  const result = await callTool(this.connection, this.tool.name, args, this.#callOptions(signal));
@@ -308,6 +334,15 @@ export class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
308
334
  if (this.reconnect && isRetriableConnectionError(error)) {
309
335
  const newConn = await reconnectWithAbort(this.reconnect, signal);
310
336
  if (newConn) {
337
+ if (!this.#isAvailableForSessionControl()) {
338
+ return buildErrorResult(
339
+ new Error("MCP server is suspended for this session"),
340
+ this.connection.name,
341
+ this.tool.name,
342
+ provider,
343
+ providerName,
344
+ );
345
+ }
311
346
  if (this.#noReplay)
312
347
  return buildErrorResult(error, this.connection.name, this.tool.name, provider, providerName);
313
348
  // Rebind so subsequent calls on this instance use the fresh connection
@@ -350,6 +385,14 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
350
385
  readonly #fallbackProviderName: string | undefined;
351
386
  #noReplay = false;
352
387
  #inputHandlerResolver: (() => MCPInputRequestHandler | undefined) | undefined;
388
+ #isAvailable: (() => boolean) | undefined;
389
+ #sessionControlInvalidated = false;
390
+ invalidateForSessionControl(): void {
391
+ this.#sessionControlInvalidated = true;
392
+ }
393
+ #isAvailableForSessionControl(): boolean {
394
+ return !this.#sessionControlInvalidated && this.#isAvailable?.() !== false;
395
+ }
353
396
 
354
397
  #callOptions(signal?: AbortSignal): MCPRequestOptions {
355
398
  const inputHandler = this.#inputHandlerResolver?.();
@@ -386,6 +429,7 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
386
429
  this.#fallbackProviderName = source?.providerName;
387
430
  this.#noReplay = options?.noReplay === true;
388
431
  this.#inputHandlerResolver = options?.inputHandler;
432
+ this.#isAvailable = options?.isAvailable;
389
433
  }
390
434
 
391
435
  renderCall(args: unknown, _options: RenderResultOptions, theme: Theme) {
@@ -407,6 +451,15 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
407
451
  const args = normalizeToolArgs(params);
408
452
  const provider = this.#fallbackProvider;
409
453
  const providerName = this.#fallbackProviderName;
454
+ if (!this.#isAvailableForSessionControl()) {
455
+ return buildErrorResult(
456
+ new Error("MCP server is suspended for this session"),
457
+ this.serverName,
458
+ this.tool.name,
459
+ provider,
460
+ providerName,
461
+ );
462
+ }
410
463
 
411
464
  try {
412
465
  const connection = await untilAborted(signal, () => this.getConnection());
@@ -425,6 +478,15 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
425
478
  if (this.reconnect && isRetriableConnectionError(callError)) {
426
479
  const newConn = await reconnectWithAbort(this.reconnect, signal);
427
480
  if (newConn) {
481
+ if (!this.#isAvailableForSessionControl()) {
482
+ return buildErrorResult(
483
+ new Error("MCP server is suspended for this session"),
484
+ this.serverName,
485
+ this.tool.name,
486
+ provider,
487
+ providerName,
488
+ );
489
+ }
428
490
  if (this.#noReplay)
429
491
  return buildErrorResult(callError, this.serverName, this.tool.name, provider, providerName);
430
492
  const retryProvider = newConn._source?.provider ?? provider;
@@ -453,6 +515,15 @@ export class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetails> {
453
515
  rethrowIfAborted(connError, signal);
454
516
  if (this.reconnect) {
455
517
  const newConn = await reconnectWithAbort(this.reconnect, signal);
518
+ if (newConn && !this.#isAvailableForSessionControl()) {
519
+ return buildErrorResult(
520
+ new Error("MCP server is suspended for this session"),
521
+ this.serverName,
522
+ this.tool.name,
523
+ provider,
524
+ providerName,
525
+ );
526
+ }
456
527
  if (newConn && !this.#noReplay) {
457
528
  try {
458
529
  const result = await callTool(newConn, this.tool.name, args, this.#callOptions(signal));
@@ -8,6 +8,7 @@
8
8
  * no sessions, no standalone stream, no replay. See ../protocol.ts.
9
9
  */
10
10
  import { logger, readSseJson, Snowflake } from "@gajae-code/utils";
11
+ import { isResourceOwnerDisposalActive, registerResourceOwner } from "../../runtime/process-lifecycle";
11
12
  import type {
12
13
  JsonRpcError,
13
14
  JsonRpcMessage,
@@ -30,6 +31,51 @@ import {
30
31
  import { fetchPluginMcpRequest, isPluginMcpPublicNetworkBound } from "../plugin-network-boundary";
31
32
  import { buildModernMcpHeaders, type MCPModernClientContext, type MCPProtocolEra, withModernMeta } from "../protocol";
32
33
 
34
+ /**
35
+ * Postmortem release of live HTTP/SSE MCP sessions.
36
+ *
37
+ * A stdio server dies with the agent because it is a `spawnOwnedProcess` child, but an
38
+ * HTTP/SSE server is a separate, already-running process that only learns a client is gone
39
+ * from the session-termination `DELETE`. A signal kill (`SIGINT`/`SIGTERM`/`SIGHUP`) or a
40
+ * fatal exit bypasses session dispose, so without this sweep the server keeps the
41
+ * `Mcp-Session-Id` and everything hanging off it for every agent run that ever died -
42
+ * unbounded growth on the server side. Mirrors the LSP/Python/browser owners.
43
+ */
44
+ const liveHttpTransports = new Set<HttpTransport>();
45
+ let httpTransportOwnerRelease: (() => void) | undefined;
46
+ /** Exit must not wait on a wedged endpoint; the per-request timeout is up to 30s. */
47
+ const POSTMORTEM_CLOSE_TIMEOUT_MS = 2_000;
48
+
49
+ function trackHttpTransport(transport: HttpTransport): void {
50
+ liveHttpTransports.add(transport);
51
+ httpTransportOwnerRelease ??= registerResourceOwner("mcp:http-transports", closeLiveHttpTransports);
52
+ }
53
+
54
+ function untrackHttpTransport(transport: HttpTransport): void {
55
+ if (!liveHttpTransports.delete(transport) || liveHttpTransports.size > 0) return;
56
+ // Nothing left to release: drop the registration so a long-lived host does not
57
+ // retain dead transports through the owner map.
58
+ httpTransportOwnerRelease?.();
59
+ httpTransportOwnerRelease = undefined;
60
+ }
61
+
62
+ async function closeLiveHttpTransports(): Promise<void> {
63
+ await Promise.all(
64
+ [...liveHttpTransports].map(async transport => {
65
+ try {
66
+ await transport.releaseForPostmortem(AbortSignal.timeout(POSTMORTEM_CLOSE_TIMEOUT_MS));
67
+ } catch (error) {
68
+ logger.debug("MCP HTTP postmortem release failed", { error });
69
+ }
70
+ }),
71
+ );
72
+ }
73
+
74
+ /** Live HTTP/SSE MCP transports awaiting postmortem release. Exposed for leak assertions/tests. */
75
+ export function liveHttpTransportCount(): number {
76
+ return liveHttpTransports.size;
77
+ }
78
+
33
79
  /** Best-effort JSON parse of an error body for structured era classification. */
34
80
  function tryParseJsonBody(text: string): unknown {
35
81
  try {
@@ -101,7 +147,11 @@ export class HttpTransport implements MCPTransport {
101
147
  */
102
148
  async connect(): Promise<void> {
103
149
  if (this.#connected) return;
150
+ if (isResourceOwnerDisposalActive()) {
151
+ throw new Error("Cannot connect MCP HTTP transport during process resource disposal");
152
+ }
104
153
  this.#connected = true;
154
+ trackHttpTransport(this);
105
155
  }
106
156
 
107
157
  #fetch(init: BunFetchRequestInit): Promise<Response> {
@@ -601,11 +651,8 @@ export class HttpTransport implements MCPTransport {
601
651
  }
602
652
  }
603
653
 
604
- async close(): Promise<void> {
605
- const wasConnected = this.#connected;
606
- this.#connected = false;
607
-
608
- // Abort all SSE/background readers and wait for them to settle.
654
+ /** Abort every SSE/background reader. Does not wait for them to settle. */
655
+ #abortStreams(): void {
609
656
  for (const controller of this.#streamControllers) {
610
657
  controller.abort();
611
658
  }
@@ -613,30 +660,66 @@ export class HttpTransport implements MCPTransport {
613
660
  this.#sseConnection.abort();
614
661
  this.#sseConnection = null;
615
662
  }
663
+ }
664
+
665
+ /**
666
+ * Send session termination (legacy era only; the modern era has no protocol
667
+ * session to terminate). This DELETE is the only signal an already-running
668
+ * HTTP/SSE server gets that its session may be dropped.
669
+ */
670
+ async #terminateSession(signal?: AbortSignal): Promise<void> {
671
+ if (this.#era === "modern") return;
672
+ const sessionId = this.#sessionId;
673
+ if (!sessionId) return;
674
+ // Claim the server session before awaiting the wire request. Graceful close
675
+ // and postmortem disposal can overlap during shutdown; only the caller that
676
+ // detached this id may emit its termination DELETE.
677
+ this.#sessionId = null;
678
+ try {
679
+ const timeout = this.config.timeout ?? 30000;
680
+ const headers: Record<string, string> = {
681
+ ...this.config.headers,
682
+ "Mcp-Session-Id": sessionId,
683
+ };
684
+
685
+ const timeoutSignal = AbortSignal.timeout(timeout);
686
+ await this.#fetch({
687
+ method: "DELETE",
688
+ headers,
689
+ signal: signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal,
690
+ });
691
+ } catch {
692
+ // Ignore termination errors
693
+ }
694
+ }
695
+
696
+ /**
697
+ * Terminate the server-side session on a signal or fatal exit, without the
698
+ * reader drain `close()` does: postmortem runs inside the signal handler,
699
+ * where an aborted SSE body read is never observed by JS, so awaiting the
700
+ * readers there never settles and the DELETE stays unreachable. `onClose` is
701
+ * deliberately not fired - the manager reacts to it by reconnecting, which
702
+ * would open a fresh server session on the way out.
703
+ */
704
+ async releaseForPostmortem(signal: AbortSignal): Promise<void> {
705
+ untrackHttpTransport(this);
706
+ this.#connected = false;
707
+ this.#abortStreams();
708
+ await this.#terminateSession(signal);
709
+ }
710
+
711
+ async close(): Promise<void> {
712
+ untrackHttpTransport(this);
713
+ const wasConnected = this.#connected;
714
+ this.#connected = false;
715
+
716
+ // Abort all SSE/background readers and wait for them to settle.
717
+ this.#abortStreams();
616
718
  await Promise.allSettled(Array.from(this.#streamReaders));
617
719
 
618
720
  if (!wasConnected && !this.#sessionId) return;
619
721
 
620
- // Send session termination if we have a session (legacy era only;
621
- // the modern era has no protocol session to terminate)
622
- if (this.#era !== "modern" && this.#sessionId) {
623
- try {
624
- const timeout = this.config.timeout ?? 30000;
625
- const headers: Record<string, string> = {
626
- ...this.config.headers,
627
- "Mcp-Session-Id": this.#sessionId,
628
- };
629
-
630
- await this.#fetch({
631
- method: "DELETE",
632
- headers,
633
- signal: AbortSignal.timeout(timeout),
634
- });
635
- } catch {
636
- // Ignore termination errors
637
- }
638
- this.#sessionId = null;
639
- }
722
+ await this.#terminateSession();
640
723
 
641
724
  this.onClose?.();
642
725
  this.onClose = undefined;
@@ -54,6 +54,13 @@ function object(value: unknown): JsonObject | undefined {
54
54
  return value !== null && typeof value === "object" && !Array.isArray(value) ? (value as JsonObject) : undefined;
55
55
  }
56
56
 
57
+ function preservePromptFailureMetadata(target: Error, source: JsonObject | undefined): void {
58
+ if (!source) return;
59
+ const providerCode = source.providerCode ?? object(source.transportFailure)?.providerCode;
60
+ if (providerCode !== undefined) Object.assign(target, { providerCode });
61
+ if (source.phase !== undefined) Object.assign(target, { phase: source.phase });
62
+ }
63
+
57
64
  function providerErrorCode(error: unknown): string | undefined {
58
65
  if (error instanceof AcpSdkAdapterError || error instanceof SdkClientError || error instanceof ReverseLeaseError)
59
66
  return error.code;
@@ -475,10 +482,16 @@ export class AcpSdkAdapter {
475
482
  const envelope = object(response);
476
483
  if (envelope?.ok === false) {
477
484
  const error = object(envelope.error);
478
- throw new AcpSdkAdapterError(
485
+ const adapterError = new AcpSdkAdapterError(
479
486
  typeof error?.code === "string" ? error.code : "request_failed",
480
487
  typeof error?.message === "string" ? error.message : "SDK session request failed.",
481
488
  );
489
+ // Prompt failures may carry the bounded classifier computed by the host. Keep
490
+ // those fields on the adapter error so the ACP boundary can project them instead
491
+ // of reconstructing a bare `{ code, details }` pair. `acpRequestFailure` performs
492
+ // the final safe-token validation before anything reaches the wire.
493
+ preservePromptFailureMetadata(adapterError, error);
494
+ throw adapterError;
482
495
  }
483
496
  return envelope?.result ?? response;
484
497
  }
@@ -494,13 +507,19 @@ export class AcpSdkAdapter {
494
507
  const sessionId = this.#sessionId;
495
508
  if (!attachment || !sessionId || !attachment.isCurrent())
496
509
  throw new SessionRouterError("pre_send", "SDK session attachment is stale.");
497
- const response = await router.request(
498
- sessionId,
499
- { ...frame, id: randomUUID() },
500
- attachment.generation,
501
- attachment,
502
- options,
503
- );
510
+ let response: Record<string, unknown>;
511
+ try {
512
+ response = await router.request(
513
+ sessionId,
514
+ { ...frame, id: randomUUID() },
515
+ attachment.generation,
516
+ attachment,
517
+ options,
518
+ );
519
+ } catch (error) {
520
+ if (error instanceof SdkClientError) preservePromptFailureMetadata(error, object(error.details));
521
+ throw error;
522
+ }
504
523
  if (!attachment.isCurrent())
505
524
  throw new SessionRouterError("ambiguous", "SDK session attachment changed while awaiting command response.");
506
525
  return raw ? response : this.#unwrapSessionResponse(response);