muonroi-cli 1.8.4 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (562) hide show
  1. package/LICENSE +17 -5
  2. package/dist/packages/agent-harness-core/src/driver.d.ts +27 -1
  3. package/dist/packages/agent-harness-core/src/driver.js +46 -0
  4. package/dist/packages/agent-harness-core/src/event-filter.js +11 -0
  5. package/dist/packages/agent-harness-core/src/event-redact.js +7 -0
  6. package/dist/packages/agent-harness-core/src/event-tee.d.ts +64 -0
  7. package/dist/packages/agent-harness-core/src/event-tee.js +104 -0
  8. package/dist/packages/agent-harness-core/src/mcp-server.d.ts +25 -0
  9. package/dist/packages/agent-harness-core/src/mcp-server.js +169 -21
  10. package/dist/packages/agent-harness-core/src/predicate.d.ts +1 -1
  11. package/dist/packages/agent-harness-core/src/protocol.d.ts +90 -4
  12. package/dist/packages/agent-harness-core/src/protocol.js +15 -0
  13. package/dist/packages/agent-harness-core/src/visual-quality.d.ts +58 -0
  14. package/dist/packages/agent-harness-core/src/visual-quality.js +141 -0
  15. package/dist/packages/agent-harness-opentui/src/agent-mode.d.ts +6 -0
  16. package/dist/packages/agent-harness-opentui/src/agent-mode.js +14 -1
  17. package/dist/packages/agent-harness-opentui/src/input-bridge.d.ts +2 -10
  18. package/dist/packages/agent-harness-opentui/src/input-bridge.js +103 -16
  19. package/dist/packages/agent-harness-opentui/src/install.d.ts +8 -0
  20. package/dist/packages/agent-harness-opentui/src/install.js +10 -0
  21. package/dist/packages/agent-harness-opentui/src/semantic.js +12 -10
  22. package/dist/packages/agent-harness-opentui/src/visual-capture.d.ts +56 -0
  23. package/dist/packages/agent-harness-opentui/src/visual-capture.js +103 -0
  24. package/dist/src/agent-harness/mock-model.d.ts +38 -0
  25. package/dist/src/agent-harness/mock-model.js +69 -3
  26. package/dist/src/agent-harness/test-spawn.js +31 -0
  27. package/dist/src/chat/chat-keychain.d.ts +7 -12
  28. package/dist/src/chat/chat-keychain.js +19 -86
  29. package/dist/src/cli/config/screen-providers.js +1 -1
  30. package/dist/src/cli/cost-forensics.d.ts +10 -0
  31. package/dist/src/cli/cost-forensics.js +18 -3
  32. package/dist/src/cli/keys-bundle.d.ts +1 -1
  33. package/dist/src/cli/keys-bundle.js +1 -1
  34. package/dist/src/cli/keys.d.ts +10 -47
  35. package/dist/src/cli/keys.js +31 -399
  36. package/dist/src/council/clarifier.d.ts +31 -3
  37. package/dist/src/council/clarifier.js +220 -32
  38. package/dist/src/council/context.js +49 -15
  39. package/dist/src/council/debate-checkpoint.d.ts +129 -0
  40. package/dist/src/council/debate-checkpoint.js +176 -0
  41. package/dist/src/council/debate-planner.js +54 -5
  42. package/dist/src/council/debate-summary.d.ts +25 -0
  43. package/dist/src/council/debate-summary.js +85 -0
  44. package/dist/src/council/debate.d.ts +169 -2
  45. package/dist/src/council/debate.js +1265 -135
  46. package/dist/src/council/index.d.ts +108 -1
  47. package/dist/src/council/index.js +670 -197
  48. package/dist/src/council/leader.d.ts +26 -0
  49. package/dist/src/council/leader.js +150 -9
  50. package/dist/src/council/llm.d.ts +94 -0
  51. package/dist/src/council/llm.js +348 -55
  52. package/dist/src/council/panel-select.d.ts +30 -0
  53. package/dist/src/council/panel-select.js +82 -0
  54. package/dist/src/council/planner.js +40 -0
  55. package/dist/src/council/preflight.d.ts +17 -0
  56. package/dist/src/council/preflight.js +50 -2
  57. package/dist/src/council/prompts.d.ts +39 -4
  58. package/dist/src/council/prompts.js +256 -69
  59. package/dist/src/council/stance-recall.d.ts +42 -0
  60. package/dist/src/council/stance-recall.js +57 -0
  61. package/dist/src/council/strip-think.d.ts +17 -0
  62. package/dist/src/council/strip-think.js +33 -0
  63. package/dist/src/council/types.d.ts +138 -0
  64. package/dist/src/ee/artifact-cache.d.ts +16 -0
  65. package/dist/src/ee/artifact-cache.js +32 -0
  66. package/dist/src/ee/auth.d.ts +20 -0
  67. package/dist/src/ee/auth.js +54 -2
  68. package/dist/src/ee/bridge.d.ts +10 -0
  69. package/dist/src/ee/bridge.js +58 -0
  70. package/dist/src/ee/client.js +109 -21
  71. package/dist/src/ee/ee-onboarding.js +6 -26
  72. package/dist/src/ee/export-transcripts.d.ts +1 -0
  73. package/dist/src/ee/export-transcripts.js +8 -10
  74. package/dist/src/ee/extract-session.js +29 -0
  75. package/dist/src/ee/extract-style.d.ts +58 -0
  76. package/dist/src/ee/extract-style.js +270 -0
  77. package/dist/src/ee/recall-ledger.d.ts +9 -0
  78. package/dist/src/ee/recall-ledger.js +3 -0
  79. package/dist/src/ee/scope.d.ts +1 -0
  80. package/dist/src/ee/scope.js +26 -1
  81. package/dist/src/ee/search.d.ts +7 -0
  82. package/dist/src/ee/search.js +24 -0
  83. package/dist/src/ee/transcript-emit.js +2 -0
  84. package/dist/src/ee/types.d.ts +22 -0
  85. package/dist/src/ee/who-am-i-brain.d.ts +35 -0
  86. package/dist/src/ee/who-am-i-brain.js +220 -0
  87. package/dist/src/ee/who-am-i.d.ts +10 -3
  88. package/dist/src/ee/who-am-i.js +12 -0
  89. package/dist/src/ee/workflow-event.d.ts +48 -0
  90. package/dist/src/ee/workflow-event.js +81 -0
  91. package/dist/src/flow/compaction/compress.d.ts +3 -3
  92. package/dist/src/flow/compaction/compress.js +58 -8
  93. package/dist/src/flow/compaction/extract.d.ts +4 -7
  94. package/dist/src/flow/compaction/extract.js +50 -10
  95. package/dist/src/flow/compaction/index.d.ts +14 -1
  96. package/dist/src/flow/compaction/index.js +96 -3
  97. package/dist/src/flow/compaction/input-guard.d.ts +24 -0
  98. package/dist/src/flow/compaction/input-guard.js +43 -0
  99. package/dist/src/flow/compaction/progress.d.ts +35 -0
  100. package/dist/src/flow/compaction/progress.js +35 -0
  101. package/dist/src/flow/fold-planning.d.ts +36 -0
  102. package/dist/src/flow/fold-planning.js +83 -0
  103. package/dist/src/flow/hierarchy.d.ts +146 -0
  104. package/dist/src/flow/hierarchy.js +427 -0
  105. package/dist/src/flow/index.d.ts +1 -0
  106. package/dist/src/flow/index.js +2 -0
  107. package/dist/src/flow/run-artifacts.d.ts +102 -0
  108. package/dist/src/flow/run-artifacts.js +208 -0
  109. package/dist/src/generated/version.d.ts +1 -1
  110. package/dist/src/generated/version.js +1 -1
  111. package/dist/src/gsd/assessment-schema.d.ts +44 -0
  112. package/dist/src/gsd/assessment-schema.js +134 -0
  113. package/dist/src/gsd/capability-registry.d.ts +45 -0
  114. package/dist/src/gsd/capability-registry.js +337 -0
  115. package/dist/src/gsd/complexity-assessor.d.ts +39 -0
  116. package/dist/src/gsd/complexity-assessor.js +152 -0
  117. package/dist/src/gsd/config-bridge.d.ts +7 -0
  118. package/dist/src/gsd/config-bridge.js +114 -0
  119. package/dist/src/gsd/config-loader.d.ts +27 -0
  120. package/dist/src/gsd/config-loader.js +50 -0
  121. package/dist/src/gsd/council-context.d.ts +44 -0
  122. package/dist/src/gsd/council-context.js +114 -0
  123. package/dist/src/gsd/ee-closure.d.ts +28 -0
  124. package/dist/src/gsd/ee-closure.js +49 -0
  125. package/dist/src/gsd/flags.d.ts +66 -0
  126. package/dist/src/gsd/flags.js +102 -0
  127. package/dist/src/gsd/gsd-dispatch.d.ts +58 -0
  128. package/dist/src/gsd/gsd-dispatch.js +131 -0
  129. package/dist/src/gsd/gsd-runtime.d.ts +22 -0
  130. package/dist/src/gsd/gsd-runtime.js +37 -0
  131. package/dist/src/gsd/host-adapter.d.ts +11 -0
  132. package/dist/src/gsd/host-adapter.js +29 -0
  133. package/dist/src/gsd/index.d.ts +24 -1
  134. package/dist/src/gsd/index.js +27 -0
  135. package/dist/src/gsd/loop-host-contract.d.ts +21 -0
  136. package/dist/src/gsd/loop-host-contract.js +39 -0
  137. package/dist/src/gsd/loop-host.d.ts +69 -0
  138. package/dist/src/gsd/loop-host.js +245 -0
  139. package/dist/src/gsd/loop-resolver.d.ts +36 -0
  140. package/dist/src/gsd/loop-resolver.js +79 -0
  141. package/dist/src/gsd/model-tier.d.ts +13 -0
  142. package/dist/src/gsd/model-tier.js +45 -0
  143. package/dist/src/gsd/mutation-gate.d.ts +16 -0
  144. package/dist/src/gsd/mutation-gate.js +41 -0
  145. package/dist/src/gsd/native-roadmap.d.ts +89 -0
  146. package/dist/src/gsd/native-roadmap.js +343 -0
  147. package/dist/src/gsd/native-state.d.ts +47 -0
  148. package/dist/src/gsd/native-state.js +220 -0
  149. package/dist/src/gsd/paths.d.ts +23 -0
  150. package/dist/src/gsd/paths.js +66 -0
  151. package/dist/src/gsd/phase-dag.d.ts +12 -0
  152. package/dist/src/gsd/phase-dag.js +94 -0
  153. package/dist/src/gsd/phase-sync.d.ts +42 -0
  154. package/dist/src/gsd/phase-sync.js +321 -0
  155. package/dist/src/gsd/pil-gate-context.d.ts +13 -0
  156. package/dist/src/gsd/pil-gate-context.js +64 -0
  157. package/dist/src/gsd/pil-gate-critic.d.ts +19 -0
  158. package/dist/src/gsd/pil-gate-critic.js +74 -0
  159. package/dist/src/gsd/plan-council-prompts.d.ts +25 -0
  160. package/dist/src/gsd/plan-council-prompts.js +79 -0
  161. package/dist/src/gsd/plan-council.d.ts +44 -0
  162. package/dist/src/gsd/plan-council.js +283 -0
  163. package/dist/src/gsd/plan-gate-vocabulary.d.ts +40 -0
  164. package/dist/src/gsd/plan-gate-vocabulary.js +64 -0
  165. package/dist/src/gsd/product-workspace.d.ts +13 -0
  166. package/dist/src/gsd/product-workspace.js +124 -0
  167. package/dist/src/gsd/ship-bridge.d.ts +25 -0
  168. package/dist/src/gsd/ship-bridge.js +65 -0
  169. package/dist/src/gsd/state-document.d.ts +40 -0
  170. package/dist/src/gsd/state-document.js +163 -0
  171. package/dist/src/gsd/verdict-schema.d.ts +39 -0
  172. package/dist/src/gsd/verdict-schema.js +144 -0
  173. package/dist/src/gsd/verify-context.d.ts +22 -0
  174. package/dist/src/gsd/verify-context.js +27 -0
  175. package/dist/src/gsd/verify-council-prompts.d.ts +19 -0
  176. package/dist/src/gsd/verify-council-prompts.js +85 -0
  177. package/dist/src/gsd/verify-council.d.ts +25 -0
  178. package/dist/src/gsd/verify-council.js +119 -0
  179. package/dist/src/gsd/verify-gate-vocabulary.d.ts +25 -0
  180. package/dist/src/gsd/verify-gate-vocabulary.js +46 -0
  181. package/dist/src/gsd/workflow-engine.d.ts +60 -0
  182. package/dist/src/gsd/workflow-engine.js +207 -0
  183. package/dist/src/gsd/workflow-tools.d.ts +13 -0
  184. package/dist/src/gsd/workflow-tools.js +277 -0
  185. package/dist/src/headless/council-answers.js +4 -0
  186. package/dist/src/hooks/index.js +1 -1
  187. package/dist/src/index.js +172 -270
  188. package/dist/src/lsp/builtins.js +3 -1
  189. package/dist/src/lsp/manager.d.ts +5 -1
  190. package/dist/src/lsp/manager.js +249 -3
  191. package/dist/src/lsp/npm-cache.d.ts +11 -1
  192. package/dist/src/lsp/npm-cache.js +17 -1
  193. package/dist/src/lsp/runtime.d.ts +6 -1
  194. package/dist/src/lsp/runtime.js +17 -1
  195. package/dist/src/lsp/types.d.ts +83 -1
  196. package/dist/src/lsp/types.js +10 -0
  197. package/dist/src/maintain/pr-builder.js +23 -13
  198. package/dist/src/mcp/auto-setup.js +57 -32
  199. package/dist/src/mcp/client-pool.js +44 -16
  200. package/dist/src/mcp/lsp-tools.d.ts +5 -1
  201. package/dist/src/mcp/lsp-tools.js +93 -2
  202. package/dist/src/mcp/mcp-keychain.d.ts +3 -5
  203. package/dist/src/mcp/mcp-keychain.js +9 -49
  204. package/dist/src/mcp/research-onboarding.js +8 -7
  205. package/dist/src/mcp/runtime.js +34 -2
  206. package/dist/src/mcp/setup-guide-text.d.ts +1 -1
  207. package/dist/src/mcp/setup-guide-text.js +22 -2
  208. package/dist/src/mcp/tools-server.d.ts +10 -0
  209. package/dist/src/mcp/tools-server.js +10 -2
  210. package/dist/src/models/catalog-client.d.ts +87 -0
  211. package/dist/src/models/catalog-client.js +105 -38
  212. package/dist/src/models/catalog.json +528 -265
  213. package/dist/src/models/registry.d.ts +22 -7
  214. package/dist/src/models/registry.js +73 -10
  215. package/dist/src/ops/doctor.js +1 -1
  216. package/dist/src/orchestrator/ask-user.d.ts +61 -0
  217. package/dist/src/orchestrator/ask-user.js +65 -0
  218. package/dist/src/orchestrator/auto-commit.js +1 -1
  219. package/dist/src/orchestrator/batch-turn-runner.js +2 -2
  220. package/dist/src/orchestrator/cache-prefix.d.ts +67 -0
  221. package/dist/src/orchestrator/cache-prefix.js +83 -0
  222. package/dist/src/orchestrator/compact-request.d.ts +32 -0
  223. package/dist/src/orchestrator/compact-request.js +41 -0
  224. package/dist/src/orchestrator/compaction.d.ts +12 -3
  225. package/dist/src/orchestrator/compaction.js +35 -15
  226. package/dist/src/orchestrator/council-manager.d.ts +12 -3
  227. package/dist/src/orchestrator/council-manager.js +74 -32
  228. package/dist/src/orchestrator/council-request.d.ts +49 -0
  229. package/dist/src/orchestrator/council-request.js +62 -0
  230. package/dist/src/orchestrator/cross-turn-dedup.d.ts +6 -0
  231. package/dist/src/orchestrator/cross-turn-dedup.js +22 -1
  232. package/dist/src/orchestrator/error-utils.d.ts +29 -0
  233. package/dist/src/orchestrator/error-utils.js +132 -24
  234. package/dist/src/orchestrator/grounding-check.js +39 -1
  235. package/dist/src/orchestrator/interactive-pause.d.ts +26 -0
  236. package/dist/src/orchestrator/interactive-pause.js +36 -0
  237. package/dist/src/orchestrator/message-processor.d.ts +4 -0
  238. package/dist/src/orchestrator/message-processor.js +268 -41
  239. package/dist/src/orchestrator/orchestrator.d.ts +64 -3
  240. package/dist/src/orchestrator/orchestrator.js +823 -120
  241. package/dist/src/orchestrator/preprocessor.js +3 -3
  242. package/dist/src/orchestrator/proactive-compact-detector.d.ts +26 -0
  243. package/dist/src/orchestrator/proactive-compact-detector.js +36 -0
  244. package/dist/src/orchestrator/prompts.js +17 -17
  245. package/dist/src/orchestrator/reactive-delegation.d.ts +39 -0
  246. package/dist/src/orchestrator/reactive-delegation.js +59 -0
  247. package/dist/src/orchestrator/retry-classifier.d.ts +2 -1
  248. package/dist/src/orchestrator/retry-classifier.js +46 -2
  249. package/dist/src/orchestrator/safety-askcard.d.ts +1 -1
  250. package/dist/src/orchestrator/safety-askcard.js +5 -2
  251. package/dist/src/orchestrator/safety-intercept.d.ts +50 -0
  252. package/dist/src/orchestrator/safety-intercept.js +62 -0
  253. package/dist/src/orchestrator/scope-reminder.js +1 -1
  254. package/dist/src/orchestrator/session-experience.d.ts +2 -1
  255. package/dist/src/orchestrator/session-experience.js +2 -1
  256. package/dist/src/orchestrator/should-run-gate.d.ts +5 -0
  257. package/dist/src/orchestrator/should-run-gate.js +18 -0
  258. package/dist/src/orchestrator/stall-watchdog.d.ts +31 -3
  259. package/dist/src/orchestrator/stall-watchdog.js +65 -10
  260. package/dist/src/orchestrator/stream-runner.d.ts +13 -3
  261. package/dist/src/orchestrator/stream-runner.js +115 -49
  262. package/dist/src/orchestrator/sub-agent-cap.d.ts +13 -1
  263. package/dist/src/orchestrator/sub-agent-cap.js +16 -1
  264. package/dist/src/orchestrator/sub-agent-model-tier.d.ts +13 -1
  265. package/dist/src/orchestrator/sub-agent-model-tier.js +16 -2
  266. package/dist/src/orchestrator/subagent-compactor.d.ts +53 -1
  267. package/dist/src/orchestrator/subagent-compactor.js +126 -15
  268. package/dist/src/orchestrator/tool-engine.d.ts +41 -0
  269. package/dist/src/orchestrator/tool-engine.js +846 -66
  270. package/dist/src/orchestrator/tool-limit-auto-recover.d.ts +22 -0
  271. package/dist/src/orchestrator/tool-limit-auto-recover.js +30 -0
  272. package/dist/src/orchestrator/turn-runner-deps.d.ts +19 -0
  273. package/dist/src/orchestrator/turn-watchdog.d.ts +44 -0
  274. package/dist/src/orchestrator/turn-watchdog.js +84 -0
  275. package/dist/src/pil/agent-operating-contract.d.ts +1 -1
  276. package/dist/src/pil/agent-operating-contract.js +6 -4
  277. package/dist/src/pil/cheap-model-playbook.d.ts +1 -1
  278. package/dist/src/pil/cheap-model-playbook.js +5 -1
  279. package/dist/src/pil/cheap-model-workbooks.d.ts +1 -1
  280. package/dist/src/pil/cheap-model-workbooks.js +1 -1
  281. package/dist/src/pil/discovery-types.d.ts +1 -0
  282. package/dist/src/pil/discovery.d.ts +1 -1
  283. package/dist/src/pil/discovery.js +18 -13
  284. package/dist/src/pil/layer1-intent.d.ts +18 -6
  285. package/dist/src/pil/layer1-intent.js +66 -757
  286. package/dist/src/pil/layer15-context-scan.js +15 -1
  287. package/dist/src/pil/layer1_5-complexity-size.d.ts +7 -0
  288. package/dist/src/pil/layer1_5-complexity-size.js +31 -5
  289. package/dist/src/pil/layer3-ee-injection.js +23 -8
  290. package/dist/src/pil/layer4-gsd.js +69 -16
  291. package/dist/src/pil/layer5-context.js +7 -3
  292. package/dist/src/pil/layer6-output.d.ts +23 -0
  293. package/dist/src/pil/layer6-output.js +5 -1
  294. package/dist/src/pil/llm-classify.d.ts +111 -5
  295. package/dist/src/pil/llm-classify.js +421 -189
  296. package/dist/src/pil/native-capabilities-workbook.d.ts +1 -1
  297. package/dist/src/pil/native-capabilities-workbook.js +8 -0
  298. package/dist/src/pil/pipeline.js +36 -2
  299. package/dist/src/pil/repo-grounding-probe.d.ts +15 -0
  300. package/dist/src/pil/repo-grounding-probe.js +136 -0
  301. package/dist/src/pil/repo-structure-hints.d.ts +7 -0
  302. package/dist/src/pil/repo-structure-hints.js +45 -0
  303. package/dist/src/pil/response-tools.js +5 -3
  304. package/dist/src/pil/schema.d.ts +1 -0
  305. package/dist/src/pil/schema.js +2 -0
  306. package/dist/src/pil/types.d.ts +18 -0
  307. package/dist/src/playbook/directives.d.ts +4 -0
  308. package/dist/src/playbook/directives.js +17 -5
  309. package/dist/src/product-loop/artifact-io.js +4 -0
  310. package/dist/src/product-loop/backlog-builder.d.ts +14 -1
  311. package/dist/src/product-loop/backlog-builder.js +30 -6
  312. package/dist/src/product-loop/criteria-seed.d.ts +51 -0
  313. package/dist/src/product-loop/criteria-seed.js +200 -0
  314. package/dist/src/product-loop/discovery-context-format.js +3 -1
  315. package/dist/src/product-loop/discovery-ecosystem.js +4 -1
  316. package/dist/src/product-loop/discovery-interview.d.ts +9 -0
  317. package/dist/src/product-loop/discovery-interview.js +60 -12
  318. package/dist/src/product-loop/discovery-recommender.js +2 -1
  319. package/dist/src/product-loop/discovery-schema.js +19 -2
  320. package/dist/src/product-loop/discovery-triage.d.ts +23 -0
  321. package/dist/src/product-loop/discovery-triage.js +109 -0
  322. package/dist/src/product-loop/gather.js +150 -2
  323. package/dist/src/product-loop/ideal-trace.d.ts +7 -0
  324. package/dist/src/product-loop/ideal-trace.js +64 -0
  325. package/dist/src/product-loop/index.d.ts +13 -1
  326. package/dist/src/product-loop/index.js +340 -52
  327. package/dist/src/product-loop/loop-driver.d.ts +7 -0
  328. package/dist/src/product-loop/loop-driver.js +330 -106
  329. package/dist/src/product-loop/phase-plan.d.ts +21 -0
  330. package/dist/src/product-loop/phase-plan.js +81 -6
  331. package/dist/src/product-loop/phase-rituals.d.ts +3 -0
  332. package/dist/src/product-loop/phase-rituals.js +8 -3
  333. package/dist/src/product-loop/phase-runner.js +39 -12
  334. package/dist/src/product-loop/plan-adherence-review.d.ts +26 -0
  335. package/dist/src/product-loop/plan-adherence-review.js +144 -0
  336. package/dist/src/product-loop/sprint-runner.d.ts +173 -0
  337. package/dist/src/product-loop/sprint-runner.js +863 -19
  338. package/dist/src/product-loop/types.d.ts +61 -5
  339. package/dist/src/providers/adapter.d.ts +1 -1
  340. package/dist/src/providers/adapter.js +3 -4
  341. package/dist/src/providers/anthropic.d.ts +9 -8
  342. package/dist/src/providers/anthropic.js +13 -47
  343. package/dist/src/providers/auth/browser-flow.d.ts +1 -1
  344. package/dist/src/providers/auth/browser-flow.js +1 -1
  345. package/dist/src/providers/auth/grok-oauth.d.ts +1 -0
  346. package/dist/src/providers/auth/grok-oauth.js +30 -5
  347. package/dist/src/providers/auth/openai-oauth.d.ts +1 -0
  348. package/dist/src/providers/auth/openai-oauth.js +15 -1
  349. package/dist/src/providers/auth/registry.js +0 -34
  350. package/dist/src/providers/auth/token-store.d.ts +9 -9
  351. package/dist/src/providers/auth/token-store.js +8 -67
  352. package/dist/src/providers/auth/types.d.ts +9 -1
  353. package/dist/src/providers/auth/types.js +1 -1
  354. package/dist/src/providers/capabilities.d.ts +24 -5
  355. package/dist/src/providers/capabilities.js +42 -24
  356. package/dist/src/providers/endpoints.d.ts +2 -2
  357. package/dist/src/providers/endpoints.js +11 -10
  358. package/dist/src/providers/env-store.d.ts +17 -0
  359. package/dist/src/providers/env-store.js +228 -0
  360. package/dist/src/providers/keychain.d.ts +22 -18
  361. package/dist/src/providers/keychain.js +127 -140
  362. package/dist/src/providers/mcp-vision-bridge.js +56 -146
  363. package/dist/src/providers/openai-compatible.js +8 -1
  364. package/dist/src/providers/pricing.d.ts +2 -2
  365. package/dist/src/providers/pricing.js +3 -13
  366. package/dist/src/providers/runtime.d.ts +43 -3
  367. package/dist/src/providers/runtime.js +88 -14
  368. package/dist/src/providers/strategies/base.strategy.d.ts +16 -0
  369. package/dist/src/providers/strategies/base.strategy.js +24 -1
  370. package/dist/src/providers/strategies/{siliconflow.strategy.d.ts → opencode-go.strategy.d.ts} +3 -3
  371. package/dist/src/providers/strategies/opencode-go.strategy.js +83 -0
  372. package/dist/src/providers/strategies/registry.js +4 -4
  373. package/dist/src/providers/strategies/thinking-mode.d.ts +109 -0
  374. package/dist/src/providers/strategies/thinking-mode.js +288 -1
  375. package/dist/src/providers/strategies/xai.strategy.js +27 -0
  376. package/dist/src/providers/strategies/zai.strategy.d.ts +14 -0
  377. package/dist/src/providers/strategies/zai.strategy.js +44 -0
  378. package/dist/src/providers/types.d.ts +5 -6
  379. package/dist/src/providers/types.js +2 -2
  380. package/dist/src/providers/vision-backend.d.ts +47 -0
  381. package/dist/src/providers/vision-backend.js +258 -0
  382. package/dist/src/providers/vision-proxy.d.ts +22 -9
  383. package/dist/src/providers/vision-proxy.js +63 -132
  384. package/dist/src/providers/warm.d.ts +65 -0
  385. package/dist/src/providers/warm.js +145 -0
  386. package/dist/src/providers/wire-debug.js +95 -0
  387. package/dist/src/router/decide.d.ts +13 -0
  388. package/dist/src/router/decide.js +138 -36
  389. package/dist/src/router/peak-hour.d.ts +38 -0
  390. package/dist/src/router/peak-hour.js +107 -0
  391. package/dist/src/router/step-router.js +3 -2
  392. package/dist/src/router/warm.js +4 -5
  393. package/dist/src/scaffold/continuation-prompt.d.ts +11 -0
  394. package/dist/src/scaffold/continuation-prompt.js +26 -0
  395. package/dist/src/scaffold/point-to-existing.d.ts +21 -0
  396. package/dist/src/scaffold/point-to-existing.js +25 -0
  397. package/dist/src/self-qa/agentic-loop.js +6 -5
  398. package/dist/src/{ui/state → state}/active-run.d.ts +19 -0
  399. package/dist/src/{ui/state → state}/active-run.js +21 -0
  400. package/dist/src/{ui/status-bar/store.d.ts → state/status-bar-store.d.ts} +4 -1
  401. package/dist/src/{ui/status-bar/store.js → state/status-bar-store.js} +12 -9
  402. package/dist/src/state/turn-trace.d.ts +43 -0
  403. package/dist/src/state/turn-trace.js +32 -0
  404. package/dist/src/storage/db.js +2 -1
  405. package/dist/src/storage/index.d.ts +1 -1
  406. package/dist/src/storage/index.js +1 -1
  407. package/dist/src/storage/interaction-log.d.ts +1 -1
  408. package/dist/src/storage/migrations.js +71 -1
  409. package/dist/src/storage/sessions.d.ts +28 -10
  410. package/dist/src/storage/sessions.js +78 -21
  411. package/dist/src/storage/transcript-view.js +1 -1
  412. package/dist/src/storage/transcript.d.ts +51 -0
  413. package/dist/src/storage/transcript.js +340 -15
  414. package/dist/src/tools/file.d.ts +15 -0
  415. package/dist/src/tools/file.js +32 -0
  416. package/dist/src/tools/git-safety.d.ts +19 -0
  417. package/dist/src/tools/git-safety.js +168 -0
  418. package/dist/src/tools/native-tools.d.ts +1 -1
  419. package/dist/src/tools/native-tools.js +81 -1
  420. package/dist/src/tools/registry.d.ts +20 -0
  421. package/dist/src/tools/registry.js +576 -23
  422. package/dist/src/tools/research.d.ts +29 -0
  423. package/dist/src/tools/research.js +233 -0
  424. package/dist/src/types/index.d.ts +147 -4
  425. package/dist/src/ui/app.js +0 -0
  426. package/dist/src/ui/cards/product-status-card.js +1 -1
  427. package/dist/src/ui/components/agent-rail-activities.d.ts +26 -0
  428. package/dist/src/ui/components/agent-rail-activities.js +47 -0
  429. package/dist/src/ui/components/bubble-body-guard.d.ts +27 -0
  430. package/dist/src/ui/components/bubble-body-guard.js +50 -0
  431. package/dist/src/ui/components/compact-progress-card.d.ts +24 -0
  432. package/dist/src/ui/components/compact-progress-card.js +42 -0
  433. package/dist/src/ui/components/context-rail.d.ts +26 -0
  434. package/dist/src/ui/components/context-rail.js +33 -0
  435. package/dist/src/ui/components/council-conclusion-card.d.ts +73 -0
  436. package/dist/src/ui/components/council-conclusion-card.js +420 -0
  437. package/dist/src/ui/components/council-debate-pill.d.ts +36 -0
  438. package/dist/src/ui/components/council-debate-pill.js +34 -0
  439. package/dist/src/ui/components/council-info-card.js +2 -2
  440. package/dist/src/ui/components/council-leader-bubble.d.ts +10 -3
  441. package/dist/src/ui/components/council-leader-bubble.js +21 -11
  442. package/dist/src/ui/components/council-message-bubble.d.ts +15 -2
  443. package/dist/src/ui/components/council-message-bubble.js +16 -15
  444. package/dist/src/ui/components/council-phase-timeline.d.ts +9 -1
  445. package/dist/src/ui/components/council-phase-timeline.js +66 -17
  446. package/dist/src/ui/components/council-placeholder-bubble.d.ts +16 -9
  447. package/dist/src/ui/components/council-placeholder-bubble.js +32 -29
  448. package/dist/src/ui/components/council-question-card.js +13 -12
  449. package/dist/src/ui/components/council-rail-rounds.d.ts +26 -0
  450. package/dist/src/ui/components/council-rail-rounds.js +57 -0
  451. package/dist/src/ui/components/council-round-group.d.ts +38 -0
  452. package/dist/src/ui/components/council-round-group.js +88 -0
  453. package/dist/src/ui/components/council-status-list.d.ts +3 -1
  454. package/dist/src/ui/components/council-status-list.js +36 -24
  455. package/dist/src/ui/components/council-synthesis-banner.d.ts +7 -2
  456. package/dist/src/ui/components/council-synthesis-banner.js +20 -5
  457. package/dist/src/ui/components/halt-recovery-card.js +9 -5
  458. package/dist/src/ui/components/jump-to-latest-pill.d.ts +11 -0
  459. package/dist/src/ui/components/jump-to-latest-pill.js +14 -0
  460. package/dist/src/ui/components/message-view.d.ts +15 -0
  461. package/dist/src/ui/components/message-view.js +50 -1
  462. package/dist/src/ui/components/prompt-box.js +18 -16
  463. package/dist/src/ui/components/session-tree-card.d.ts +14 -0
  464. package/dist/src/ui/components/session-tree-card.js +46 -0
  465. package/dist/src/ui/components/slash-inline-menu.d.ts +12 -0
  466. package/dist/src/ui/components/slash-inline-menu.js +26 -5
  467. package/dist/src/ui/components/task-list-panel.d.ts +14 -1
  468. package/dist/src/ui/components/task-list-panel.js +22 -2
  469. package/dist/src/ui/components/tool-group.d.ts +15 -3
  470. package/dist/src/ui/components/tool-group.js +69 -11
  471. package/dist/src/ui/containers/modals-layer.d.ts +4 -2
  472. package/dist/src/ui/containers/modals-layer.js +2 -2
  473. package/dist/src/ui/council-harness-event.d.ts +57 -0
  474. package/dist/src/ui/council-harness-event.js +46 -0
  475. package/dist/src/ui/heartbeat-debug.d.ts +29 -0
  476. package/dist/src/ui/heartbeat-debug.js +45 -0
  477. package/dist/src/ui/hooks/use-session-picker.d.ts +3 -3
  478. package/dist/src/ui/mcp-modal.js +2 -4
  479. package/dist/src/ui/modals/api-key-modal.js +1 -1
  480. package/dist/src/ui/modals/connect-modal.js +4 -3
  481. package/dist/src/ui/modals/model-picker-modal.d.ts +8 -18
  482. package/dist/src/ui/modals/model-picker-modal.js +8 -10
  483. package/dist/src/ui/modals/session-picker-modal.d.ts +2 -2
  484. package/dist/src/ui/modals/session-picker-modal.js +3 -5
  485. package/dist/src/ui/picker-providers.d.ts +1 -1
  486. package/dist/src/ui/picker-providers.js +1 -1
  487. package/dist/src/ui/primitives/index.d.ts +1 -0
  488. package/dist/src/ui/primitives/index.js +2 -0
  489. package/dist/src/ui/primitives/semantic-primitives.d.ts +76 -0
  490. package/dist/src/ui/primitives/semantic-primitives.js +81 -0
  491. package/dist/src/ui/slash/compact.js +5 -7
  492. package/dist/src/ui/slash/cost.js +1 -1
  493. package/dist/src/ui/slash/council.js +19 -1
  494. package/dist/src/ui/slash/debug.d.ts +3 -31
  495. package/dist/src/ui/slash/debug.js +9 -20
  496. package/dist/src/ui/slash/ee.js +81 -0
  497. package/dist/src/ui/slash/ideal.d.ts +6 -2
  498. package/dist/src/ui/slash/ideal.js +97 -7
  499. package/dist/src/ui/slash/menu-items.d.ts +7 -0
  500. package/dist/src/ui/slash/menu-items.js +23 -20
  501. package/dist/src/ui/slash/registry.d.ts +2 -0
  502. package/dist/src/ui/slash/registry.js +4 -0
  503. package/dist/src/ui/status-bar/cache-hit.d.ts +6 -0
  504. package/dist/src/ui/status-bar/cache-hit.js +9 -0
  505. package/dist/src/ui/status-bar/index.d.ts +1 -1
  506. package/dist/src/ui/status-bar/index.js +7 -3
  507. package/dist/src/ui/status-bar/usd-meter.d.ts +5 -4
  508. package/dist/src/ui/status-bar/usd-meter.js +6 -4
  509. package/dist/src/ui/theme.d.ts +1 -0
  510. package/dist/src/ui/theme.js +2 -0
  511. package/dist/src/ui/types.d.ts +7 -0
  512. package/dist/src/ui/use-app-logic.js +0 -0
  513. package/dist/src/ui/utils/agent-activities.d.ts +39 -0
  514. package/dist/src/ui/utils/agent-activities.js +96 -0
  515. package/dist/src/ui/utils/format.d.ts +14 -0
  516. package/dist/src/ui/utils/format.js +23 -3
  517. package/dist/src/ui/utils/group-tool-entries.d.ts +26 -0
  518. package/dist/src/ui/utils/group-tool-entries.js +111 -0
  519. package/dist/src/ui/utils/tool-summary.d.ts +21 -0
  520. package/dist/src/ui/utils/tool-summary.js +91 -0
  521. package/dist/src/usage/downgrade.js +2 -2
  522. package/dist/src/usage/product-ledger.js +2 -2
  523. package/dist/src/utils/event-loop-monitor.d.ts +85 -0
  524. package/dist/src/utils/event-loop-monitor.js +107 -0
  525. package/dist/src/utils/install-manager.js +2 -1
  526. package/dist/src/utils/llm-deadline.d.ts +14 -0
  527. package/dist/src/utils/llm-deadline.js +19 -0
  528. package/dist/src/utils/logger.js +2 -2
  529. package/dist/src/utils/loop-profiler.d.ts +102 -0
  530. package/dist/src/utils/loop-profiler.js +202 -0
  531. package/dist/src/utils/permission-mode.js +5 -3
  532. package/dist/src/utils/redactor.js +1 -1
  533. package/dist/src/utils/settings.d.ts +180 -5
  534. package/dist/src/utils/settings.js +271 -31
  535. package/dist/src/utils/side-question.d.ts +1 -2
  536. package/dist/src/utils/side-question.js +2 -2
  537. package/dist/src/utils/visible-retry.d.ts +11 -0
  538. package/dist/src/utils/visible-retry.js +10 -1
  539. package/dist/src/verify/entrypoint.d.ts +1 -1
  540. package/dist/src/verify/entrypoint.js +52 -17
  541. package/dist/src/verify/orchestrator.d.ts +1 -1
  542. package/dist/src/verify/orchestrator.js +20 -3
  543. package/dist/src/verify/recipes.d.ts +13 -0
  544. package/dist/src/verify/recipes.js +15 -0
  545. package/package.json +134 -132
  546. package/dist/src/cli/bw-vault.d.ts +0 -55
  547. package/dist/src/cli/bw-vault.js +0 -133
  548. package/dist/src/mcp/ee-tools.d.ts +0 -46
  549. package/dist/src/mcp/ee-tools.js +0 -193
  550. package/dist/src/providers/auth/gcloud.d.ts +0 -28
  551. package/dist/src/providers/auth/gcloud.js +0 -102
  552. package/dist/src/providers/auth/gemini-oauth.d.ts +0 -82
  553. package/dist/src/providers/auth/gemini-oauth.js +0 -472
  554. package/dist/src/providers/gemini.d.ts +0 -11
  555. package/dist/src/providers/gemini.js +0 -45
  556. package/dist/src/providers/siliconflow-sse-repair.d.ts +0 -58
  557. package/dist/src/providers/siliconflow-sse-repair.js +0 -177
  558. package/dist/src/providers/strategies/google.strategy.d.ts +0 -22
  559. package/dist/src/providers/strategies/google.strategy.js +0 -174
  560. package/dist/src/providers/strategies/siliconflow.strategy.js +0 -29
  561. package/dist/src/ui/containers/chat-feed.d.ts +0 -40
  562. package/dist/src/ui/containers/chat-feed.js +0 -66
