@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
@@ -11,7 +11,9 @@
11
11
  */
12
12
  import { execFileSync } from "node:child_process";
13
13
  import { randomBytes } from "node:crypto";
14
+ import { readdirSync, readFileSync } from "node:fs";
14
15
  import { readFile } from "node:fs/promises";
16
+ import { type LinuxProcPidProbeResult, probeLinuxProcPidSync } from "../gjc-runtime/linux-proc";
15
17
  import {
16
18
  buildReceipt,
17
19
  type CompletionEvidence,
@@ -23,7 +25,7 @@ import {
23
25
  type ValidationEvidence,
24
26
  validateReceipt,
25
27
  } from "./receipts";
26
- import { readReceiptIndex, writeReceiptImmutable } from "./storage";
28
+ import { type ReceiptIndexEntry, readReceiptIndex, writeReceiptImmutable } from "./storage";
27
29
  import { extractReviewVerdict, isReviewVerdict, type ReviewVerdict } from "./types";
28
30
 
29
31
  export interface ValidationCommandSpec {
@@ -37,12 +39,28 @@ export interface ValidationRun {
37
39
  exitStatus: number;
38
40
  pass: boolean;
39
41
  }
42
+ export class ValidationObservationUncertainError extends Error {
43
+ readonly exactCommand: string;
44
+ readonly cwd: string;
45
+ constructor(exactCommand: string, cwd: string, cause?: unknown) {
46
+ super("validation observation is uncertain");
47
+ this.name = "ValidationObservationUncertainError";
48
+ this.exactCommand = exactCommand;
49
+ this.cwd = cwd;
50
+ if (cause !== undefined) this.cause = cause;
51
+ }
52
+ }
40
53
 
41
54
  export interface FinalizeChecks {
42
- runValidation(spec: ValidationCommandSpec): Promise<ValidationRun>;
55
+ runValidation(spec: ValidationCommandSpec, signal?: AbortSignal): Promise<ValidationRun>;
43
56
  resolveCommit(): Promise<string | null>;
44
57
  commitOnBranch(commit: string, branch: string): Promise<boolean>;
45
58
  prOrIssue(): Promise<{ prUrl: string | null; issueArtifact: string | null }>;
59
+ /** Owner-scoped receipt commit hook; null means lifecycle authority was withdrawn. */
60
+ writeReceipt?(
61
+ family: "validation" | "completion" | "review-failure" | "review-verdict",
62
+ receipt: ReceiptEnvelope<unknown>,
63
+ ): Promise<ReceiptIndexEntry | null>;
46
64
  }
47
65
 
48
66
  export interface FinalizeOptions {
@@ -66,6 +84,8 @@ export interface FinalizeOptions {
66
84
  prTarget?: string | null;
67
85
  validationCommands?: ValidationCommandSpec[];
68
86
  checks: FinalizeChecks;
87
+ /** Cancels an in-flight validation subprocess when its owning request is withdrawn. */
88
+ signal?: AbortSignal;
69
89
  clock?: () => number;
70
90
  }
71
91
 
@@ -84,6 +104,15 @@ function receiptId(prefix: string): string {
84
104
  return `${prefix}-${Date.now()}-${randomBytes(4).toString("hex")}`;
85
105
  }
86
106
 
107
+ function persistFinalizeReceipt(
108
+ opts: FinalizeOptions,
109
+ family: "validation" | "completion" | "review-failure" | "review-verdict",
110
+ receipt: ReceiptEnvelope<unknown>,
111
+ ): Promise<ReceiptIndexEntry | null> {
112
+ if (opts.checks.writeReceipt) return opts.checks.writeReceipt(family, receipt);
113
+ return writeReceiptImmutable(opts.root, opts.sessionId, family, receipt.receiptId, receipt);
114
+ }
115
+
87
116
  /** Bound + whitespace-collapse assistant text into a redaction-safe digest summary (never a raw dump). */
88
117
  function boundedAssistantSummary(text: string | null): string | null {
89
118
  if (!text) return null;
@@ -93,19 +122,53 @@ function boundedAssistantSummary(text: string | null): string | null {
93
122
  }
94
123
 
95
124
  export async function runFinalize(opts: FinalizeOptions): Promise<FinalizeResult> {
125
+ if (opts.signal?.aborted) {
126
+ return {
127
+ completed: false,
128
+ receiptPath: null,
129
+ validation: [],
130
+ commitHash: null,
131
+ prUrl: null,
132
+ issueArtifact: null,
133
+ blockers: ["validation-unknown:cancelled"],
134
+ };
135
+ }
96
136
  if (opts.reviewOnly) return runReviewFinalize(opts);
97
137
 
98
138
  const now = () => new Date(opts.clock ? opts.clock() : Date.now()).toISOString();
99
139
  const blockers: string[] = [];
100
140
  const validation: FinalizeResult["validation"] = [];
101
141
  const validationReceiptIds: string[] = [];
142
+ const canceled = (
143
+ commit: string | null,
144
+ artifact: { prUrl: string | null; issueArtifact: string | null },
145
+ ): FinalizeResult => ({
146
+ completed: false,
147
+ receiptPath: null,
148
+ validation,
149
+ commitHash: commit,
150
+ prUrl: artifact.prUrl,
151
+ issueArtifact: artifact.issueArtifact,
152
+ blockers: ["validation-unknown:cancelled"],
153
+ });
102
154
 
103
155
  const commit = await opts.checks.resolveCommit();
156
+ if (opts.signal?.aborted) return canceled(commit, { prUrl: null, issueArtifact: null });
104
157
  const subject: ReceiptSubject = { workspace: opts.workspace, branch: opts.branch, head: commit, commit };
105
158
 
106
159
  // 1. Validation receipts.
107
160
  for (const spec of opts.validationCommands ?? []) {
108
- const run = await opts.checks.runValidation(spec);
161
+ let run: ValidationRun;
162
+ try {
163
+ run = await opts.checks.runValidation(spec, opts.signal);
164
+ } catch (caught) {
165
+ if (caught instanceof ValidationObservationUncertainError) {
166
+ blockers.push(`validation-unknown:${spec.name}`);
167
+ break;
168
+ }
169
+ throw caught;
170
+ }
171
+ if (opts.signal?.aborted) return canceled(commit, { prUrl: null, issueArtifact: null });
109
172
  const evidence: ValidationEvidence = {
110
173
  command: spec.name,
111
174
  exactCommand: run.exactCommand,
@@ -124,25 +187,36 @@ export async function runFinalize(opts: FinalizeOptions): Promise<FinalizeResult
124
187
  createdAt: now(),
125
188
  valid: run.pass,
126
189
  });
127
- await writeReceiptImmutable(opts.root, opts.sessionId, "validation", receipt.receiptId, receipt);
190
+ const entry = await persistFinalizeReceipt(opts, "validation", receipt);
191
+ if (!entry) return canceled(commit, { prUrl: null, issueArtifact: null });
128
192
  const outcome = validateReceipt(receipt);
129
193
  validation.push({ name: spec.name, valid: outcome.valid, exitStatus: run.exitStatus });
130
194
  validationReceiptIds.push(receipt.receiptId);
195
+ if (opts.signal?.aborted) return canceled(commit, { prUrl: null, issueArtifact: null });
131
196
  if (opts.requireTests && !outcome.valid) blockers.push(`validation-failed:${spec.name}`);
132
197
  }
133
198
  if (opts.requireTests && (opts.validationCommands?.length ?? 0) === 0) {
134
199
  blockers.push("validation-required-but-none-run");
135
200
  }
201
+ const validationUnknown = blockers.some(blocker => blocker.startsWith("validation-unknown:"));
136
202
 
137
- // 2. Commit on branch.
138
- if (opts.requireCommit) {
139
- if (!commit) blockers.push("missing-commit");
140
- else if (!(await opts.checks.commitOnBranch(commit, opts.branch))) blockers.push("commit-not-on-branch");
141
- }
203
+ let artifact: { prUrl: string | null; issueArtifact: string | null } = { prUrl: null, issueArtifact: null };
204
+ if (!validationUnknown) {
205
+ // 2. Commit on branch.
206
+ if (opts.requireCommit) {
207
+ if (!commit) blockers.push("missing-commit");
208
+ else {
209
+ const onBranch = await opts.checks.commitOnBranch(commit, opts.branch);
210
+ if (opts.signal?.aborted) return canceled(commit, artifact);
211
+ if (!onBranch) blockers.push("commit-not-on-branch");
212
+ }
213
+ }
142
214
 
143
- // 3. PR / issue artifact.
144
- const artifact = await opts.checks.prOrIssue();
145
- if (opts.requirePr && !artifact.prUrl && !artifact.issueArtifact) blockers.push("missing-pr-or-issue");
215
+ // 3. PR / issue artifact.
216
+ artifact = await opts.checks.prOrIssue();
217
+ if (opts.signal?.aborted) return canceled(commit, artifact);
218
+ if (opts.requirePr && !artifact.prUrl && !artifact.issueArtifact) blockers.push("missing-pr-or-issue");
219
+ }
146
220
 
147
221
  // B4: cross-validate the persisted validation receipts (validity + commit freshness) before completion.
148
222
  if (blockers.length === 0) {
@@ -170,6 +244,7 @@ export async function runFinalize(opts: FinalizeOptions): Promise<FinalizeResult
170
244
  blockers,
171
245
  };
172
246
  }
247
+ if (opts.signal?.aborted) return canceled(commit, artifact);
173
248
 
174
249
  // 4. Completion receipt + predicate.
175
250
  const completion: CompletionEvidence = {
@@ -192,7 +267,8 @@ export async function runFinalize(opts: FinalizeOptions): Promise<FinalizeResult
192
267
  createdAt: now(),
193
268
  });
194
269
  const outcome = validateReceipt(receipt);
195
- const entry = await writeReceiptImmutable(opts.root, opts.sessionId, "completion", receipt.receiptId, receipt);
270
+ const entry = await persistFinalizeReceipt(opts, "completion", receipt);
271
+ if (!entry) return canceled(commit, artifact);
196
272
  return {
197
273
  completed: outcome.valid,
198
274
  receiptPath: entry.path,
@@ -227,6 +303,15 @@ async function runReviewFinalize(opts: FinalizeOptions): Promise<FinalizeResult>
227
303
  prUrl: null,
228
304
  issueArtifact: null,
229
305
  };
306
+ if (opts.signal?.aborted) {
307
+ return {
308
+ ...baseResult,
309
+ completed: false,
310
+ receiptPath: null,
311
+ verdict: null,
312
+ blockers: ["validation-unknown:cancelled"],
313
+ };
314
+ }
230
315
 
231
316
  // Explicit operator/loop verdict always wins. Only when none is supplied do we fall back to
232
317
  // extracting a closed-vocabulary verdict from the live RPC owner's final assistant text.
@@ -259,13 +344,16 @@ async function runReviewFinalize(opts: FinalizeOptions): Promise<FinalizeResult>
259
344
  createdAt: now(),
260
345
  });
