agentic-orchestrator 0.1.28 → 0.2.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 (836) hide show
  1. package/.claude/settings.local.json +46 -1
  2. package/.cortexrc +28 -0
  3. package/.github/agents/copilot-instructions.md +29 -0
  4. package/.github/copilot-instructions.md +93 -0
  5. package/.vscode/settings.json +13 -0
  6. package/.vscode/tms.code-snippets +223 -0
  7. package/AGENTS.md +72 -1
  8. package/Agentic-Orchestrator.iml +12 -11
  9. package/CLAUDE.md +72 -1
  10. package/CONSTITUTION.md +504 -0
  11. package/FUTURE-ENHANCEMENTS.md +85 -0
  12. package/NEXT-TASKS.md +25 -0
  13. package/PROMPTS.md +161 -0
  14. package/README.md +126 -29
  15. package/agentic/orchestrator/agents.yaml +4 -3
  16. package/agentic/orchestrator/defaults/policy.defaults.yaml +39 -3
  17. package/agentic/orchestrator/gates.yaml +15 -3
  18. package/agentic/orchestrator/policy.yaml +47 -3
  19. package/agentic/orchestrator/prompts/builder.system.md +69 -20
  20. package/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
  21. package/agentic/orchestrator/prompts/planner.system.md +113 -40
  22. package/agentic/orchestrator/prompts/qa.system.md +73 -18
  23. package/agentic/orchestrator/prompts/reconciler.system.md +119 -0
  24. package/agentic/orchestrator/schemas/agents.schema.json +89 -1
  25. package/agentic/orchestrator/schemas/execution-control.schema.json +242 -0
  26. package/agentic/orchestrator/schemas/index.schema.json +234 -0
  27. package/agentic/orchestrator/schemas/intake.review.schema.json +82 -0
  28. package/agentic/orchestrator/schemas/organizer-ordering-artifact.schema.json +75 -0
  29. package/agentic/orchestrator/schemas/plan.schema.json +44 -0
  30. package/agentic/orchestrator/schemas/policy.schema.json +238 -9
  31. package/agentic/orchestrator/schemas/policy.user.schema.json +129 -1
  32. package/agentic/orchestrator/schemas/spec.manifest.bootstrap.schema.json +101 -0
  33. package/agentic/orchestrator/schemas/spec.manifest.verified.schema.json +80 -0
  34. package/agentic/orchestrator/schemas/state.schema.json +298 -3
  35. package/agentic/orchestrator/tools/catalog.json +145 -15
  36. package/agentic/orchestrator/tools/schemas/input/doctor.run.input.schema.json +18 -0
  37. package/agentic/orchestrator/tools/schemas/input/evidence.latest.input.schema.json +4 -0
  38. package/agentic/orchestrator/tools/schemas/input/evidence.verify_chain.input.schema.json +13 -0
  39. package/agentic/orchestrator/tools/schemas/input/feature.intake_submit.input.schema.json +11 -0
  40. package/agentic/orchestrator/tools/schemas/input/feature.question_answer.input.schema.json +15 -0
  41. package/agentic/orchestrator/tools/schemas/input/feature.question_create.input.schema.json +21 -0
  42. package/agentic/orchestrator/tools/schemas/input/feature.question_list.input.schema.json +13 -0
  43. package/agentic/orchestrator/tools/schemas/input/feature.ready_to_merge.input.schema.json +5 -0
  44. package/agentic/orchestrator/tools/schemas/input/feature.send_message.input.schema.json +1 -1
  45. package/agentic/orchestrator/tools/schemas/input/replay.timeline_get.input.schema.json +32 -0
  46. package/agentic/orchestrator/tools/schemas/input/repo.conflict_abort.input.schema.json +16 -0
  47. package/agentic/orchestrator/tools/schemas/input/repo.conflict_files.input.schema.json +16 -0
  48. package/agentic/orchestrator/tools/schemas/input/repo.reconcile_mainline.input.schema.json +37 -0
  49. package/agentic/orchestrator/tools/schemas/input/repo.resolve_conflict.input.schema.json +40 -0
  50. package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_list.input.schema.json +7 -0
  51. package/agentic/orchestrator/tools/schemas/input/runtime.execution_request_submit.input.schema.json +25 -0
  52. package/agentic/orchestrator/tools/schemas/output/doctor.run.output.schema.json +34 -0
  53. package/agentic/orchestrator/tools/schemas/output/evidence.verify_chain.output.schema.json +23 -0
  54. package/agentic/orchestrator/tools/schemas/output/feature.get_context.output.schema.json +62 -2
  55. package/agentic/orchestrator/tools/schemas/output/feature.intake_submit.output.schema.json +24 -0
  56. package/agentic/orchestrator/tools/schemas/output/feature.question_answer.output.schema.json +21 -0
  57. package/agentic/orchestrator/tools/schemas/output/feature.question_create.output.schema.json +12 -0
  58. package/agentic/orchestrator/tools/schemas/output/feature.question_list.output.schema.json +14 -0
  59. package/agentic/orchestrator/tools/schemas/output/feature.ready_to_merge.output.schema.json +31 -0
  60. package/agentic/orchestrator/tools/schemas/output/feature.send_message.output.schema.json +8 -18
  61. package/agentic/orchestrator/tools/schemas/output/replay.timeline_get.output.schema.json +64 -0
  62. package/agentic/orchestrator/tools/schemas/output/repo.conflict_abort.output.schema.json +16 -0
  63. package/agentic/orchestrator/tools/schemas/output/repo.conflict_files.output.schema.json +22 -0
  64. package/agentic/orchestrator/tools/schemas/output/repo.reconcile_mainline.output.schema.json +61 -0
  65. package/agentic/orchestrator/tools/schemas/output/repo.resolve_conflict.output.schema.json +19 -0
  66. package/agentic/orchestrator/tools/schemas/output/report.dashboard.output.schema.json +26 -0
  67. package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_list.output.schema.json +17 -0
  68. package/agentic/orchestrator/tools/schemas/output/runtime.execution_request_submit.output.schema.json +24 -0
  69. package/agentic/orchestrator/tools.md +13 -0
  70. package/apps/control-plane/scripts/validate-mcp-contracts.ts +1 -1
  71. package/apps/control-plane/src/application/kernel-tool-wiring.ts +140 -2
  72. package/apps/control-plane/src/application/services/activity-monitor-service.ts +44 -1
  73. package/apps/control-plane/src/application/services/bootstrap-manifest-generator-service.ts +251 -0
  74. package/apps/control-plane/src/application/services/checkpoint-service.ts +87 -27
  75. package/apps/control-plane/src/application/services/collision-override-service.ts +906 -0
  76. package/apps/control-plane/src/application/services/collision-queue-service.ts +129 -38
  77. package/apps/control-plane/src/application/services/cost-tracking-service.ts +94 -0
  78. package/apps/control-plane/src/application/services/execution-control-service.ts +599 -0
  79. package/apps/control-plane/src/application/services/feature-deletion-service.ts +37 -1
  80. package/apps/control-plane/src/application/services/feature-lifecycle-service.ts +182 -4
  81. package/apps/control-plane/src/application/services/feature-send-message-service.ts +17 -8
  82. package/apps/control-plane/src/application/services/feature-state-service.ts +191 -6
  83. package/apps/control-plane/src/application/services/gate-service.ts +121 -2
  84. package/apps/control-plane/src/application/services/git-reconciliation-service.ts +1591 -0
  85. package/apps/control-plane/src/application/services/intake-service.ts +1468 -0
  86. package/apps/control-plane/src/application/services/merge-service.ts +308 -17
  87. package/apps/control-plane/src/application/services/notifier-service.ts +3 -1
  88. package/apps/control-plane/src/application/services/performance-analytics-service.ts +75 -0
  89. package/apps/control-plane/src/application/services/plan-service.ts +336 -20
  90. package/apps/control-plane/src/application/services/question-service.ts +693 -0
  91. package/apps/control-plane/src/application/services/reactions-service.ts +73 -17
  92. package/apps/control-plane/src/application/services/replay-timeline-service.ts +295 -0
  93. package/apps/control-plane/src/application/services/reporting-service.ts +194 -10
  94. package/apps/control-plane/src/application/services/run-lease-service.ts +121 -5
  95. package/apps/control-plane/src/application/services/worktree-watchdog-service.ts +95 -8
  96. package/apps/control-plane/src/application/tools/tool-metadata.ts +7 -0
  97. package/apps/control-plane/src/application/usage-types.ts +138 -0
  98. package/apps/control-plane/src/cli/add-command-handler.ts +162 -0
  99. package/apps/control-plane/src/cli/answer-command-handler.ts +113 -0
  100. package/apps/control-plane/src/cli/attach-command-handler.ts +12 -3
  101. package/apps/control-plane/src/cli/cli-argument-parser.ts +133 -11
  102. package/apps/control-plane/src/cli/collision-command-handler.ts +113 -0
  103. package/apps/control-plane/src/cli/command-catalog.ts +479 -0
  104. package/apps/control-plane/src/cli/complete-command-handler.ts +23 -0
  105. package/apps/control-plane/src/cli/completion-command-handler.ts +25 -0
  106. package/apps/control-plane/src/cli/completion-resolver.ts +319 -0
  107. package/apps/control-plane/src/cli/completion-shell-renderer.ts +58 -0
  108. package/apps/control-plane/src/cli/dashboard-command-handler.ts +110 -1
  109. package/apps/control-plane/src/cli/dashboard-runtime-runner.ts +1036 -0
  110. package/apps/control-plane/src/cli/dashboard-runtime.ts +31 -0
  111. package/apps/control-plane/src/cli/help-command-handler.ts +17 -185
  112. package/apps/control-plane/src/cli/init-command-handler.ts +51 -6
  113. package/apps/control-plane/src/cli/merge-command-handler.ts +200 -0
  114. package/apps/control-plane/src/cli/questions-command-handler.ts +70 -0
  115. package/apps/control-plane/src/cli/replay-command-handler.ts +98 -0
  116. package/apps/control-plane/src/cli/resume-command-handler.ts +231 -16
  117. package/apps/control-plane/src/cli/retry-command-handler.ts +229 -17
  118. package/apps/control-plane/src/cli/retry-resume-decision.ts +75 -0
  119. package/apps/control-plane/src/cli/rollback-command-handler.ts +4 -2
  120. package/apps/control-plane/src/cli/run-command-handler.ts +35 -1
  121. package/apps/control-plane/src/cli/spec-ingestion-service.ts +45 -55
  122. package/apps/control-plane/src/cli/spec-preparation.ts +114 -0
  123. package/apps/control-plane/src/cli/spec-utils.ts +90 -11
  124. package/apps/control-plane/src/cli/status-command-handler.ts +122 -0
  125. package/apps/control-plane/src/cli/types.ts +41 -3
  126. package/apps/control-plane/src/core/collisions.ts +150 -31
  127. package/apps/control-plane/src/core/constants.ts +18 -1
  128. package/apps/control-plane/src/core/error-codes.ts +39 -0
  129. package/apps/control-plane/src/core/execution-control.ts +56 -0
  130. package/apps/control-plane/src/core/feature-resume-phase.ts +118 -0
  131. package/apps/control-plane/src/core/gate-freshness.ts +359 -0
  132. package/apps/control-plane/src/core/gate-log-extractor.ts +97 -0
  133. package/apps/control-plane/src/core/gates.ts +90 -1
  134. package/apps/control-plane/src/core/intake-artifacts.ts +295 -0
  135. package/apps/control-plane/src/core/kernel-types.ts +11 -0
  136. package/apps/control-plane/src/core/kernel.ts +604 -16
  137. package/apps/control-plane/src/core/mainline-conflict.ts +22 -0
  138. package/apps/control-plane/src/core/merge-repair.ts +149 -0
  139. package/apps/control-plane/src/core/path-layout.ts +46 -2
  140. package/apps/control-plane/src/core/path-rules.ts +11 -3
  141. package/apps/control-plane/src/core/plan-submit-recovery.ts +130 -0
  142. package/apps/control-plane/src/core/questions.ts +49 -0
  143. package/apps/control-plane/src/core/runtime-sessions.ts +4 -0
  144. package/apps/control-plane/src/core/schemas.ts +40 -1
  145. package/apps/control-plane/src/core/tool-caller.ts +25 -1
  146. package/apps/control-plane/src/core/utils/index-normalizer.ts +25 -4
  147. package/apps/control-plane/src/core/worktree-diff.ts +66 -0
  148. package/apps/control-plane/src/index.ts +29 -1
  149. package/apps/control-plane/src/interfaces/cli/bootstrap.ts +300 -6
  150. package/apps/control-plane/src/mcp/kernel-tool-executor.ts +17 -0
  151. package/apps/control-plane/src/mcp/tool-runtime.ts +63 -4
  152. package/apps/control-plane/src/providers/api-worker-provider.ts +62 -15
  153. package/apps/control-plane/src/providers/cli-worker-provider.ts +1037 -61
  154. package/apps/control-plane/src/providers/output-parsers/generic-output-parser.ts +99 -1
  155. package/apps/control-plane/src/providers/output-parsers/types.ts +2 -0
  156. package/apps/control-plane/src/providers/provider-defaults.ts +116 -7
  157. package/apps/control-plane/src/providers/providers.ts +225 -21
  158. package/apps/control-plane/src/providers/worker-provider-factory.ts +26 -2
  159. package/apps/control-plane/src/supervisor/artifact-stager.ts +52 -0
  160. package/apps/control-plane/src/supervisor/build-wave-executor.ts +477 -166
  161. package/apps/control-plane/src/supervisor/execution-enrollment-service.ts +408 -0
  162. package/apps/control-plane/src/supervisor/organizer-enrollment-scheduler.ts +117 -0
  163. package/apps/control-plane/src/supervisor/organizer-sidecar-service.ts +394 -0
  164. package/apps/control-plane/src/supervisor/plan-conformance-scorer.ts +2 -5
  165. package/apps/control-plane/src/supervisor/planner-phase.ts +85 -0
  166. package/apps/control-plane/src/supervisor/planning-wave-executor.ts +993 -64
  167. package/apps/control-plane/src/supervisor/prompt-bundle-loader.ts +20 -1
  168. package/apps/control-plane/src/supervisor/qa-wave-executor.ts +384 -177
  169. package/apps/control-plane/src/supervisor/run-coordinator.ts +723 -20
  170. package/apps/control-plane/src/supervisor/runtime.ts +485 -9
  171. package/apps/control-plane/src/supervisor/session-orchestrator.ts +220 -1
  172. package/apps/control-plane/src/supervisor/types.ts +152 -1
  173. package/apps/control-plane/src/supervisor/worker-decision-loop.ts +1030 -92
  174. package/apps/control-plane/test/activity-monitor.spec.ts +76 -0
  175. package/apps/control-plane/test/add-command-handler.spec.ts +189 -0
  176. package/apps/control-plane/test/application/services/feature-state-service.spec.ts +208 -0
  177. package/apps/control-plane/test/artifact-stager.spec.ts +93 -0
  178. package/apps/control-plane/test/batch-operations.spec.ts +58 -0
  179. package/apps/control-plane/test/bootstrap-edge-cases.spec.ts +50 -2
  180. package/apps/control-plane/test/bootstrap-manifest-generator-service.spec.ts +99 -0
  181. package/apps/control-plane/test/bootstrap.spec.ts +177 -4
  182. package/apps/control-plane/test/checkpoint-service.spec.ts +977 -29
  183. package/apps/control-plane/test/cli-argument-parser.spec.ts +119 -0
  184. package/apps/control-plane/test/cli-helpers.spec.ts +1202 -12
  185. package/apps/control-plane/test/cli.unit.spec.ts +797 -16
  186. package/apps/control-plane/test/collision-command-handler.spec.ts +182 -0
  187. package/apps/control-plane/test/collision-override-service.spec.ts +878 -0
  188. package/apps/control-plane/test/collision-queue.spec.ts +430 -2
  189. package/apps/control-plane/test/collisions.spec.ts +209 -1
  190. package/apps/control-plane/test/core-utils.spec.ts +61 -0
  191. package/apps/control-plane/test/cost-tracking.spec.ts +224 -0
  192. package/apps/control-plane/test/dashboard-api.integration.spec.ts +185 -5
  193. package/apps/control-plane/test/dashboard-client.spec.ts +948 -0
  194. package/apps/control-plane/test/dashboard-command.spec.ts +138 -6
  195. package/apps/control-plane/test/dashboard-runtime-runner.spec.ts +1550 -0
  196. package/apps/control-plane/test/dashboard-runtime.spec.ts +138 -0
  197. package/apps/control-plane/test/dashboard-ui-utils.spec.ts +56 -12
  198. package/apps/control-plane/test/dependency-scheduler.spec.ts +7 -1
  199. package/apps/control-plane/test/env-file.spec.ts +76 -0
  200. package/apps/control-plane/test/execution-control-service.spec.ts +535 -0
  201. package/apps/control-plane/test/execution-enrollment-service.spec.ts +648 -0
  202. package/apps/control-plane/test/feature-lifecycle.spec.ts +126 -0
  203. package/apps/control-plane/test/feature-resume-phase.spec.ts +164 -0
  204. package/apps/control-plane/test/feature-send-message-service.spec.ts +161 -0
  205. package/apps/control-plane/test/feature-state-service.spec.ts +295 -0
  206. package/apps/control-plane/test/fs.spec.ts +80 -0
  207. package/apps/control-plane/test/gate-freshness.spec.ts +590 -0
  208. package/apps/control-plane/test/gate-log-extractor.spec.ts +170 -0
  209. package/apps/control-plane/test/gates.spec.ts +108 -0
  210. package/apps/control-plane/test/git-reconciliation-service.spec.ts +2307 -0
  211. package/apps/control-plane/test/helpers.ts +65 -0
  212. package/apps/control-plane/test/incremental-gates.spec.ts +271 -0
  213. package/apps/control-plane/test/index-normalizer.spec.ts +98 -0
  214. package/apps/control-plane/test/init-wizard.spec.ts +17 -0
  215. package/apps/control-plane/test/intake-artifacts.spec.ts +203 -0
  216. package/apps/control-plane/test/intake-service.spec.ts +3176 -0
  217. package/apps/control-plane/test/kernel-collision-replay.spec.ts +3 -2
  218. package/apps/control-plane/test/kernel-tool-executor.spec.ts +77 -0
  219. package/apps/control-plane/test/kernel-tool-wiring.spec.ts +279 -0
  220. package/apps/control-plane/test/kernel.branches.spec.ts +15 -2
  221. package/apps/control-plane/test/kernel.coverage.spec.ts +7 -3
  222. package/apps/control-plane/test/kernel.coverage2.spec.ts +731 -2
  223. package/apps/control-plane/test/kernel.spec.ts +464 -2
  224. package/apps/control-plane/test/mainline-conflict.spec.ts +66 -0
  225. package/apps/control-plane/test/mcp-helpers.spec.ts +79 -0
  226. package/apps/control-plane/test/mcp.spec.ts +177 -13
  227. package/apps/control-plane/test/merge-command-handler.spec.ts +531 -0
  228. package/apps/control-plane/test/merge-service.spec.ts +570 -4
  229. package/apps/control-plane/test/notifier-service.spec.ts +26 -0
  230. package/apps/control-plane/test/organizer-enrollment-scheduler.spec.ts +340 -0
  231. package/apps/control-plane/test/organizer-ordering-artifact.spec.ts +95 -0
  232. package/apps/control-plane/test/organizer-sidecar-service.spec.ts +468 -0
  233. package/apps/control-plane/test/output-loop-detector.spec.ts +6 -0
  234. package/apps/control-plane/test/path-layout.spec.ts +70 -0
  235. package/apps/control-plane/test/performance-analytics.spec.ts +124 -0
  236. package/apps/control-plane/test/plan-conformance-scorer.spec.ts +53 -0
  237. package/apps/control-plane/test/plan-service.spec.ts +686 -4
  238. package/apps/control-plane/test/planning-wave-executor.spec.ts +3272 -86
  239. package/apps/control-plane/test/policy-loader-service.spec.ts +5 -0
  240. package/apps/control-plane/test/prompt-overlay.spec.ts +65 -0
  241. package/apps/control-plane/test/provider-command-runner-epipe.spec.ts +64 -0
  242. package/apps/control-plane/test/providers/api-worker-provider.spec.ts +129 -0
  243. package/apps/control-plane/test/providers/cli-worker-provider.spec.ts +148 -0
  244. package/apps/control-plane/test/providers/usage-types.spec.ts +98 -0
  245. package/apps/control-plane/test/providers.spec.ts +293 -16
  246. package/apps/control-plane/test/question-command-handlers.spec.ts +156 -0
  247. package/apps/control-plane/test/question-service.spec.ts +1119 -0
  248. package/apps/control-plane/test/reactions.spec.ts +114 -0
  249. package/apps/control-plane/test/replay-command-handler.spec.ts +144 -0
  250. package/apps/control-plane/test/replay-timeline-service.spec.ts +459 -0
  251. package/apps/control-plane/test/response.spec.ts +31 -0
  252. package/apps/control-plane/test/resume-command.spec.ts +757 -9
  253. package/apps/control-plane/test/retry-resume-decision.spec.ts +133 -0
  254. package/apps/control-plane/test/rollback-command-handler.spec.ts +334 -0
  255. package/apps/control-plane/test/rollback-command.spec.ts +120 -0
  256. package/apps/control-plane/test/run-coordinator.spec.ts +3062 -404
  257. package/apps/control-plane/test/schemas/state.schema.spec.ts +71 -0
  258. package/apps/control-plane/test/service-retry-paths.spec.ts +112 -0
  259. package/apps/control-plane/test/services.spec.ts +472 -2
  260. package/apps/control-plane/test/session-management.spec.ts +346 -1
  261. package/apps/control-plane/test/spec-ingestion.spec.ts +102 -28
  262. package/apps/control-plane/test/spec-preparation.spec.ts +182 -0
  263. package/apps/control-plane/test/supervisor-collaborators.spec.ts +191 -3
  264. package/apps/control-plane/test/supervisor.calltool.spec.ts +198 -0
  265. package/apps/control-plane/test/supervisor.spec.ts +95 -16
  266. package/apps/control-plane/test/supervisor.unit.spec.ts +385 -18
  267. package/apps/control-plane/test/tool-runtime.spec.ts +122 -0
  268. package/apps/control-plane/test/worker-decision-loop.spec.ts +3479 -476
  269. package/apps/control-plane/test/worker-execution-policy.spec.ts +1416 -6
  270. package/apps/control-plane/test/worker-provider-adapters.spec.ts +1894 -37
  271. package/apps/control-plane/test/worker-provider-factory.spec.ts +81 -0
  272. package/apps/control-plane/test/worktree-watchdog-service.spec.ts +125 -0
  273. package/apps/control-plane/vitest.config.ts +5 -0
  274. package/config/agentic/orchestrator/agents.yaml +22 -1
  275. package/config/agentic/orchestrator/gates.yaml +24 -7
  276. package/config/agentic/orchestrator/policy.yaml +23 -1
  277. package/config/agentic/orchestrator/prompts/builder.system.md +69 -20
  278. package/config/agentic/orchestrator/prompts/organizer.system.md +85 -0
  279. package/config/agentic/orchestrator/prompts/overrides/builder.claude.md +28 -0
  280. package/config/agentic/orchestrator/prompts/overrides/builder.codex.md +28 -0
  281. package/config/agentic/orchestrator/prompts/overrides/planner.claude.md +20 -0
  282. package/config/agentic/orchestrator/prompts/overrides/planner.codex.md +20 -0
  283. package/config/agentic/orchestrator/prompts/planner-intake.system.md +149 -0
  284. package/config/agentic/orchestrator/prompts/planner.system.md +113 -40
  285. package/config/agentic/orchestrator/prompts/qa.system.md +75 -18
  286. package/config/agentic/orchestrator/prompts/reconciler.system.md +119 -0
  287. package/dist/apps/control-plane/application/kernel-tool-wiring.d.ts +26 -2
  288. package/dist/apps/control-plane/application/kernel-tool-wiring.js +40 -2
  289. package/dist/apps/control-plane/application/kernel-tool-wiring.js.map +1 -1
  290. package/dist/apps/control-plane/application/services/activity-monitor-service.js +37 -1
  291. package/dist/apps/control-plane/application/services/activity-monitor-service.js.map +1 -1
  292. package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.d.ts +4 -0
  293. package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js +188 -0
  294. package/dist/apps/control-plane/application/services/bootstrap-manifest-generator-service.js.map +1 -0
  295. package/dist/apps/control-plane/application/services/checkpoint-service.d.ts +5 -0
  296. package/dist/apps/control-plane/application/services/checkpoint-service.js +69 -24
  297. package/dist/apps/control-plane/application/services/checkpoint-service.js.map +1 -1
  298. package/dist/apps/control-plane/application/services/collision-override-service.d.ts +139 -0
  299. package/dist/apps/control-plane/application/services/collision-override-service.js +568 -0
  300. package/dist/apps/control-plane/application/services/collision-override-service.js.map +1 -0
  301. package/dist/apps/control-plane/application/services/collision-queue-service.d.ts +15 -0
  302. package/dist/apps/control-plane/application/services/collision-queue-service.js +92 -33
  303. package/dist/apps/control-plane/application/services/collision-queue-service.js.map +1 -1
  304. package/dist/apps/control-plane/application/services/cost-tracking-service.d.ts +11 -0
  305. package/dist/apps/control-plane/application/services/cost-tracking-service.js +75 -0
  306. package/dist/apps/control-plane/application/services/cost-tracking-service.js.map +1 -1
  307. package/dist/apps/control-plane/application/services/execution-control-service.d.ts +75 -0
  308. package/dist/apps/control-plane/application/services/execution-control-service.js +421 -0
  309. package/dist/apps/control-plane/application/services/execution-control-service.js.map +1 -0
  310. package/dist/apps/control-plane/application/services/feature-deletion-service.d.ts +1 -0
  311. package/dist/apps/control-plane/application/services/feature-deletion-service.js +23 -1
  312. package/dist/apps/control-plane/application/services/feature-deletion-service.js.map +1 -1
  313. package/dist/apps/control-plane/application/services/feature-lifecycle-service.d.ts +24 -1
  314. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js +132 -3
  315. package/dist/apps/control-plane/application/services/feature-lifecycle-service.js.map +1 -1
  316. package/dist/apps/control-plane/application/services/feature-send-message-service.js +16 -8
  317. package/dist/apps/control-plane/application/services/feature-send-message-service.js.map +1 -1
  318. package/dist/apps/control-plane/application/services/feature-state-service.d.ts +36 -0
  319. package/dist/apps/control-plane/application/services/feature-state-service.js +163 -6
  320. package/dist/apps/control-plane/application/services/feature-state-service.js.map +1 -1
  321. package/dist/apps/control-plane/application/services/gate-service.d.ts +2 -1
  322. package/dist/apps/control-plane/application/services/gate-service.js +95 -5
  323. package/dist/apps/control-plane/application/services/gate-service.js.map +1 -1
  324. package/dist/apps/control-plane/application/services/git-reconciliation-service.d.ts +92 -0
  325. package/dist/apps/control-plane/application/services/git-reconciliation-service.js +1097 -0
  326. package/dist/apps/control-plane/application/services/git-reconciliation-service.js.map +1 -0
  327. package/dist/apps/control-plane/application/services/intake-service.d.ts +63 -0
  328. package/dist/apps/control-plane/application/services/intake-service.js +1050 -0
  329. package/dist/apps/control-plane/application/services/intake-service.js.map +1 -0
  330. package/dist/apps/control-plane/application/services/merge-service.d.ts +5 -1
  331. package/dist/apps/control-plane/application/services/merge-service.js +233 -18
  332. package/dist/apps/control-plane/application/services/merge-service.js.map +1 -1
  333. package/dist/apps/control-plane/application/services/notifier-service.d.ts +1 -1
  334. package/dist/apps/control-plane/application/services/notifier-service.js +1 -0
  335. package/dist/apps/control-plane/application/services/notifier-service.js.map +1 -1
  336. package/dist/apps/control-plane/application/services/performance-analytics-service.d.ts +11 -0
  337. package/dist/apps/control-plane/application/services/performance-analytics-service.js +59 -0
  338. package/dist/apps/control-plane/application/services/performance-analytics-service.js.map +1 -1
  339. package/dist/apps/control-plane/application/services/plan-service.d.ts +5 -0
  340. package/dist/apps/control-plane/application/services/plan-service.js +254 -15
  341. package/dist/apps/control-plane/application/services/plan-service.js.map +1 -1
  342. package/dist/apps/control-plane/application/services/question-service.d.ts +72 -0
  343. package/dist/apps/control-plane/application/services/question-service.js +507 -0
  344. package/dist/apps/control-plane/application/services/question-service.js.map +1 -0
  345. package/dist/apps/control-plane/application/services/reactions-service.d.ts +2 -0
  346. package/dist/apps/control-plane/application/services/reactions-service.js +60 -17
  347. package/dist/apps/control-plane/application/services/reactions-service.js.map +1 -1
  348. package/dist/apps/control-plane/application/services/replay-timeline-service.d.ts +39 -0
  349. package/dist/apps/control-plane/application/services/replay-timeline-service.js +205 -0
  350. package/dist/apps/control-plane/application/services/replay-timeline-service.js.map +1 -0
  351. package/dist/apps/control-plane/application/services/reporting-service.d.ts +59 -0
  352. package/dist/apps/control-plane/application/services/reporting-service.js +121 -9
  353. package/dist/apps/control-plane/application/services/reporting-service.js.map +1 -1
  354. package/dist/apps/control-plane/application/services/run-lease-service.d.ts +20 -0
  355. package/dist/apps/control-plane/application/services/run-lease-service.js +81 -4
  356. package/dist/apps/control-plane/application/services/run-lease-service.js.map +1 -1
  357. package/dist/apps/control-plane/application/services/worktree-watchdog-service.d.ts +10 -0
  358. package/dist/apps/control-plane/application/services/worktree-watchdog-service.js +65 -8
  359. package/dist/apps/control-plane/application/services/worktree-watchdog-service.js.map +1 -1
  360. package/dist/apps/control-plane/application/tools/tool-metadata.js +7 -0
  361. package/dist/apps/control-plane/application/tools/tool-metadata.js.map +1 -1
  362. package/dist/apps/control-plane/application/usage-types.d.ts +65 -0
  363. package/dist/apps/control-plane/application/usage-types.js +75 -0
  364. package/dist/apps/control-plane/application/usage-types.js.map +1 -0
  365. package/dist/apps/control-plane/cli/add-command-handler.d.ts +18 -0
  366. package/dist/apps/control-plane/cli/add-command-handler.js +110 -0
  367. package/dist/apps/control-plane/cli/add-command-handler.js.map +1 -0
  368. package/dist/apps/control-plane/cli/answer-command-handler.d.ts +8 -0
  369. package/dist/apps/control-plane/cli/answer-command-handler.js +96 -0
  370. package/dist/apps/control-plane/cli/answer-command-handler.js.map +1 -0
  371. package/dist/apps/control-plane/cli/attach-command-handler.js +8 -3
  372. package/dist/apps/control-plane/cli/attach-command-handler.js.map +1 -1
  373. package/dist/apps/control-plane/cli/cli-argument-parser.js +131 -11
  374. package/dist/apps/control-plane/cli/cli-argument-parser.js.map +1 -1
  375. package/dist/apps/control-plane/cli/collision-command-handler.d.ts +8 -0
  376. package/dist/apps/control-plane/cli/collision-command-handler.js +90 -0
  377. package/dist/apps/control-plane/cli/collision-command-handler.js.map +1 -0
  378. package/dist/apps/control-plane/cli/command-catalog.d.ts +21 -0
  379. package/dist/apps/control-plane/cli/command-catalog.js +416 -0
  380. package/dist/apps/control-plane/cli/command-catalog.js.map +1 -0
  381. package/dist/apps/control-plane/cli/complete-command-handler.d.ts +15 -0
  382. package/dist/apps/control-plane/cli/complete-command-handler.js +26 -0
  383. package/dist/apps/control-plane/cli/complete-command-handler.js.map +1 -0
  384. package/dist/apps/control-plane/cli/completion-command-handler.d.ts +8 -0
  385. package/dist/apps/control-plane/cli/completion-command-handler.js +20 -0
  386. package/dist/apps/control-plane/cli/completion-command-handler.js.map +1 -0
  387. package/dist/apps/control-plane/cli/completion-resolver.d.ts +1 -0
  388. package/dist/apps/control-plane/cli/completion-resolver.js +250 -0
  389. package/dist/apps/control-plane/cli/completion-resolver.js.map +1 -0
  390. package/dist/apps/control-plane/cli/completion-shell-renderer.d.ts +3 -0
  391. package/dist/apps/control-plane/cli/completion-shell-renderer.js +53 -0
  392. package/dist/apps/control-plane/cli/completion-shell-renderer.js.map +1 -0
  393. package/dist/apps/control-plane/cli/dashboard-command-handler.d.ts +1 -0
  394. package/dist/apps/control-plane/cli/dashboard-command-handler.js +83 -1
  395. package/dist/apps/control-plane/cli/dashboard-command-handler.js.map +1 -1
  396. package/dist/apps/control-plane/cli/dashboard-runtime-runner.d.ts +81 -0
  397. package/dist/apps/control-plane/cli/dashboard-runtime-runner.js +724 -0
  398. package/dist/apps/control-plane/cli/dashboard-runtime-runner.js.map +1 -0
  399. package/dist/apps/control-plane/cli/dashboard-runtime.d.ts +1 -0
  400. package/dist/apps/control-plane/cli/dashboard-runtime.js +26 -0
  401. package/dist/apps/control-plane/cli/dashboard-runtime.js.map +1 -0
  402. package/dist/apps/control-plane/cli/help-command-handler.js +13 -172
  403. package/dist/apps/control-plane/cli/help-command-handler.js.map +1 -1
  404. package/dist/apps/control-plane/cli/init-command-handler.js +51 -6
  405. package/dist/apps/control-plane/cli/init-command-handler.js.map +1 -1
  406. package/dist/apps/control-plane/cli/merge-command-handler.d.ts +8 -0
  407. package/dist/apps/control-plane/cli/merge-command-handler.js +139 -0
  408. package/dist/apps/control-plane/cli/merge-command-handler.js.map +1 -0
  409. package/dist/apps/control-plane/cli/questions-command-handler.d.ts +8 -0
  410. package/dist/apps/control-plane/cli/questions-command-handler.js +59 -0
  411. package/dist/apps/control-plane/cli/questions-command-handler.js.map +1 -0
  412. package/dist/apps/control-plane/cli/replay-command-handler.d.ts +15 -0
  413. package/dist/apps/control-plane/cli/replay-command-handler.js +55 -0
  414. package/dist/apps/control-plane/cli/replay-command-handler.js.map +1 -0
  415. package/dist/apps/control-plane/cli/resume-command-handler.d.ts +2 -0
  416. package/dist/apps/control-plane/cli/resume-command-handler.js +180 -17
  417. package/dist/apps/control-plane/cli/resume-command-handler.js.map +1 -1
  418. package/dist/apps/control-plane/cli/retry-command-handler.js +202 -16
  419. package/dist/apps/control-plane/cli/retry-command-handler.js.map +1 -1
  420. package/dist/apps/control-plane/cli/retry-resume-decision.d.ts +26 -0
  421. package/dist/apps/control-plane/cli/retry-resume-decision.js +61 -0
  422. package/dist/apps/control-plane/cli/retry-resume-decision.js.map +1 -0
  423. package/dist/apps/control-plane/cli/rollback-command-handler.js +3 -2
  424. package/dist/apps/control-plane/cli/rollback-command-handler.js.map +1 -1
  425. package/dist/apps/control-plane/cli/run-command-handler.js +26 -2
  426. package/dist/apps/control-plane/cli/run-command-handler.js.map +1 -1
  427. package/dist/apps/control-plane/cli/spec-ingestion-service.d.ts +2 -0
  428. package/dist/apps/control-plane/cli/spec-ingestion-service.js +37 -48
  429. package/dist/apps/control-plane/cli/spec-ingestion-service.js.map +1 -1
  430. package/dist/apps/control-plane/cli/spec-preparation.d.ts +14 -0
  431. package/dist/apps/control-plane/cli/spec-preparation.js +81 -0
  432. package/dist/apps/control-plane/cli/spec-preparation.js.map +1 -0
  433. package/dist/apps/control-plane/cli/spec-utils.d.ts +4 -0
  434. package/dist/apps/control-plane/cli/spec-utils.js +70 -11
  435. package/dist/apps/control-plane/cli/spec-utils.js.map +1 -1
  436. package/dist/apps/control-plane/cli/status-command-handler.js +69 -0
  437. package/dist/apps/control-plane/cli/status-command-handler.js.map +1 -1
  438. package/dist/apps/control-plane/cli/types.d.ts +41 -4
  439. package/dist/apps/control-plane/cli/types.js +9 -1
  440. package/dist/apps/control-plane/cli/types.js.map +1 -1
  441. package/dist/apps/control-plane/core/collisions.d.ts +37 -19
  442. package/dist/apps/control-plane/core/collisions.js +87 -12
  443. package/dist/apps/control-plane/core/collisions.js.map +1 -1
  444. package/dist/apps/control-plane/core/constants.d.ts +17 -1
  445. package/dist/apps/control-plane/core/constants.js +18 -1
  446. package/dist/apps/control-plane/core/constants.js.map +1 -1
  447. package/dist/apps/control-plane/core/error-codes.d.ts +39 -0
  448. package/dist/apps/control-plane/core/error-codes.js +39 -0
  449. package/dist/apps/control-plane/core/error-codes.js.map +1 -1
  450. package/dist/apps/control-plane/core/execution-control.d.ts +45 -0
  451. package/dist/apps/control-plane/core/execution-control.js +2 -0
  452. package/dist/apps/control-plane/core/execution-control.js.map +1 -0
  453. package/dist/apps/control-plane/core/feature-resume-phase.d.ts +3 -0
  454. package/dist/apps/control-plane/core/feature-resume-phase.js +88 -0
  455. package/dist/apps/control-plane/core/feature-resume-phase.js.map +1 -0
  456. package/dist/apps/control-plane/core/gate-freshness.d.ts +48 -0
  457. package/dist/apps/control-plane/core/gate-freshness.js +267 -0
  458. package/dist/apps/control-plane/core/gate-freshness.js.map +1 -0
  459. package/dist/apps/control-plane/core/gate-log-extractor.d.ts +22 -0
  460. package/dist/apps/control-plane/core/gate-log-extractor.js +66 -0
  461. package/dist/apps/control-plane/core/gate-log-extractor.js.map +1 -0
  462. package/dist/apps/control-plane/core/gates.d.ts +11 -2
  463. package/dist/apps/control-plane/core/gates.js +67 -3
  464. package/dist/apps/control-plane/core/gates.js.map +1 -1
  465. package/dist/apps/control-plane/core/intake-artifacts.d.ts +109 -0
  466. package/dist/apps/control-plane/core/intake-artifacts.js +143 -0
  467. package/dist/apps/control-plane/core/intake-artifacts.js.map +1 -0
  468. package/dist/apps/control-plane/core/kernel-types.d.ts +8 -0
  469. package/dist/apps/control-plane/core/kernel.d.ts +256 -8
  470. package/dist/apps/control-plane/core/kernel.js +400 -14
  471. package/dist/apps/control-plane/core/kernel.js.map +1 -1
  472. package/dist/apps/control-plane/core/mainline-conflict.d.ts +7 -0
  473. package/dist/apps/control-plane/core/mainline-conflict.js +20 -0
  474. package/dist/apps/control-plane/core/mainline-conflict.js.map +1 -0
  475. package/dist/apps/control-plane/core/merge-repair.d.ts +35 -0
  476. package/dist/apps/control-plane/core/merge-repair.js +99 -0
  477. package/dist/apps/control-plane/core/merge-repair.js.map +1 -0
  478. package/dist/apps/control-plane/core/path-layout.d.ts +10 -0
  479. package/dist/apps/control-plane/core/path-layout.js +32 -2
  480. package/dist/apps/control-plane/core/path-layout.js.map +1 -1
  481. package/dist/apps/control-plane/core/path-rules.js +9 -3
  482. package/dist/apps/control-plane/core/path-rules.js.map +1 -1
  483. package/dist/apps/control-plane/core/plan-submit-recovery.d.ts +22 -0
  484. package/dist/apps/control-plane/core/plan-submit-recovery.js +78 -0
  485. package/dist/apps/control-plane/core/plan-submit-recovery.js.map +1 -0
  486. package/dist/apps/control-plane/core/questions.d.ts +40 -0
  487. package/dist/apps/control-plane/core/questions.js +2 -0
  488. package/dist/apps/control-plane/core/questions.js.map +1 -0
  489. package/dist/apps/control-plane/core/runtime-sessions.d.ts +4 -0
  490. package/dist/apps/control-plane/core/schemas.d.ts +2 -0
  491. package/dist/apps/control-plane/core/schemas.js +31 -1
  492. package/dist/apps/control-plane/core/schemas.js.map +1 -1
  493. package/dist/apps/control-plane/core/tool-caller.d.ts +18 -1
  494. package/dist/apps/control-plane/core/utils/index-normalizer.js +17 -4
  495. package/dist/apps/control-plane/core/utils/index-normalizer.js.map +1 -1
  496. package/dist/apps/control-plane/core/worktree-diff.d.ts +4 -0
  497. package/dist/apps/control-plane/core/worktree-diff.js +52 -0
  498. package/dist/apps/control-plane/core/worktree-diff.js.map +1 -0
  499. package/dist/apps/control-plane/index.d.ts +10 -2
  500. package/dist/apps/control-plane/index.js +9 -2
  501. package/dist/apps/control-plane/index.js.map +1 -1
  502. package/dist/apps/control-plane/interfaces/cli/bootstrap.js +236 -6
  503. package/dist/apps/control-plane/interfaces/cli/bootstrap.js.map +1 -1
  504. package/dist/apps/control-plane/mcp/kernel-tool-executor.js +16 -0
  505. package/dist/apps/control-plane/mcp/kernel-tool-executor.js.map +1 -1
  506. package/dist/apps/control-plane/mcp/tool-runtime.d.ts +5 -0
  507. package/dist/apps/control-plane/mcp/tool-runtime.js +40 -5
  508. package/dist/apps/control-plane/mcp/tool-runtime.js.map +1 -1
  509. package/dist/apps/control-plane/providers/api-worker-provider.d.ts +2 -2
  510. package/dist/apps/control-plane/providers/api-worker-provider.js +40 -9
  511. package/dist/apps/control-plane/providers/api-worker-provider.js.map +1 -1
  512. package/dist/apps/control-plane/providers/cli-worker-provider.d.ts +59 -3
  513. package/dist/apps/control-plane/providers/cli-worker-provider.js +758 -46
  514. package/dist/apps/control-plane/providers/cli-worker-provider.js.map +1 -1
  515. package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js +91 -1
  516. package/dist/apps/control-plane/providers/output-parsers/generic-output-parser.js.map +1 -1
  517. package/dist/apps/control-plane/providers/output-parsers/types.d.ts +2 -0
  518. package/dist/apps/control-plane/providers/provider-defaults.d.ts +12 -0
  519. package/dist/apps/control-plane/providers/provider-defaults.js +103 -7
  520. package/dist/apps/control-plane/providers/provider-defaults.js.map +1 -1
  521. package/dist/apps/control-plane/providers/providers.d.ts +50 -4
  522. package/dist/apps/control-plane/providers/providers.js +145 -14
  523. package/dist/apps/control-plane/providers/providers.js.map +1 -1
  524. package/dist/apps/control-plane/providers/worker-provider-factory.d.ts +2 -0
  525. package/dist/apps/control-plane/providers/worker-provider-factory.js +8 -1
  526. package/dist/apps/control-plane/providers/worker-provider-factory.js.map +1 -1
  527. package/dist/apps/control-plane/supervisor/artifact-stager.d.ts +5 -0
  528. package/dist/apps/control-plane/supervisor/artifact-stager.js +45 -0
  529. package/dist/apps/control-plane/supervisor/artifact-stager.js.map +1 -0
  530. package/dist/apps/control-plane/supervisor/build-wave-executor.d.ts +24 -1
  531. package/dist/apps/control-plane/supervisor/build-wave-executor.js +362 -150
  532. package/dist/apps/control-plane/supervisor/build-wave-executor.js.map +1 -1
  533. package/dist/apps/control-plane/supervisor/execution-enrollment-service.d.ts +41 -0
  534. package/dist/apps/control-plane/supervisor/execution-enrollment-service.js +311 -0
  535. package/dist/apps/control-plane/supervisor/execution-enrollment-service.js.map +1 -0
  536. package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.d.ts +15 -0
  537. package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js +93 -0
  538. package/dist/apps/control-plane/supervisor/organizer-enrollment-scheduler.js.map +1 -0
  539. package/dist/apps/control-plane/supervisor/organizer-sidecar-service.d.ts +44 -0
  540. package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js +311 -0
  541. package/dist/apps/control-plane/supervisor/organizer-sidecar-service.js.map +1 -0
  542. package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js +2 -5
  543. package/dist/apps/control-plane/supervisor/plan-conformance-scorer.js.map +1 -1
  544. package/dist/apps/control-plane/supervisor/planner-phase.d.ts +3 -0
  545. package/dist/apps/control-plane/supervisor/planner-phase.js +70 -0
  546. package/dist/apps/control-plane/supervisor/planner-phase.js.map +1 -0
  547. package/dist/apps/control-plane/supervisor/planning-wave-executor.d.ts +42 -0
  548. package/dist/apps/control-plane/supervisor/planning-wave-executor.js +753 -55
  549. package/dist/apps/control-plane/supervisor/planning-wave-executor.js.map +1 -1
  550. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js +19 -1
  551. package/dist/apps/control-plane/supervisor/prompt-bundle-loader.js.map +1 -1
  552. package/dist/apps/control-plane/supervisor/qa-wave-executor.d.ts +21 -0
  553. package/dist/apps/control-plane/supervisor/qa-wave-executor.js +287 -156
  554. package/dist/apps/control-plane/supervisor/qa-wave-executor.js.map +1 -1
  555. package/dist/apps/control-plane/supervisor/run-coordinator.d.ts +30 -1
  556. package/dist/apps/control-plane/supervisor/run-coordinator.js +561 -17
  557. package/dist/apps/control-plane/supervisor/run-coordinator.js.map +1 -1
  558. package/dist/apps/control-plane/supervisor/runtime.d.ts +84 -0
  559. package/dist/apps/control-plane/supervisor/runtime.js +393 -3
  560. package/dist/apps/control-plane/supervisor/runtime.js.map +1 -1
  561. package/dist/apps/control-plane/supervisor/session-orchestrator.d.ts +54 -0
  562. package/dist/apps/control-plane/supervisor/session-orchestrator.js +176 -1
  563. package/dist/apps/control-plane/supervisor/session-orchestrator.js.map +1 -1
  564. package/dist/apps/control-plane/supervisor/types.d.ts +142 -1
  565. package/dist/apps/control-plane/supervisor/types.js.map +1 -1
  566. package/dist/apps/control-plane/supervisor/worker-decision-loop.d.ts +68 -2
  567. package/dist/apps/control-plane/supervisor/worker-decision-loop.js +723 -89
  568. package/dist/apps/control-plane/supervisor/worker-decision-loop.js.map +1 -1
  569. package/docs/core/ARCHITECTURE.md +227 -0
  570. package/docs/core/DECISIONS.md +94 -0
  571. package/docs/core/DOMAIN-LOGIC.md +60 -0
  572. package/docs/core/PATTERNS.md +201 -0
  573. package/docs/core/TROUBLESHOOTING.md +347 -0
  574. package/docs/core/intentgraph-dependencies.json +39860 -0
  575. package/docs/core/intentgraph.index.json +46580 -0
  576. package/docs/plans/2026-03-10-gate-failure-targeted-repair-design.md +224 -0
  577. package/docs/plans/2026-03-10-gate-failure-targeted-repair.md +1032 -0
  578. package/docs/superpowers/plans/2026-03-16-provider-cli-config.md +743 -0
  579. package/docs/superpowers/plans/2026-03-23-reconcile-divergence-fix.md +777 -0
  580. package/docs/superpowers/plans/2026-03-28-ordering-agent-implementation.md +1754 -0
  581. package/docs/superpowers/plans/2026-03-29-drop-zone-and-provider-optimization.md +1108 -0
  582. package/docs/superpowers/plans/2026-03-29-merge-target-feature-branch.md +685 -0
  583. package/docs/superpowers/plans/2026-03-29-organizer-sidecar-runtime-loop.md +1289 -0
  584. package/docs/superpowers/specs/2026-03-23-reconcile-divergence-fix-design.md +118 -0
  585. package/docs/superpowers/specs/2026-03-28-ordering-agent-spec-audit-design.md +50 -0
  586. package/docs/superpowers/specs/2026-03-29-drop-zone-and-provider-optimization-design.md +254 -0
  587. package/docs/superpowers/specs/2026-03-29-merge-target-feature-branch-design.md +152 -0
  588. package/docs/superpowers/specs/2026-03-29-organizer-sidecar-runtime-loop-design.md +225 -0
  589. package/package.json +3 -2
  590. package/packages/web-dashboard/package.json +2 -1
  591. package/packages/web-dashboard/src/app/analytics/page.tsx +36 -2
  592. package/packages/web-dashboard/src/app/api/actions/route.ts +274 -63
  593. package/packages/web-dashboard/src/app/api/actions/status/route.ts +35 -0
  594. package/packages/web-dashboard/src/app/api/analytics/provider/route.ts +18 -0
  595. package/packages/web-dashboard/src/app/api/collisions/approve/route.ts +58 -0
  596. package/packages/web-dashboard/src/app/api/features/[id]/checkpoint-diff/route.ts +36 -0
  597. package/packages/web-dashboard/src/app/api/features/[id]/checkpoints/route.ts +29 -0
  598. package/packages/web-dashboard/src/app/api/features/[id]/conflicts/abort/route.ts +29 -0
  599. package/packages/web-dashboard/src/app/api/features/[id]/conflicts/files/route.ts +30 -0
  600. package/packages/web-dashboard/src/app/api/features/[id]/conflicts/resolve/route.ts +51 -0
  601. package/packages/web-dashboard/src/app/api/features/[id]/conflicts/route.ts +75 -0
  602. package/packages/web-dashboard/src/app/api/features/[id]/diff/route.ts +16 -2
  603. package/packages/web-dashboard/src/app/api/features/[id]/files/route.ts +26 -0
  604. package/packages/web-dashboard/src/app/api/features/[id]/gate-history/route.ts +27 -0
  605. package/packages/web-dashboard/src/app/api/features/[id]/genealogy/route.ts +26 -0
  606. package/packages/web-dashboard/src/app/api/features/[id]/history/run/[runId]/route.ts +20 -0
  607. package/packages/web-dashboard/src/app/api/features/[id]/history/runs/route.ts +34 -0
  608. package/packages/web-dashboard/src/app/api/features/[id]/intake-workspace/route.ts +20 -0
  609. package/packages/web-dashboard/src/app/api/features/[id]/live-output/route.ts +74 -0
  610. package/packages/web-dashboard/src/app/api/features/[id]/plan/amend/route.ts +21 -0
  611. package/packages/web-dashboard/src/app/api/features/[id]/plan-progress/route.ts +20 -0
  612. package/packages/web-dashboard/src/app/api/features/[id]/planner-artifacts/[artifact]/route.ts +78 -0
  613. package/packages/web-dashboard/src/app/api/features/[id]/planner-lifecycle/route.ts +20 -0
  614. package/packages/web-dashboard/src/app/api/features/[id]/planning-workspace/route.ts +20 -0
  615. package/packages/web-dashboard/src/app/api/features/[id]/questions/[questionId]/answer/route.ts +27 -0
  616. package/packages/web-dashboard/src/app/api/features/[id]/questions/route.ts +18 -0
  617. package/packages/web-dashboard/src/app/api/features/[id]/review/route.ts +14 -7
  618. package/packages/web-dashboard/src/app/api/features/[id]/route.ts +57 -2
  619. package/packages/web-dashboard/src/app/api/features/[id]/spec/route.ts +30 -0
  620. package/packages/web-dashboard/src/app/api/features/[id]/triage/route.ts +83 -0
  621. package/packages/web-dashboard/src/app/api/features/[id]/worker-events/route.ts +40 -0
  622. package/packages/web-dashboard/src/app/api/launch/preview/route.ts +86 -0
  623. package/packages/web-dashboard/src/app/api/launch/submit/route.ts +180 -0
  624. package/packages/web-dashboard/src/app/api/mainline/status/route.ts +74 -0
  625. package/packages/web-dashboard/src/app/api/merge-queue/route.ts +13 -0
  626. package/packages/web-dashboard/src/app/api/policy/budget/route.ts +14 -0
  627. package/packages/web-dashboard/src/app/api/projects/route.ts +11 -7
  628. package/packages/web-dashboard/src/app/api/reconciler/queue/route.ts +47 -0
  629. package/packages/web-dashboard/src/app/api/run/route.ts +26 -2
  630. package/packages/web-dashboard/src/app/api/runtime/events/route.ts +227 -0
  631. package/packages/web-dashboard/src/app/api/runtime/operations/route.ts +269 -0
  632. package/packages/web-dashboard/src/app/api/runtime/questions/route.ts +11 -0
  633. package/packages/web-dashboard/src/app/api/runtime/runs/route.ts +80 -0
  634. package/packages/web-dashboard/src/app/api/status/route.ts +4 -2
  635. package/packages/web-dashboard/src/app/feature/[id]/page.tsx +32 -42
  636. package/packages/web-dashboard/src/app/globals.css +34 -3
  637. package/packages/web-dashboard/src/app/launch/page.tsx +357 -0
  638. package/packages/web-dashboard/src/app/layout.tsx +23 -1
  639. package/packages/web-dashboard/src/app/page.tsx +263 -272
  640. package/packages/web-dashboard/src/components/dashboard/attention-strip.tsx +52 -0
  641. package/packages/web-dashboard/src/components/dashboard/collision-approval-drawer.tsx +185 -0
  642. package/packages/web-dashboard/src/components/dashboard/command-center-header.tsx +102 -0
  643. package/packages/web-dashboard/src/components/dashboard/mainline-status-banner.tsx +84 -0
  644. package/packages/web-dashboard/src/components/dashboard/merged-archive.tsx +36 -0
  645. package/packages/web-dashboard/src/components/dashboard/prioritized-queues.tsx +98 -0
  646. package/packages/web-dashboard/src/components/dashboard/reconciler-queue-card.tsx +115 -0
  647. package/packages/web-dashboard/src/components/dashboard/secondary-diagnostics-rail.tsx +48 -0
  648. package/packages/web-dashboard/src/components/dashboard/task-filter-bar.tsx +74 -0
  649. package/packages/web-dashboard/src/components/dashboard/triage-drawer.tsx +455 -0
  650. package/packages/web-dashboard/src/components/diff-viewer.tsx +19 -3
  651. package/packages/web-dashboard/src/components/evidence-viewer.tsx +65 -51
  652. package/packages/web-dashboard/src/components/feature-card.tsx +90 -7
  653. package/packages/web-dashboard/src/components/feature-cost-panel.tsx +112 -11
  654. package/packages/web-dashboard/src/components/feature-list-view.tsx +25 -4
  655. package/packages/web-dashboard/src/components/features/runtime-inspector/EventsTimelineView.tsx +260 -0
  656. package/packages/web-dashboard/src/components/features/runtime-inspector/OperationsListView.tsx +172 -0
  657. package/packages/web-dashboard/src/components/features/runtime-inspector/RuntimeInspectorPanel.tsx +896 -0
  658. package/packages/web-dashboard/src/components/filter-bar.tsx +7 -39
  659. package/packages/web-dashboard/src/components/focus/ActionableRiskList.tsx +46 -0
  660. package/packages/web-dashboard/src/components/focus/AgentRolePerformanceCard.tsx +200 -0
  661. package/packages/web-dashboard/src/components/focus/BlockedGuidanceBanner.tsx +149 -0
  662. package/packages/web-dashboard/src/components/focus/CheckpointInspector.tsx +123 -0
  663. package/packages/web-dashboard/src/components/focus/CheckpointRail.tsx +118 -0
  664. package/packages/web-dashboard/src/components/focus/CheckpointScrubber.tsx +249 -0
  665. package/packages/web-dashboard/src/components/focus/CollisionApprovalBanner.tsx +192 -0
  666. package/packages/web-dashboard/src/components/focus/CollisionRadar.tsx +136 -0
  667. package/packages/web-dashboard/src/components/focus/ConflictStatusCard.tsx +52 -0
  668. package/packages/web-dashboard/src/components/focus/ContextSidebar.tsx +108 -0
  669. package/packages/web-dashboard/src/components/focus/DiagnosisPanel.tsx +68 -0
  670. package/packages/web-dashboard/src/components/focus/FeatureDecisionBanner.tsx +68 -0
  671. package/packages/web-dashboard/src/components/focus/FeatureQuestionAnswerPanel.tsx +167 -0
  672. package/packages/web-dashboard/src/components/focus/FocusHeader.tsx +54 -0
  673. package/packages/web-dashboard/src/components/focus/FocusLayout.tsx +283 -0
  674. package/packages/web-dashboard/src/components/focus/GateFlakinessSummary.tsx +144 -0
  675. package/packages/web-dashboard/src/components/focus/GenealogyTree.tsx +34 -0
  676. package/packages/web-dashboard/src/components/focus/HeroBlock.tsx +67 -0
  677. package/packages/web-dashboard/src/components/focus/LiveAgentConsole.tsx +277 -0
  678. package/packages/web-dashboard/src/components/focus/MergeQueueCard.tsx +78 -0
  679. package/packages/web-dashboard/src/components/focus/OperationalSummaryCard.tsx +227 -0
  680. package/packages/web-dashboard/src/components/focus/PinnedActions.tsx +96 -0
  681. package/packages/web-dashboard/src/components/focus/PlanAmendmentPanel.tsx +250 -0
  682. package/packages/web-dashboard/src/components/focus/PlanProgressPanel.tsx +133 -0
  683. package/packages/web-dashboard/src/components/focus/PlannerArtifactViewer.tsx +158 -0
  684. package/packages/web-dashboard/src/components/focus/PlannerLifecycleHeader.tsx +141 -0
  685. package/packages/web-dashboard/src/components/focus/ProgressSnapshotCard.tsx +113 -0
  686. package/packages/web-dashboard/src/components/focus/RecentMaterialChanges.tsx +69 -0
  687. package/packages/web-dashboard/src/components/focus/RoleLogViewer.tsx +436 -0
  688. package/packages/web-dashboard/src/components/focus/RunHistoryBrowser.tsx +62 -0
  689. package/packages/web-dashboard/src/components/focus/SpecViewer.tsx +172 -0
  690. package/packages/web-dashboard/src/components/focus/TabBar.tsx +33 -0
  691. package/packages/web-dashboard/src/components/focus/UsageBurnChart.tsx +212 -0
  692. package/packages/web-dashboard/src/components/focus/VerificationSummaryCard.tsx +122 -0
  693. package/packages/web-dashboard/src/components/focus/tabs/ChangesTab.tsx +325 -0
  694. package/packages/web-dashboard/src/components/focus/tabs/ConflictsTab.tsx +395 -0
  695. package/packages/web-dashboard/src/components/focus/tabs/GatesQaTab.tsx +38 -0
  696. package/packages/web-dashboard/src/components/focus/tabs/HistoryTab.tsx +213 -0
  697. package/packages/web-dashboard/src/components/focus/tabs/IntakeTab.tsx +429 -0
  698. package/packages/web-dashboard/src/components/focus/tabs/OverviewTab.tsx +217 -0
  699. package/packages/web-dashboard/src/components/focus/tabs/PlanningTab.tsx +390 -0
  700. package/packages/web-dashboard/src/components/focus/tabs/ReviewTab.tsx +497 -0
  701. package/packages/web-dashboard/src/components/focus/tabs/RuntimeTab.tsx +213 -0
  702. package/packages/web-dashboard/src/components/focus/tabs/TranscriptTab.tsx +315 -0
  703. package/packages/web-dashboard/src/components/gate-results.tsx +2 -2
  704. package/packages/web-dashboard/src/components/human-input-panel.tsx +33 -57
  705. package/packages/web-dashboard/src/components/kanban-board.tsx +4 -0
  706. package/packages/web-dashboard/src/components/launch/launch-draft-card.tsx +131 -0
  707. package/packages/web-dashboard/src/components/plan-viewer.tsx +147 -69
  708. package/packages/web-dashboard/src/components/quick-launch-panel.tsx +20 -47
  709. package/packages/web-dashboard/src/components/summary-bar.tsx +30 -76
  710. package/packages/web-dashboard/src/lib/aop-client.ts +2484 -36
  711. package/packages/web-dashboard/src/lib/blocked-state-guidance.ts +475 -0
  712. package/packages/web-dashboard/src/lib/collision-radar.ts +136 -0
  713. package/packages/web-dashboard/src/lib/dashboard-action-states.ts +204 -0
  714. package/packages/web-dashboard/src/lib/dashboard-runtime-client.ts +439 -0
  715. package/packages/web-dashboard/src/lib/dashboard-utils.ts +179 -18
  716. package/packages/web-dashboard/src/lib/drop-zone-utils.ts +92 -0
  717. package/packages/web-dashboard/src/lib/focus-detail-derivations.ts +958 -0
  718. package/packages/web-dashboard/src/lib/focus-view.ts +300 -0
  719. package/packages/web-dashboard/src/lib/health-diagnosis.ts +356 -0
  720. package/packages/web-dashboard/src/lib/launch-contracts.ts +77 -0
  721. package/packages/web-dashboard/src/lib/launch-markdown.ts +107 -0
  722. package/packages/web-dashboard/src/lib/launch-page-preview.ts +89 -0
  723. package/packages/web-dashboard/src/lib/live-feed.ts +1 -1
  724. package/packages/web-dashboard/src/lib/multi-project-config.ts +33 -0
  725. package/packages/web-dashboard/src/lib/orchestrator-tools.ts +845 -59
  726. package/packages/web-dashboard/src/lib/planner-workspace.ts +1285 -0
  727. package/packages/web-dashboard/src/lib/review-contracts.ts +5 -3
  728. package/packages/web-dashboard/src/lib/runtime-files.ts +285 -0
  729. package/packages/web-dashboard/src/lib/tool-catalog.ts +51 -0
  730. package/packages/web-dashboard/src/lib/types.ts +731 -3
  731. package/packages/web-dashboard/src/lib/usage-burn.ts +175 -0
  732. package/packages/web-dashboard/src/lib/worktree-diff.ts +128 -0
  733. package/packages/web-dashboard/src/styles/dashboard.module.css +1742 -459
  734. package/packages/web-dashboard/test/api/actions/route.spec.ts +675 -0
  735. package/packages/web-dashboard/test/api/features/diff.route.spec.ts +57 -0
  736. package/packages/web-dashboard/test/api/features/feature.route.spec.ts +99 -0
  737. package/packages/web-dashboard/test/api/features/live-output.route.spec.ts +123 -0
  738. package/packages/web-dashboard/test/api/features/plan-amend.route.spec.ts +95 -0
  739. package/packages/web-dashboard/test/api/features/planner-workspaces.route.spec.ts +162 -0
  740. package/packages/web-dashboard/test/api/features/question-answer.route.spec.ts +99 -0
  741. package/packages/web-dashboard/test/api/features/triage.route.spec.ts +195 -0
  742. package/packages/web-dashboard/test/api/launch/preview.route.spec.ts +149 -0
  743. package/packages/web-dashboard/test/api/launch/submit.route.spec.ts +382 -0
  744. package/packages/web-dashboard/test/api/runtime/events/route.spec.ts +164 -0
  745. package/packages/web-dashboard/test/api/runtime/operations/route.spec.ts +156 -0
  746. package/packages/web-dashboard/test/api/runtime/runs/route.spec.ts +112 -0
  747. package/packages/web-dashboard/test/components/changes-tab.spec.tsx +76 -0
  748. package/packages/web-dashboard/test/components/command-center-root.spec.tsx +87 -0
  749. package/packages/web-dashboard/test/components/diagnosis-panel.spec.tsx +59 -0
  750. package/packages/web-dashboard/test/components/feature-card.spec.tsx +45 -0
  751. package/packages/web-dashboard/test/components/focus-layout.spec.tsx +299 -0
  752. package/packages/web-dashboard/test/components/gate-results.spec.tsx +39 -0
  753. package/packages/web-dashboard/test/components/gates-qa-tab.spec.tsx +118 -0
  754. package/packages/web-dashboard/test/components/human-input-panel.spec.tsx +54 -0
  755. package/packages/web-dashboard/test/components/intake-tab.spec.tsx +210 -0
  756. package/packages/web-dashboard/test/components/kanban-board.spec.tsx +35 -0
  757. package/packages/web-dashboard/test/components/launch-draft-card.spec.tsx +54 -0
  758. package/packages/web-dashboard/test/components/launch-page.spec.tsx +79 -0
  759. package/packages/web-dashboard/test/components/overview-tab.spec.tsx +236 -0
  760. package/packages/web-dashboard/test/components/planning-tab.spec.tsx +202 -0
  761. package/packages/web-dashboard/test/components/review-tab.spec.tsx +169 -0
  762. package/packages/web-dashboard/test/components/role-log-viewer.spec.ts +42 -0
  763. package/packages/web-dashboard/test/components/runtime-inspector.spec.tsx +22 -0
  764. package/packages/web-dashboard/test/components/runtime-tab.spec.tsx +133 -0
  765. package/packages/web-dashboard/test/components/transcript-tab.spec.tsx +46 -0
  766. package/packages/web-dashboard/test/components/triage-drawer.spec.tsx +159 -0
  767. package/packages/web-dashboard/test/lib/aop-client.spec.ts +235 -0
  768. package/packages/web-dashboard/test/lib/dashboard-runtime-client.spec.ts +144 -0
  769. package/packages/web-dashboard/test/lib/focus-detail-derivations.spec.ts +314 -0
  770. package/packages/web-dashboard/test/lib/focus-view.spec.ts +248 -0
  771. package/packages/web-dashboard/test/lib/health-diagnosis.spec.ts +277 -0
  772. package/packages/web-dashboard/test/lib/launch-markdown.spec.ts +36 -0
  773. package/packages/web-dashboard/test/lib/multi-project-config.spec.ts +54 -0
  774. package/packages/web-dashboard/test/lib/orchestrator-tools.spec.ts +352 -0
  775. package/packages/web-dashboard/test/lib/planner-workspace.spec.ts +289 -0
  776. package/packages/web-dashboard/test/lib/worktree-diff.spec.ts +119 -0
  777. package/packages/web-dashboard/vitest.config.ts +2 -0
  778. package/spec-files/completed/agentic_orchestrator_add_feature_to_active_execution_spec.md +557 -0
  779. package/spec-files/completed/agentic_orchestrator_dashboard_command_center_redesign_spec.md +1147 -0
  780. package/spec-files/completed/agentic_orchestrator_execution_mode_spec.md +18 -16
  781. package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_a_spec.md +672 -0
  782. package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_b_spec.md +794 -0
  783. package/spec-files/completed/agentic_orchestrator_feature_focus_view_track_c_decision_centric_remediation_spec.md +1037 -0
  784. package/spec-files/completed/agentic_orchestrator_feature_focus_view_ux_redesign_spec.md +1432 -0
  785. package/spec-files/completed/agentic_orchestrator_focus_plan_tab_intake_planning_workspace_spec.md +921 -0
  786. package/spec-files/completed/agentic_orchestrator_intentional_collision_override_spec.md +584 -0
  787. package/spec-files/completed/agentic_orchestrator_interactive_planning_intake_and_requirements_verification_spec.md +1185 -0
  788. package/spec-files/completed/agentic_orchestrator_reactive_execution_enrollment_spec.md +864 -0
  789. package/spec-files/{outstanding → completed}/agentic_orchestrator_runtime_inspection_spec.md +92 -19
  790. package/spec-files/completed/agentic_orchestrator_scope_aware_run_lease_spec.md +408 -0
  791. package/spec-files/completed/git-reconciliation-engine.md +827 -0
  792. package/spec-files/outstanding/agentic_orchestrator_dashboard_quick_launch_and_control_surface_spec.md +331 -0
  793. package/spec-files/outstanding/agentic_orchestrator_enterprise_governance_dashboard_spec.md +16 -6
  794. package/spec-files/outstanding/agentic_orchestrator_evidence_integrity_doctor_spec.md +60 -9
  795. package/spec-files/outstanding/agentic_orchestrator_focus_plan_tab_execution_contract_workspace_spec.md +616 -0
  796. package/spec-files/outstanding/agentic_orchestrator_headless_standby_dashboard_runtime_spec.md +310 -0
  797. package/spec-files/outstanding/agentic_orchestrator_human_input_interaction_protocol_spec.md +175 -72
  798. package/spec-files/outstanding/agentic_orchestrator_interactive_rename_cleanup_spec.md +197 -0
  799. package/spec-files/outstanding/agentic_orchestrator_interactive_resume_and_reconciliation_disposition_spec.md +412 -0
  800. package/spec-files/outstanding/agentic_orchestrator_knowledge_canary_spec.md +166 -137
  801. package/spec-files/outstanding/agentic_orchestrator_observability_replay_spec.md +3 -3
  802. package/spec-files/outstanding/agentic_orchestrator_phase_specific_agent_profiles_and_token_telemetry_spec.md +303 -0
  803. package/spec-files/outstanding/agentic_orchestrator_planning_review_quality_spec.md +18 -5
  804. package/spec-files/outstanding/agentic_orchestrator_policy_stratification_spec.md +225 -0
  805. package/spec-files/outstanding/agentic_orchestrator_quality_adoption_execution_spec.md +77 -50
  806. package/spec-files/outstanding/agentic_orchestrator_ready_to_merge_branch_handoff_spec.md +724 -0
  807. package/spec-files/outstanding/agentic_orchestrator_remove_deterministic_mode_spec.md +263 -0
  808. package/spec-files/outstanding/agentic_orchestrator_request_more_context_and_dashboard_human_input_spec.md +456 -0
  809. package/spec-files/outstanding/agentic_orchestrator_spec_coverage_and_reconciliation_enforcement_spec.md +1411 -0
  810. package/spec-files/outstanding/agentic_orchestrator_spec_ordering_agent_spec.md +370 -0
  811. package/spec-files/outstanding/shadow_workspace_implementation_spec.md +1 -1
  812. package/spec-files/progress.md +2026 -120
  813. package/specs/001-runtime-inspection/checklists/requirements.md +35 -0
  814. package/specs/001-runtime-inspection/design.md +338 -0
  815. package/specs/001-runtime-inspection/spec.md +95 -0
  816. package/specs/002-scope-aware-lease/checklists/requirements.md +35 -0
  817. package/specs/002-scope-aware-lease/contracts/lease-registry.schema.json +101 -0
  818. package/specs/002-scope-aware-lease/data-model.md +236 -0
  819. package/specs/002-scope-aware-lease/plan.md +766 -0
  820. package/specs/002-scope-aware-lease/quickstart.md +150 -0
  821. package/specs/002-scope-aware-lease/research.md +135 -0
  822. package/specs/002-scope-aware-lease/spec.md +128 -0
  823. package/specs/002-scope-aware-lease/tasks.md +767 -0
  824. package/tsconfig.json +1 -1
  825. package/vitest.config.ts +28 -0
  826. package/ARCHITECTURE_ADHERENCE_ANALYSIS.md +0 -871
  827. package/packages/web-dashboard/next-env.d.ts +0 -6
  828. package/packages/web-dashboard/src/components/detail-panel.tsx +0 -1124
  829. package/packages/web-dashboard/src/components/review-workspace.tsx +0 -1162
  830. /package/spec-files/{outstanding → completed}/agentic_orchestrator_artifact_database_publishing_spec.md +0 -0
  831. /package/spec-files/{outstanding → completed}/agentic_orchestrator_cli_shell_tab_completion_spec.md +0 -0
  832. /package/spec-files/{outstanding → completed}/agentic_orchestrator_dashboard_diff_and_agent_console_spec.md +0 -0
  833. /package/spec-files/{outstanding → completed}/agentic_orchestrator_performance_improvements_spec.md +0 -0
  834. /package/spec-files/{outstanding → completed}/agentic_orchestrator_persistent_worker_runtime_spec.md +0 -0
  835. /package/spec-files/{outstanding → completed}/agentic_orchestrator_provider_auth_bootstrap_spec.md +0 -0
  836. /package/spec-files/{outstanding → completed}/agentic_orchestrator_real_worker_provider_execution_spec.md +0 -0
