@voybio/ace-swarm 0.1.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 (334) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/LICENSE +186 -0
  3. package/README.md +229 -0
  4. package/assets/.agents/ACE/ACE-Init/AGENTS.md +210 -0
  5. package/assets/.agents/ACE/ACE-Init/instructions.md +118 -0
  6. package/assets/.agents/ACE/ACE_coders/AGENTS.md +154 -0
  7. package/assets/.agents/ACE/ACE_coders/INSTRUCTIONS.md +216 -0
  8. package/assets/.agents/ACE/AGENT_REGISTRY.md +70 -0
  9. package/assets/.agents/ACE/AGENT_REGISTRY_7.md +9 -0
  10. package/assets/.agents/ACE/DIRECTIVE_KERNEL.md +234 -0
  11. package/assets/.agents/ACE/UI/AGENTS.md +115 -0
  12. package/assets/.agents/ACE/UI/instructions.md +178 -0
  13. package/assets/.agents/ACE/VOS/ACE_VOS_MISSING_INFO_MATRIX.md +42 -0
  14. package/assets/.agents/ACE/VOS/AGENTS.md +72 -0
  15. package/assets/.agents/ACE/VOS/instructions.md +211 -0
  16. package/assets/.agents/ACE/agent-astgrep/AGENTS.md +123 -0
  17. package/assets/.agents/ACE/agent-astgrep/instructions.md +91 -0
  18. package/assets/.agents/ACE/agent-builder/AGENTS.md +172 -0
  19. package/assets/.agents/ACE/agent-builder/instructions.md +137 -0
  20. package/assets/.agents/ACE/agent-docs/AGENTS.md +159 -0
  21. package/assets/.agents/ACE/agent-docs/instructions.md +133 -0
  22. package/assets/.agents/ACE/agent-eval/AGENTS.md +46 -0
  23. package/assets/.agents/ACE/agent-eval/instructions.md +56 -0
  24. package/assets/.agents/ACE/agent-memory/AGENTS.md +49 -0
  25. package/assets/.agents/ACE/agent-memory/instructions.md +50 -0
  26. package/assets/.agents/ACE/agent-observability/AGENTS.md +46 -0
  27. package/assets/.agents/ACE/agent-observability/instructions.md +50 -0
  28. package/assets/.agents/ACE/agent-ops/AGENTS.md +201 -0
  29. package/assets/.agents/ACE/agent-ops/instructions.md +136 -0
  30. package/assets/.agents/ACE/agent-qa/AGENTS.md +189 -0
  31. package/assets/.agents/ACE/agent-qa/instructions.md +121 -0
  32. package/assets/.agents/ACE/agent-release/AGENTS.md +48 -0
  33. package/assets/.agents/ACE/agent-release/instructions.md +49 -0
  34. package/assets/.agents/ACE/agent-research/AGENTS.md +160 -0
  35. package/assets/.agents/ACE/agent-research/instructions.md +118 -0
  36. package/assets/.agents/ACE/agent-security/AGENTS.md +48 -0
  37. package/assets/.agents/ACE/agent-security/instructions.md +50 -0
  38. package/assets/.agents/ACE/agent-skeptic/AGENTS.md +178 -0
  39. package/assets/.agents/ACE/agent-skeptic/instructions.md +196 -0
  40. package/assets/.agents/ACE/agent-spec/AGENTS.md +169 -0
  41. package/assets/.agents/ACE/agent-spec/instructions.md +116 -0
  42. package/assets/.agents/ACE/orchestrator/AGENTS.md +365 -0
  43. package/assets/.agents/ACE/orchestrator/instructions.md +231 -0
  44. package/assets/.agents/skills/ace-orchestrator/SKILL.md +63 -0
  45. package/assets/.agents/skills/ace-orchestrator/references/engineering-bootstrap-playbook.md +360 -0
  46. package/assets/.agents/skills/astgrep-index/SKILL.md +58 -0
  47. package/assets/.agents/skills/codemunch/SKILL.md +65 -0
  48. package/assets/.agents/skills/codemunch/references/ast-driven-protocol.md +543 -0
  49. package/assets/.agents/skills/codesnipe/SKILL.md +64 -0
  50. package/assets/.agents/skills/codesnipe/references/dual-codebase-playbook.md +671 -0
  51. package/assets/.agents/skills/eval-harness/SKILL.md +203 -0
  52. package/assets/.agents/skills/handoff-lint/SKILL.md +164 -0
  53. package/assets/.agents/skills/incident-commander/SKILL.md +174 -0
  54. package/assets/.agents/skills/landing-review-watcher/SKILL.md +68 -0
  55. package/assets/.agents/skills/memory-curator/SKILL.md +179 -0
  56. package/assets/.agents/skills/problem-triage/SKILL.md +57 -0
  57. package/assets/.agents/skills/problem-triage/agents/openai.yaml +3 -0
  58. package/assets/.agents/skills/release-sentry/SKILL.md +189 -0
  59. package/assets/.agents/skills/risk-quant/SKILL.md +190 -0
  60. package/assets/.agents/skills/schema-forge/SKILL.md +174 -0
  61. package/assets/.agents/skills/skill-auditor/SKILL.md +52 -0
  62. package/assets/.agents/skills/state-auditor/SKILL.md +182 -0
  63. package/assets/.github/hooks/ace-copilot.json +68 -0
  64. package/assets/agent-state/ACE_WORKFLOW.md +131 -0
  65. package/assets/agent-state/ARTIFACT_MANIFEST.json +5 -0
  66. package/assets/agent-state/AST_GREP_COMMANDS.md +121 -0
  67. package/assets/agent-state/AST_GREP_INDEX.json +13 -0
  68. package/assets/agent-state/AST_GREP_INDEX.md +15 -0
  69. package/assets/agent-state/DECISIONS.md +7 -0
  70. package/assets/agent-state/EVIDENCE_LOG.md +7 -0
  71. package/assets/agent-state/HANDOFF.json +24 -0
  72. package/assets/agent-state/INTERFACE_REGISTRY.md +75 -0
  73. package/assets/agent-state/MODULES/gates/gate-autonomy.json +7 -0
  74. package/assets/agent-state/MODULES/gates/gate-completeness.json +7 -0
  75. package/assets/agent-state/MODULES/gates/gate-correctness.json +7 -0
  76. package/assets/agent-state/MODULES/gates/gate-evaluation.json +7 -0
  77. package/assets/agent-state/MODULES/gates/gate-operability.json +7 -0
  78. package/assets/agent-state/MODULES/gates/gate-security.json +7 -0
  79. package/assets/agent-state/MODULES/gates/gate-typescript-public-surface.json +7 -0
  80. package/assets/agent-state/MODULES/registry.json +41 -0
  81. package/assets/agent-state/MODULES/roles/capability-astgrep.json +49 -0
  82. package/assets/agent-state/MODULES/roles/capability-build.json +39 -0
  83. package/assets/agent-state/MODULES/roles/capability-docs.json +38 -0
  84. package/assets/agent-state/MODULES/roles/capability-eval.json +20 -0
  85. package/assets/agent-state/MODULES/roles/capability-memory.json +20 -0
  86. package/assets/agent-state/MODULES/roles/capability-observability.json +20 -0
  87. package/assets/agent-state/MODULES/roles/capability-ops.json +45 -0
  88. package/assets/agent-state/MODULES/roles/capability-qa.json +40 -0
  89. package/assets/agent-state/MODULES/roles/capability-release.json +21 -0
  90. package/assets/agent-state/MODULES/roles/capability-research.json +44 -0
  91. package/assets/agent-state/MODULES/roles/capability-security.json +21 -0
  92. package/assets/agent-state/MODULES/roles/capability-skeptic.json +48 -0
  93. package/assets/agent-state/MODULES/roles/capability-spec.json +42 -0
  94. package/assets/agent-state/MODULES/schemas/ACE_RUNTIME_PROFILE.schema.json +289 -0
  95. package/assets/agent-state/MODULES/schemas/ARTIFACT_MANIFEST.schema.json +185 -0
  96. package/assets/agent-state/MODULES/schemas/HANDOFF.agent-state.schema.json +124 -0
  97. package/assets/agent-state/MODULES/schemas/HANDOFF.schema.json +55 -0
  98. package/assets/agent-state/MODULES/schemas/RUNTIME_EXECUTOR_SESSION_REGISTRY.schema.json +290 -0
  99. package/assets/agent-state/MODULES/schemas/RUNTIME_TOOL_SPEC_REGISTRY.schema.json +144 -0
  100. package/assets/agent-state/MODULES/schemas/STATUS_EVENT.schema.json +84 -0
  101. package/assets/agent-state/MODULES/schemas/SWARM_HANDOFF.schema.json +138 -0
  102. package/assets/agent-state/MODULES/schemas/TRACKER_SNAPSHOT.schema.json +134 -0
  103. package/assets/agent-state/MODULES/schemas/VERICIFY_BRIDGE_SNAPSHOT.schema.json +157 -0
  104. package/assets/agent-state/MODULES/schemas/VERICIFY_PROCESS_POST_LOG.schema.json +93 -0
  105. package/assets/agent-state/MODULES/schemas/WORKSPACE_SESSION_REGISTRY.schema.json +133 -0
  106. package/assets/agent-state/PROVENANCE_LOG.md +28 -0
  107. package/assets/agent-state/QUALITY_GATES.md +15 -0
  108. package/assets/agent-state/RISKS.md +8 -0
  109. package/assets/agent-state/SCOPE.md +20 -0
  110. package/assets/agent-state/SKILL_CATALOG.md +48 -0
  111. package/assets/agent-state/STATUS.md +8 -0
  112. package/assets/agent-state/STATUS_EVENTS.ndjson +1 -0
  113. package/assets/agent-state/TASK.md +18 -0
  114. package/assets/agent-state/TEAL_CONFIG.md +117 -0
  115. package/assets/agent-state/handoff-registry.json +5 -0
  116. package/assets/agent-state/index-fingerprints.json +7 -0
  117. package/assets/agent-state/index.json +32 -0
  118. package/assets/agent-state/run-ledger.json +5 -0
  119. package/assets/agent-state/runtime-executor-sessions.json +5 -0
  120. package/assets/agent-state/runtime-tool-specs.json +5 -0
  121. package/assets/agent-state/runtime-workspaces.json +5 -0
  122. package/assets/agent-state/todo-state.json +7 -0
  123. package/assets/agent-state/tracker-snapshot.json +7 -0
  124. package/assets/agent-state/vericify/ace-bridge.json +60 -0
  125. package/assets/agent-state/vericify/process-posts.json +5 -0
  126. package/assets/instructions/ACE.instructions.md +187 -0
  127. package/assets/instructions/ACE_Coder.instructions.md +146 -0
  128. package/assets/instructions/ACE_UI.instructions.md +178 -0
  129. package/assets/instructions/ACE_VOS.instructions.md +211 -0
  130. package/assets/scripts/ace-hook-dispatch.mjs +538 -0
  131. package/assets/scripts/bootstrap-workspace.sh +27 -0
  132. package/assets/scripts/copilot-hook-dispatch.mjs +3 -0
  133. package/assets/scripts/eval-harness.sh +68 -0
  134. package/assets/scripts/render-mcp-configs.sh +396 -0
  135. package/assets/tasks/README.md +48 -0
  136. package/assets/tasks/SWARM_HANDOFF.example.json +53 -0
  137. package/assets/tasks/SWARM_HANDOFF.example_ui_to_coders.json +55 -0
  138. package/assets/tasks/SWARM_HANDOFF.example_vos_to_ui.json +55 -0
  139. package/assets/tasks/SWARM_HANDOFF.template.json +52 -0
  140. package/assets/tasks/cli_work_split.md +22 -0
  141. package/assets/tasks/lessons.md +17 -0
  142. package/assets/tasks/role_tasks.md +206 -0
  143. package/assets/tasks/todo.md +23 -0
  144. package/dist/ace-autonomy.d.ts +137 -0
  145. package/dist/ace-autonomy.js +472 -0
  146. package/dist/ace-context.d.ts +29 -0
  147. package/dist/ace-context.js +240 -0
  148. package/dist/ace-internal-tools.d.ts +8 -0
  149. package/dist/ace-internal-tools.js +76 -0
  150. package/dist/ace-server-instructions.d.ts +12 -0
  151. package/dist/ace-server-instructions.js +324 -0
  152. package/dist/agent-runtime/role-adapters.d.ts +29 -0
  153. package/dist/agent-runtime/role-adapters.js +573 -0
  154. package/dist/astgrep-index.d.ts +24 -0
  155. package/dist/astgrep-index.js +476 -0
  156. package/dist/cli.d.ts +3 -0
  157. package/dist/cli.js +591 -0
  158. package/dist/git-ops.d.ts +53 -0
  159. package/dist/git-ops.js +238 -0
  160. package/dist/handoff-registry.d.ts +71 -0
  161. package/dist/handoff-registry.js +422 -0
  162. package/dist/helpers.d.ts +126 -0
  163. package/dist/helpers.js +1687 -0
  164. package/dist/index-store.d.ts +51 -0
  165. package/dist/index-store.js +328 -0
  166. package/dist/index.d.ts +3 -0
  167. package/dist/index.js +7 -0
  168. package/dist/internal-tool-runtime.d.ts +21 -0
  169. package/dist/internal-tool-runtime.js +136 -0
  170. package/dist/job-scheduler.d.ts +175 -0
  171. package/dist/job-scheduler.js +1217 -0
  172. package/dist/kanban.d.ts +27 -0
  173. package/dist/kanban.js +339 -0
  174. package/dist/local-model-runtime.d.ts +40 -0
  175. package/dist/local-model-runtime.js +174 -0
  176. package/dist/model-bridge.d.ts +54 -0
  177. package/dist/model-bridge.js +587 -0
  178. package/dist/orchestrator-supervisor.d.ts +100 -0
  179. package/dist/orchestrator-supervisor.js +399 -0
  180. package/dist/problem-triage.d.ts +23 -0
  181. package/dist/problem-triage.js +448 -0
  182. package/dist/prompts.d.ts +7 -0
  183. package/dist/prompts.js +628 -0
  184. package/dist/public-surface.d.ts +30 -0
  185. package/dist/public-surface.js +316 -0
  186. package/dist/resources.d.ts +7 -0
  187. package/dist/resources.js +545 -0
  188. package/dist/run-ledger.d.ts +36 -0
  189. package/dist/run-ledger.js +257 -0
  190. package/dist/runtime-command.d.ts +18 -0
  191. package/dist/runtime-command.js +76 -0
  192. package/dist/runtime-executor.d.ts +104 -0
  193. package/dist/runtime-executor.js +985 -0
  194. package/dist/runtime-profile.d.ts +116 -0
  195. package/dist/runtime-profile.js +532 -0
  196. package/dist/runtime-tool-specs.d.ts +68 -0
  197. package/dist/runtime-tool-specs.js +527 -0
  198. package/dist/safe-edit.d.ts +52 -0
  199. package/dist/safe-edit.js +255 -0
  200. package/dist/schemas.d.ts +44 -0
  201. package/dist/schemas.js +830 -0
  202. package/dist/semantic-cache.d.ts +147 -0
  203. package/dist/semantic-cache.js +552 -0
  204. package/dist/semantic-hash.d.ts +83 -0
  205. package/dist/semantic-hash.js +346 -0
  206. package/dist/server.d.ts +10 -0
  207. package/dist/server.js +46 -0
  208. package/dist/shared.d.ts +136 -0
  209. package/dist/shared.js +269 -0
  210. package/dist/skill-auditor.d.ts +26 -0
  211. package/dist/skill-auditor.js +184 -0
  212. package/dist/skill-catalog.d.ts +60 -0
  213. package/dist/skill-catalog.js +305 -0
  214. package/dist/status-events.d.ts +40 -0
  215. package/dist/status-events.js +269 -0
  216. package/dist/store/ace-packed-store.d.ts +69 -0
  217. package/dist/store/ace-packed-store.js +434 -0
  218. package/dist/store/bootstrap-store.d.ts +46 -0
  219. package/dist/store/bootstrap-store.js +242 -0
  220. package/dist/store/catalog-builder.d.ts +21 -0
  221. package/dist/store/catalog-builder.js +68 -0
  222. package/dist/store/importer.d.ts +19 -0
  223. package/dist/store/importer.js +157 -0
  224. package/dist/store/knowledge-bake.d.ts +59 -0
  225. package/dist/store/knowledge-bake.js +339 -0
  226. package/dist/store/materializers/hook-context-materializer.d.ts +25 -0
  227. package/dist/store/materializers/hook-context-materializer.js +100 -0
  228. package/dist/store/materializers/host-file-materializer.d.ts +37 -0
  229. package/dist/store/materializers/host-file-materializer.js +271 -0
  230. package/dist/store/materializers/todo-syncer.d.ts +30 -0
  231. package/dist/store/materializers/todo-syncer.js +140 -0
  232. package/dist/store/materializers/vericify-projector.d.ts +38 -0
  233. package/dist/store/materializers/vericify-projector.js +239 -0
  234. package/dist/store/repositories/discovery-repository.d.ts +24 -0
  235. package/dist/store/repositories/discovery-repository.js +58 -0
  236. package/dist/store/repositories/handoff-repository.d.ts +31 -0
  237. package/dist/store/repositories/handoff-repository.js +67 -0
  238. package/dist/store/repositories/ledger-repository.d.ts +26 -0
  239. package/dist/store/repositories/ledger-repository.js +49 -0
  240. package/dist/store/repositories/runtime-kv-repository.d.ts +16 -0
  241. package/dist/store/repositories/runtime-kv-repository.js +36 -0
  242. package/dist/store/repositories/scheduler-repository.d.ts +50 -0
  243. package/dist/store/repositories/scheduler-repository.js +123 -0
  244. package/dist/store/repositories/session-repository.d.ts +33 -0
  245. package/dist/store/repositories/session-repository.js +82 -0
  246. package/dist/store/repositories/todo-repository.d.ts +31 -0
  247. package/dist/store/repositories/todo-repository.js +77 -0
  248. package/dist/store/repositories/tracker-repository.d.ts +25 -0
  249. package/dist/store/repositories/tracker-repository.js +43 -0
  250. package/dist/store/repositories/vericify-repository.d.ts +32 -0
  251. package/dist/store/repositories/vericify-repository.js +58 -0
  252. package/dist/store/skills-install.d.ts +28 -0
  253. package/dist/store/skills-install.js +86 -0
  254. package/dist/store/state-reader.d.ts +49 -0
  255. package/dist/store/state-reader.js +111 -0
  256. package/dist/store/store-artifacts.d.ts +12 -0
  257. package/dist/store/store-artifacts.js +138 -0
  258. package/dist/store/store-snapshot.d.ts +19 -0
  259. package/dist/store/store-snapshot.js +140 -0
  260. package/dist/store/topology-bake.d.ts +15 -0
  261. package/dist/store/topology-bake.js +215 -0
  262. package/dist/store/types.d.ts +155 -0
  263. package/dist/store/types.js +35 -0
  264. package/dist/store/workspace-snapshot.d.ts +26 -0
  265. package/dist/store/workspace-snapshot.js +107 -0
  266. package/dist/store/write-queue.d.ts +7 -0
  267. package/dist/store/write-queue.js +26 -0
  268. package/dist/todo-state.d.ts +41 -0
  269. package/dist/todo-state.js +399 -0
  270. package/dist/tools-agent.d.ts +7 -0
  271. package/dist/tools-agent.js +1542 -0
  272. package/dist/tools-discovery.d.ts +6 -0
  273. package/dist/tools-discovery.js +178 -0
  274. package/dist/tools-drift.d.ts +13 -0
  275. package/dist/tools-drift.js +357 -0
  276. package/dist/tools-files.d.ts +6 -0
  277. package/dist/tools-files.js +679 -0
  278. package/dist/tools-framework.d.ts +7 -0
  279. package/dist/tools-framework.js +1414 -0
  280. package/dist/tools-git.d.ts +6 -0
  281. package/dist/tools-git.js +183 -0
  282. package/dist/tools-handoff.d.ts +32 -0
  283. package/dist/tools-handoff.js +489 -0
  284. package/dist/tools-lifecycle.d.ts +6 -0
  285. package/dist/tools-lifecycle.js +205 -0
  286. package/dist/tools-memory.d.ts +6 -0
  287. package/dist/tools-memory.js +260 -0
  288. package/dist/tools-scheduler.d.ts +6 -0
  289. package/dist/tools-scheduler.js +228 -0
  290. package/dist/tools-skills.d.ts +3 -0
  291. package/dist/tools-skills.js +104 -0
  292. package/dist/tools-todo.d.ts +6 -0
  293. package/dist/tools-todo.js +154 -0
  294. package/dist/tools.d.ts +9 -0
  295. package/dist/tools.js +33 -0
  296. package/dist/tracker-adapters.d.ts +74 -0
  297. package/dist/tracker-adapters.js +776 -0
  298. package/dist/tracker-sync.d.ts +10 -0
  299. package/dist/tracker-sync.js +84 -0
  300. package/dist/tui/agent-runner.d.ts +137 -0
  301. package/dist/tui/agent-runner.js +466 -0
  302. package/dist/tui/agent-worker.d.ts +10 -0
  303. package/dist/tui/agent-worker.js +347 -0
  304. package/dist/tui/chat.d.ts +84 -0
  305. package/dist/tui/chat.js +368 -0
  306. package/dist/tui/commands.d.ts +57 -0
  307. package/dist/tui/commands.js +432 -0
  308. package/dist/tui/dashboard.d.ts +24 -0
  309. package/dist/tui/dashboard.js +110 -0
  310. package/dist/tui/index.d.ts +114 -0
  311. package/dist/tui/index.js +1059 -0
  312. package/dist/tui/input.d.ts +49 -0
  313. package/dist/tui/input.js +336 -0
  314. package/dist/tui/layout.d.ts +116 -0
  315. package/dist/tui/layout.js +367 -0
  316. package/dist/tui/ollama.d.ts +116 -0
  317. package/dist/tui/ollama.js +192 -0
  318. package/dist/tui/openai-compatible.d.ts +63 -0
  319. package/dist/tui/openai-compatible.js +370 -0
  320. package/dist/tui/provider-discovery.d.ts +59 -0
  321. package/dist/tui/provider-discovery.js +530 -0
  322. package/dist/tui/renderer.d.ts +166 -0
  323. package/dist/tui/renderer.js +304 -0
  324. package/dist/tui/tabs.d.ts +70 -0
  325. package/dist/tui/tabs.js +208 -0
  326. package/dist/tui/telemetry.d.ts +56 -0
  327. package/dist/tui/telemetry.js +106 -0
  328. package/dist/vericify-bridge.d.ts +146 -0
  329. package/dist/vericify-bridge.js +571 -0
  330. package/dist/vericify-context.d.ts +10 -0
  331. package/dist/vericify-context.js +72 -0
  332. package/dist/workspace-manager.d.ts +107 -0
  333. package/dist/workspace-manager.js +636 -0
  334. package/package.json +83 -0