261
346
  const outcome = validateReceipt(receipt);
262
- const entry = await writeReceiptImmutable(
263
- opts.root,
264
- opts.sessionId,
265
- "review-failure",
266
- receipt.receiptId,
267
- receipt,
268
- );
347
+ const entry = await persistFinalizeReceipt(opts, "review-failure", receipt);
348
+ if (!entry) {
349
+ return {
350
+ ...baseResult,
351
+ completed: false,
352
+ receiptPath: null,
353
+ verdict: null,
354
+ blockers: ["validation-unknown:cancelled"],
355
+ };
356
+ }
269
357
  const blockers = outcome.valid ? [reason] : [reason, ...outcome.reasons];
270
358
  return { ...baseResult, completed: false, receiptPath: entry.path, verdict: null, blockers };
271
359
  }
@@ -289,7 +377,16 @@ async function runReviewFinalize(opts: FinalizeOptions): Promise<FinalizeResult>
289
377
  createdAt: now(),
290
378
  });
291
379
  const outcome = validateReceipt(receipt);
292
- const entry = await writeReceiptImmutable(opts.root, opts.sessionId, "review-verdict", receipt.receiptId, receipt);
380
+ const entry = await persistFinalizeReceipt(opts, "review-verdict", receipt);
381
+ if (!entry) {
382
+ return {
383
+ ...baseResult,
384
+ completed: false,
385
+ receiptPath: null,
386
+ verdict: null,
387
+ blockers: ["validation-unknown:cancelled"],
388
+ };
389
+ }
293
390
  // A confirmation-required verdict is recorded but never an autonomous success.
