@gajae-code/coding-agent 0.11.11 → 0.12.1

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 (344) hide show
  1. package/CHANGELOG.md +131 -4
  2. package/dist/types/async/job-manager.d.ts +17 -3
  3. package/dist/types/cli/read-cli.d.ts +1 -0
  4. package/dist/types/commands/deep-interview.d.ts +9 -0
  5. package/dist/types/commands/harness.d.ts +22 -0
  6. package/dist/types/commands/read.d.ts +6 -0
  7. package/dist/types/config/model-registry.d.ts +4 -0
  8. package/dist/types/config/provider-auth-health.d.ts +14 -0
  9. package/dist/types/config/provider-ranking.d.ts +59 -0
  10. package/dist/types/config/settings-schema.d.ts +83 -1
  11. package/dist/types/config/settings.d.ts +2 -0
  12. package/dist/types/exa/mcp-client.d.ts +10 -1
  13. package/dist/types/exec/bash-executor.d.ts +45 -12
  14. package/dist/types/extensibility/extensions/types.d.ts +38 -4
  15. package/dist/types/extensibility/gjc-plugins/index.d.ts +12 -2
  16. package/dist/types/extensibility/gjc-plugins/installer.d.ts +63 -7
  17. package/dist/types/extensibility/gjc-plugins/lifecycle-reconciliation.d.ts +55 -0
  18. package/dist/types/extensibility/gjc-plugins/lifecycle.d.ts +64 -0
  19. package/dist/types/extensibility/gjc-plugins/runtime-quarantine.d.ts +67 -0
  20. package/dist/types/extensibility/gjc-plugins/session-validation.d.ts +3 -1
  21. package/dist/types/extensibility/gjc-plugins/types.d.ts +124 -0
  22. package/dist/types/extensibility/shared-events.d.ts +6 -0
  23. package/dist/types/gjc-runtime/deep-interview-ambiguity.d.ts +5 -12
  24. package/dist/types/gjc-runtime/deep-interview-recorder.d.ts +17 -32
  25. package/dist/types/gjc-runtime/deep-interview-stage.d.ts +37 -0
  26. package/dist/types/gjc-runtime/deep-interview-state.d.ts +4 -135
  27. package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
  28. package/dist/types/gjc-runtime/launch-tmux.d.ts +1 -0
  29. package/dist/types/gjc-runtime/memory-guard-owner-claims.d.ts +47 -0
  30. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +70 -1
  31. package/dist/types/gjc-runtime/state-writer.d.ts +5 -46
  32. package/dist/types/gjc-runtime/team-launch.d.ts +1 -1
  33. package/dist/types/gjc-runtime/team-runtime.d.ts +27 -1
  34. package/dist/types/gjc-runtime/team-store.d.ts +12 -0
  35. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +43 -0
  36. package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +92 -0
  37. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +17 -0
  38. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +8 -0
  39. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +31 -80
  40. package/dist/types/gjc-runtime/workflow-manifest.d.ts +3 -5
  41. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  42. package/dist/types/main.d.ts +1 -1
  43. package/dist/types/memories/index.d.ts +2 -0
  44. package/dist/types/modes/acp/acp-agent.d.ts +10 -19
  45. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  46. package/dist/types/modes/components/gjc-bundle-settings.d.ts +34 -0
  47. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  48. package/dist/types/modes/components/notifications-settings-editor.d.ts +1 -0
  49. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  50. package/dist/types/modes/components/session-observer-overlay.d.ts +22 -0
  51. package/dist/types/modes/components/settings-selector.d.ts +11 -0
  52. package/dist/types/modes/components/status-line/gh.d.ts +5 -0
  53. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  54. package/dist/types/modes/components/transcript-viewer-overlay.d.ts +18 -1
  55. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  56. package/dist/types/modes/interactive-mode.d.ts +2 -0
  57. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  58. package/dist/types/modes/types.d.ts +2 -0
  59. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  60. package/dist/types/reminders/star-reminder.d.ts +3 -13
  61. package/dist/types/runtime-mcp/manager.d.ts +1 -0
  62. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  63. package/dist/types/sdk/acp/adapter.d.ts +3 -1
  64. package/dist/types/sdk/broker/lifecycle.d.ts +5 -0
  65. package/dist/types/sdk/broker/transport.d.ts +2 -0
  66. package/dist/types/sdk/bus/attachment-registry.d.ts +1 -0
  67. package/dist/types/sdk/bus/chat-daemon-control.d.ts +4 -1
  68. package/dist/types/sdk/bus/config.d.ts +6 -2
  69. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  70. package/dist/types/sdk/bus/index.d.ts +44 -1
  71. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +44 -0
  72. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +4 -0
  73. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +2 -1
  74. package/dist/types/sdk/bus/reconciliation-store.d.ts +69 -0
  75. package/dist/types/sdk/bus/rich-draft.d.ts +1 -0
  76. package/dist/types/sdk/bus/rich-render.d.ts +2 -0
  77. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +165 -0
  78. package/dist/types/sdk/bus/telegram-cli.d.ts +12 -0
  79. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +11 -4
  80. package/dist/types/sdk/bus/telegram-daemon.d.ts +25 -1
  81. package/dist/types/sdk/bus/telegram-reference.d.ts +11 -1
  82. package/dist/types/sdk/bus/threaded-render.d.ts +3 -2
  83. package/dist/types/sdk/bus/topic-registry.d.ts +11 -1
  84. package/dist/types/sdk/host/control/operations.d.ts +1 -1
  85. package/dist/types/sdk/host/host.d.ts +2 -0
  86. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  87. package/dist/types/sdk/host/query/revision-store.d.ts +2 -0
  88. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  89. package/dist/types/sdk/prompt-status.d.ts +23 -3
  90. package/dist/types/sdk/session.d.ts +6 -0
  91. package/dist/types/session/agent-session.d.ts +82 -12
  92. package/dist/types/session/artifacts.d.ts +8 -0
  93. package/dist/types/session/blob-store.d.ts +57 -4
  94. package/dist/types/session/internal/managed-session-storage.d.ts +8 -1
  95. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  96. package/dist/types/session/session-manager.d.ts +48 -19
  97. package/dist/types/session/session-storage.d.ts +4 -0
  98. package/dist/types/session/streaming-output.d.ts +96 -12
  99. package/dist/types/setup/credential-import.d.ts +12 -0
  100. package/dist/types/skill-state/active-state.d.ts +12 -4
  101. package/dist/types/skill-state/workflow-hud.d.ts +9 -0
  102. package/dist/types/task/executor.d.ts +3 -2
  103. package/dist/types/task/index.d.ts +3 -1
  104. package/dist/types/task/provider-retry-status.d.ts +8 -0
  105. package/dist/types/task/receipt.d.ts +7 -1
  106. package/dist/types/task/types.d.ts +23 -0
  107. package/dist/types/tools/ask-answer-registry.d.ts +2 -2
  108. package/dist/types/tools/bash-interactive.d.ts +4 -1
  109. package/dist/types/tools/bash.d.ts +3 -1
  110. package/dist/types/tools/browser/launch.d.ts +7 -0
  111. package/dist/types/tools/fetch.d.ts +17 -1
  112. package/dist/types/tools/image-gen.d.ts +4 -0
  113. package/dist/types/tools/index.d.ts +4 -0
  114. package/dist/types/tools/output-meta.d.ts +44 -3
  115. package/dist/types/tools/path-utils.d.ts +1 -0
  116. package/dist/types/tools/read-internals.d.ts +12 -0
  117. package/dist/types/tools/read.d.ts +45 -7
  118. package/dist/types/tools/resource-gc.d.ts +4 -0
  119. package/dist/types/tools/review.d.ts +5 -7
  120. package/dist/types/tools/subagent.d.ts +2 -0
  121. package/dist/types/tools/tool-result.d.ts +7 -1
  122. package/dist/types/utils/gh.d.ts +13 -0
  123. package/dist/types/utils/image-resize.d.ts +1 -0
  124. package/dist/types/web/search/providers/kimi.d.ts +2 -0
  125. package/dist/types/web/search/providers/searxng.d.ts +7 -0
  126. package/dist/types/web/search/providers/xai.d.ts +2 -0
  127. package/package.json +11 -13
  128. package/scripts/acp-conformance-agent.ts +218 -0
  129. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  130. package/scripts/capture-gjc-bundle-settings.ts +306 -0
  131. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  132. package/scripts/generate-sdk-operation-inventory.ts +5 -0
  133. package/scripts/resident-memory-bench.ts +1341 -0
  134. package/scripts/run-acp-conformance.ts +285 -0
  135. package/scripts/verify-gjc-sdk-canonicalization.ts +122 -18
  136. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  137. package/src/async/job-manager.ts +78 -20
  138. package/src/capability/index.ts +8 -0
  139. package/src/cli/fast-help.ts +1 -1
  140. package/src/cli/plugin-cli.ts +176 -18
  141. package/src/cli/read-cli.ts +2 -1
  142. package/src/cli.ts +1 -0
  143. package/src/commands/deep-interview.ts +29 -9
  144. package/src/commands/harness.ts +35 -12
  145. package/src/commands/read.ts +11 -2
  146. package/src/commands/team.ts +20 -2
  147. package/src/config/file-lock.ts +11 -2
  148. package/src/config/model-registry.ts +21 -2
  149. package/src/config/provider-auth-health.ts +42 -0
  150. package/src/config/provider-ranking.ts +119 -0
  151. package/src/config/settings-schema.ts +74 -1
  152. package/src/config/settings.ts +246 -108
  153. package/src/coordinator-mcp/question-gate-codec.ts +1 -1
  154. package/src/coordinator-mcp/server.ts +5 -12
  155. package/src/defaults/gjc/skills/deep-interview/SKILL.md +230 -82
  156. package/src/defaults/gjc/skills/ralplan/SKILL.md +77 -41
  157. package/src/defaults/gjc/skills/team/SKILL.md +3 -1
  158. package/src/defaults/gjc/skills/ultragoal/SKILL.md +62 -39
  159. package/src/defaults/gjc/skills/ultragoal/validation-batch-contracts.md +12 -0
  160. package/src/defaults/gjc-defaults.ts +4 -4
  161. package/src/eval/py/executor.ts +7 -2
  162. package/src/exa/mcp-client.ts +12 -3
  163. package/src/exec/bash-executor.ts +144 -27
  164. package/src/extensibility/extensions/runner.ts +15 -0
  165. package/src/extensibility/extensions/types.ts +46 -5
  166. package/src/extensibility/gjc-plugins/constrained-hooks.ts +8 -2
  167. package/src/extensibility/gjc-plugins/index.ts +19 -2
  168. package/src/extensibility/gjc-plugins/installer.ts +189 -50
  169. package/src/extensibility/gjc-plugins/lifecycle-reconciliation.ts +199 -0
  170. package/src/extensibility/gjc-plugins/lifecycle.ts +626 -0
  171. package/src/extensibility/gjc-plugins/observability.ts +3 -3
  172. package/src/extensibility/gjc-plugins/prompt-appendix.ts +5 -1
  173. package/src/extensibility/gjc-plugins/runtime-adapters.ts +12 -2
  174. package/src/extensibility/gjc-plugins/runtime-quarantine.ts +121 -0
  175. package/src/extensibility/gjc-plugins/schema.ts +84 -12
  176. package/src/extensibility/gjc-plugins/session-validation.ts +9 -3
  177. package/src/extensibility/gjc-plugins/types.ts +141 -0
  178. package/src/extensibility/gjc-plugins/validation.ts +9 -0
  179. package/src/extensibility/shared-events.ts +5 -0
  180. package/src/gjc-runtime/deep-interview-ambiguity.ts +47 -82
  181. package/src/gjc-runtime/deep-interview-recorder.ts +227 -310
  182. package/src/gjc-runtime/deep-interview-runtime.ts +109 -270
  183. package/src/gjc-runtime/deep-interview-stage.ts +1016 -0
  184. package/src/gjc-runtime/deep-interview-state.ts +12 -943
  185. package/src/gjc-runtime/gc-render.ts +1 -0
  186. package/src/gjc-runtime/gc-runtime.ts +11 -1
  187. package/src/gjc-runtime/launch-tmux.ts +25 -6
  188. package/src/gjc-runtime/managed-owner-admission.ts +1 -1
  189. package/src/gjc-runtime/memory-guard-owner-claims.ts +389 -0
  190. package/src/gjc-runtime/ralplan-runtime.ts +1149 -98
  191. package/src/gjc-runtime/state-runtime.ts +2 -1
  192. package/src/gjc-runtime/state-writer.ts +70 -222
  193. package/src/gjc-runtime/team-launch.ts +42 -5
  194. package/src/gjc-runtime/team-runtime.ts +1085 -40
  195. package/src/gjc-runtime/team-store.ts +32 -0
  196. package/src/gjc-runtime/team-worker-heartbeat.ts +149 -0
  197. package/src/gjc-runtime/team-worker-memory-guard.ts +363 -0
  198. package/src/gjc-runtime/team-workers.ts +1 -0
  199. package/src/gjc-runtime/tmux-owner-isolation.ts +28 -0
  200. package/src/gjc-runtime/tmux-sessions.ts +58 -13
  201. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +20 -0
  202. package/src/gjc-runtime/ultragoal-runtime.ts +414 -618
  203. package/src/gjc-runtime/workflow-manifest.generated.json +105 -449
  204. package/src/gjc-runtime/workflow-manifest.ts +38 -247
  205. package/src/hooks/native-skill-hook.ts +17 -4
  206. package/src/hooks/skill-state.ts +1 -23
  207. package/src/internal-urls/docs-index.generated.ts +21 -22
  208. package/src/internal-urls/local-root-gc.ts +127 -0
  209. package/src/main.ts +9 -5
  210. package/src/memories/index.ts +10 -0
  211. package/src/modes/DESIGN.md +98 -0
  212. package/src/modes/acp/acp-agent.ts +339 -191
  213. package/src/modes/acp/acp-event-mapper.ts +14 -7
  214. package/src/modes/acp/acp-mode.ts +39 -3
  215. package/src/modes/components/assistant-message.ts +123 -22
  216. package/src/modes/components/gjc-bundle-settings.ts +508 -0
  217. package/src/modes/components/irc-sidebar.ts +176 -62
  218. package/src/modes/components/model-selector.ts +61 -4
  219. package/src/modes/components/notifications-settings-editor.ts +12 -1
  220. package/src/modes/components/oauth-selector.ts +96 -28
  221. package/src/modes/components/read-tool-group.ts +82 -14
  222. package/src/modes/components/session-observer-overlay.ts +457 -83
  223. package/src/modes/components/settings-selector.ts +116 -23
  224. package/src/modes/components/status-line/gh.ts +16 -0
  225. package/src/modes/components/tool-execution.ts +138 -27
  226. package/src/modes/components/tool-status-header.ts +3 -14
  227. package/src/modes/components/transcript-viewer-overlay.ts +99 -24
  228. package/src/modes/controllers/command-controller.ts +4 -0
  229. package/src/modes/controllers/event-controller.ts +109 -27
  230. package/src/modes/controllers/extension-ui-controller.ts +26 -2
  231. package/src/modes/controllers/input-controller.ts +18 -3
  232. package/src/modes/controllers/selector-controller.ts +127 -36
  233. package/src/modes/interactive-mode.ts +62 -3
  234. package/src/modes/irc-observation-ledger.ts +71 -15
  235. package/src/modes/runtime-init.ts +22 -2
  236. package/src/modes/types.ts +2 -0
  237. package/src/modes/utils/ui-helpers.ts +94 -1
  238. package/src/prompts/agent-fragments/ralplan-persistence.md +4 -3
  239. package/src/prompts/agents/architect.md +9 -1
  240. package/src/prompts/agents/critic.md +9 -0
  241. package/src/prompts/system/eager-todo.md +8 -4
  242. package/src/prompts/system/system-prompt.md +11 -5
  243. package/src/prompts/tools/bash.md +5 -5
  244. package/src/prompts/tools/read.md +4 -2
  245. package/src/prompts/tools/search-tool-bm25.md +5 -0
  246. package/src/prompts/tools/task.md +1 -1
  247. package/src/reminders/star-reminder.ts +4 -42
  248. package/src/runtime-mcp/manager.ts +19 -4
  249. package/src/runtime-mcp/smithery-auth.ts +17 -2
  250. package/src/runtime-mcp/smithery-connect.ts +11 -1
  251. package/src/sdk/acp/adapter.ts +22 -6
  252. package/src/sdk/broker/lifecycle.ts +25 -6
  253. package/src/sdk/broker/transport.ts +35 -3
  254. package/src/sdk/bus/attachment-registry.ts +5 -1
  255. package/src/sdk/bus/chat-daemon-cli.ts +4 -39
  256. package/src/sdk/bus/chat-daemon-control.ts +6 -3
  257. package/src/sdk/bus/config.ts +18 -2
  258. package/src/sdk/bus/control-drain-lease.ts +104 -0
  259. package/src/sdk/bus/index.ts +984 -146
  260. package/src/sdk/bus/kind-aware-reconciliation.ts +317 -0
  261. package/src/sdk/bus/lifecycle-commands.ts +4 -1
  262. package/src/sdk/bus/lifecycle-control-runtime.ts +403 -88
  263. package/src/sdk/bus/prompt-reconciliation.ts +2 -1
  264. package/src/sdk/bus/reconciliation-store.ts +303 -0
  265. package/src/sdk/bus/rich-draft.ts +1 -1
  266. package/src/sdk/bus/rich-render.ts +2 -2
  267. package/src/sdk/bus/telegram-adoption-intent.ts +574 -0
  268. package/src/sdk/bus/telegram-cli.ts +33 -8
  269. package/src/sdk/bus/telegram-daemon-cli.ts +1 -0
  270. package/src/sdk/bus/telegram-daemon-contract.ts +11 -4
  271. package/src/sdk/bus/telegram-daemon.ts +916 -23
  272. package/src/sdk/bus/telegram-reference.ts +40 -3
  273. package/src/sdk/bus/threaded-render.ts +48 -3
  274. package/src/sdk/bus/topic-registry.ts +20 -0
  275. package/src/sdk/host/control/dispatch.ts +5 -1
  276. package/src/sdk/host/control/operations.ts +1 -1
  277. package/src/sdk/host/host.ts +23 -1
  278. package/src/sdk/host/query/handlers.ts +55 -0
  279. package/src/sdk/host/query/revision-store.ts +36 -2
  280. package/src/sdk/host/reverse-leases.ts +44 -7
  281. package/src/sdk/mcp/server.ts +46 -18
  282. package/src/sdk/prompt-status.ts +16 -3
  283. package/src/sdk/protocol/operation-inventory.generated.json +51 -0
  284. package/src/sdk/protocol/operation-registry.ts +7 -2
  285. package/src/sdk/session.ts +101 -10
  286. package/src/session/agent-session.ts +1286 -220
  287. package/src/session/artifacts.ts +22 -0
  288. package/src/session/auth-broker-config.ts +10 -3
  289. package/src/session/blob-store.ts +915 -24
  290. package/src/session/internal/managed-session-scope.ts +44 -6
  291. package/src/session/internal/managed-session-storage.ts +48 -6
  292. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  293. package/src/session/session-manager.ts +2364 -438
  294. package/src/session/session-storage.ts +9 -1
  295. package/src/session/streaming-output.ts +500 -111
  296. package/src/setup/credential-import.ts +75 -13
  297. package/src/setup/provider-onboarding.ts +19 -4
  298. package/src/skill-state/active-state.ts +32 -10
  299. package/src/skill-state/workflow-hud.ts +42 -2
  300. package/src/skill-state/workflow-mutation-guard.ts +560 -8
  301. package/src/task/executor.ts +122 -39
  302. package/src/task/index.ts +23 -14
  303. package/src/task/provider-retry-status.ts +16 -0
  304. package/src/task/receipt.ts +23 -7
  305. package/src/task/render.ts +6 -2
  306. package/src/task/types.ts +108 -0
  307. package/src/tools/ask-answer-registry.ts +12 -6
  308. package/src/tools/ask.ts +169 -118
  309. package/src/tools/ast-edit.ts +1 -0
  310. package/src/tools/ast-grep.ts +1 -0
  311. package/src/tools/bash-interactive.ts +8 -3
  312. package/src/tools/bash.ts +503 -60
  313. package/src/tools/browser/launch.ts +41 -6
  314. package/src/tools/fetch.ts +114 -23
  315. package/src/tools/find.ts +1 -0
  316. package/src/tools/image-gen.ts +29 -5
  317. package/src/tools/index.ts +4 -0
  318. package/src/tools/output-meta.ts +281 -20
  319. package/src/tools/path-utils.ts +8 -3
  320. package/src/tools/read-internals.ts +44 -0
  321. package/src/tools/read.ts +1560 -310
  322. package/src/tools/resource-gc.ts +182 -18
  323. package/src/tools/review.ts +5 -7
  324. package/src/tools/search.ts +1 -0
  325. package/src/tools/subagent-render.ts +6 -2
  326. package/src/tools/subagent.ts +6 -0
  327. package/src/tools/telegram-send.ts +6 -3
  328. package/src/tools/tool-result.ts +14 -1
  329. package/src/utils/gh.ts +39 -0
  330. package/src/utils/image-resize.ts +3 -0
  331. package/src/web/search/providers/anthropic.ts +4 -4
  332. package/src/web/search/providers/codex.ts +1 -1
  333. package/src/web/search/providers/kimi.ts +15 -5
  334. package/src/web/search/providers/searxng.ts +47 -4
  335. package/src/web/search/providers/xai.ts +7 -2
  336. package/dist/types/gjc-runtime/deep-interview-draft.d.ts +0 -8
  337. package/dist/types/gjc-runtime/deep-interview-payload.d.ts +0 -41
  338. package/dist/types/gjc-runtime/deep-interview-repair.d.ts +0 -17
  339. package/dist/types/gjc-runtime/ultragoal-pipeline.d.ts +0 -23
  340. package/src/defaults/gjc/skills/ultragoal/pipeline-validation-contracts.md +0 -30
  341. package/src/gjc-runtime/deep-interview-draft.ts +0 -843
  342. package/src/gjc-runtime/deep-interview-payload.ts +0 -262
  343. package/src/gjc-runtime/deep-interview-repair.ts +0 -1674
  344. package/src/gjc-runtime/ultragoal-pipeline.ts +0 -306