@@ -0,0 +1,163 @@
1
+ /**
2
+ * state-document.ts — Native replacement for gsd-core/bin/lib/state-document.cjs
3
+ *
4
+ * STATE.md Document Module — pure transforms for STATE.md text.
5
+ * This module does not read the filesystem and does not own persistence or locking.
6
+ */
7
+ function escapeRegex(str) {
8
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
+ }
10
+ function isTableSeparatorRow(firstCell) {
11
+ return /^[\s\-:]+$/.test(firstCell.trim());
12
+ }
13
+ function tableRowPattern(escapedFieldName) {
14
+ return new RegExp(`^(\\|[ \\t]*)(${escapedFieldName})([ \\t]*\\|[ \\t]*)([^|\\n]*?)([ \\t]*\\|[ \\t]*)$`, "im");
15
+ }
16
+ /**
17
+ * Extract a field value from STATE.md content.
18
+ * Supports bold inline (**FieldName:** value), plain line-start (FieldName: value),
19
+ * and pipe-table (| FieldName | value |) formats.
20
+ */
21
+ export function stateExtractField(content, fieldName) {
22
+ const escaped = escapeRegex(fieldName);
23
+ // Bold inline: **FieldName:** value
24
+ const boldPattern = new RegExp(`\\*\\*${escaped}:\\*\\*[ \\t]*(.+)`, "i");
25
+ const boldMatch = content.match(boldPattern);
26
+ if (boldMatch)
27
+ return boldMatch[1].trim();
28
+ // Plain line-start: FieldName: value
29
+ const plainPattern = new RegExp(`^${escaped}:[ \\t]*(.+)`, "im");
30
+ const plainMatch = content.match(plainPattern);
31
+ if (plainMatch)
32
+ return plainMatch[1].trim();
33
+ // Pipe-table: | FieldName | value |
34
+ const tableMatch = content.match(tableRowPattern(escaped));
35
+ if (tableMatch && !isTableSeparatorRow(tableMatch[2]))
36
+ return tableMatch[4].trim();
37
+ return null;
38
+ }
39
+ /**
40
+ * Replace a field value in STATE.md content.
41
+ * Returns null if the field is not found in any known format.
42
+ */
43
+ export function stateReplaceField(content, fieldName, newValue) {
44
+ const escaped = escapeRegex(fieldName);
45
+ // Bold inline: **FieldName:** value
46
+ const boldPattern = new RegExp(`(\\*\\*${escaped}:\\*\\*\\s*)(.*)`, "i");
47
+ if (boldPattern.test(content)) {
48
+ return content.replace(boldPattern, (_match, prefix) => `${prefix}${newValue}`);
49
+ }
50
+ // Plain line-start: FieldName: value
51
+ const plainPattern = new RegExp(`(^${escaped}:\\s*)(.*)`, "im");
52
+ if (plainPattern.test(content)) {
53
+ return content.replace(plainPattern, (_match, prefix) => `${prefix}${newValue}`);
54
+ }
55
+ // Pipe-table: | FieldName | value |
56
+ const tblPat = tableRowPattern(escaped);
57
+ const tblMatch = content.match(tblPat);
58
+ if (tblMatch && !isTableSeparatorRow(tblMatch[2])) {
59
+ return content.replace(tblPat, (_m, leadPipe, fieldCell, midPipe, _oldVal, trailPipe) => `${leadPipe}${fieldCell}${midPipe}${newValue}${trailPipe}`);
60
+ }
61
+ return null;
62
+ }
63
+ /**
64
+ * Replace a field with a primary name, falling back to an alternate field name.
65
+ */
66
+ export function stateReplaceFieldWithFallback(content, primary, fallback, value) {
67
+ const result = stateReplaceField(content, primary, value);
68
+ if (result)
69
+ return result;
70
+ if (fallback) {
71
+ const fbResult = stateReplaceField(content, fallback, value);
72
+ if (fbResult)
73
+ return fbResult;
74
+ }
75
+ return content;
76
+ }
77
+ /** Normalize a status string to a canonical value. */
78
+ export function normalizeStateStatus(status, pausedAt) {
79
+ const statusLower = (status || "").toLowerCase();
80
+ if (statusLower.includes("paused") || statusLower.includes("stopped") || pausedAt) {
81
+ return "paused";
82
+ }
83
+ if (statusLower.includes("executing") || statusLower.includes("in progress")) {
84
+ return "executing";
85
+ }
86
+ if (statusLower.includes("planning") || statusLower.includes("ready to plan")) {
87
+ return "planning";
88
+ }
89
+ if (statusLower.includes("discussing"))
90
+ return "discussing";
91
+ if (statusLower.includes("verif"))
92
+ return "verifying";
93
+ if (statusLower.includes("complete") || statusLower.includes("done"))
94
+ return "completed";
95
+ if (statusLower.includes("ready to execute"))
96
+ return "executing";
97
+ return status || "unknown";
98
+ }
99
+ /** Compute progress percentage from plan and phase counts. */
100
+ export function computeProgressPercent(completedPlans, totalPlans, completedPhases, totalPhases) {
101
+ const hasPlanData = totalPlans !== null && totalPlans > 0 && completedPlans !== null;
102
+ const hasPhaseData = totalPhases !== null && totalPhases > 0 && completedPhases !== null;
103
+ if (!hasPlanData && !hasPhaseData)
104
+ return null;
105
+ const planFraction = hasPlanData ? (completedPlans ?? 0) / (totalPlans ?? 1) : 1;
106
+ const phaseFraction = hasPhaseData ? (completedPhases ?? 0) / (totalPhases ?? 1) : 1;
107
+ return Math.min(100, Math.round(Math.min(planFraction, phaseFraction) * 100));
108
+ }
109
+ /**
110
+ * KNOWN_TEMPLATE_DEFAULTS — per-field table of handler-written values.
111
+ * A value in this list is safe to overwrite on the next handler call.
112
+ */
113
+ export const KNOWN_TEMPLATE_DEFAULTS = {
114
+ "Resume File": ["None"],
115
+ Status: [
116
+ "Ready to execute",
117
+ "Phase complete — ready for verification",
118
+ "Ready to plan",
119
+ "Defining requirements",
120
+ "Planning complete",
121
+ "Executing",
122
+ "In progress",
123
+ "Planning",
124
+ "Verifying",
125
+ "Completed",
126
+ "Done",
127
+ "Active",
128
+ "Paused",
129
+ "unknown",
130
+ ],
131
+ "Last Activity": [],
132
+ "Last activity": [],
133
+ };
134
+ /**
135
+ * Regex patterns matching handler-generated Status values with variable components.
136
+ */
137
+ export const KNOWN_STATUS_PATTERNS = [
138
+ /^Executing Phase\s+\d+/i,
139
+ /^Planning Phase\s+\d+/i,
140
+ /^Phase\s+\d+\s+complete/i,
141
+ /^Verifying Phase\s+\d+/i,
142
+ /^Phase complete/i,
143
+ /^Complete\s*[✓✔✅☑]?\s*$/i,
144
+ ];
145
+ /** Check if a value is a known template default (handler may overwrite it). */
146
+ export function isStateTemplateDefault(field, value) {
147
+ if (value === null || value === undefined)
148
+ return true;
149
+ const v = (typeof value === "string" ? value : `${value}`).trim();
150
+ if (v === "")
151
+ return true;
152
+ const defaults = KNOWN_TEMPLATE_DEFAULTS[field];
153
+ const matched = defaults ? defaults.some((d) => d.toLowerCase() === v.toLowerCase()) : false;
154
+ if (matched)
155
+ return true;
156
+ const fieldLower = field.toLowerCase();
157
+ if (fieldLower === "status" && KNOWN_STATUS_PATTERNS.some((p) => p.test(v)))
158
+ return true;
159
+ if (fieldLower === "last activity" && /^\d{4}-\d{2}-\d{2}$/.test(v))
160
+ return true;
161
+ return false;
162
+ }
163
+ //# sourceMappingURL=state-document.js.map
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Model-first verdict protocol for the GSD plan-council.
3
+ *
4
+ * The verdict decision is owned by the model and emitted as structured JSON.
5
+ * Our code only parses + validates. When parse fails the caller degrades
6
+ * conservatively (force another revision cycle) — we never derive the verdict
7
+ * from prose via regex.
8
+ *
9
+ * Extraction strategy (in priority order):
10
+ * 1. Last fenced block labeled ```council-verdict``` (preferred shape).
11
+ * 2. Last fenced block labeled ```json``` that validates.
12
+ * 3. Last fenced block (any / no label) that validates.
13
+ * 4. Last brace-balanced {...} substring that validates.
14
+ * 5. null — caller decides conservative fallback.
15
+ *
16
+ * "Last wins" because the model is instructed to emit reasoning first and a
17
+ * final verdict block last; earlier JSON (e.g. quoting plan acceptance
18
+ * criteria) must not collide.
19
+ */
20
+ import { z } from "zod";
21
+ export declare const PlanCouncilVerdictSchema: z.ZodObject<{
22
+ verdict: z.ZodEnum<{
23
+ block: "block";
24
+ approve: "approve";
25
+ revise: "revise";
26
+ }>;
27
+ concerns: z.ZodCatch<z.ZodArray<z.ZodString>>;
28
+ evidence: z.ZodDefault<z.ZodCatch<z.ZodArray<z.ZodString>>>;
29
+ rationale: z.ZodOptional<z.ZodCatch<z.ZodString>>;
30
+ }, z.core.$strip>;
31
+ export type PlanCouncilVerdict = z.infer<typeof PlanCouncilVerdictSchema>;
32
+ /**
33
+ * Extract a model-first structured verdict from raw model output.
34
+ * Returns null when no valid verdict block is found — caller MUST treat null
35
+ * as "parse failed" (conservative revise), never as "approve".
36
+ */
37
+ export declare function extractStructuredVerdict(raw: string): PlanCouncilVerdict | null;
38
+ /** Render the output-contract suffix appended to every council prompt. */
39
+ export declare const VERDICT_OUTPUT_CONTRACT: string;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Model-first verdict protocol for the GSD plan-council.
3
+ *
4
+ * The verdict decision is owned by the model and emitted as structured JSON.
5
+ * Our code only parses + validates. When parse fails the caller degrades
6
+ * conservatively (force another revision cycle) — we never derive the verdict
7
+ * from prose via regex.
8
+ *
9
+ * Extraction strategy (in priority order):
10
+ * 1. Last fenced block labeled ```council-verdict``` (preferred shape).
11
+ * 2. Last fenced block labeled ```json``` that validates.
12
+ * 3. Last fenced block (any / no label) that validates.
13
+ * 4. Last brace-balanced {...} substring that validates.
14
+ * 5. null — caller decides conservative fallback.
15
+ *
16
+ * "Last wins" because the model is instructed to emit reasoning first and a
17
+ * final verdict block last; earlier JSON (e.g. quoting plan acceptance
18
+ * criteria) must not collide.
19
+ */
20
+ import { z } from "zod";
21
+ export const PlanCouncilVerdictSchema = z.object({
22
+ verdict: z.enum(["approve", "revise", "block"]),
23
+ concerns: z.array(z.string()).catch([]),
24
+ evidence: z.array(z.string()).catch([]).default([]),
25
+ rationale: z.string().catch("").optional(),
26
+ });
27
+ /** Validate + coerce a candidate JSON object to the verdict shape, or null. */
28
+ function validate(candidate) {
29
+ if (candidate === null || typeof candidate !== "object")
30
+ return null;
31
+ const parsed = PlanCouncilVerdictSchema.safeParse(candidate);
32
+ return parsed.success ? parsed.data : null;
33
+ }
34
+ const FENCE_RE = /```([a-zA-Z0-9_+-]+)?\s*\n([\s\S]*?)\n?```/g;
35
+ /** All fenced blocks in document order, with their (lower-cased) label. */
36
+ function findFencedBlocks(raw) {
37
+ const out = [];
38
+ for (const m of raw.matchAll(FENCE_RE)) {
39
+ const label = (m[1] ?? "").toLowerCase();
40
+ const body = m[2] ?? "";
41
+ out.push({ label, body });
42
+ }
43
+ return out;
44
+ }
45
+ /** Top-level {...} substrings via brace-balanced scan, in document order. */
46
+ function findBareObjects(raw) {
47
+ const out = [];
48
+ let i = 0;
49
+ while (i < raw.length) {
50
+ if (raw[i] !== "{") {
51
+ i += 1;
52
+ continue;
53
+ }
54
+ let depth = 0;
55
+ let inStr = false;
56
+ let esc = false;
57
+ let j = i;
58
+ for (; j < raw.length; j += 1) {
59
+ const ch = raw[j];
60
+ if (inStr) {
61
+ if (esc)
62
+ esc = false;
63
+ else if (ch === "\\")
64
+ esc = true;
65
+ else if (ch === '"')
66
+ inStr = false;
67
+ }
68
+ else if (ch === '"') {
69
+ inStr = true;
70
+ }
71
+ else if (ch === "{") {
72
+ depth += 1;
73
+ }
74
+ else if (ch === "}") {
75
+ depth -= 1;
76
+ if (depth === 0) {
77
+ out.push(raw.slice(i, j + 1));
78
+ break;
79
+ }
80
+ }
81
+ }
82
+ i = j >= raw.length ? j : j + 1;
83
+ }
84
+ return out;
85
+ }
86
+ function tryJson(s) {
87
+ const trimmed = s.trim();
88
+ if (!trimmed)
89
+ return null;
90
+ try {
91
+ return validate(JSON.parse(trimmed));
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Extract a model-first structured verdict from raw model output.
99
+ * Returns null when no valid verdict block is found — caller MUST treat null
100
+ * as "parse failed" (conservative revise), never as "approve".
101
+ */
102
+ export function extractStructuredVerdict(raw) {
103
+ if (!raw || !raw.trim())
104
+ return null;
105
+ // 1-3. Fenced blocks, preferring labeled council-verdict → json → bare, then
106
+ // taking the LAST valid one in each priority bucket.
107
+ const fenced = findFencedBlocks(raw);
108
+ const buckets = { verdict: [], json: [], bare: [] };
109
+ for (const f of fenced) {
110
+ if (f.label === "council-verdict")
111
+ buckets.verdict.push(f);
112
+ else if (f.label === "json")
113
+ buckets.json.push(f);
114
+ else
115
+ buckets.bare.push(f);
116
+ }
117
+ for (const bucket of [buckets.verdict, buckets.json, buckets.bare]) {
118
+ for (let i = bucket.length - 1; i >= 0; i -= 1) {
119
+ const parsed = tryJson(bucket[i].body);
120
+ if (parsed)
121
+ return parsed;
122
+ }
123
+ }
124
+ // 4. Bare {...} substrings, right-to-left.
125
+ const bare = findBareObjects(raw);
126
+ for (let i = bare.length - 1; i >= 0; i -= 1) {
127
+ const parsed = tryJson(bare[i]);
128
+ if (parsed)
129
+ return parsed;
130
+ }
131
+ return null;
132
+ }
133
+ /** Render the output-contract suffix appended to every council prompt. */
134
+ export const VERDICT_OUTPUT_CONTRACT = [
135
+ "",
136
+ "Emit your final decision as a fenced block in EXACTLY this shape — no prose inside the fence, no fields beyond these four:",
137
+ "```council-verdict",
138
+ '{"verdict":"approve|revise|block","concerns":["..."],"evidence":["..."],"rationale":"one short sentence"}',
139
+ "```",
140
+ '- "approve" = plan is correct, safe, and ready to execute.',
141
+ '- "revise" = plan has gaps — list each gap as a concern; execution stays gated.',
142
+ '- "block" = plan is fundamentally flawed — list each blocker as a concern.',
143
+ ].join("\n");
144
+ //# sourceMappingURL=verdict-schema.js.map
@@ -0,0 +1,22 @@
1
+ import { type CouncilContextBundle } from "./council-context.js";
2
+ export interface VerifyContextBundle {
3
+ base: CouncilContextBundle;
4
+ /** Implementation diff (caller supplies; empty when unavailable). */
5
+ diff: string;
6
+ diffChars: number;
7
+ /** Deterministic-floor evidence (test/lint/self-verify output). */
8
+ evidence: string;
9
+ /** The plan-verify verdict recorded before execution — sanity anchor. */
10
+ planVerdict: "pass" | "revise" | "block" | null;
11
+ }
12
+ /**
13
+ * Build the context a verify-council needs: the full plan bundle (acceptance
14
+ * criteria are the verify contract) PLUS the implementation diff and the
15
+ * deterministic-floor evidence. Reads are tolerant — missing inputs degrade to
16
+ * empty strings, never throw.
17
+ */
18
+ export declare function buildVerifyContextBundle(cwd: string, opts: {
19
+ depth: string;
20
+ evidence?: string;
21
+ diff?: string;
22
+ }): VerifyContextBundle;
@@ -0,0 +1,27 @@
1
+ import { buildCouncilContextBundle } from "./council-context.js";
2
+ import { readPlanVerifyVerdict } from "./workflow-engine.js";
3
+ const DIFF_CAP = 8000;
4
+ const EVIDENCE_CAP = 4000;
5
+ function cap(text, max) {
6
+ const t = (text ?? "").trim();
7
+ return t.length <= max ? t : `${t.slice(0, max)}…[truncated]`;
8
+ }
9
+ /**
10
+ * Build the context a verify-council needs: the full plan bundle (acceptance
11
+ * criteria are the verify contract) PLUS the implementation diff and the
12
+ * deterministic-floor evidence. Reads are tolerant — missing inputs degrade to
13
+ * empty strings, never throw.
14
+ */
15
+ export function buildVerifyContextBundle(cwd, opts) {
16
+ const base = buildCouncilContextBundle(cwd, { depth: opts.depth });
17
+ const diff = cap(opts.diff ?? "", DIFF_CAP);
18
+ const evidence = cap(opts.evidence ?? "", EVIDENCE_CAP);
19
+ return {
20
+ base,
21
+ diff,
22
+ diffChars: diff.length,
23
+ evidence,
24
+ planVerdict: readPlanVerifyVerdict(cwd),
25
+ };
26
+ }
27
+ //# sourceMappingURL=verify-context.js.map
@@ -0,0 +1,19 @@
1
+ import type { VerifyContextBundle } from "./verify-context.js";
2
+ import { type VerifyGateDimensionId } from "./verify-gate-vocabulary.js";
3
+ export type VerifyPerspectiveId = "acceptance" | "correctness" | "regression" | "security";
4
+ export interface VerifyPerspective {
5
+ id: VerifyPerspectiveId;
6
+ role: string;
7
+ mandate: string;
8
+ /**
9
+ * The shared verify-gate axis this perspective primarily owns. Ties the
10
+ * headless perspective set to the same criteria the interactive verify debate
11
+ * uses; the full set must cover every VERIFY_GATE_DIMENSION (parity-tested).
12
+ */
13
+ dimension: VerifyGateDimensionId;
14
+ }
15
+ export declare const VERIFY_PERSPECTIVES: VerifyPerspective[];
16
+ /** standard = acceptance + correctness; heavy = all four; quick = none (deterministic floor only). */
17
+ export declare function verifyPerspectivesForDepth(depth: string): VerifyPerspective[];
18
+ export declare function buildVerifyPerspectivePrompt(p: VerifyPerspective, bundle: VerifyContextBundle): string;
19
+ export declare function buildVerifyDebateTopic(bundle: VerifyContextBundle): string;
@@ -0,0 +1,85 @@
1
+ import { renderCouncilContextBlock } from "./council-context.js";
2
+ import { VERDICT_OUTPUT_CONTRACT } from "./verdict-schema.js";
3
+ import { renderVerifyGateAxes } from "./verify-gate-vocabulary.js";
4
+ export const VERIFY_PERSPECTIVES = [
5
+ {
6
+ id: "acceptance",
7
+ role: "acceptance auditor",
8
+ mandate: "For EACH acceptance criterion, cite the diff line or evidence that satisfies it. Any criterion without concrete evidence is a concern.",
9
+ dimension: "acceptance",
10
+ },
11
+ {
12
+ id: "correctness",
13
+ role: "adversarial correctness reviewer",
14
+ mandate: "Try to REFUTE that the implementation works. Construct a concrete failing input or state. Default to a concern when uncertain.",
15
+ dimension: "correctness",
16
+ },
17
+ {
18
+ id: "regression",
19
+ role: "regression reviewer",
20
+ mandate: "Identify behavior OUTSIDE the task scope that the diff may have broken (removed guards, changed signatures, side effects).",
21
+ dimension: "regression",
22
+ },
23
+ {
24
+ id: "security",
25
+ role: "security reviewer",
26
+ mandate: "Path traversal, secret handling, permission changes, dangerous shell patterns introduced by the diff.",
27
+ dimension: "safety",
28
+ },
29
+ ];
30
+ /** standard = acceptance + correctness; heavy = all four; quick = none (deterministic floor only). */
31
+ export function verifyPerspectivesForDepth(depth) {
32
+ if (depth === "quick")
33
+ return [];
34
+ if (depth === "standard")
35
+ return VERIFY_PERSPECTIVES.filter((p) => p.id === "acceptance" || p.id === "correctness");
36
+ return VERIFY_PERSPECTIVES;
37
+ }
38
+ function renderBundle(bundle) {
39
+ return [
40
+ renderCouncilContextBlock(bundle.base),
41
+ "",
42
+ "### Deterministic-floor evidence (tests/lint/self-verify)",
43
+ "",
44
+ bundle.evidence || "(no evidence supplied)",
45
+ "",
46
+ "### Implementation diff under review",
47
+ "",
48
+ "```diff",
49
+ bundle.diff || "(no diff supplied)",
50
+ "```",
51
+ ].join("\n");
52
+ }
53
+ export function buildVerifyPerspectivePrompt(p, bundle) {
54
+ return [
55
+ `You are the ${p.role} on a verify council judging whether an implementation meets its plan.`,
56
+ `Mandate: ${p.mandate}`,
57
+ "",
58
+ "The deterministic test floor has already PASSED. Your job is intent-vs-reality: does the code",
59
+ "actually achieve the plan's goal and acceptance criteria? Tests passing is necessary, not sufficient.",
60
+ "",
61
+ // Shared gate axes (single source with the interactive verify debate) so both
62
+ // verify-gate paths judge the implementation against identical criteria.
63
+ renderVerifyGateAxes(),
64
+ "",
65
+ renderBundle(bundle),
66
+ "",
67
+ VERDICT_OUTPUT_CONTRACT,
68
+ ].join("\n");
69
+ }
70
+ export function buildVerifyDebateTopic(bundle) {
71
+ return [
72
+ "Debate whether the implementation below satisfies the plan's goal and acceptance criteria.",
73
+ "The deterministic test floor already passed — focus on goal-achievement, missed acceptance criteria,",
74
+ "and regressions. Converge on a single merged verdict.",
75
+ "",
76
+ // Shared gate axes (single source with the headless perspective review) so
77
+ // both verify-gate paths judge the implementation against identical criteria.
78
+ renderVerifyGateAxes(),
79
+ "",
80
+ renderBundle(bundle),
81
+ "",
82
+ VERDICT_OUTPUT_CONTRACT,
83
+ ].join("\n");
84
+ }
85
+ //# sourceMappingURL=verify-council-prompts.js.map
@@ -0,0 +1,25 @@
1
+ import { type VerifyPerspective } from "./verify-council-prompts.js";
2
+ export type VerifyVerdict = "pass" | "revise" | "block";
3
+ export interface VerifyCouncilResult {
4
+ skipped: boolean;
5
+ verdict: VerifyVerdict;
6
+ concerns: string[];
7
+ verifyCouncilPath?: string;
8
+ leaderModelId?: string;
9
+ verdictSource: "structured" | "heuristic-fallback" | "parse-failed";
10
+ }
11
+ export interface VerifyCouncilOpts {
12
+ cwd: string;
13
+ sessionModelId: string;
14
+ depth: string;
15
+ evidence?: string;
16
+ diff?: string;
17
+ runPerspectiveFn?: (prompt: string, p: VerifyPerspective) => Promise<string>;
18
+ runDebate?: (topic: string) => Promise<string>;
19
+ }
20
+ /**
21
+ * Independent council adjudication of an implementation against its plan.
22
+ * Runs ONLY after the deterministic test floor passes (caller's contract).
23
+ * Never silently approves: a missing structured verdict forces "revise".
24
+ */
25
+ export declare function runVerifyCouncil(opts: VerifyCouncilOpts): Promise<VerifyCouncilResult>;
@@ -0,0 +1,119 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { resolvePlanCouncilLeader } from "../council/leader.js";
3
+ import { planningArtifact } from "./paths.js";
4
+ import { extractStructuredVerdict } from "./verdict-schema.js";
5
+ import { buildVerifyContextBundle } from "./verify-context.js";
6
+ import { buildVerifyDebateTopic, buildVerifyPerspectivePrompt, verifyPerspectivesForDepth, } from "./verify-council-prompts.js";
7
+ /** approve → pass; else the worst verdict wins (block > revise). */
8
+ function mergeVerdict(verdicts) {
9
+ if (verdicts.some((v) => v === "block"))
10
+ return "block";
11
+ if (verdicts.some((v) => v === "revise"))
12
+ return "revise";
13
+ return "pass";
14
+ }
15
+ function writeArtifact(cwd, verdict, concerns, leaderModelId, source) {
16
+ const path = planningArtifact(cwd, "VERIFY-COUNCIL.md");
17
+ const content = [
18
+ "# VERIFY-COUNCIL",
19
+ "",
20
+ `verdict: ${verdict}`,
21
+ `leader: \`${leaderModelId}\``,
22
+ `verdictSource: ${source}`,
23
+ "",
24
+ "## Concerns",
25
+ concerns.length ? concerns.map((c) => `- ${c}`).join("\n") : "- (none)",
26
+ ].join("\n");
27
+ writeFileSync(path, content, "utf8");
28
+ return path;
29
+ }
30
+ /**
31
+ * Independent council adjudication of an implementation against its plan.
32
+ * Runs ONLY after the deterministic test floor passes (caller's contract).
33
+ * Never silently approves: a missing structured verdict forces "revise".
34
+ */
35
+ export async function runVerifyCouncil(opts) {
36
+ const perspectives = verifyPerspectivesForDepth(opts.depth);
37
+ if (perspectives.length === 0) {
38
+ return { skipped: true, verdict: "pass", concerns: [], verdictSource: "structured" };
39
+ }
40
+ const bundle = buildVerifyContextBundle(opts.cwd, { depth: opts.depth, evidence: opts.evidence, diff: opts.diff });
41
+ const leader = await resolvePlanCouncilLeader(opts.sessionModelId);
42
+ // ---- Debate path (production: runCouncilV2 synthesis) ----
43
+ if (opts.runDebate) {
44
+ let synthesis = "";
45
+ try {
46
+ synthesis = await opts.runDebate(buildVerifyDebateTopic(bundle));
47
+ }
48
+ catch (err) {
49
+ console.error(`[gsd] verify-council debate failed: ${err.message}`);
50
+ }
51
+ const parsed = extractStructuredVerdict(synthesis);
52
+ if (!parsed) {
53
+ const concerns = ["Verify council leader emitted no structured verdict — forcing revision."];
54
+ const path = writeArtifact(opts.cwd, "revise", concerns, leader.modelId, "parse-failed");
55
+ return {
56
+ skipped: false,
57
+ verdict: "revise",
58
+ concerns,
59
+ verifyCouncilPath: path,
60
+ leaderModelId: leader.modelId,
61
+ verdictSource: "parse-failed",
62
+ };
63
+ }
64
+ const verdict = mergeVerdict([parsed.verdict]);
65
+ const concerns = parsed.concerns.map(String);
66
+ const path = writeArtifact(opts.cwd, verdict, concerns, leader.modelId, "structured");
67
+ return {
68
+ skipped: false,
69
+ verdict,
70
+ concerns,
71
+ verifyCouncilPath: path,
72
+ leaderModelId: leader.modelId,
73
+ verdictSource: "structured",
74
+ };
75
+ }
76
+ // ---- Perspective path (parallel sub-agents; tests use this) ----
77
+ if (!opts.runPerspectiveFn) {
78
+ // No runner at all — cannot adjudicate; conservatively pass (deterministic floor already gated).
79
+ return { skipped: true, verdict: "pass", concerns: [], verdictSource: "structured" };
80
+ }
81
+ const runFn = opts.runPerspectiveFn;
82
+ const results = await Promise.all(perspectives.map(async (p) => {
83
+ try {
84
+ const raw = await runFn(buildVerifyPerspectivePrompt(p, bundle), p);
85
+ const parsed = extractStructuredVerdict(raw);
86
+ if (!parsed) {
87
+ console.error(`[gsd] verify-council perspective ${p.id} emitted no structured verdict — forcing revise`);
88
+ return {
89
+ verdict: "revise",
90
+ concerns: [`${p.id}: no structured verdict (parse failed)`],
91
+ parseFailed: true,
92
+ };
93
+ }
94
+ return { verdict: parsed.verdict, concerns: parsed.concerns.map(String), parseFailed: false };
95
+ }
96
+ catch (err) {
97
+ console.error(`[gsd] verify-council perspective ${p.id} failed: ${err.message}`);
98
+ return {
99
+ verdict: "revise",
100
+ concerns: [`${p.id}: perspective error — ${err.message}`],
101
+ parseFailed: true,
102
+ };
103
+ }
104
+ }));
105
+ const verdict = mergeVerdict(results.map((r) => r.verdict));
106
+ const concerns = results.flatMap((r) => r.concerns);
107
+ const anyParseFailed = results.some((r) => r.parseFailed);
108
+ const source = anyParseFailed ? "parse-failed" : "structured";
109
+ const path = writeArtifact(opts.cwd, verdict, concerns, leader.modelId, source);
110
+ return {
111
+ skipped: false,
112
+ verdict,
113
+ concerns,
114
+ verifyCouncilPath: path,
115
+ leaderModelId: leader.modelId,
116
+ verdictSource: source,
117
+ };
118
+ }
119
+ //# sourceMappingURL=verify-council.js.map
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Single source of truth for the GSD verify-gate's EVALUATION AXES — the twin of
3
+ * plan-gate-vocabulary.ts for the verify council. Same drift risk: the interactive
4
+ * verify debate (`buildVerifyDebateTopic`) and the headless perspective review
5
+ * (`buildVerifyPerspectivePrompt` over `VERIFY_PERSPECTIVES`) must judge an
6
+ * implementation against IDENTICAL criteria or the two verify gates diverge.
7
+ *
8
+ * Council decision 2026-07-11 (PR 2): apply the plan-gate consolidation to the
9
+ * verify twin — one criteria source both paths derive from, parity-locked.
10
+ */
11
+ export type VerifyGateDimensionId = "acceptance" | "correctness" | "regression" | "safety";
12
+ export interface VerifyGateDimension {
13
+ id: VerifyGateDimensionId;
14
+ label: string;
15
+ probe: string;
16
+ }
17
+ /**
18
+ * The canonical axes every implementation is judged against once the
19
+ * deterministic test floor has passed — intent-vs-reality, not "tests are green".
20
+ */
21
+ export declare const VERIFY_GATE_DIMENSIONS: readonly VerifyGateDimension[];
22
+ /** Fast lookup by id. */
23
+ export declare const VERIFY_GATE_DIMENSION_BY_ID: Readonly<Record<VerifyGateDimensionId, VerifyGateDimension>>;
24
+ /** Bullet list of axes, shared by both verify-gate prompt paths. */
25
+ export declare function renderVerifyGateAxes(): string;