294
391
  const humanActionRequired = verdict === "OWNER_CONFIRMATION_REQUIRED";
295
392
  const completed = outcome.valid && !humanActionRequired;
@@ -308,11 +405,201 @@ function git(workspace: string, args: string[]): string | null {
308
405
  }
309
406
  }
310
407
 
311
- /** Real checks: git for commit/branch, gh for PR, Bun.spawn for validation commands. */
312
- export function defaultFinalizeChecks(workspace: string): FinalizeChecks {
408
+ /** Real checks: git for commit/branch, gh for PR, async Bun.spawn for validation commands. */
409
+ async function discardSpawnStream(stream: ReadableStream<Uint8Array> | null | undefined): Promise<void> {
410
+ if (!stream) return;
411
+ const reader = stream.getReader();
412
+ try {
413
+ for (;;) {
414
+ const { done } = await reader.read();
415
+ if (done) return;
416
+ }
417
+ } finally {
418
+ reader.releaseLock();
419
+ }
420
+ }
421
+
422
+ type ValidationProcessGroupIdentity = "verified" | "leader-absent" | "unverified";
423
+
424
+ function validationProcessGroupIdentity(
425
+ proc: Bun.Subprocess<"ignore", "pipe", "pipe">,
426
+ startTime: string | undefined,
427
+ probeProcess: (pid: number) => LinuxProcPidProbeResult,
428
+ ): ValidationProcessGroupIdentity {
429
+ if (process.platform !== "linux") return proc.exitCode === null ? "verified" : "unverified";
430
+ const leader = probeProcess(proc.pid);
431
+ if (leader.kind === "absent") return "leader-absent";
432
+ if (leader.kind !== "live" || startTime === undefined || leader.startTime !== startTime) return "unverified";
433
+ return "verified";
434
+ }
435
+
436
+ function validationProcessGroupHasRunningMembers(
437
+ proc: Bun.Subprocess<"ignore", "pipe", "pipe">,
438
+ startTime: string | undefined,
439
+ probeProcess: (pid: number) => LinuxProcPidProbeResult,
440
+ ): boolean {
441
+ const identity = validationProcessGroupIdentity(proc, startTime, probeProcess);
442
+ if (identity === "unverified") {
443
+ // We may prove that the group has disappeared, but a failed /proc identity
444
+ // probe cannot authorize either signaling the group or declaring it clean.
445
+ try {
446
+ process.kill(-proc.pid, 0);
447
+ return true;
448
+ } catch (error) {
449
+ const code = (error as NodeJS.ErrnoException).code;
450
+ if (code === "ESRCH") return false;
451
+ if (code === "EPERM") return true;
452
+ throw error;
453
+ }
454
+ }
455
+ try {
456
+ process.kill(-proc.pid, 0);
457
+ } catch (error) {
458
+ const code = (error as NodeJS.ErrnoException).code;
459
+ if (code === "ESRCH") return false;
460
+ if (code !== "EPERM") throw error;
461
+ }
462
+ if (process.platform !== "linux") return true;
463
+ try {
464
+ for (const entry of readdirSync("/proc")) {
465
+ if (!/^\d+$/.test(entry)) continue;
466
+ let stat: string;
467
+ try {
468
+ stat = readFileSync(`/proc/${entry}/stat`, "utf8");
469
+ } catch (error) {
470
+ const code = (error as NodeJS.ErrnoException).code;
471
+ if (code === "ENOENT" || code === "ESRCH") continue;
472
+ return true;
473
+ }
474
+ const fields = stat.slice(stat.lastIndexOf(")") + 2).split(" ");
475
+ const state = fields[0] ?? "";
476
+ if (Number(fields[2]) === proc.pid && state !== "Z" && state !== "X") return true;
477
+ }
478
+ return false;
479
+ } catch {
480
+ // Procfs is not available/readable; conservatively keep waiting for group exit.
481
+ return true;
482
+ }
483
+ }
484
+
485
+ async function waitForValidationProcessGroupExit(
486
+ proc: Bun.Subprocess<"ignore", "pipe", "pipe">,
487
+ startTime: string | undefined,
488
+ probeProcess: (pid: number) => LinuxProcPidProbeResult,
489
+ ): Promise<void> {
490
+ while (validationProcessGroupHasRunningMembers(proc, startTime, probeProcess)) await Bun.sleep(20);
491
+ }
492
+
493
+ function signalValidationProcess(
494
+ proc: Bun.Subprocess<"ignore", "pipe", "pipe">,
495
+ signal: NodeJS.Signals,
496
+ groupStartTime: string | undefined,
497
+ probeProcess: (pid: number) => LinuxProcPidProbeResult,
498
+ ): void {
499
+ if (process.platform !== "win32" && Number.isSafeInteger(proc.pid) && proc.pid > 0) {
500
+ if (validationProcessGroupIdentity(proc, groupStartTime, probeProcess) === "unverified") {
501
+ // The Subprocess handle is exact authority for its direct child. Never
502
+ // signal a numeric process group whose leader identity could not be proven.
503
+ if (proc.exitCode === null) {
504
+ try {
505
+ proc.kill(signal);
506
+ } catch {}
507
+ }
508
+ return;
509
+ }
510
+ try {
511
+ // `detached: true` makes the validator the leader of its own POSIX session
512
+ // and process group, so this also reaches shells and background children.
513
+ process.kill(-proc.pid, signal);
514
+ return;
515
+ } catch (error) {
516
+ if ((error as NodeJS.ErrnoException).code !== "ESRCH") {
517
+ // Still signal the exact child as a best effort; group liveness below
518
+ // remains authoritative and shutdown will not proceed while it exists.
519
+ try {
520
+ proc.kill(signal);
521
+ } catch {}
522
+ return;
523
+ }
524
+ }
525
+ }
526
+ try {
527
+ proc.kill(signal);
528
+ } catch {
529
+ // The exact child may already have exited; the exit promise is authoritative.
530
+ }
531
+ }
532
+
533
+ async function terminateValidationProcess(
534
+ proc: Bun.Subprocess<"ignore", "pipe", "pipe">,
535
+ groupStartTime: string | undefined,
536
+ probeProcess: (pid: number) => LinuxProcPidProbeResult,
537
+ ): Promise<void> {
538
+ const hasProcessGroup = process.platform !== "win32" && Number.isSafeInteger(proc.pid) && proc.pid > 0;
539
+ signalValidationProcess(proc, "SIGTERM", groupStartTime, probeProcess);
540
+ if (hasProcessGroup) {
541
+ const groupExit = waitForValidationProcessGroupExit(proc, groupStartTime, probeProcess);
542
+ const exitedGracefully = await Promise.race([groupExit.then(() => true), Bun.sleep(250).then(() => false)]);
543
+ if (!exitedGracefully) {
544
+ signalValidationProcess(proc, "SIGKILL", groupStartTime, probeProcess);
545
+ await groupExit;
546
+ }
547
+ } else {
548
+ const exitedGracefully = await Promise.race([proc.exited.then(() => true), Bun.sleep(250).then(() => false)]);
549
+ if (!exitedGracefully) signalValidationProcess(proc, "SIGKILL", groupStartTime, probeProcess);
550
+ }
551
+ await proc.exited;
552
+ }
553
+
554
+ export function defaultFinalizeChecks(
555
+ workspace: string,
556
+ probeProcess: (pid: number) => LinuxProcPidProbeResult = probeLinuxProcPidSync,
557
+ ): FinalizeChecks {
313
558
  return {
314
- async runValidation(spec) {
315
- const proc = Bun.spawnSync(["bash", "-lc", spec.command], { cwd: workspace, stdout: "pipe", stderr: "pipe" });
559
+ async runValidation(spec, signal) {
560
+ if (signal?.aborted) throw new ValidationObservationUncertainError(spec.command, workspace, signal.reason);
561
+ let proc: Bun.Subprocess<"ignore", "pipe", "pipe">;
562
+ try {
563
+ proc = Bun.spawn(["bash", "-lc", spec.command], {
564
+ cwd: workspace,
565
+ stdout: "pipe",
566
+ stderr: "pipe",
567
+ stdin: "ignore",
568
+ detached: true,
569
+ });
570
+ } catch {
571
+ return { exactCommand: spec.command, cwd: workspace, exitStatus: 1, pass: false };
572
+ }
573
+ const spawnLeader =
574
+ process.platform === "linux" && Number.isSafeInteger(proc.pid) && proc.pid > 0
575
+ ? probeProcess(proc.pid)
576
+ : undefined;
577
+ const groupStartTime = spawnLeader?.kind === "live" ? spawnLeader.startTime : undefined;
578
+ const stdout = discardSpawnStream(proc.stdout);
579
+ const stderr = discardSpawnStream(proc.stderr);
580
+ const exited = proc.exited;
581
+ let abortListener: (() => void) | undefined;
582
+ const aborted = new Promise<never>((_resolve, reject) => {
583
+ if (!signal) return;
584
+ abortListener = () => reject(signal.reason ?? new Error("validation_aborted"));
585
+ if (signal.aborted) abortListener();
586
+ else signal.addEventListener("abort", abortListener, { once: true });
587
+ });
588
+ try {
589
+ await Promise.race([Promise.all([stdout, stderr, exited]), aborted]);
590
+ } catch (cause) {
591
+ try {
592
+ await terminateValidationProcess(proc, groupStartTime, probeProcess);
593
+ } catch (cleanupError) {
594
+ throw new Error("validation_process_cleanup_failed", {
595
+ cause: new AggregateError([cause, cleanupError]),
596
+ });
597
+ }
598
+ await Promise.allSettled([stdout, stderr, exited]);
599
+ throw new ValidationObservationUncertainError(spec.command, workspace, cause);
600
+ } finally {
601
+ if (abortListener) signal?.removeEventListener("abort", abortListener);
602
+ }
316
603
  const exitStatus = proc.exitCode ?? 1;
317
604
  return { exactCommand: spec.command, cwd: workspace, exitStatus, pass: exitStatus === 0 };
318
605
  },