@@ -1,1162 +0,0 @@
1
- import {
2
- useEffect,
3
- useMemo,
4
- useRef,
5
- useState,
6
- type KeyboardEvent as ReactKeyboardEvent,
7
- } from 'react';
8
- import dynamic from 'next/dynamic';
9
- import { html as renderDiffHtml } from 'diff2html';
10
- import DOMPurify from 'dompurify';
11
- import { projectQuery, parseUnifiedDiff } from '@/lib/dashboard-utils.js';
12
- import { isEditableTarget } from '@/lib/review-contracts.js';
13
- import {
14
- appendCappedLogEntries,
15
- isConsoleSendAllowed,
16
- stepHunkIndex,
17
- } from '@/lib/review-workspace-logic.js';
18
- import type {
19
- AgentLogEntry,
20
- AgentPipelineStatus,
21
- FeatureCheckpoint,
22
- FeatureDetail,
23
- FileDiffPayload,
24
- RawLogFileMeta,
25
- RoleStatus,
26
- WorkerEventEntry,
27
- } from '@/lib/types.js';
28
- import styles from '@/styles/dashboard.module.css';
29
-
30
- const MonacoDiffEditor = dynamic(
31
- async () => {
32
- const module = await import('@monaco-editor/react');
33
- return module.DiffEditor;
34
- },
35
- { ssr: false },
36
- );
37
-
38
- type ReviewAction =
39
- | 'review.approve'
40
- | 'review.deny'
41
- | 'review.request_changes'
42
- | 'feature.send_message';
43
- type DiffRenderMode = 'line-by-line' | 'side-by-side';
44
- type TimelineValidity = 'all' | 'valid' | 'invalid';
45
- type TrustClass = 'Structured Artifact' | 'Raw Provider Output' | 'Derived';
46
- type PipelineRole = 'planner' | 'builder' | 'qa';
47
- type RuntimeInspectorTab = 'activity' | 'checkpoints';
48
-
49
- interface ActionResponse {
50
- ok: boolean;
51
- error?: { code?: string; message?: string };
52
- }
53
-
54
- interface ApiEnvelope<TData> {
55
- ok: boolean;
56
- data?: TData;
57
- error?: { code?: string; message?: string };
58
- }
59
-
60
- interface LogStreamPayload {
61
- type: 'snapshot' | 'append' | 'heartbeat' | 'error';
62
- cursor: string;
63
- entries: AgentLogEntry[];
64
- message?: string;
65
- }
66
-
67
- interface ReviewWorkspaceProps {
68
- detail: FeatureDetail;
69
- project: string;
70
- hasActiveRuntimeSession: boolean;
71
- refreshDetail: (featureId: string) => Promise<void>;
72
- refreshStatus: () => Promise<void>;
73
- addToast: (message: string, type?: 'success' | 'error' | 'info') => void;
74
- }
75
-
76
- interface ActiveRoleMarker {
77
- role: PipelineRole | null;
78
- status: RoleStatus | null;
79
- }
80
-
81
- function truncateSessionId(value: string): string {
82
- if (value.length <= 18) {
83
- return value;
84
- }
85
- return `${value.slice(0, 8)}…${value.slice(-8)}`;
86
- }
87
-
88
- function formatTimestamp(value: string): string {
89
- const parsed = Date.parse(value);
90
- if (Number.isNaN(parsed)) {
91
- return value;
92
- }
93
- return new Date(parsed).toLocaleTimeString([], {
94
- hour: '2-digit',
95
- minute: '2-digit',
96
- second: '2-digit',
97
- });
98
- }
99
-
100
- function formatCheckpointTimestamp(value: string): string {
101
- const parsed = Date.parse(value);
102
- if (Number.isNaN(parsed)) {
103
- return value;
104
- }
105
- return new Date(parsed).toLocaleString([], {
106
- month: 'short',
107
- day: '2-digit',
108
- hour: '2-digit',
109
- minute: '2-digit',
110
- second: '2-digit',
111
- });
112
- }
113
-
114
- function checkpointStatusBadge(
115
- checkpoint: FeatureCheckpoint,
116
- stylesMap: Record<string, string>,
117
- ): string {
118
- if (checkpoint.validation_status === 'valid') {
119
- return `${stylesMap.badge} ${stylesMap.badgePass}`;
120
- }
121
- if (checkpoint.validation_status === 'invalid') {
122
- return `${stylesMap.badge} ${stylesMap.badgeFail}`;
123
- }
124
- return `${stylesMap.badge} ${stylesMap.badgePending}`;
125
- }
126
-
127
- function checkpointSeverityBadge(
128
- severity: FeatureCheckpoint['severity'],
129
- stylesMap: Record<string, string>,
130
- ): string {
131
- if (severity === 'error' || severity === 'critical') {
132
- return `${stylesMap.badge} ${stylesMap.badgeFail}`;
133
- }
134
- if (severity === 'warning') {
135
- return `${stylesMap.badge} ${stylesMap.badgePending}`;
136
- }
137
- return `${stylesMap.badge} ${stylesMap.badgeNeutral}`;
138
- }
139
-
140
- function hasActiveSession(value: string | undefined): boolean {
141
- return Boolean(value) && value !== 'unknown' && value !== 'unassigned' && value !== 'none';
142
- }
143
-
144
- function resolveActiveRole(roleStatus: AgentPipelineStatus | undefined): ActiveRoleMarker {
145
- if (!roleStatus) {
146
- return { role: null, status: null };
147
- }
148
- const entries: Array<{ role: PipelineRole; status: RoleStatus }> = [
149
- { role: 'planner', status: roleStatus.planner },
150
- { role: 'builder', status: roleStatus.builder },
151
- { role: 'qa', status: roleStatus.qa },
152
- ];
153
- const priorities: RoleStatus[] = ['running', 'blocked', 'ready', 'done', 'unknown'];
154
- for (const priority of priorities) {
155
- const match = entries.find((entry) => entry.status === priority);
156
- if (match) {
157
- return { role: match.role, status: match.status };
158
- }
159
- }
160
- return { role: null, status: null };
161
- }
162
-
163
- async function callAction(
164
- action: ReviewAction,
165
- featureId: string,
166
- project: string,
167
- payload: Record<string, unknown>,
168
- ): Promise<ActionResponse> {
169
- const response = await fetch(`/api/actions${projectQuery(project)}`, {
170
- method: 'POST',
171
- headers: { 'Content-Type': 'application/json' },
172
- body: JSON.stringify({ action, feature_id: featureId, ...payload }),
173
- });
174
- return (await response.json()) as ActionResponse;
175
- }
176
-
177
- export function ReviewWorkspace({
178
- detail,
179
- project,
180
- hasActiveRuntimeSession,
181
- refreshDetail,
182
- refreshStatus,
183
- addToast,
184
- }: ReviewWorkspaceProps) {
185
- const featureId = detail.feature.feature_id;
186
- const files = useMemo(() => parseUnifiedDiff(detail.diff), [detail.diff]);
187
- const filePaths = useMemo(
188
- () =>
189
- files.map((file) => ({
190
- path: file.filePath,
191
- hunkCount: file.hunks.length,
192
- })),
193
- [files],
194
- );
195
- const diffStats = useMemo(() => {
196
- let additions = 0;
197
- let deletions = 0;
198
- for (const file of files) {
199
- for (const hunk of file.hunks) {
200
- for (const line of hunk.lines) {
201
- if (line.type === 'add') {
202
- additions += 1;
203
- }
204
- if (line.type === 'del') {
205
- deletions += 1;
206
- }
207
- }
208
- }
209
- }
210
- return { filesChanged: files.length, additions, deletions };
211
- }, [files]);
212
-
213
- const [submitting, setSubmitting] = useState(false);
214
- const [reviewMessage, setReviewMessage] = useState('');
215
- const [approvalToken, setApprovalToken] = useState('approved');
216
- const [mergeStrategy, setMergeStrategy] = useState<'merge_commit' | 'squash' | 'rebase'>(
217
- 'merge_commit',
218
- );
219
- const [diffMode, setDiffMode] = useState<DiffRenderMode>('line-by-line');
220
- const [selectedFileIndex, setSelectedFileIndex] = useState(0);
221
- const [selectedHunkIndex, setSelectedHunkIndex] = useState(0);
222
- const [diffShortcutsVisible, setDiffShortcutsVisible] = useState(false);
223
- const [inspectorOpen, setInspectorOpen] = useState(false);
224
- const [inspectorLoading, setInspectorLoading] = useState(false);
225
- const [inspectorError, setInspectorError] = useState<string | null>(null);
226
- const [inspectorPayload, setInspectorPayload] = useState<FileDiffPayload | null>(null);
227
- const [streamEntries, setStreamEntries] = useState<AgentLogEntry[]>(detail.log_entries ?? []);
228
- const [streamFollow, setStreamFollow] = useState(true);
229
- const [streamError, setStreamError] = useState<string | null>(null);
230
- const [consoleMessage, setConsoleMessage] = useState('');
231
- const [consoleTranscript, setConsoleTranscript] = useState<
232
- Array<{ id: string; timestamp: string; text: string }>
233
- >([]);
234
- const [lastMessageSentAt, setLastMessageSentAt] = useState<number>(0);
235
- const [timelineEntries, setTimelineEntries] = useState<WorkerEventEntry[]>([]);
236
- const [timelineRole, setTimelineRole] = useState<string>('');
237
- const [timelineValidity, setTimelineValidity] = useState<TimelineValidity>('all');
238
- const [timelineLoading, setTimelineLoading] = useState(false);
239
- const [timelineError, setTimelineError] = useState<string | null>(null);
240
- const [runtimeInspectorTab, setRuntimeInspectorTab] = useState<RuntimeInspectorTab>('activity');
241
- const [rawLogsEnabled, setRawLogsEnabled] = useState<boolean | null>(null);
242
- const [rawLogs, setRawLogs] = useState<RawLogFileMeta[]>([]);
243
- const [rawLogSelection, setRawLogSelection] = useState<string | null>(null);
244
- const [rawLogContent, setRawLogContent] = useState<string>('');
245
- const [rawLogError, setRawLogError] = useState<string | null>(null);
246
- const [isPhoneViewport, setIsPhoneViewport] = useState(false);
247
-
248
- const diffHtml = useMemo(() => {
249
- if (detail.diff.trim().length === 0) {
250
- return '';
251
- }
252
- const rendered = renderDiffHtml(detail.diff, {
253
- drawFileList: true,
254
- outputFormat: diffMode,
255
- matching: 'lines',
256
- renderNothingWhenEmpty: false,
257
- });
258
- return DOMPurify.sanitize(rendered, { USE_PROFILES: { html: true } });
259
- }, [detail.diff, diffMode]);
260
-
261
- const diffRegionRef = useRef<HTMLDivElement>(null);
262
- const diffContentRef = useRef<HTMLDivElement>(null);
263
- const logListRef = useRef<HTMLDivElement>(null);
264
- const streamCursorRef = useRef<string>('0');
265
-
266
- useEffect(() => {
267
- if (selectedFileIndex >= filePaths.length) {
268
- setSelectedFileIndex(0);
269
- setSelectedHunkIndex(0);
270
- }
271
- }, [filePaths.length, selectedFileIndex]);
272
-
273
- useEffect(() => {
274
- setStreamEntries(detail.log_entries ?? []);
275
- streamCursorRef.current = '0';
276
- }, [featureId, detail.log_entries]);
277
-
278
- useEffect(() => {
279
- if (!streamFollow) {
280
- return;
281
- }
282
- const container = logListRef.current;
283
- if (!container) {
284
- return;
285
- }
286
- container.scrollTop = container.scrollHeight;
287
- }, [streamEntries, streamFollow]);
288
-
289
- useEffect(() => {
290
- const container = diffContentRef.current;
291
- if (!container) {
292
- return;
293
- }
294
- const fileWrappers = container.querySelectorAll<HTMLElement>('.d2h-file-wrapper');
295
- const fileWrapper = fileWrappers[selectedFileIndex];
296
- if (!fileWrapper) {
297
- return;
298
- }
299
- const hunkHeaders = fileWrapper.querySelectorAll<HTMLElement>('tr.d2h-info');
300
- const target =
301
- hunkHeaders[selectedHunkIndex] ??
302
- hunkHeaders[Math.max(0, hunkHeaders.length - 1)] ??
303
- fileWrapper.querySelector<HTMLElement>('.d2h-file-header');
304
- target?.scrollIntoView({ block: 'nearest' });
305
- }, [selectedFileIndex, selectedHunkIndex, diffHtml]);
306
-
307
- useEffect(() => {
308
- const mediaQuery = window.matchMedia('(max-width: 680px)');
309
- const update = () => {
310
- setIsPhoneViewport(mediaQuery.matches);
311
- };
312
- update();
313
- mediaQuery.addEventListener('change', update);
314
- return () => {
315
- mediaQuery.removeEventListener('change', update);
316
- };
317
- }, []);
318
-
319
- useEffect(() => {
320
- if (!inspectorOpen || !isPhoneViewport) {
321
- return;
322
- }
323
- const previousOverflow = document.body.style.overflow;
324
- document.body.style.overflow = 'hidden';
325
- return () => {
326
- document.body.style.overflow = previousOverflow;
327
- };
328
- }, [inspectorOpen, isPhoneViewport]);
329
-
330
- useEffect(() => {
331
- const params = new URLSearchParams();
332
- params.set('cursor', streamCursorRef.current);
333
- if (project.length > 0) {
334
- params.set('project', project);
335
- }
336
- const eventSource = new EventSource(
337
- `/api/features/${encodeURIComponent(featureId)}/log-stream?${params.toString()}`,
338
- );
339
-
340
- const onStreamEvent = (event: MessageEvent<string>) => {
341
- let payload: LogStreamPayload;
342
- try {
343
- payload = JSON.parse(event.data) as LogStreamPayload;
344
- } catch {
345
- return;
346
- }
347
- if (payload.type === 'error') {
348
- setStreamError(payload.message ?? 'Log stream warning');
349
- return;
350
- }
351
- streamCursorRef.current = payload.cursor;
352
- if (payload.entries.length === 0) {
353
- return;
354
- }
355
- setStreamEntries((current) => appendCappedLogEntries(current, payload.entries));
356
- };
357
-
358
- eventSource.addEventListener('snapshot', onStreamEvent as EventListener);
359
- eventSource.addEventListener('append', onStreamEvent as EventListener);
360
- eventSource.addEventListener('error', () => {
361
- setStreamError('Disconnected from event stream');
362
- });
363
-
364
- return () => {
365
- eventSource.close();
366
- };
367
- }, [featureId, project]);
368
-
369
- const selectedFilePath = filePaths[selectedFileIndex]?.path ?? '';
370
- const selectedFileHunkCount = files[selectedFileIndex]?.hunks.length ?? 0;
371
- const activeRoleMarker = useMemo(
372
- () => resolveActiveRole(detail.feature.role_status),
373
- [detail.feature.role_status],
374
- );
375
- const sessionRows = useMemo(
376
- () => [
377
- {
378
- key: 'orchestrator',
379
- label: 'Orchestrator',
380
- sessionId: detail.feature.cluster?.orchestrator_session_id ?? 'unknown',
381
- },
382
- {
383
- key: 'planner',
384
- label: 'Planner',
385
- sessionId: detail.feature.cluster?.planner_session_id ?? 'unknown',
386
- },
387
- {
388
- key: 'builder',
389
- label: 'Builder',
390
- sessionId: detail.feature.cluster?.builder_session_id ?? 'unknown',
391
- },
392
- {
393
- key: 'qa',
394
- label: 'QA',
395
- sessionId: detail.feature.cluster?.qa_session_id ?? 'unknown',
396
- },
397
- ],
398
- [detail.feature.cluster],
399
- );
400
-
401
- const canSendConsoleMessage = useMemo(() => {
402
- return isConsoleSendAllowed({
403
- status: detail.feature.status,
404
- cluster: detail.feature.cluster,
405
- hasActiveRuntimeSession,
406
- submitting,
407
- message: consoleMessage,
408
- nowMs: Date.now(),
409
- lastMessageSentAtMs: lastMessageSentAt,
410
- });
411
- }, [
412
- detail.feature.cluster,
413
- detail.feature.status,
414
- hasActiveRuntimeSession,
415
- submitting,
416
- consoleMessage,
417
- lastMessageSentAt,
418
- ]);
419
-
420
- const runReviewAction = async (action: ReviewAction, payload: Record<string, unknown>) => {
421
- if (submitting) {
422
- return;
423
- }
424
- setSubmitting(true);
425
- try {
426
- const response = await callAction(action, featureId, project, payload);
427
- if (!response.ok) {
428
- addToast(response.error?.message ?? `${action} failed`, 'error');
429
- return;
430
- }
431
- addToast(`${action} completed`, 'success');
432
- await refreshStatus();
433
- await refreshDetail(featureId);
434
- } catch {
435
- addToast(`${action} failed`, 'error');
436
- } finally {
437
- setSubmitting(false);
438
- }
439
- };
440
-
441
- const openInspector = async (targetPath: string) => {
442
- if (!targetPath) {
443
- return;
444
- }
445
- setInspectorOpen(true);
446
- setInspectorLoading(true);
447
- setInspectorError(null);
448
- try {
449
- const params = new URLSearchParams();
450
- params.set('path', targetPath);
451
- if (project.length > 0) {
452
- params.set('project', project);
453
- }
454
- const response = await fetch(
455
- `/api/features/${encodeURIComponent(featureId)}/file-diff?${params.toString()}`,
456
- );
457
- const body = (await response.json()) as ApiEnvelope<FileDiffPayload>;
458
- if (!body.ok || !body.data) {
459
- setInspectorPayload(null);
460
- setInspectorError(body.error?.message ?? 'Unable to load file diff');
461
- return;
462
- }
463
- setInspectorPayload(body.data);
464
- } catch {
465
- setInspectorPayload(null);
466
- setInspectorError('Unable to load file diff');
467
- } finally {
468
- setInspectorLoading(false);
469
- }
470
- };
471
-
472
- const sendConsoleMessage = async () => {
473
- const message = consoleMessage.trim();
474
- if (message.length === 0) {
475
- return;
476
- }
477
- const timestamp = new Date().toISOString();
478
- setConsoleTranscript((current) => [
479
- ...current,
480
- {
481
- id: `${timestamp}:${current.length}`,
482
- timestamp,
483
- text: message,
484
- },
485
- ]);
486
- setConsoleMessage('');
487
- setLastMessageSentAt(Date.now());
488
- await runReviewAction('feature.send_message', { message });
489
- };
490
-
491
- const copySessionId = async (sessionId: string) => {
492
- if (!hasActiveSession(sessionId)) {
493
- addToast('No session id is available to copy', 'info');
494
- return;
495
- }
496
- if (!navigator.clipboard?.writeText) {
497
- addToast('Clipboard write is unavailable in this browser', 'error');
498
- return;
499
- }
500
- try {
501
- await navigator.clipboard.writeText(sessionId);
502
- addToast('Session id copied', 'success');
503
- } catch {
504
- addToast('Failed to copy session id', 'error');
505
- }
506
- };
507
-
508
- const fetchTimeline = async () => {
509
- setTimelineLoading(true);
510
- setTimelineError(null);
511
- try {
512
- const params = new URLSearchParams();
513
- params.set('limit', '100');
514
- if (timelineRole) {
515
- params.set('role', timelineRole);
516
- }
517
- if (timelineValidity !== 'all') {
518
- params.set('valid', timelineValidity);
519
- }
520
- if (project.length > 0) {
521
- params.set('project', project);
522
- }
523
- const response = await fetch(
524
- `/api/features/${encodeURIComponent(featureId)}/timeline?${params.toString()}`,
525
- );
526
- const body = (await response.json()) as ApiEnvelope<{ entries: WorkerEventEntry[] }>;
527
- if (!body.ok || !body.data) {
528
- setTimelineEntries([]);
529
- setTimelineError(body.error?.message ?? 'Unable to load timeline');
530
- return;
531
- }
532
- setTimelineEntries(body.data.entries);
533
- } catch {
534
- setTimelineEntries([]);
535
- setTimelineError('Unable to load timeline');
536
- } finally {
537
- setTimelineLoading(false);
538
- }
539
- };
540
-
541
- const fetchRawLogs = async () => {
542
- setRawLogError(null);
543
- try {
544
- const params = new URLSearchParams();
545
- params.set('limit', '100');
546
- if (project.length > 0) {
547
- params.set('project', project);
548
- }
549
- const response = await fetch(
550
- `/api/features/${encodeURIComponent(featureId)}/raw-logs?${params.toString()}`,
551
- );
552
- const body = (await response.json()) as ApiEnvelope<{
553
- enabled: boolean;
554
- files: RawLogFileMeta[];
555
- }>;
556
- if (!body.ok || !body.data) {
557
- setRawLogsEnabled(false);
558
- setRawLogs([]);
559
- setRawLogError(body.error?.message ?? 'Unable to load raw logs');
560
- return;
561
- }
562
- setRawLogsEnabled(body.data.enabled);
563
- setRawLogs(body.data.files);
564
- if (body.data.files.length > 0 && !rawLogSelection) {
565
- setRawLogSelection(body.data.files[0].filename);
566
- }
567
- } catch {
568
- setRawLogsEnabled(false);
569
- setRawLogs([]);
570
- setRawLogError('Unable to load raw logs');
571
- }
572
- };
573
-
574
- const fetchRawLogContent = async (filename: string) => {
575
- setRawLogContent('');
576
- setRawLogError(null);
577
- try {
578
- const suffix = project.length > 0 ? `?project=${encodeURIComponent(project)}` : '';
579
- const response = await fetch(
580
- `/api/features/${encodeURIComponent(featureId)}/raw-logs/${encodeURIComponent(filename)}${suffix}`,
581
- );
582
- const body = (await response.json()) as ApiEnvelope<{ filename: string; content: string }>;
583
- if (!body.ok || !body.data) {
584
- setRawLogError(body.error?.message ?? 'Unable to load raw log file');
585
- return;
586
- }
587
- setRawLogContent(body.data.content);
588
- } catch {
589
- setRawLogError('Unable to load raw log file');
590
- }
591
- };
592
-
593
- useEffect(() => {
594
- void fetchTimeline();
595
- }, [featureId, project, timelineRole, timelineValidity]);
596
-
597
- useEffect(() => {
598
- void fetchRawLogs();
599
- }, [featureId, project]);
600
-
601
- useEffect(() => {
602
- setRawLogSelection(null);
603
- setRawLogContent('');
604
- }, [featureId]);
605
-
606
- useEffect(() => {
607
- if (!rawLogSelection) {
608
- return;
609
- }
610
- void fetchRawLogContent(rawLogSelection);
611
- }, [rawLogSelection]);
612
-
613
- const onDiffKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {
614
- if (isEditableTarget(event.target)) {
615
- return;
616
- }
617
- if (filePaths.length === 0) {
618
- return;
619
- }
620
- if (event.key === 'j' || event.key === 'n') {
621
- event.preventDefault();
622
- setSelectedFileIndex((current) => Math.min(filePaths.length - 1, current + 1));
623
- setSelectedHunkIndex(0);
624
- return;
625
- }
626
- if (event.key === 'k' || event.key === 'p') {
627
- event.preventDefault();
628
- setSelectedFileIndex((current) => Math.max(0, current - 1));
629
- setSelectedHunkIndex(0);
630
- return;
631
- }
632
- if (event.key === 'o') {
633
- event.preventDefault();
634
- void openInspector(selectedFilePath);
635
- return;
636
- }
637
- if (event.key === '[') {
638
- event.preventDefault();
639
- setSelectedHunkIndex((current) => stepHunkIndex(current, -1, selectedFileHunkCount));
640
- return;
641
- }
642
- if (event.key === ']') {
643
- event.preventDefault();
644
- setSelectedHunkIndex((current) => stepHunkIndex(current, 1, selectedFileHunkCount));
645
- }
646
- };
647
-
648
- const onConsoleKeyDown = (event: ReactKeyboardEvent<HTMLTextAreaElement>) => {
649
- if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {
650
- event.preventDefault();
651
- void sendConsoleMessage();
652
- }
653
- };
654
-
655
- const trustBadgeClassName = (value: TrustClass): string => {
656
- if (value === 'Raw Provider Output') {
657
- return `${styles.trustBadge} ${styles.trustBadgeRaw}`;
658
- }
659
- if (value === 'Derived') {
660
- return `${styles.trustBadge} ${styles.trustBadgeDerived}`;
661
- }
662
- return `${styles.trustBadge} ${styles.trustBadgeStructured}`;
663
- };
664
-
665
- const renderTrustBadge = (value: TrustClass) => (
666
- <span className={trustBadgeClassName(value)}>{value}</span>
667
- );
668
-
669
- return (
670
- <div className={styles.reviewWorkspace}>
671
- <section className={styles.reviewLeftPane}>
672
- <div className={styles.section}>
673
- <div className={styles.reviewHeaderRow}>
674
- <div className={styles.reviewTitleWrap}>
675
- <h3 className={styles.sectionTitle}>Diff Overview</h3>
676
- {renderTrustBadge('Structured Artifact')}
677
- </div>
678
- <div className={styles.inlineActions}>
679
- <button
680
- type="button"
681
- className={styles.buttonGhost}
682
- onClick={() => setDiffShortcutsVisible((value) => !value)}
683
- >
684
- {diffShortcutsVisible ? 'Hide Hotkeys' : 'Show Hotkeys'}
685
- </button>
686
- <select
687
- className={styles.actionSelect}
688
- value={diffMode}
689
- onChange={(event) => setDiffMode(event.target.value as DiffRenderMode)}
690
- >
691
- <option value="line-by-line">Line by line</option>
692
- <option value="side-by-side">Side by side</option>
693
- </select>
694
- </div>
695
- </div>
696
- {diffShortcutsVisible ? (
697
- <p className={styles.metaText}>
698
- Hotkeys: j/n next file, k/p previous file, o open in inspector, [ / ] hunk
699
- </p>
700
- ) : null}
701
- <p className={styles.metaText}>
702
- {diffStats.filesChanged} files changed • +{diffStats.additions} / -{diffStats.deletions}
703
- </p>
704
- {filePaths.length === 0 ? (
705
- <p className={styles.metaText}>No changes in this feature worktree.</p>
706
- ) : (
707
- <>
708
- <div className={styles.reviewFileSelectorRow}>
709
- <select
710
- className={styles.actionSelect}
711
- value={selectedFilePath}
712
- onChange={(event) => {
713
- const index = filePaths.findIndex((file) => file.path === event.target.value);
714
- if (index >= 0) {
715
- setSelectedFileIndex(index);
716
- setSelectedHunkIndex(0);
717
- }
718
- }}
719
- >
720
- {filePaths.map((file) => (
721
- <option key={file.path} value={file.path}>
722
- {file.path} ({file.hunkCount} hunks)
723
- </option>
724
- ))}
725
- </select>
726
- <button
727
- type="button"
728
- className={styles.button}
729
- onClick={() => void openInspector(selectedFilePath)}
730
- >
731
- Open In Inspector
732
- </button>
733
- </div>
734
- <p className={styles.metaText}>
735
- File {selectedFileIndex + 1}/{filePaths.length} • Hunk{' '}
736
- {Math.min(selectedHunkIndex + 1, Math.max(1, selectedFileHunkCount))}
737
- </p>
738
- <div
739
- ref={diffRegionRef}
740
- className={styles.reviewDiffRegion}
741
- role="region"
742
- tabIndex={0}
743
- aria-label="Diff overview"
744
- onKeyDown={onDiffKeyDown}
745
- >
746
- <div
747
- ref={diffContentRef}
748
- className={styles.reviewDiffHtml}
749
- dangerouslySetInnerHTML={{ __html: diffHtml }}
750
- />
751
- </div>
752
- </>
753
- )}
754
- </div>
755
-
756
- {inspectorOpen && !isPhoneViewport ? (
757
- <div className={`${styles.section} ${styles.inspectorPanel}`}>
758
- <div className={styles.reviewHeaderRow}>
759
- <div className={styles.reviewTitleWrap}>
760
- <h3 className={styles.sectionTitle}>File Inspector</h3>
761
- {renderTrustBadge('Structured Artifact')}
762
- </div>
763
- <button
764
- type="button"
765
- className={styles.buttonGhost}
766
- onClick={() => setInspectorOpen(false)}
767
- >
768
- Close
769
- </button>
770
- </div>
771
- {inspectorLoading ? <p className={styles.metaText}>Loading file inspector...</p> : null}
772
- {inspectorError ? <p className={styles.metaText}>{inspectorError}</p> : null}
773
- {!inspectorLoading && !inspectorError && inspectorPayload ? (
774
- <div className={styles.reviewMonacoWrap}>
775
- <MonacoDiffEditor
776
- height="420px"
777
- language={inspectorPayload.language}
778
- original={inspectorPayload.original}
779
- modified={inspectorPayload.modified}
780
- options={{
781
- readOnly: true,
782
- renderSideBySide: true,
783
- minimap: { enabled: false },
784
- scrollBeyondLastLine: false,
785
- }}
786
- />
787
- </div>
788
- ) : null}
789
- </div>
790
- ) : null}
791
- </section>
792
-
793
- <aside className={styles.reviewRightPane}>
794
- <div className={`${styles.section} ${styles.reviewActionSection}`}>
795
- <div className={styles.reviewTitleWrap}>
796
- <h3 className={styles.sectionTitle}>Review Actions</h3>
797
- {renderTrustBadge('Derived')}
798
- </div>
799
- <label className={styles.label} htmlFor="review-message">
800
- Review message
801
- </label>
802
- <textarea
803
- id="review-message"
804
- className={styles.textarea}
805
- rows={3}
806
- value={reviewMessage}
807
- onChange={(event) => setReviewMessage(event.target.value)}
808
- />
809
- <label className={styles.label} htmlFor="approval-token">
810
- Approval token
811
- </label>
812
- <input
813
- id="approval-token"
814
- className={styles.input}
815
- value={approvalToken}
816
- onChange={(event) => setApprovalToken(event.target.value)}
817
- />
818
- <label className={styles.label} htmlFor="merge-strategy">
819
- Merge strategy
820
- </label>
821
- <select
822
- id="merge-strategy"
823
- className={styles.actionSelect}
824
- value={mergeStrategy}
825
- onChange={(event) =>
826
- setMergeStrategy(event.target.value as 'merge_commit' | 'squash' | 'rebase')
827
- }
828
- >
829
- <option value="merge_commit">Merge Commit</option>
830
- <option value="squash">Squash</option>
831
- <option value="rebase">Rebase</option>
832
- </select>
833
- <div className={styles.actionGrid}>
834
- <button
835
- type="button"
836
- className={`${styles.button} ${styles.buttonSuccess}`}
837
- disabled={submitting || approvalToken.trim().length === 0}
838
- onClick={() =>
839
- void runReviewAction('review.approve', {
840
- approval_token: approvalToken.trim(),
841
- merge_strategy: mergeStrategy,
842
- message: reviewMessage.trim(),
843
- })
844
- }
845
- >
846
- Approve
847
- </button>
848
- <button
849
- type="button"
850
- className={`${styles.button} ${styles.buttonDanger}`}
851
- disabled={submitting || reviewMessage.trim().length === 0}
852
- onClick={() => void runReviewAction('review.deny', { reason: reviewMessage.trim() })}
853
- >
854
- Deny
855
- </button>
856
- <button
857
- type="button"
858
- className={styles.button}
859
- disabled={submitting}
860
- onClick={() =>
861
- void runReviewAction('review.request_changes', { message: reviewMessage.trim() })
862
- }
863
- >
864
- Request Changes
865
- </button>
866
- </div>
867
- </div>
868
-
869
- <div className={styles.section}>
870
- <div className={styles.reviewHeaderRow}>
871
- <div className={styles.reviewTitleWrap}>
872
- <h3 className={styles.sectionTitle}>Agent Log Stream</h3>
873
- {renderTrustBadge('Structured Artifact')}
874
- </div>
875
- <button
876
- type="button"
877
- className={styles.buttonGhost}
878
- onClick={() => setStreamFollow((value) => !value)}
879
- >
880
- {streamFollow ? 'Pause Follow' : 'Resume Follow'}
881
- </button>
882
- </div>
883
- {streamError ? <p className={styles.metaText}>{streamError}</p> : null}
884
- <div ref={logListRef} className={styles.reviewLogList}>
885
- {streamEntries.map((entry) => (
886
- <div key={`${entry.id}:${entry.timestamp}`} className={styles.reviewLogEntry}>
887
- <span className={styles.reviewLogStamp}>{formatTimestamp(entry.timestamp)}</span>
888
- <span className={styles.reviewRoleBadge}>{entry.role}</span>
889
- <strong>{entry.actor}</strong>
890
- <span>{entry.text}</span>
891
- </div>
892
- ))}
893
- </div>
894
- </div>
895
-
896
- <div className={styles.section}>
897
- <div className={styles.reviewTitleWrap}>
898
- <h3 className={styles.sectionTitle}>Agent Console</h3>
899
- {renderTrustBadge('Derived')}
900
- </div>
901
- <textarea
902
- className={styles.textarea}
903
- rows={3}
904
- value={consoleMessage}
905
- placeholder="Send a directed message to the active agent session"
906
- onChange={(event) => setConsoleMessage(event.target.value)}
907
- onKeyDown={onConsoleKeyDown}
908
- />
909
- <p className={styles.metaText}>
910
- {hasActiveRuntimeSession
911
- ? 'Cmd/Ctrl + Enter to send. Minimum 1s between messages.'
912
- : 'No active runtime session is available for this feature.'}
913
- </p>
914
- <button
915
- type="button"
916
- className={styles.button}
917
- disabled={!canSendConsoleMessage}
918
- onClick={() => void sendConsoleMessage()}
919
- >
920
- Send Message
921
- </button>
922
- <div className={styles.reviewConsoleTranscript}>
923
- {consoleTranscript.map((entry) => (
924
- <div key={entry.id} className={styles.reviewTranscriptEntry}>
925
- <strong>You</strong>{' '}
926
- <span className={styles.metaText}>{formatTimestamp(entry.timestamp)}</span>
927
- <p>{entry.text}</p>
928
- </div>
929
- ))}
930
- </div>
931
- </div>
932
-
933
- <details className={styles.section}>
934
- <summary className={styles.sectionSummary}>Agent Session Status</summary>
935
- <p className={styles.trustLabelRow}>{renderTrustBadge('Structured Artifact')}</p>
936
- <p className={styles.metaText}>
937
- Active role:{' '}
938
- {activeRoleMarker.role && activeRoleMarker.status
939
- ? `${activeRoleMarker.role} (${activeRoleMarker.status})`
940
- : 'unknown'}
941
- </p>
942
- <div className={styles.reviewSessionRows}>
943
- {sessionRows.map((row) => {
944
- const isActiveRole = row.key === activeRoleMarker.role;
945
- const roleStatus =
946
- row.key === 'planner' || row.key === 'builder' || row.key === 'qa'
947
- ? (detail.feature.role_status?.[row.key] ?? 'unknown')
948
- : 'n/a';
949
- return (
950
- <div
951
- key={row.key}
952
- className={`${styles.reviewSessionRow}${isActiveRole ? ` ${styles.reviewSessionRowActive}` : ''}`}
953
- >
954
- <div className={styles.reviewSessionIdentity}>
955
- <span>{row.label}</span>
956
- <span className={styles.reviewSessionState}>{roleStatus}</span>
957
- {isActiveRole ? (
958
- <span className={styles.reviewSessionMarker}>active</span>
959
- ) : null}
960
- </div>
961
- <div className={styles.reviewSessionValue}>
962
- <span>{truncateSessionId(row.sessionId)}</span>
963
- <button
964
- type="button"
965
- className={styles.buttonGhost}
966
- disabled={!hasActiveSession(row.sessionId)}
967
- onClick={() => {
968
- void copySessionId(row.sessionId);
969
- }}
970
- >
971
- Copy
972
- </button>
973
- </div>
974
- </div>
975
- );
976
- })}
977
- </div>
978
- </details>
979
-
980
- <details
981
- className={styles.section}
982
- onToggle={(event) => {
983
- if ((event.currentTarget as HTMLDetailsElement).open) {
984
- void fetchTimeline();
985
- }
986
- }}
987
- >
988
- <summary className={styles.sectionSummary}>Runtime Inspector</summary>
989
- <p className={styles.trustLabelRow}>{renderTrustBadge('Structured Artifact')}</p>
990
- <div className={styles.runtimeInspectorTabs}>
991
- <button
992
- type="button"
993
- className={`${styles.runtimeInspectorTab}${runtimeInspectorTab === 'activity' ? ` ${styles.runtimeInspectorTabActive}` : ''}`}
994
- onClick={() => setRuntimeInspectorTab('activity')}
995
- >
996
- Activity
997
- </button>
998
- <button
999
- type="button"
1000
- className={`${styles.runtimeInspectorTab}${runtimeInspectorTab === 'checkpoints' ? ` ${styles.runtimeInspectorTabActive}` : ''}`}
1001
- onClick={() => setRuntimeInspectorTab('checkpoints')}
1002
- >
1003
- Checkpoints
1004
- </button>
1005
- </div>
1006
- {runtimeInspectorTab === 'activity' ? (
1007
- <>
1008
- <div className={styles.reviewTimelineFilters}>
1009
- <select
1010
- className={styles.actionSelect}
1011
- value={timelineRole}
1012
- onChange={(event) => setTimelineRole(event.target.value)}
1013
- >
1014
- <option value="">All roles</option>
1015
- <option value="planner">Planner</option>
1016
- <option value="builder">Builder</option>
1017
- <option value="qa">QA</option>
1018
- </select>
1019
- <select
1020
- className={styles.actionSelect}
1021
- value={timelineValidity}
1022
- onChange={(event) => setTimelineValidity(event.target.value as TimelineValidity)}
1023
- >
1024
- <option value="all">All validity</option>
1025
- <option value="valid">Valid only</option>
1026
- <option value="invalid">Invalid only</option>
1027
- </select>
1028
- </div>
1029
- {timelineLoading ? <p className={styles.metaText}>Loading timeline...</p> : null}
1030
- {timelineError ? <p className={styles.metaText}>{timelineError}</p> : null}
1031
- {!timelineLoading && !timelineError ? (
1032
- <div className={styles.reviewTimelineList}>
1033
- {timelineEntries.map((entry, index) => (
1034
- <div key={`${entry.ts}:${index}`} className={styles.reviewTimelineEntry}>
1035
- <span>{formatTimestamp(entry.ts)}</span>
1036
- <span>{entry.role}</span>
1037
- <span>{entry.event_type ?? 'event'}</span>
1038
- <span>{entry.valid ? 'valid' : 'invalid'}</span>
1039
- </div>
1040
- ))}
1041
- </div>
1042
- ) : null}
1043
- </>
1044
- ) : (
1045
- <>
1046
- <div className={styles.badgeRow}>
1047
- <span className={`${styles.badge} ${styles.badgeNeutral}`}>
1048
- mode: {detail.execution_mode ?? 'deterministic'}
1049
- </span>
1050
- <span className={`${styles.badge} ${styles.badgeNeutral}`}>
1051
- {detail.checkpoints?.length ?? 0} checkpoints
1052
- </span>
1053
- </div>
1054
- {detail.checkpoints && detail.checkpoints.length > 0 ? (
1055
- <div className={styles.reviewTimelineList}>
1056
- {detail.checkpoints.map((checkpoint) => (
1057
- <div
1058
- key={`${checkpoint.checkpoint_id}:${checkpoint.timestamp}`}
1059
- className={styles.reviewTimelineEntry}
1060
- >
1061
- <div className={styles.badgeRow}>
1062
- <span className={checkpointStatusBadge(checkpoint, styles)}>
1063
- {checkpoint.validation_status}
1064
- </span>
1065
- {checkpoint.severity ? (
1066
- <span className={checkpointSeverityBadge(checkpoint.severity, styles)}>
1067
- {checkpoint.severity}
1068
- </span>
1069
- ) : null}
1070
- </div>
1071
- <span>{formatCheckpointTimestamp(checkpoint.timestamp)}</span>
1072
- <span>{checkpoint.files_changed.length} files</span>
1073
- <span>{checkpoint.checkpoint_id}</span>
1074
- {checkpoint.violations.length > 0 ? (
1075
- <span>{checkpoint.violations[0]}</span>
1076
- ) : (
1077
- <span>no violations</span>
1078
- )}
1079
- </div>
1080
- ))}
1081
- </div>
1082
- ) : (
1083
- <p className={styles.metaText}>No checkpoints recorded for this feature yet.</p>
1084
- )}
1085
- </>
1086
- )}
1087
- </details>
1088
-
1089
- <details
1090
- className={styles.section}
1091
- onToggle={(event) => {
1092
- if ((event.currentTarget as HTMLDetailsElement).open) {
1093
- void fetchRawLogs();
1094
- }
1095
- }}
1096
- >
1097
- <summary className={styles.sectionSummary}>Raw Agent Output</summary>
1098
- <p className={styles.trustLabelRow}>{renderTrustBadge('Raw Provider Output')}</p>
1099
- <p className={styles.banner}>Raw output may contain sensitive data.</p>
1100
- {rawLogsEnabled === false ? (
1101
- <p className={styles.metaText}>Raw output is disabled by policy.</p>
1102
- ) : null}
1103
- {rawLogError ? <p className={styles.metaText}>{rawLogError}</p> : null}
1104
- {rawLogsEnabled ? (
1105
- <>
1106
- <select
1107
- className={styles.actionSelect}
1108
- value={rawLogSelection ?? ''}
1109
- onChange={(event) => setRawLogSelection(event.target.value)}
1110
- >
1111
- {rawLogs.map((file) => (
1112
- <option key={file.filename} value={file.filename}>
1113
- {file.filename} ({Math.round(file.size_bytes / 1024)} KB)
1114
- </option>
1115
- ))}
1116
- </select>
1117
- <pre className={styles.preContent}>{rawLogContent}</pre>
1118
- </>
1119
- ) : null}
1120
- </details>
1121
- </aside>
1122
-
1123
- {inspectorOpen && isPhoneViewport ? (
1124
- <div className={styles.mobileInspectorOverlay} role="dialog" aria-modal="true">
1125
- <div className={styles.mobileInspectorPanel}>
1126
- <div className={styles.reviewHeaderRow}>
1127
- <div className={styles.reviewTitleWrap}>
1128
- <h3 className={styles.sectionTitle}>File Inspector</h3>
1129
- {renderTrustBadge('Structured Artifact')}
1130
- </div>
1131
- <button
1132
- type="button"
1133
- className={styles.buttonGhost}
1134
- onClick={() => setInspectorOpen(false)}
1135
- >
1136
- Close
1137
- </button>
1138
- </div>
1139
- {inspectorLoading ? <p className={styles.metaText}>Loading file inspector...</p> : null}
1140
- {inspectorError ? <p className={styles.metaText}>{inspectorError}</p> : null}
1141
- {!inspectorLoading && !inspectorError && inspectorPayload ? (
1142
- <div className={styles.reviewMonacoWrap}>
1143
- <MonacoDiffEditor
1144
- height="calc(100dvh - 9.5rem)"
1145
- language={inspectorPayload.language}
1146
- original={inspectorPayload.original}
1147
- modified={inspectorPayload.modified}
1148
- options={{
1149
- readOnly: true,
1150
- renderSideBySide: true,
1151
- minimap: { enabled: false },
1152
- scrollBeyondLastLine: false,
1153
- }}
1154
- />
1155
- </div>
1156
- ) : null}
1157
- </div>
1158
- </div>
1159
- ) : null}
1160
- </div>
1161
- );
1162
- }