@@ -0,0 +1,399 @@
1
+ import { existsSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ import { dispatchJobs, enqueueJob, getJobQueuePath } from "./job-scheduler.js";
5
+ import { appendVericifyProcessPostSafe, deriveWorkspaceVericifyRunRef, } from "./vericify-bridge.js";
6
+ function parseNumericStepId(stepId) {
7
+ const numeric = Number(stepId.replace(/^step-/, ""));
8
+ return Number.isFinite(numeric) && numeric > 0 ? numeric : 0;
9
+ }
10
+ function cloneSteps(steps) {
11
+ return steps.map((step) => ({ ...step }));
12
+ }
13
+ function nextStepId(steps) {
14
+ const max = steps.reduce((best, step) => Math.max(best, parseNumericStepId(step.step_id)), 0);
15
+ return `step-${max + 1}`;
16
+ }
17
+ function appendNewSteps(steps, additions) {
18
+ const next = [...steps];
19
+ for (const addition of additions) {
20
+ next.push({
21
+ ...addition,
22
+ step_id: nextStepId(next),
23
+ status: "planned",
24
+ });
25
+ }
26
+ return next;
27
+ }
28
+ function deriveStepEvidence(result) {
29
+ return Array.from(new Set(result.tool_calls.map((tool) => tool.tool)));
30
+ }
31
+ function isTaskPlan(value) {
32
+ return Boolean(value) && typeof value === "object" && Array.isArray(value.steps);
33
+ }
34
+ function extractVcxCursor(payload) {
35
+ if (!payload || typeof payload !== "object")
36
+ return undefined;
37
+ const candidate = payload;
38
+ const direct = candidate.vcx_cursor ?? candidate.cursor ?? candidate.next_cursor;
39
+ if (typeof direct === "string" && direct.trim()) {
40
+ return direct.trim();
41
+ }
42
+ const liveSignal = candidate.live_signal;
43
+ if (liveSignal && typeof liveSignal === "object") {
44
+ const nested = liveSignal.vcx_cursor;
45
+ if (typeof nested === "string" && nested.trim()) {
46
+ return nested.trim();
47
+ }
48
+ }
49
+ return undefined;
50
+ }
51
+ export function deriveTaskPlanStatus(plan) {
52
+ if (plan.steps.some((step) => step.status === "failed")) {
53
+ return "failed";
54
+ }
55
+ if (plan.steps.some((step) => step.status === "blocked")) {
56
+ return "blocked";
57
+ }
58
+ if (plan.steps.length > 0 && plan.steps.every((step) => step.status === "done" || step.status === "skipped")) {
59
+ return "done";
60
+ }
61
+ if (plan.steps.some((step) => step.status === "running")) {
62
+ return "executing";
63
+ }
64
+ if (plan.steps.every((step) => step.status === "planned")) {
65
+ return "planning";
66
+ }
67
+ if (plan.steps.some((step) => step.status === "done")) {
68
+ return "reviewing";
69
+ }
70
+ return plan.status;
71
+ }
72
+ function withDerivedStatus(plan) {
73
+ return {
74
+ ...plan,
75
+ steps: cloneSteps(plan.steps),
76
+ status: deriveTaskPlanStatus(plan),
77
+ };
78
+ }
79
+ export function createTaskPlan(input) {
80
+ return withDerivedStatus({
81
+ plan_id: `plan-${randomUUID()}`,
82
+ task: input.task,
83
+ steps: input.steps.map((step, index) => ({
84
+ ...step,
85
+ step_id: `step-${index + 1}`,
86
+ status: "planned",
87
+ })),
88
+ status: "planning",
89
+ execution_mode: input.execution_mode ?? "sequential",
90
+ vcx_cursor: input.vcx_cursor,
91
+ });
92
+ }
93
+ export function getReadyTaskSteps(plan) {
94
+ const completed = new Set(plan.steps
95
+ .filter((step) => step.status === "done" || step.status === "skipped")
96
+ .map((step) => step.step_id));
97
+ return plan.steps.filter((step) => {
98
+ if (step.status !== "planned")
99
+ return false;
100
+ const dependencies = step.depends_on ?? [];
101
+ return dependencies.every((dependency) => completed.has(dependency));
102
+ });
103
+ }
104
+ export function markTaskStepStatus(plan, stepId, status, patch = {}) {
105
+ return withDerivedStatus({
106
+ ...plan,
107
+ steps: plan.steps.map((step) => step.step_id === stepId
108
+ ? {
109
+ ...step,
110
+ ...patch,
111
+ status,
112
+ }
113
+ : step),
114
+ });
115
+ }
116
+ export function applyBridgeResultToStep(plan, stepId, result) {
117
+ const nextStatus = result.status === "completed"
118
+ ? "done"
119
+ : result.status === "needs_input" || result.status === "max_turns"
120
+ ? "blocked"
121
+ : "failed";
122
+ return withDerivedStatus({
123
+ ...plan,
124
+ steps: plan.steps.map((step) => step.step_id === stepId
125
+ ? {
126
+ ...step,
127
+ status: nextStatus,
128
+ result_summary: result.summary,
129
+ evidence_refs: deriveStepEvidence(result),
130
+ blocked_reason: nextStatus === "blocked" ? result.summary : undefined,
131
+ }
132
+ : step),
133
+ });
134
+ }
135
+ export function amendTaskPlan(plan, amendment) {
136
+ let steps = cloneSteps(plan.steps);
137
+ if (Array.isArray(amendment.remove_step_ids) && amendment.remove_step_ids.length > 0) {
138
+ const removeSet = new Set(amendment.remove_step_ids);
139
+ steps = steps.filter((step) => !removeSet.has(step.step_id));
140
+ }
141
+ if (Array.isArray(amendment.update_steps)) {
142
+ for (const update of amendment.update_steps) {
143
+ steps = steps.map((step) => step.step_id === update.step_id
144
+ ? {
145
+ ...step,
146
+ ...update.patch,
147
+ }
148
+ : step);
149
+ }
150
+ }
151
+ if (Array.isArray(amendment.prepend_steps) && amendment.prepend_steps.length > 0) {
152
+ const prepended = [];
153
+ for (const addition of amendment.prepend_steps) {
154
+ prepended.push({
155
+ ...addition,
156
+ step_id: nextStepId([...prepended, ...steps]),
157
+ status: "planned",
158
+ });
159
+ }
160
+ steps = [...prepended, ...steps];
161
+ }
162
+ if (Array.isArray(amendment.steps_to_add) && amendment.steps_to_add.length > 0) {
163
+ if (amendment.add_after_step_id) {
164
+ const insertionIndex = steps.findIndex((step) => step.step_id === amendment.add_after_step_id);
165
+ const injected = [];
166
+ for (const addition of amendment.steps_to_add) {
167
+ injected.push({
168
+ ...addition,
169
+ step_id: nextStepId([...steps, ...injected]),
170
+ status: "planned",
171
+ });
172
+ }
173
+ if (insertionIndex >= 0) {
174
+ steps = [
175
+ ...steps.slice(0, insertionIndex + 1),
176
+ ...injected,
177
+ ...steps.slice(insertionIndex + 1),
178
+ ];
179
+ }
180
+ else {
181
+ steps = [...steps, ...injected];
182
+ }
183
+ }
184
+ else {
185
+ steps = appendNewSteps(steps, amendment.steps_to_add);
186
+ }
187
+ }
188
+ if (Array.isArray(amendment.append_steps) && amendment.append_steps.length > 0) {
189
+ steps = appendNewSteps(steps, amendment.append_steps);
190
+ }
191
+ if (Array.isArray(amendment.reorder_step_ids) && amendment.reorder_step_ids.length > 0) {
192
+ const order = new Map(amendment.reorder_step_ids.map((stepId, index) => [stepId, index]));
193
+ steps = steps
194
+ .slice()
195
+ .sort((left, right) => {
196
+ const leftRank = order.get(left.step_id);
197
+ const rightRank = order.get(right.step_id);
198
+ if (leftRank === undefined && rightRank === undefined) {
199
+ return parseNumericStepId(left.step_id) - parseNumericStepId(right.step_id);
200
+ }
201
+ if (leftRank === undefined)
202
+ return 1;
203
+ if (rightRank === undefined)
204
+ return -1;
205
+ return leftRank - rightRank;
206
+ });
207
+ }
208
+ return withDerivedStatus({
209
+ ...plan,
210
+ steps,
211
+ execution_mode: amendment.execution_mode ?? plan.execution_mode,
212
+ vcx_cursor: amendment.vcx_cursor ?? plan.vcx_cursor,
213
+ });
214
+ }
215
+ export async function promoteParallelGroupToScheduler(plan, parallelGroup, owner = "capability-ops") {
216
+ const readySteps = getReadyTaskSteps(plan).filter((step) => step.parallel_group === parallelGroup);
217
+ if (readySteps.length === 0) {
218
+ return { plan, job_ids: [] };
219
+ }
220
+ if (!existsSync(dirname(getJobQueuePath()))) {
221
+ console.warn(`[orchestrator-supervisor] Scheduler state is not ready under ${dirname(getJobQueuePath())}; skipping promotion for parallel group '${parallelGroup}'.`);
222
+ return { plan, job_ids: [] };
223
+ }
224
+ const jobIds = [];
225
+ const nextSteps = cloneSteps(plan.steps);
226
+ for (const step of readySteps) {
227
+ const enqueued = await enqueueJob({
228
+ kind: step.role,
229
+ payload: {
230
+ task: step.task,
231
+ tool_scope: step.tool_scope ?? [],
232
+ plan_id: plan.plan_id,
233
+ step_id: step.step_id,
234
+ },
235
+ priority: "P1",
236
+ dependencies: step.depends_on?.map((dependency) => ({
237
+ kind: "handoff",
238
+ ref: dependency,
239
+ })) ?? [],
240
+ });
241
+ const jobId = enqueued.ack?.job_id;
242
+ if (!jobId)
243
+ continue;
244
+ jobIds.push(jobId);
245
+ const stepIndex = nextSteps.findIndex((candidate) => candidate.step_id === step.step_id);
246
+ if (stepIndex >= 0) {
247
+ nextSteps[stepIndex] = {
248
+ ...nextSteps[stepIndex],
249
+ status: "running",
250
+ job_id: jobId,
251
+ };
252
+ }
253
+ }
254
+ if (jobIds.length > 0) {
255
+ const refs = deriveWorkspaceVericifyRunRef({
256
+ session_id: plan.plan_id,
257
+ role: "orchestrator",
258
+ });
259
+ await dispatchJobs({ owner });
260
+ await appendVericifyProcessPostSafe({
261
+ run_id: refs.run_id,
262
+ branch_id: refs.branch_id,
263
+ lane_id: refs.lane_id,
264
+ agent_id: "agent-orchestrator",
265
+ kind: "progress",
266
+ summary: `Promoted parallel group '${parallelGroup}' to scheduler: ${jobIds.join(", ")}`,
267
+ tool_refs: ["enqueue_job", "dispatch_jobs"],
268
+ evidence_refs: jobIds,
269
+ });
270
+ }
271
+ return {
272
+ plan: withDerivedStatus({
273
+ ...plan,
274
+ execution_mode: "scheduled",
275
+ steps: nextSteps,
276
+ status: "executing",
277
+ }),
278
+ job_ids: jobIds,
279
+ };
280
+ }
281
+ export async function superviseTaskPlan(inputPlan, hooks) {
282
+ let plan = withDerivedStatus({
283
+ ...inputPlan,
284
+ steps: cloneSteps(inputPlan.steps),
285
+ });
286
+ const handoffIds = [];
287
+ const jobIds = [];
288
+ if (!plan.vcx_cursor && hooks.getVericifyContext) {
289
+ const contextPacket = await hooks.getVericifyContext(plan);
290
+ const vcxCursor = extractVcxCursor(contextPacket);
291
+ if (vcxCursor) {
292
+ plan = {
293
+ ...plan,
294
+ vcx_cursor: vcxCursor,
295
+ };
296
+ }
297
+ }
298
+ const maxIterations = Math.max(1, plan.steps.length * 4);
299
+ for (let iteration = 0; iteration < maxIterations; iteration += 1) {
300
+ const readySteps = getReadyTaskSteps(plan);
301
+ if (readySteps.length === 0) {
302
+ break;
303
+ }
304
+ if (plan.execution_mode === "scheduled") {
305
+ const readyGroup = readySteps.find((step) => step.parallel_group)?.parallel_group;
306
+ if (readyGroup) {
307
+ const promoted = await promoteParallelGroupToScheduler(plan, readyGroup);
308
+ jobIds.push(...promoted.job_ids);
309
+ plan = promoted.plan;
310
+ break;
311
+ }
312
+ }
313
+ const currentStep = readySteps[0];
314
+ plan = markTaskStepStatus(plan, currentStep.step_id, "running");
315
+ await hooks.emitStatusEvent?.({
316
+ status: "in_progress",
317
+ summary: `Running ${currentStep.step_id}: ${currentStep.task}`,
318
+ step_id: currentStep.step_id,
319
+ });
320
+ let handoffId;
321
+ if (hooks.createHandoff) {
322
+ const created = await hooks.createHandoff({ step: currentStep, plan });
323
+ handoffId = created.handoff_id;
324
+ handoffIds.push(handoffId);
325
+ plan = amendTaskPlan(plan, {
326
+ update_steps: [{ step_id: currentStep.step_id, patch: { handoff_id: handoffId } }],
327
+ });
328
+ await hooks.ackHandoff?.(handoffId, "accepted", `Started ${currentStep.step_id}`);
329
+ }
330
+ const result = await hooks.spawnStep(currentStep, plan);
331
+ plan = applyBridgeResultToStep(plan, currentStep.step_id, result);
332
+ if (handoffId) {
333
+ await hooks.ackHandoff?.(handoffId, result.status === "completed" ? "completed" : "blocked", result.summary);
334
+ }
335
+ let vericifyDelta;
336
+ if (plan.vcx_cursor && hooks.getVericifyDelta) {
337
+ vericifyDelta = await hooks.getVericifyDelta(plan.vcx_cursor, {
338
+ plan,
339
+ step: currentStep,
340
+ result,
341
+ });
342
+ const nextCursor = extractVcxCursor(vericifyDelta);
343
+ if (nextCursor) {
344
+ plan = {
345
+ ...plan,
346
+ vcx_cursor: nextCursor,
347
+ };
348
+ }
349
+ }
350
+ const amended = await hooks.amendPlan?.({
351
+ plan,
352
+ step: plan.steps.find((step) => step.step_id === currentStep.step_id) ?? currentStep,
353
+ result,
354
+ vericify_delta: vericifyDelta,
355
+ });
356
+ if (amended) {
357
+ plan = isTaskPlan(amended) ? withDerivedStatus(amended) : amendTaskPlan(plan, amended);
358
+ }
359
+ if (result.status === "failed" || result.status === "needs_input" || result.status === "max_turns") {
360
+ await hooks.openCircuitBreaker?.(result.summary, {
361
+ plan,
362
+ step: plan.steps.find((step) => step.step_id === currentStep.step_id) ?? currentStep,
363
+ result,
364
+ });
365
+ return {
366
+ plan: withDerivedStatus(plan),
367
+ handoff_ids: handoffIds,
368
+ job_ids: jobIds,
369
+ circuit_opened: true,
370
+ };
371
+ }
372
+ }
373
+ if (plan.steps.length > 0 && plan.steps.every((step) => step.status === "done" || step.status === "skipped")) {
374
+ const finalGate = await hooks.executeGates?.(plan);
375
+ await hooks.contextSnapshot?.(plan);
376
+ await hooks.emitStatusEvent?.({
377
+ status: "done",
378
+ summary: `Task plan ${plan.plan_id} completed`,
379
+ });
380
+ await hooks.closeCircuitBreaker?.("Task plan completed.", { plan });
381
+ return {
382
+ plan: {
383
+ ...plan,
384
+ status: "done",
385
+ },
386
+ handoff_ids: handoffIds,
387
+ job_ids: jobIds,
388
+ circuit_opened: false,
389
+ final_gate: finalGate,
390
+ };
391
+ }
392
+ return {
393
+ plan: withDerivedStatus(plan),
394
+ handoff_ids: handoffIds,
395
+ job_ids: jobIds,
396
+ circuit_opened: false,
397
+ };
398
+ }
399
+ //# sourceMappingURL=orchestrator-supervisor.js.map
@@ -0,0 +1,23 @@
1
+ import { type SkillCatalogEntry, type SkillCatalogSummary } from "./skill-catalog.js";
2
+ export type ProblemRoute = "existing_skill_fit" | "existing_skill_needs_patch" | "new_skill_warranted" | "missing_tool_or_permission" | "one_off_task";
3
+ export interface SkillMatch {
4
+ name: string;
5
+ source: SkillCatalogEntry["source"];
6
+ score: number;
7
+ reasons: string[];
8
+ }
9
+ export interface ProblemTriageResult {
10
+ request: string;
11
+ route: ProblemRoute;
12
+ confidence: number;
13
+ rationale: string[];
14
+ skill_matches: SkillMatch[];
15
+ missing_requirements: string[];
16
+ suggested_next_steps: string[];
17
+ proposed_skill_name?: string;
18
+ catalog_summary: SkillCatalogSummary;
19
+ }
20
+ export declare function triageProblemRequest(request: string, entries?: SkillCatalogEntry[]): ProblemTriageResult;
21
+ export declare function renderProblemTriageReport(result: ProblemTriageResult): string;
22
+ export declare function writeProblemTriageReport(result: ProblemTriageResult, targetPath?: string): string;
23
+ //# sourceMappingURL=problem-triage.d.ts.map