@@ -1,306 +0,0 @@
1
- import * as crypto from "node:crypto";
2
- import {
3
- appendLedger,
4
- collectPipelineBlockerFootprints,
5
- currentUltragoalSessionId,
6
- getUltragoalPaths,
7
- handleIdsFromValue,
8
- hashPipelineMetadata,
9
- isSubstantiveEvidence,
10
- type JsonObject,
11
- nonEmptyString,
12
- openPipelineOverlap,
13
- pipelinePeer,
14
- readUltragoalLedger,
15
- readUltragoalPlan,
16
- requireCoveredHandles,
17
- requireFreshPipelineMetadata,
18
- requireJsonObjectOrArrayValue,
19
- requireJsonObjectValue,
20
- requireNonEmptyPipelineTargets,
21
- resultHandleIds,
22
- stringArray,
23
- targetsAreDisjoint,
24
- targetsOverlap,
25
- type UltragoalGoal,
26
- type UltragoalLedgerEvent,
27
- type UltragoalPipelineLedgerEventName,
28
- type UltragoalPipelineOverlapReceipt,
29
- type UltragoalPipelineOverlapState,
30
- type UltragoalPlan,
31
- validateValidationBatchPipelineExclusion,
32
- writePlan,
33
- } from "./ultragoal-runtime";
34
-
35
- export function requirePipelineStartable(plan: UltragoalPlan, prior: UltragoalGoal, next: UltragoalGoal): void {
36
- if (plan.gjcGoalMode !== "aggregate")
37
- throw new Error("pipeline overlap is supported only for aggregate ultragoal mode");
38
- if (openPipelineOverlap(plan))
39
- throw new Error("Cannot start pipeline overlap because another overlap is already open");
40
- if (prior.status !== "active")
41
- throw new Error(`Prior goal ${prior.id} must be active before pipeline overlap starts`);
42
- if (next.status !== "pending" && next.status !== "failed")
43
- throw new Error(`Next goal ${next.id} must be pending or retryable failed`);
44
- validateValidationBatchPipelineExclusion(prior);
45
- validateValidationBatchPipelineExclusion(next);
46
- if (prior.validationBatch || next.validationBatch)
47
- throw new Error("pipeline overlap cannot start for validation batch goals");
48
- const priorMetadata = requireFreshPipelineMetadata(prior);
49
- const nextMetadata = requireFreshPipelineMetadata(next);
50
- if (!priorMetadata.eligible || !nextMetadata.eligible)
51
- throw new Error("pipeline overlap requires eligible original-plan metadata on both goals");
52
- if (!priorMetadata.independentOf.includes(next.id) || !nextMetadata.independentOf.includes(prior.id)) {
53
- throw new Error("pipeline overlap requires symmetric original independence");
54
- }
55
- if (!targetsAreDisjoint(priorMetadata.targets, nextMetadata.targets))
56
- throw new Error("pipeline overlap requires disjoint files and surfaces");
57
- }
58
-
59
- function pipelineEventRefs(prior: UltragoalGoal, next: UltragoalGoal): JsonObject {
60
- return {
61
- priorMetadataHash: prior.pipelineMetadata?.metadataHash,
62
- nextMetadataHash: next.pipelineMetadata?.metadataHash,
63
- priorTargets: prior.pipelineMetadata?.targets,
64
- nextTargets: next.pipelineMetadata?.targets,
65
- };
66
- }
67
-
68
- function pipelineReceipt(
69
- cwd: string,
70
- event: string,
71
- overlapId: string,
72
- prior: UltragoalGoal,
73
- next: UltragoalGoal,
74
- ): UltragoalPipelineOverlapReceipt {
75
- const paths = getUltragoalPaths(cwd, currentUltragoalSessionId(cwd));
76
- return {
77
- ok: true,
78
- event,
79
- overlap_id: overlapId,
80
- prior_goal_id: prior.id,
81
- next_goal_id: next.id,
82
- status: next.pipelineMetadata?.overlap,
83
- next_goal_status: next.status,
84
- goals_path: paths.goalsPath,
85
- ledger_path: paths.ledgerPath,
86
- };
87
- }
88
-
89
- export async function startUltragoalPipelineOverlap(input: {
90
- cwd: string;
91
- priorGoalId: string;
92
- nextGoalId: string;
93
- reviewHandles: JsonObject | JsonObject[];
94
- qaHandles: JsonObject | JsonObject[];
95
- implementationHandle: JsonObject;
96
- }): Promise<UltragoalPipelineOverlapReceipt> {
97
- const plan = await readUltragoalPlan(input.cwd);
98
- if (!plan) throw new Error("No ultragoal plan found. Run `gjc ultragoal create-goals --brief ...` first.");
99
- const prior = plan.goals.find(goal => goal.id === input.priorGoalId);
100
- const next = plan.goals.find(goal => goal.id === input.nextGoalId);
101
- if (!prior || !next) throw new Error("start-pipeline-overlap requires existing prior and next goal ids");
102
- const reviewHandles = requireJsonObjectOrArrayValue(input.reviewHandles, "review handles");
103
- const qaHandles = requireJsonObjectOrArrayValue(input.qaHandles, "QA handles");
104
- requireJsonObjectValue(input.implementationHandle, "implementation handle");
105
- requirePipelineStartable(plan, prior, next);
106
- const now = new Date().toISOString();
107
- const overlapId = `pipeline-${crypto.randomUUID()}`;
108
- const priorMetadata = requireFreshPipelineMetadata(prior);
109
- const nextMetadata = requireFreshPipelineMetadata(next);
110
- const priorOpenMetadata = {
111
- ...priorMetadata,
112
- overlap: "open" as const,
113
- overlapId,
114
- priorGoalId: prior.id,
115
- nextGoalId: next.id,
116
- };
117
- const nextOpenMetadata = {
118
- ...nextMetadata,
119
- overlap: "open" as const,
120
- overlapId,
121
- priorGoalId: prior.id,
122
- nextGoalId: next.id,
123
- };
124
- prior.pipelineMetadata = { ...priorOpenMetadata, metadataHash: hashPipelineMetadata(priorOpenMetadata) };
125
- next.pipelineMetadata = { ...nextOpenMetadata, metadataHash: hashPipelineMetadata(nextOpenMetadata) };
126
- prior.updatedAt = now;
127
- next.updatedAt = now;
128
- next.status = "active";
129
- next.startedAt = next.startedAt ?? now;
130
- plan.updatedAt = now;
131
- await writePlan(input.cwd, plan);
132
- const refs = pipelineEventRefs(prior, next);
133
- const expectedReviewHandleIds = handleIdsFromValue(reviewHandles, "review");
134
- const expectedQaHandleIds = handleIdsFromValue(qaHandles, "QA");
135
- await appendLedger(input.cwd, {
136
- event: "pipeline_overlap_started",
137
- eventId: crypto.randomUUID(),
138
- timestamp: now,
139
- schemaVersion: 1,
140
- overlapId,
141
- priorGoalId: prior.id,
142
- nextGoalId: next.id,
143
- reviewHandles,
144
- reviewHandleIds: expectedReviewHandleIds,
145
- qaHandles,
146
- qaHandleIds: expectedQaHandleIds,
147
- implementationHandle: input.implementationHandle,
148
- ...refs,
149
- });
150
- await appendLedger(input.cwd, { event: "goal_started", goalId: next.id, pipelineOverlapId: overlapId });
151
- return pipelineReceipt(input.cwd, "pipeline_overlap_started", overlapId, prior, next);
152
- }
153
-
154
- function resultStatus(value: JsonObject, fieldName: string): string {
155
- const status = nonEmptyString(value.status) ?? nonEmptyString(value.verdict) ?? nonEmptyString(value.result);
156
- if (!status) throw new Error(`${fieldName} requires status, verdict, or result`);
157
- return status.toLowerCase();
158
- }
159
-
160
- function requireCleanPipelineResult(result: JsonObject, expectedHandleIds: readonly string[], fieldName: string): void {
161
- const status = resultStatus(result, fieldName);
162
- if (!["passed", "pass", "approved", "clear"].includes(status)) throw new Error(`${fieldName} did not pass`);
163
- const evidence = nonEmptyString(result.evidence);
164
- if (!evidence || !isSubstantiveEvidence(evidence)) throw new Error(`${fieldName} requires substantive evidence`);
165
- requireCoveredHandles(expectedHandleIds, resultHandleIds(result, fieldName), fieldName);
166
- if (collectPipelineBlockerFootprints(result, fieldName).length > 0)
167
- throw new Error(`${fieldName} cannot clean-join with blockers`);
168
- }
169
-
170
- function pipelineStartEventHandleIds(
171
- ledger: UltragoalLedgerEvent[],
172
- overlapId: string,
173
- ): { review: string[]; qa: string[] } {
174
- const event = ledger.find(row => row.event === "pipeline_overlap_started" && row.overlapId === overlapId) as
175
- | JsonObject
176
- | undefined;
177
- if (!event) throw new Error(`No pipeline_overlap_started event found for ${overlapId}`);
178
- const review =
179
- stringArray(event.reviewHandleIds) ??
180
- handleIdsFromValue(requireJsonObjectOrArrayValue(event.reviewHandles, "review handles"), "review");
181
- const qa =
182
- stringArray(event.qaHandleIds) ??
183
- handleIdsFromValue(requireJsonObjectOrArrayValue(event.qaHandles, "QA handles"), "QA");
184
- return { review, qa };
185
- }
186
-
187
- export async function joinUltragoalPipelineOverlap(input: {
188
- cwd: string;
189
- overlapId: string;
190
- reviewResult: JsonObject;
191
- qaResult: JsonObject;
192
- }): Promise<UltragoalPipelineOverlapReceipt> {
193
- const plan = await readUltragoalPlan(input.cwd);
194
- if (!plan) throw new Error("No ultragoal plan found. Run `gjc ultragoal create-goals --brief ...` first.");
195
- const overlap = openPipelineOverlap(plan);
196
- if (!overlap || overlap.overlapId !== input.overlapId)
197
- throw new Error(`No open pipeline overlap found for ${input.overlapId}`);
198
- const { prior, next, overlapId } = overlap;
199
- const nextMetadata = requireFreshPipelineMetadata(next);
200
- const ledger = await readUltragoalLedger(input.cwd);
201
- const expectedHandles = pipelineStartEventHandleIds(ledger, overlapId);
202
- const reviewBlockers = collectPipelineBlockerFootprints(input.reviewResult, "review result");
203
- const qaBlockers = collectPipelineBlockerFootprints(input.qaResult, "QA result");
204
- const blockerFootprints = [...reviewBlockers, ...qaBlockers];
205
- let state: UltragoalPipelineOverlapState;
206
- let event: UltragoalPipelineLedgerEventName;
207
- if (blockerFootprints.length === 0) {
208
- try {
209
- requireCleanPipelineResult(input.reviewResult, expectedHandles.review, "review result");
210
- requireCleanPipelineResult(input.qaResult, expectedHandles.qa, "QA result");
211
- state = "joined_clean";
212
- event = "pipeline_overlap_joined";
213
- } catch {
214
- state = "quarantine_required";
215
- event = "pipeline_overlap_quarantined";
216
- }
217
- } else if (blockerFootprints.every(footprint => !targetsOverlap(footprint, nextMetadata.targets))) {
218
- state = "blocked_disjoint_continue";
219
- event = "pipeline_overlap_joined";
220
- } else {
221
- state = "quarantine_required";
222
- event = "pipeline_overlap_quarantined";
223
- }
224
- const now = new Date().toISOString();
225
- for (const goal of [prior, next]) {
226
- const metadata = requireFreshPipelineMetadata(goal);
227
- const joinedMetadata = { ...metadata, overlap: state, blockerFootprints };
228
- goal.pipelineMetadata = { ...joinedMetadata, metadataHash: hashPipelineMetadata(joinedMetadata) };
229
- goal.updatedAt = now;
230
- }
231
- if (state === "quarantine_required") next.status = "blocked";
232
- plan.updatedAt = now;
233
- await writePlan(input.cwd, plan);
234
- await appendLedger(input.cwd, {
235
- event,
236
- eventId: crypto.randomUUID(),
237
- timestamp: now,
238
- schemaVersion: 1,
239
- overlapId,
240
- priorGoalId: prior.id,
241
- nextGoalId: next.id,
242
- status: state,
243
- reviewResult: input.reviewResult,
244
- qaResult: input.qaResult,
245
- blockerFootprints,
246
- ...pipelineEventRefs(prior, next),
247
- });
248
- return pipelineReceipt(input.cwd, event, overlapId, prior, next);
249
- }
250
-
251
- export async function rebaselineUltragoalPipelineOverlap(input: {
252
- cwd: string;
253
- overlapId: string;
254
- goalId: string;
255
- evidence: string;
256
- targetState: JsonObject;
257
- }): Promise<UltragoalPipelineOverlapReceipt> {
258
- const plan = await readUltragoalPlan(input.cwd);
259
- if (!plan) throw new Error("No ultragoal plan found. Run `gjc ultragoal create-goals --brief ...` first.");
260
- const goal = plan.goals.find(item => item.id === input.goalId);
261
- if (!goal) throw new Error(`No ultragoal goal found for ${input.goalId}.`);
262
- const evidence = input.evidence.trim();
263
- if (!isSubstantiveEvidence(evidence)) throw new Error("rebaseline-pipeline-overlap requires substantive evidence");
264
- const targetState = requireNonEmptyPipelineTargets(input.targetState, "target state");
265
- const metadata = requireFreshPipelineMetadata(goal);
266
- if (metadata.overlap !== "quarantine_required" || metadata.overlapId !== input.overlapId) {
267
- throw new Error(`Goal ${goal.id} is not quarantined for overlap ${input.overlapId}`);
268
- }
269
- for (const footprint of metadata.blockerFootprints ?? []) {
270
- if (targetsOverlap(footprint, targetState))
271
- throw new Error("rebaseline-pipeline-overlap target state overlaps unresolved blocker footprints");
272
- }
273
- const now = new Date().toISOString();
274
- const rebaselinedMetadata = { ...metadata, overlap: "rebaseline_complete" as const, targets: targetState };
275
- goal.pipelineMetadata = { ...rebaselinedMetadata, metadataHash: hashPipelineMetadata(rebaselinedMetadata) };
276
- goal.status = "active";
277
- goal.evidence = evidence;
278
- goal.updatedAt = now;
279
- plan.updatedAt = now;
280
- await writePlan(input.cwd, plan);
281
- const peer = pipelinePeer(plan, metadata);
282
- await appendLedger(input.cwd, {
283
- event: "pipeline_overlap_rebaselined",
284
- eventId: crypto.randomUUID(),
285
- timestamp: now,
286
- schemaVersion: 1,
287
- overlapId: input.overlapId,
288
- priorGoalId: metadata.priorGoalId ?? peer?.id ?? "",
289
- nextGoalId: metadata.nextGoalId ?? goal.id,
290
- goalId: goal.id,
291
- evidence,
292
- targetState,
293
- metadataHash: goal.pipelineMetadata.metadataHash,
294
- });
295
- const paths = getUltragoalPaths(input.cwd, currentUltragoalSessionId(input.cwd));
296
- return {
297
- ok: true,
298
- event: "pipeline_overlap_rebaselined",
299
- overlap_id: input.overlapId,
300
- prior_goal_id: metadata.priorGoalId ?? peer?.id ?? "",
301
- goal_id: goal.id,
302
- status: goal.pipelineMetadata.overlap,
303
- goals_path: paths.goalsPath,
304
- ledger_path: paths.ledgerPath,
305
- };
306
- }