@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,1542 @@
1
+ /**
2
+ * Agent, skill, kernel, and task-pack tool registrations.
3
+ */
4
+ import { z } from "zod";
5
+ import { ALL_AGENTS, COMPOSABLE_AGENTS, SWARM_AGENTS, SWARM_SUBAGENT_MAP, classifyPathSource, getAgentInstructionPath, getAgentManifestPath, getKernelArtifactPath, isSwarmRole, listAvailableSkills, readAgentInstructions, readAgentManifest, readKernelArtifact, readSkillInstructions, readTaskArtifact, resolveWritableTaskPath, safeWrite, } from "./helpers.js";
6
+ import { loadRuntimeProfile, readRuntimePromptTemplate, readRuntimeProfileState, validateRuntimeProfileContent, } from "./runtime-profile.js";
7
+ import { getUnattendedSession, listUnattendedSessions, startUnattendedSession, stopUnattendedSession, validateRuntimeExecutorSessionRegistryContent, waitForUnattendedSession, } from "./runtime-executor.js";
8
+ import { executeRuntimeTool, listRuntimeToolSpecs, loadRuntimeToolRegistry, validateRuntimeToolRegistryContent, } from "./runtime-tool-specs.js";
9
+ import { createWorkspaceSession, listWorkspaceSessions, removeWorkspaceSession, resolveRuntimeWorkspaceRoot, validateManagedWorkspacePath, } from "./workspace-manager.js";
10
+ import { getTrackerAdapter, listTrackerAdapterKinds, loadTrackerSnapshot, validateTrackerSnapshotContent, } from "./tracker-adapters.js";
11
+ import { refreshTrackerSnapshot } from "./tracker-sync.js";
12
+ import { appendVericifyProcessPost, loadVericifyBridgeSnapshot, loadVericifyProcessPostLog, refreshVericifyBridgeSnapshot, validateVericifyBridgeSnapshotContent, validateVericifyProcessPostLogContent, } from "./vericify-bridge.js";
13
+ import { getRoleTitle, ROLE_ENUM, KERNEL_KEY_ENUM, ROLE_TITLES } from "./shared.js";
14
+ import { createDefaultModelBridgeClients, resolveLocalModelRuntime, runLocalModelTask, } from "./local-model-runtime.js";
15
+ import { executeAceInternalTool } from "./ace-internal-tools.js";
16
+ import { ModelBridge } from "./model-bridge.js";
17
+ import { getVericifyContextPacket, getVericifyDelta } from "./vericify-context.js";
18
+ import { createTaskPlan, superviseTaskPlan, } from "./orchestrator-supervisor.js";
19
+ function parseOptionalJsonObject(raw) {
20
+ if (!raw)
21
+ return {};
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
25
+ return parsed;
26
+ }
27
+ }
28
+ catch {
29
+ // fall through
30
+ }
31
+ return { raw_json: raw };
32
+ }
33
+ function parseUnknownJson(raw) {
34
+ if (typeof raw !== "string" || raw.trim().length === 0)
35
+ return {};
36
+ try {
37
+ return JSON.parse(raw);
38
+ }
39
+ catch {
40
+ return { raw };
41
+ }
42
+ }
43
+ function extractToolTextContent(result) {
44
+ if (!result || typeof result !== "object")
45
+ return "";
46
+ const content = Array.isArray(result.content) ? result.content : [];
47
+ return content
48
+ .filter((entry) => Boolean(entry) &&
49
+ typeof entry === "object" &&
50
+ entry.type === "text")
51
+ .map((entry) => String(entry.text ?? "").trim())
52
+ .filter(Boolean)
53
+ .join("\n");
54
+ }
55
+ function normalizeRoleCandidate(input) {
56
+ if (!input)
57
+ return undefined;
58
+ const normalized = input.trim().toLowerCase().replace(/^ace-/, "").replace(/[^a-z0-9]+/g, "");
59
+ const candidate = normalized === "coder" ? "coders" : normalized;
60
+ return ROLE_ENUM.options.includes(candidate)
61
+ ? candidate
62
+ : undefined;
63
+ }
64
+ function parseRoleFromRoutingSummary(summary) {
65
+ const match = summary.match(/\*\*Primary Swarm Agent\(s\):\*\*\s*([^\n]+)/i);
66
+ if (!match?.[1])
67
+ return undefined;
68
+ const firstAgent = match[1]
69
+ .split(",")
70
+ .map((entry) => entry.trim())
71
+ .find(Boolean);
72
+ return normalizeRoleCandidate(firstAgent);
73
+ }
74
+ function mapRoleToTaskType(role) {
75
+ switch (role) {
76
+ case "vos":
77
+ return "venture";
78
+ case "ui":
79
+ return "ux";
80
+ case "orchestrator":
81
+ return "mixed";
82
+ default:
83
+ return "engineering";
84
+ }
85
+ }
86
+ function extractHandoffId(text) {
87
+ const jsonMatch = text.match(/"handoff_id"\s*:\s*"([^"]+)"/);
88
+ if (jsonMatch?.[1])
89
+ return jsonMatch[1];
90
+ const lineMatch = text.match(/handoff_id:\s*([A-Z0-9-]+)/i);
91
+ return lineMatch?.[1];
92
+ }
93
+ async function buildOrchestratorSteps(task, sessionId) {
94
+ const routing = await executeAceInternalTool("route_task", { description: task, domain: "unknown" }, sessionId);
95
+ const routedRole = parseRoleFromRoutingSummary(extractToolTextContent(routing)) ?? "orchestrator";
96
+ return [{ role: routedRole, task }];
97
+ }
98
+ function appendUniqueNote(target, note) {
99
+ if (!target.includes(note)) {
100
+ target.push(note);
101
+ }
102
+ }
103
+ function buildDefaultOrchestratorAmendment(input) {
104
+ if (input.result.status !== "completed" || input.step.role !== "coders") {
105
+ return undefined;
106
+ }
107
+ const currentIndex = input.plan.steps.findIndex((step) => step.step_id === input.step.step_id);
108
+ if (currentIndex < 0) {
109
+ return undefined;
110
+ }
111
+ const downstreamSteps = input.plan.steps.slice(currentIndex + 1);
112
+ const hasValidationStep = downstreamSteps.some((step) => step.role === "qa" || step.role === "docs");
113
+ if (hasValidationStep) {
114
+ return undefined;
115
+ }
116
+ return {
117
+ steps_to_add: [
118
+ {
119
+ role: "qa",
120
+ task: `Validate completed work for ${input.step.step_id}: ${input.step.task}`,
121
+ depends_on: [input.step.step_id],
122
+ tool_scope: ["run_tests", "execute_gates", "git_diff"],
123
+ },
124
+ ],
125
+ add_after_step_id: input.step.step_id,
126
+ };
127
+ }
128
+ async function tryVericifyPacket(factory, onWarning) {
129
+ try {
130
+ return await factory();
131
+ }
132
+ catch (error) {
133
+ const message = error instanceof Error ? error.message : String(error);
134
+ onWarning?.(message);
135
+ return undefined;
136
+ }
137
+ }
138
+ export function registerAgentTools(server) {
139
+ // ── Agent Instructions & Manifests ────────────────────────────────
140
+ server.tool("get_agent_instructions", "Load the full instruction file for a specific ACE agent role", {
141
+ role: ROLE_ENUM.describe("Which agent role to load"),
142
+ }, async ({ role }) => {
143
+ const content = readAgentInstructions(role);
144
+ const sourcePath = getAgentInstructionPath(role);
145
+ const source = classifyPathSource(sourcePath);
146
+ return {
147
+ content: [
148
+ {
149
+ type: "text",
150
+ text: [
151
+ `# ACE-${role.toUpperCase()} Instructions`,
152
+ "",
153
+ `Source: ${source}${sourcePath ? ` (${sourcePath})` : ""}`,
154
+ "",
155
+ content,
156
+ ].join("\n"),
157
+ },
158
+ ],
159
+ };
160
+ });
161
+ server.tool("get_agent_manifest", "Load AGENTS manifest-style instructions for a specific ACE role", {
162
+ role: ROLE_ENUM.describe("Which agent role to load"),
163
+ }, async ({ role }) => {
164
+ const content = readAgentManifest(role);
165
+ const sourcePath = getAgentManifestPath(role);
166
+ const source = classifyPathSource(sourcePath);
167
+ return {
168
+ content: [
169
+ {
170
+ type: "text",
171
+ text: [
172
+ `# ACE-${role.toUpperCase()} Manifest`,
173
+ "",
174
+ `Source: ${source}${sourcePath ? ` (${sourcePath})` : ""}`,
175
+ "",
176
+ content,
177
+ ].join("\n"),
178
+ },
179
+ ],
180
+ };
181
+ });
182
+ server.tool("get_all_agents_summary", "Get an overview of the unified swarm + composable ACE agent system and source files", {}, async () => {
183
+ const swarmLabel = [...SWARM_AGENTS].map((role) => `ACE-${getRoleTitle(role)}`);
184
+ const composableLabel = [...COMPOSABLE_AGENTS].map((role) => `ACE-${getRoleTitle(role)}`);
185
+ const blocks = ALL_AGENTS.map((role) => {
186
+ const instructionPath = getAgentInstructionPath(role);
187
+ const manifestPath = getAgentManifestPath(role);
188
+ const group = isSwarmRole(role) ? "swarm" : "composable";
189
+ const linkage = isSwarmRole(role)
190
+ ? `- Composable subagents: ${SWARM_SUBAGENT_MAP[role].join(", ")}`
191
+ : `- Available to swarm agents: ${[...SWARM_AGENTS].join(", ")}`;
192
+ return [
193
+ `## ACE-${getRoleTitle(role)}`,
194
+ `- Group: ${group}`,
195
+ `- Instruction source: ${classifyPathSource(instructionPath)}${instructionPath ? ` (${instructionPath})` : ""}`,
196
+ `- Manifest source: ${classifyPathSource(manifestPath)}${manifestPath ? ` (${manifestPath})` : ""}`,
197
+ linkage,
198
+ ].join("\n");
199
+ });
200
+ const kernelKeys = ["directive_kernel", "agent_registry"];
201
+ const kernelLines = kernelKeys.map((key) => {
202
+ const path = getKernelArtifactPath(key);
203
+ return `- ${key}: ${classifyPathSource(path)}${path ? ` (${path})` : ""}`;
204
+ });
205
+ return {
206
+ content: [
207
+ {
208
+ type: "text",
209
+ text: [
210
+ "# ACE Unified Agent Summary",
211
+ "",
212
+ "## Agent Groups",
213
+ `- Swarm agents: ${swarmLabel.join(", ")}`,
214
+ `- Composable agents: ${composableLabel.join(", ")}`,
215
+ "",
216
+ ...blocks,
217
+ "",
218
+ "## Shared Kernel Artifacts",
219
+ ...kernelLines,
220
+ "",
221
+ "## Pipelines",
222
+ "- standard: Swarm entrypoint -> ASTGrep -> Research -> Spec -> Builder -> QA -> Docs (Skeptic sidecar)",
223
+ "- high_certainty: Swarm entrypoint -> ASTGrep -> Spec -> Builder -> QA -> Security -> Eval -> Release",
224
+ "- high_ambiguity: Swarm entrypoint -> ASTGrep -> Research (continuous) -> Spec -> Builder with Ops + Memory sidecars",
225
+ ].join("\n"),
226
+ },
227
+ ],
228
+ };
229
+ });
230
+ server.tool("get_kernel_artifact", "Load shared ACE kernel artifacts that harmonize swarm and composable agents", {
231
+ key: KERNEL_KEY_ENUM.describe("Kernel artifact key: directive_kernel or agent_registry"),
232
+ }, async ({ key }) => {
233
+ const path = getKernelArtifactPath(key);
234
+ const source = classifyPathSource(path);
235
+ return {
236
+ content: [
237
+ {
238
+ type: "text",
239
+ text: [
240
+ `# ACE Kernel Artifact: ${key}`,
241
+ "",
242
+ `Source: ${source}${path ? ` (${path})` : ""}`,
243
+ "",
244
+ readKernelArtifact(key),
245
+ ].join("\n"),
246
+ },
247
+ ],
248
+ };
249
+ });
250
+ server.tool("get_runtime_profile", "Load the active ACE runtime profile and prompt template state", {
251
+ path: z
252
+ .string()
253
+ .optional()
254
+ .describe("Optional workspace-relative path to inspect instead of the canonical runtime profile"),
255
+ }, async ({ path }) => {
256
+ const current = loadRuntimeProfile(path);
257
+ const active = readRuntimeProfileState();
258
+ return {
259
+ content: [
260
+ {
261
+ type: "text",
262
+ text: [
263
+ "# ACE Runtime Profile",
264
+ "",
265
+ `Current load: ${current.ok ? "valid" : "INVALID"}`,
266
+ `Current source: ${current.source}`,
267
+ `Current path: ${current.path}`,
268
+ current.ok
269
+ ? `Current cache: ${current.cache_hit ? "hit" : "miss"}`
270
+ : "",
271
+ !current.ok && current.errors.length > 0
272
+ ? ["## Current Errors", ...current.errors.map((error) => `- ${error}`)].join("\n")
273
+ : "",
274
+ "",
275
+ `Active source: ${active.source}`,
276
+ `Active path: ${active.path}`,
277
+ "",
278
+ "## Active Profile",
279
+ "```json",
280
+ JSON.stringify(active.profile, null, 2),
281
+ "```",
282
+ "",
283
+ "## Active Prompt Template",
284
+ "```md",
285
+ readRuntimePromptTemplate(),
286
+ "```",
287
+ ]
288
+ .filter(Boolean)
289
+ .join("\n"),
290
+ },
291
+ ],
292
+ };
293
+ });
294
+ server.tool("validate_runtime_profile", "Validate ACE runtime profile markdown content or the current ACE_WORKFLOW.md file", {
295
+ content: z
296
+ .string()
297
+ .optional()
298
+ .describe("Raw ACE_WORKFLOW.md content. If omitted, validate the selected file path."),
299
+ path: z
300
+ .string()
301
+ .optional()
302
+ .describe("Optional workspace-relative path to validate when content is omitted."),
303
+ }, async ({ content, path }) => {
304
+ const validation = typeof content === "string"
305
+ ? validateRuntimeProfileContent(content)
306
+ : loadRuntimeProfile(path);
307
+ return {
308
+ content: [
309
+ {
310
+ type: "text",
311
+ text: validation.ok
312
+ ? `✅ Runtime profile is valid (${validation.schema})`
313
+ : [
314
+ "❌ Runtime profile failed validation.",
315
+ `Schema: ${validation.schema}`,
316
+ ...validation.errors.map((error) => `- ${error}`),
317
+ ].join("\n"),
318
+ },
319
+ ],
320
+ };
321
+ });
322
+ server.tool("get_runtime_tool_specs", "Load the active runtime-configured external tool spec registry", {
323
+ path: z
324
+ .string()
325
+ .optional()
326
+ .describe("Optional workspace-relative path to inspect instead of the configured runtime tool registry"),
327
+ }, async ({ path }) => {
328
+ const result = loadRuntimeToolRegistry(path);
329
+ return {
330
+ content: [
331
+ {
332
+ type: "text",
333
+ text: result.ok
334
+ ? JSON.stringify({
335
+ schema: result.schema,
336
+ path: result.path,
337
+ source: result.source,
338
+ registry: result.registry,
339
+ }, null, 2)
340
+ : [
341
+ "❌ Runtime tool registry failed validation.",
342
+ `Schema: ${result.schema}`,
343
+ `Path: ${result.path}`,
344
+ ...((result.errors ?? []).map((error) => `- ${error}`)),
345
+ ].join("\n"),
346
+ },
347
+ ],
348
+ };
349
+ });
350
+ server.tool("validate_runtime_tool_specs", "Validate runtime-tool-specs.json content or the active runtime tool registry file", {
351
+ content: z
352
+ .string()
353
+ .optional()
354
+ .describe("Raw runtime-tool-specs.json content. If omitted, validate the selected file path."),
355
+ path: z
356
+ .string()
357
+ .optional()
358
+ .describe("Optional workspace-relative path to validate when content is omitted."),
359
+ }, async ({ content, path }) => {
360
+ const validation = typeof content === "string"
361
+ ? validateRuntimeToolRegistryContent(content)
362
+ : loadRuntimeToolRegistry(path);
363
+ return {
364
+ content: [
365
+ {
366
+ type: "text",
367
+ text: validation.ok
368
+ ? `✅ Runtime tool registry is valid (${validation.schema})`
369
+ : [
370
+ "❌ Runtime tool registry failed validation.",
371
+ `Schema: ${validation.schema}`,
372
+ ...((validation.errors ?? []).map((error) => `- ${error}`)),
373
+ ].join("\n"),
374
+ },
375
+ ],
376
+ };
377
+ });
378
+ server.tool("list_runtime_tool_specs", "List runtime-configured external tool specs", {}, async () => ({
379
+ content: [
380
+ {
381
+ type: "text",
382
+ text: JSON.stringify(listRuntimeToolSpecs().map((tool) => ({
383
+ name: tool.name,
384
+ description: tool.description,
385
+ executor: {
386
+ command: tool.executor.command,
387
+ cwd: tool.executor.cwd ?? null,
388
+ timeout_ms: tool.executor.timeout_ms ?? null,
389
+ },
390
+ })), null, 2),
391
+ },
392
+ ],
393
+ }));
394
+ server.tool("execute_runtime_tool", "Execute a runtime-configured external tool spec by name", {
395
+ name: z.string().describe("Runtime tool spec name"),
396
+ input_json: z
397
+ .string()
398
+ .optional()
399
+ .describe("JSON payload validated against the tool input schema"),
400
+ workspace_path: z
401
+ .string()
402
+ .optional()
403
+ .describe("Optional workspace/session path used as the execution root"),
404
+ session_id: z
405
+ .string()
406
+ .optional()
407
+ .describe("Optional unattended session id for provenance"),
408
+ turn_number: z
409
+ .number()
410
+ .int()
411
+ .positive()
412
+ .optional()
413
+ .describe("Optional unattended session turn number for provenance"),
414
+ }, async ({ name, input_json, workspace_path, session_id, turn_number }) => {
415
+ const result = await executeRuntimeTool(name, parseUnknownJson(input_json), {
416
+ workspace_path,
417
+ session_id,
418
+ turn_number,
419
+ });
420
+ return {
421
+ content: [
422
+ {
423
+ type: "text",
424
+ text: JSON.stringify(result, null, 2),
425
+ },
426
+ ],
427
+ };
428
+ });
429
+ server.tool("list_unattended_sessions", "List unattended ACE runtime executor sessions", {}, async () => ({
430
+ content: [
431
+ {
432
+ type: "text",
433
+ text: JSON.stringify(listUnattendedSessions(), null, 2),
434
+ },
435
+ ],
436
+ }));
437
+ server.tool("get_unattended_session", "Get a single unattended ACE runtime executor session by id", {
438
+ session_id: z.string().describe("Unattended session id"),
439
+ }, async ({ session_id }) => ({
440
+ content: [
441
+ {
442
+ type: "text",
443
+ text: JSON.stringify(getUnattendedSession(session_id) ?? {
444
+ error: `Unknown unattended session: ${session_id}`,
445
+ }, null, 2),
446
+ },
447
+ ],
448
+ }));
449
+ server.tool("validate_unattended_session_registry", "Validate runtime-executor-sessions.json content or the active unattended session registry file", {
450
+ content: z
451
+ .string()
452
+ .optional()
453
+ .describe("Raw runtime-executor-sessions.json content. If omitted, validate the active registry file."),
454
+ }, async ({ content }) => {
455
+ const validation = typeof content === "string"
456
+ ? validateRuntimeExecutorSessionRegistryContent(content)
457
+ : validateRuntimeExecutorSessionRegistryContent(JSON.stringify(listUnattendedSessions(), null, 2));
458
+ return {
459
+ content: [
460
+ {
461
+ type: "text",
462
+ text: validation.ok
463
+ ? `✅ Unattended session registry is valid (${validation.schema})`
464
+ : [
465
+ "❌ Unattended session registry failed validation.",
466
+ `Schema: ${validation.schema}`,
467
+ ...((validation.errors ?? []).map((error) => `- ${error}`)),
468
+ ].join("\n"),
469
+ },
470
+ ],
471
+ };
472
+ });
473
+ server.tool("start_unattended_session", "Start a managed unattended execution session using ACE_WORKFLOW.md", {
474
+ task: z.string().describe("Primary objective or task for the unattended session"),
475
+ context_json: z
476
+ .string()
477
+ .optional()
478
+ .describe("Optional JSON object merged into the turn request context"),
479
+ workspace_name: z
480
+ .string()
481
+ .optional()
482
+ .describe("Optional logical workspace name for the managed session"),
483
+ workspace_path: z
484
+ .string()
485
+ .optional()
486
+ .describe("Optional explicit managed workspace path"),
487
+ objective_id: z.string().optional().describe("Optional linked objective id"),
488
+ tracker_item_id: z.string().optional().describe("Optional linked tracker item id"),
489
+ max_turns: z
490
+ .number()
491
+ .int()
492
+ .positive()
493
+ .optional()
494
+ .describe("Optional max-turn override"),
495
+ turn_timeout_ms: z
496
+ .number()
497
+ .int()
498
+ .positive()
499
+ .optional()
500
+ .describe("Optional per-turn timeout override in milliseconds"),
501
+ auto_cleanup: z
502
+ .boolean()
503
+ .optional()
504
+ .describe("If false, keep the managed workspace session after completion"),
505
+ }, async ({ task, context_json, workspace_name, workspace_path, objective_id, tracker_item_id, max_turns, turn_timeout_ms, auto_cleanup, }) => {
506
+ const result = await startUnattendedSession({
507
+ task,
508
+ context: parseOptionalJsonObject(context_json),
509
+ workspace_name,
510
+ workspace_path,
511
+ objective_id,
512
+ tracker_item_id,
513
+ max_turns,
514
+ turn_timeout_ms,
515
+ auto_cleanup,
516
+ });
517
+ return {
518
+ content: [
519
+ {
520
+ type: "text",
521
+ text: result.ok
522
+ ? [
523
+ "✅ Unattended session started",
524
+ `Registry: ${result.registry_path}`,
525
+ "```json",
526
+ JSON.stringify(result.session, null, 2),
527
+ "```",
528
+ ].join("\n")
529
+ : [
530
+ "❌ Unattended session failed to start",
531
+ result.error ?? "Unknown error",
532
+ ].join("\n"),
533
+ },
534
+ ],
535
+ };
536
+ });
537
+ server.tool("wait_for_unattended_session", "Wait for an unattended runtime session to reach a terminal state", {
538
+ session_id: z.string().describe("Unattended session id"),
539
+ timeout_ms: z
540
+ .number()
541
+ .int()
542
+ .positive()
543
+ .optional()
544
+ .describe("How long to wait before timing out"),
545
+ }, async ({ session_id, timeout_ms }) => {
546
+ const result = await waitForUnattendedSession(session_id, timeout_ms);
547
+ return {
548
+ content: [
549
+ {
550
+ type: "text",
551
+ text: JSON.stringify(result, null, 2),
552
+ },
553
+ ],
554
+ };
555
+ });
556
+ server.tool("stop_unattended_session", "Stop an active unattended runtime session", {
557
+ session_id: z.string().describe("Unattended session id"),
558
+ }, async ({ session_id }) => {
559
+ const result = await stopUnattendedSession(session_id);
560
+ return {
561
+ content: [
562
+ {
563
+ type: "text",
564
+ text: JSON.stringify(result, null, 2),
565
+ },
566
+ ],
567
+ };
568
+ });
569
+ server.tool("run_local_model", "Offload a governed ACE subtask to a local model bridge and return the result", {
570
+ task: z.string().describe("Task to execute with the local ACE model bridge"),
571
+ role: ROLE_ENUM.optional().describe("Optional ACE role; defaults to route_task"),
572
+ max_turns: z
573
+ .number()
574
+ .int()
575
+ .positive()
576
+ .optional()
577
+ .describe("Optional max-turn override; defaults by role"),
578
+ tier: z
579
+ .enum(["auto", "full", "compressed", "brief"])
580
+ .optional()
581
+ .describe("Prompt packing tier; default auto-detects from role and model"),
582
+ provider: z
583
+ .string()
584
+ .optional()
585
+ .describe("Optional provider override; otherwise discovered from local runtime context"),
586
+ model: z
587
+ .string()
588
+ .optional()
589
+ .describe("Optional model override; otherwise discovered from local runtime context"),
590
+ base_url: z
591
+ .string()
592
+ .optional()
593
+ .describe("Optional local runtime base URL override"),
594
+ ollama_url: z
595
+ .string()
596
+ .optional()
597
+ .describe("Optional Ollama base URL override (legacy alias for base_url)"),
598
+ tool_scope: z
599
+ .array(z.string())
600
+ .optional()
601
+ .describe("Optional explicit ACE tool allowlist for the delegated run"),
602
+ workspace_root: z
603
+ .string()
604
+ .optional()
605
+ .describe("Optional workspace root override; defaults to the active workspace"),
606
+ }, async ({ task, role, max_turns, tier, provider, model, base_url, ollama_url, tool_scope, workspace_root, }) => {
607
+ const delegated = await runLocalModelTask({
608
+ task,
609
+ role,
610
+ workspaceRoot: workspace_root,
611
+ provider,
612
+ model,
613
+ baseUrl: base_url,
614
+ ollamaUrl: ollama_url,
615
+ maxTurns: max_turns,
616
+ tier,
617
+ toolScope: tool_scope,
618
+ });
619
+ return {
620
+ content: [
621
+ {
622
+ type: "text",
623
+ text: [
624
+ "## Local Model Run",
625
+ `- role: ${delegated.role}`,
626
+ `- provider: ${delegated.runtime.provider}`,
627
+ `- model: ${delegated.runtime.model}`,
628
+ `- workspace: ${delegated.runtime.workspaceRoot}`,
629
+ `- status: ${delegated.result.status}`,
630
+ `- turns: ${delegated.result.turns}`,
631
+ delegated.routingSummary
632
+ ? ["", "### Routing", delegated.routingSummary].join("\n")
633
+ : "",
634
+ delegated.runtime.notes.length > 0
635
+ ? [
636
+ "",
637
+ "### Discovery Notes",
638
+ ...delegated.runtime.notes.map((note) => `- ${note}`),
639
+ ].join("\n")
640
+ : "",
641
+ "",
642
+ "### Result",
643
+ delegated.result.summary,
644
+ delegated.result.tool_calls.length > 0
645
+ ? [
646
+ "",
647
+ "### Tool Calls",
648
+ ...delegated.result.tool_calls.map((tool) => `- ${tool.tool}: ${tool.ok ? "ok" : "error"} — ${tool.summary}`),
649
+ ].join("\n")
650
+ : "",
651
+ ]
652
+ .filter(Boolean)
653
+ .join("\n"),
654
+ },
655
+ ],
656
+ };
657
+ });
658
+ server.tool("run_orchestrator", "Execute a supervised plan via model bridge child runs; when steps are omitted, auto-planning falls back to a single route_task-derived step", {
659
+ task: z.string().describe("The task to decompose and execute"),
660
+ steps: z
661
+ .array(z.object({
662
+ role: ROLE_ENUM.describe("ACE role assigned to the step"),
663
+ task: z.string().describe("Task directive for the step"),
664
+ depends_on: z
665
+ .array(z.string())
666
+ .optional()
667
+ .describe("Optional step ids that must complete first"),
668
+ parallel_group: z
669
+ .string()
670
+ .optional()
671
+ .describe("Optional parallel execution group"),
672
+ tool_scope: z
673
+ .array(z.string())
674
+ .optional()
675
+ .describe("Optional ACE tool allowlist for the step"),
676
+ }))
677
+ .optional()
678
+ .describe("Pre-defined steps; if omitted, the orchestrator derives a single routed step"),
679
+ execution_mode: z
680
+ .enum(["sequential", "scheduled"])
681
+ .optional()
682
+ .describe("Execution mode for the task plan"),
683
+ max_turns_per_step: z
684
+ .number()
685
+ .int()
686
+ .positive()
687
+ .optional()
688
+ .describe("Optional max-turn limit applied to each child bridge step"),
689
+ provider: z
690
+ .string()
691
+ .optional()
692
+ .describe("Optional provider override; otherwise discovered from local runtime context"),
693
+ model: z
694
+ .string()
695
+ .optional()
696
+ .describe("Optional model override; otherwise discovered from local runtime context"),
697
+ base_url: z
698
+ .string()
699
+ .optional()
700
+ .describe("Optional local runtime base URL override"),
701
+ ollama_url: z
702
+ .string()
703
+ .optional()
704
+ .describe("Optional Ollama base URL override (legacy alias for base_url)"),
705
+ workspace_root: z
706
+ .string()
707
+ .optional()
708
+ .describe("Optional workspace root override; defaults to the active workspace"),
709
+ }, async ({ task, steps, execution_mode, max_turns_per_step, provider, model, base_url, ollama_url, workspace_root }, extra) => {
710
+ const runtime = resolveLocalModelRuntime({
711
+ workspaceRoot: workspace_root,
712
+ provider,
713
+ model,
714
+ baseUrl: base_url,
715
+ ollamaUrl: ollama_url,
716
+ });
717
+ const sessionId = typeof extra?.sessionId === "string" ? extra.sessionId : undefined;
718
+ const planSource = Array.isArray(steps) && steps.length > 0 ? "explicit_steps" : "route_task_single_step";
719
+ const planSteps = Array.isArray(steps) && steps.length > 0
720
+ ? steps
721
+ : await buildOrchestratorSteps(task, sessionId);
722
+ const plan = createTaskPlan({
723
+ task,
724
+ steps: planSteps,
725
+ execution_mode: execution_mode ?? "sequential",
726
+ });
727
+ const bridge = new ModelBridge(createDefaultModelBridgeClients(runtime));
728
+ const fallbackHandoffPrefix = `LOCAL-${plan.plan_id}-`;
729
+ const vericifyWarnings = [];
730
+ const supervised = await superviseTaskPlan(plan, {
731
+ async spawnStep(step) {
732
+ return bridge.spawn({
733
+ task: step.task,
734
+ role: step.role,
735
+ workspace: runtime.workspaceRoot,
736
+ maxTurns: max_turns_per_step ?? 6,
737
+ provider: runtime.provider,
738
+ model: runtime.model,
739
+ toolScope: step.tool_scope,
740
+ });
741
+ },
742
+ async createHandoff({ step, plan: activePlan }) {
743
+ const created = await executeAceInternalTool("create_handoff", {
744
+ from: "orchestrator",
745
+ to: step.role,
746
+ title: `${activePlan.plan_id}:${step.step_id} ${step.task}`.slice(0, 120),
747
+ task_type: mapRoleToTaskType(step.role),
748
+ priority: "P1",
749
+ directive: step.task,
750
+ acceptance_criteria: [`Complete ${step.step_id}: ${step.task}`],
751
+ context_pointers: {
752
+ engineering_constraint: `plan=${activePlan.plan_id}; step=${step.step_id}`,
753
+ },
754
+ }, sessionId);
755
+ const handoffId = extractHandoffId(extractToolTextContent(created));
756
+ return {
757
+ handoff_id: handoffId ?? `${fallbackHandoffPrefix}${step.step_id}`,
758
+ };
759
+ },
760
+ async ackHandoff(handoffId, status, note) {
761
+ if (handoffId.startsWith(fallbackHandoffPrefix)) {
762
+ return;
763
+ }
764
+ await executeAceInternalTool("ack_handoff", {
765
+ handoff_id: handoffId,
766
+ status,
767
+ note,
768
+ }, sessionId);
769
+ },
770
+ amendPlan({ plan: activePlan, step, result }) {
771
+ return buildDefaultOrchestratorAmendment({
772
+ plan: activePlan,
773
+ step,
774
+ result,
775
+ });
776
+ },
777
+ async getVericifyContext() {
778
+ return tryVericifyPacket(() => getVericifyContextPacket({
779
+ workspaceRoot: runtime.workspaceRoot,
780
+ }), (message) => appendUniqueNote(vericifyWarnings, `Vericify context unavailable for ${plan.plan_id}: ${message}`));
781
+ },
782
+ async getVericifyDelta(since) {
783
+ return tryVericifyPacket(() => getVericifyDelta({
784
+ since,
785
+ workspaceRoot: runtime.workspaceRoot,
786
+ }), (message) => appendUniqueNote(vericifyWarnings, `Vericify delta unavailable for ${plan.plan_id}: ${message}`));
787
+ },
788
+ async openCircuitBreaker(reason) {
789
+ await executeAceInternalTool("open_circuit_breaker", {
790
+ reason,
791
+ owner: "capability-ops",
792
+ }, sessionId);
793
+ },
794
+ async closeCircuitBreaker(reason) {
795
+ await executeAceInternalTool("close_circuit_breaker", {
796
+ reason,
797
+ }, sessionId);
798
+ },
799
+ async executeGates() {
800
+ const result = await executeAceInternalTool("execute_gates", {}, sessionId);
801
+ return {
802
+ ok: !Boolean(result?.isError),
803
+ summary: extractToolTextContent(result),
804
+ };
805
+ },
806
+ async contextSnapshot(activePlan) {
807
+ await executeAceInternalTool("context_snapshot", {
808
+ name: `${activePlan.plan_id}-final`,
809
+ summary: `Orchestrator plan ${activePlan.plan_id} finished with status ${activePlan.status}`,
810
+ artifacts: activePlan.steps.map((step) => `${step.step_id}:${step.role}`),
811
+ decisions: activePlan.steps
812
+ .filter((step) => typeof step.result_summary === "string" && step.result_summary.trim())
813
+ .map((step) => `${step.step_id}: ${step.result_summary}`),
814
+ }, sessionId);
815
+ },
816
+ async emitStatusEvent(event) {
817
+ await executeAceInternalTool("emit_status_event", {
818
+ source_module: "capability-ops",
819
+ event_type: "ORCHESTRATOR_STEP",
820
+ status: event.status === "done" ? "done" : event.status === "blocked" ? "blocked" : "in_progress",
821
+ summary: event.summary,
822
+ payload_json: JSON.stringify(event.step_id ? { step_id: event.step_id, plan_id: plan.plan_id } : { plan_id: plan.plan_id }),
823
+ }, sessionId);
824
+ },
825
+ });
826
+ const step_summaries = supervised.plan.steps.map((step) => ({
827
+ step_id: step.step_id,
828
+ role: step.role,
829
+ task: step.task,
830
+ status: step.status,
831
+ result_summary: step.result_summary ?? "",
832
+ handoff_id: step.handoff_id ?? null,
833
+ job_id: step.job_id ?? null,
834
+ blocked_reason: step.blocked_reason ?? null,
835
+ }));
836
+ return {
837
+ content: [
838
+ {
839
+ type: "text",
840
+ text: JSON.stringify({
841
+ runtime,
842
+ plan_source: planSource,
843
+ planning_note: planSource === "route_task_single_step"
844
+ ? "Auto-planning currently falls back to a single route_task-derived step. Pass explicit steps for multi-step orchestration."
845
+ : null,
846
+ plan: supervised.plan,
847
+ step_summaries,
848
+ handoff_ids: supervised.handoff_ids,
849
+ job_ids: supervised.job_ids,
850
+ circuit_opened: supervised.circuit_opened,
851
+ final_gate: supervised.final_gate ?? null,
852
+ vericify_warnings: vericifyWarnings,
853
+ }, null, 2),
854
+ },
855
+ ],
856
+ };
857
+ });
858
+ server.tool("get_vericify_context", "Build a compact Vericify context packet for workspace:current or a specified run", {
859
+ run_id: z
860
+ .string()
861
+ .optional()
862
+ .describe("Optional Vericify run id; defaults to workspace:current"),
863
+ workspace_root: z
864
+ .string()
865
+ .optional()
866
+ .describe("Optional workspace root override used to locate the Vericify workspace"),
867
+ }, async ({ run_id, workspace_root }) => {
868
+ try {
869
+ const packet = await getVericifyContextPacket({
870
+ runId: run_id,
871
+ workspaceRoot: workspace_root,
872
+ });
873
+ return {
874
+ content: [
875
+ {
876
+ type: "text",
877
+ text: JSON.stringify(packet, null, 2),
878
+ },
879
+ ],
880
+ };
881
+ }
882
+ catch (error) {
883
+ return {
884
+ content: [
885
+ {
886
+ type: "text",
887
+ text: `❌ Vericify context failed: ${error instanceof Error ? error.message : String(error)}`,
888
+ },
889
+ ],
890
+ isError: true,
891
+ };
892
+ }
893
+ });
894
+ server.tool("get_vericify_delta", "Build a compact Vericify delta from a prior vcx cursor or checkpoint reference", {
895
+ since: z
896
+ .string()
897
+ .describe("Required prior vcx cursor or compatible checkpoint reference"),
898
+ run_id: z
899
+ .string()
900
+ .optional()
901
+ .describe("Optional Vericify run id; defaults to workspace:current"),
902
+ workspace_root: z
903
+ .string()
904
+ .optional()
905
+ .describe("Optional workspace root override used to locate the Vericify workspace"),
906
+ }, async ({ since, run_id, workspace_root }) => {
907
+ try {
908
+ const delta = await getVericifyDelta({
909
+ since,
910
+ runId: run_id,
911
+ workspaceRoot: workspace_root,
912
+ });
913
+ return {
914
+ content: [
915
+ {
916
+ type: "text",
917
+ text: JSON.stringify(delta, null, 2),
918
+ },
919
+ ],
920
+ };
921
+ }
922
+ catch (error) {
923
+ return {
924
+ content: [
925
+ {
926
+ type: "text",
927
+ text: `❌ Vericify delta failed: ${error instanceof Error ? error.message : String(error)}`,
928
+ },
929
+ ],
930
+ isError: true,
931
+ };
932
+ }
933
+ });
934
+ server.tool("get_vericify_bridge", "Load the optional Vericify sidecar bridge snapshot derived from ACE runtime artifacts", {}, async () => {
935
+ const result = loadVericifyBridgeSnapshot();
936
+ return {
937
+ content: [
938
+ {
939
+ type: "text",
940
+ text: result.ok
941
+ ? JSON.stringify({
942
+ schema: result.schema,
943
+ path: result.path,
944
+ snapshot: result.snapshot,
945
+ }, null, 2)
946
+ : [
947
+ "❌ Vericify bridge snapshot failed validation.",
948
+ `Schema: ${result.schema}`,
949
+ `Path: ${result.path}`,
950
+ ...((result.errors ?? []).map((error) => `- ${error}`)),
951
+ ].join("\n"),
952
+ },
953
+ ],
954
+ };
955
+ });
956
+ server.tool("refresh_vericify_bridge", "Refresh the optional Vericify sidecar bridge snapshot from current ACE runtime artifacts", {}, async () => {
957
+ const result = refreshVericifyBridgeSnapshot();
958
+ return {
959
+ content: [
960
+ {
961
+ type: "text",
962
+ text: result.ok
963
+ ? [
964
+ "✅ Vericify bridge refreshed",
965
+ `Path: ${result.path}`,
966
+ "```json",
967
+ JSON.stringify(result.snapshot, null, 2),
968
+ "```",
969
+ ].join("\n")
970
+ : [
971
+ "❌ Vericify bridge refresh failed",
972
+ `Path: ${result.path}`,
973
+ result.error ?? "Unknown error",
974
+ ].join("\n"),
975
+ },
976
+ ],
977
+ };
978
+ });
979
+ server.tool("validate_vericify_bridge", "Validate the Vericify bridge snapshot content or active file", {
980
+ content: z
981
+ .string()
982
+ .optional()
983
+ .describe("Raw Vericify bridge snapshot JSON. If omitted, validate the active bridge file."),
984
+ }, async ({ content }) => {
985
+ const validation = typeof content === "string"
986
+ ? validateVericifyBridgeSnapshotContent(content)
987
+ : loadVericifyBridgeSnapshot();
988
+ return {
989
+ content: [
990
+ {
991
+ type: "text",
992
+ text: validation.ok
993
+ ? `✅ Vericify bridge snapshot is valid (${validation.schema})`
994
+ : [
995
+ "❌ Vericify bridge snapshot failed validation.",
996
+ `Schema: ${validation.schema}`,
997
+ ...((validation.errors ?? []).map((error) => `- ${error}`)),
998
+ ].join("\n"),
999
+ },
1000
+ ],
1001
+ };
1002
+ });
1003
+ server.tool("get_vericify_process_posts", "Load the optional Vericify sidecar process-post log maintained by ACE", {}, async () => {
1004
+ const result = loadVericifyProcessPostLog();
1005
+ return {
1006
+ content: [
1007
+ {
1008
+ type: "text",
1009
+ text: result.ok
1010
+ ? JSON.stringify({
1011
+ schema: result.schema,
1012
+ path: result.path,
1013
+ log: result.log,
1014
+ }, null, 2)
1015
+ : [
1016
+ "❌ Vericify process post log failed validation.",
1017
+ `Schema: ${result.schema}`,
1018
+ `Path: ${result.path}`,
1019
+ ...((result.errors ?? []).map((error) => `- ${error}`)),
1020
+ ].join("\n"),
1021
+ },
1022
+ ],
1023
+ };
1024
+ });
1025
+ server.tool("append_vericify_process_post", "Append a structured process post to the optional Vericify sidecar log without requiring Vericify to be installed", {
1026
+ run_id: z.string().describe("Vericify run id"),
1027
+ branch_id: z.string().optional().describe("Optional Vericify branch id"),
1028
+ lane_id: z.string().optional().describe("Optional Vericify lane id"),
1029
+ agent_id: z.string().describe("Posting agent/module id"),
1030
+ kind: z
1031
+ .enum(["intent", "progress", "blocker", "handoff_note", "stale_ack", "completion"])
1032
+ .describe("Structured process post kind"),
1033
+ summary: z.string().describe("Short operator-facing summary"),
1034
+ tool_refs: z
1035
+ .array(z.string())
1036
+ .optional()
1037
+ .describe("Optional tool references attached to the process post"),
1038
+ evidence_refs: z
1039
+ .array(z.string())
1040
+ .optional()
1041
+ .describe("Optional evidence references attached to the process post"),
1042
+ checkpoint_ref: z.string().optional().describe("Optional checkpoint id"),
1043
+ }, async ({ run_id, branch_id, lane_id, agent_id, kind, summary, tool_refs, evidence_refs, checkpoint_ref }) => {
1044
+ const result = await appendVericifyProcessPost({
1045
+ run_id,
1046
+ branch_id,
1047
+ lane_id,
1048
+ agent_id,
1049
+ kind,
1050
+ summary,
1051
+ tool_refs,
1052
+ evidence_refs,
1053
+ checkpoint_ref,
1054
+ });
1055
+ return {
1056
+ content: [
1057
+ {
1058
+ type: "text",
1059
+ text: [
1060
+ "✅ Vericify process post appended",
1061
+ `Path: ${result.path}`,
1062
+ "```json",
1063
+ JSON.stringify(result.post, null, 2),
1064
+ "```",
1065
+ ].join("\n"),
1066
+ },
1067
+ ],
1068
+ };
1069
+ });
1070
+ server.tool("validate_vericify_process_post_log", "Validate the Vericify process-post log content or active file", {
1071
+ content: z
1072
+ .string()
1073
+ .optional()
1074
+ .describe("Raw Vericify process-post log JSON. If omitted, validate the active log file."),
1075
+ }, async ({ content }) => {
1076
+ const validation = typeof content === "string"
1077
+ ? validateVericifyProcessPostLogContent(content)
1078
+ : loadVericifyProcessPostLog();
1079
+ return {
1080
+ content: [
1081
+ {
1082
+ type: "text",
1083
+ text: validation.ok
1084
+ ? `✅ Vericify process post log is valid (${validation.schema})`
1085
+ : [
1086
+ "❌ Vericify process post log failed validation.",
1087
+ `Schema: ${validation.schema}`,
1088
+ ...((validation.errors ?? []).map((error) => `- ${error}`)),
1089
+ ].join("\n"),
1090
+ },
1091
+ ],
1092
+ };
1093
+ });
1094
+ server.tool("list_workspace_sessions", "List managed ACE workspace sessions from the runtime registry", {}, async () => ({
1095
+ content: [
1096
+ {
1097
+ type: "text",
1098
+ text: JSON.stringify(listWorkspaceSessions(), null, 2),
1099
+ },
1100
+ ],
1101
+ }));
1102
+ server.tool("validate_managed_workspace_path", "Validate a target path against the configured managed workspace root and path-safety invariants", {
1103
+ target: z.string().describe("Target workspace path or relative child path"),
1104
+ root: z
1105
+ .string()
1106
+ .optional()
1107
+ .describe("Optional root override. Defaults to the runtime profile workspace root."),
1108
+ }, async ({ target, root }) => {
1109
+ const resolvedRoot = resolveRuntimeWorkspaceRoot(root);
1110
+ const validation = validateManagedWorkspacePath(resolvedRoot, target);
1111
+ return {
1112
+ content: [
1113
+ {
1114
+ type: "text",
1115
+ text: JSON.stringify(validation, null, 2),
1116
+ },
1117
+ ],
1118
+ };
1119
+ });
1120
+ server.tool("create_workspace_session", "Create a managed ACE workspace session under the configured runtime root", {
1121
+ workspace_name: z
1122
+ .string()
1123
+ .optional()
1124
+ .describe("Logical workspace name used to derive the managed directory name"),
1125
+ workspace_path: z
1126
+ .string()
1127
+ .optional()
1128
+ .describe("Optional explicit target path. Relative paths are resolved under the managed root."),
1129
+ source: z
1130
+ .enum(["manual", "executor", "test"])
1131
+ .describe("How this workspace session was created"),
1132
+ objective_id: z.string().optional().describe("Optional linked objective id"),
1133
+ tracker_item_id: z.string().optional().describe("Optional linked tracker item id"),
1134
+ root: z
1135
+ .string()
1136
+ .optional()
1137
+ .describe("Optional root override. Defaults to the runtime profile workspace root."),
1138
+ hooks_timeout_ms: z
1139
+ .number()
1140
+ .int()
1141
+ .positive()
1142
+ .optional()
1143
+ .describe("Optional hook timeout override in milliseconds"),
1144
+ }, async ({ workspace_name, workspace_path, source, objective_id, tracker_item_id, root, hooks_timeout_ms, }) => {
1145
+ const result = createWorkspaceSession({
1146
+ workspace_name,
1147
+ workspace_path,
1148
+ source,
1149
+ objective_id,
1150
+ tracker_item_id,
1151
+ root,
1152
+ hooks_timeout_ms,
1153
+ });
1154
+ return {
1155
+ content: [
1156
+ {
1157
+ type: "text",
1158
+ text: result.ok
1159
+ ? [
1160
+ "✅ Workspace session created",
1161
+ `Registry: ${result.registry_path}`,
1162
+ "```json",
1163
+ JSON.stringify(result.session, null, 2),
1164
+ "```",
1165
+ ].join("\n")
1166
+ : [
1167
+ "❌ Workspace session create failed",
1168
+ result.error ?? "Unknown error",
1169
+ result.validation ? "```json" : "",
1170
+ result.validation ? JSON.stringify(result.validation, null, 2) : "",
1171
+ result.validation ? "```" : "",
1172
+ ]
1173
+ .filter(Boolean)
1174
+ .join("\n"),
1175
+ },
1176
+ ],
1177
+ };
1178
+ });
1179
+ server.tool("remove_workspace_session", "Remove or archive a managed ACE workspace session using the runtime retention policy", {
1180
+ session_id: z.string().optional().describe("Managed workspace session id"),
1181
+ workspace_path: z
1182
+ .string()
1183
+ .optional()
1184
+ .describe("Managed workspace path when removing by path instead of session id"),
1185
+ root: z
1186
+ .string()
1187
+ .optional()
1188
+ .describe("Optional root override. Defaults to the runtime profile workspace root."),
1189
+ hooks_timeout_ms: z
1190
+ .number()
1191
+ .int()
1192
+ .positive()
1193
+ .optional()
1194
+ .describe("Optional hook timeout override in milliseconds"),
1195
+ }, async ({ session_id, workspace_path, root, hooks_timeout_ms }) => {
1196
+ const result = removeWorkspaceSession({
1197
+ session_id,
1198
+ workspace_path,
1199
+ root,
1200
+ hooks_timeout_ms,
1201
+ });
1202
+ return {
1203
+ content: [
1204
+ {
1205
+ type: "text",
1206
+ text: result.ok
1207
+ ? [
1208
+ "✅ Workspace session updated",
1209
+ `Registry: ${result.registry_path}`,
1210
+ "```json",
1211
+ JSON.stringify(result.session, null, 2),
1212
+ "```",
1213
+ ].join("\n")
1214
+ : [
1215
+ "❌ Workspace session removal failed",
1216
+ result.error ?? "Unknown error",
1217
+ result.validation ? "```json" : "",
1218
+ result.validation ? JSON.stringify(result.validation, null, 2) : "",
1219
+ result.validation ? "```" : "",
1220
+ ]
1221
+ .filter(Boolean)
1222
+ .join("\n"),
1223
+ },
1224
+ ],
1225
+ };
1226
+ });
1227
+ server.tool("get_tracker_snapshot", "Load the active normalized ACE tracker snapshot", {
1228
+ path: z
1229
+ .string()
1230
+ .optional()
1231
+ .describe("Optional workspace-relative path override for a tracker snapshot file."),
1232
+ }, async ({ path }) => {
1233
+ const result = loadTrackerSnapshot(path);
1234
+ return {
1235
+ content: [
1236
+ {
1237
+ type: "text",
1238
+ text: result.ok
1239
+ ? JSON.stringify({
1240
+ schema: result.schema,
1241
+ path: result.path,
1242
+ source: result.source,
1243
+ snapshot: result.snapshot,
1244
+ }, null, 2)
1245
+ : [
1246
+ "❌ Tracker snapshot failed validation.",
1247
+ `Schema: ${result.schema}`,
1248
+ `Path: ${result.path}`,
1249
+ ...((result.errors ?? []).map((error) => `- ${error}`)),
1250
+ ].join("\n"),
1251
+ },
1252
+ ],
1253
+ };
1254
+ });
1255
+ server.tool("validate_tracker_snapshot", "Validate tracker-snapshot.json content or the active snapshot file", {
1256
+ content: z
1257
+ .string()
1258
+ .optional()
1259
+ .describe("Raw tracker snapshot JSON content. If omitted, validate the selected file path."),
1260
+ path: z
1261
+ .string()
1262
+ .optional()
1263
+ .describe("Optional workspace-relative path to validate when content is omitted."),
1264
+ }, async ({ content, path }) => {
1265
+ const validation = typeof content === "string"
1266
+ ? validateTrackerSnapshotContent(content)
1267
+ : loadTrackerSnapshot(path);
1268
+ return {
1269
+ content: [
1270
+ {
1271
+ type: "text",
1272
+ text: validation.ok
1273
+ ? `✅ Tracker snapshot is valid (${validation.schema})`
1274
+ : [
1275
+ "❌ Tracker snapshot failed validation.",
1276
+ `Schema: ${validation.schema}`,
1277
+ ...((validation.errors ?? []).map((error) => `- ${error}`)),
1278
+ ].join("\n"),
1279
+ },
1280
+ ],
1281
+ };
1282
+ });
1283
+ server.tool("list_tracker_adapter_kinds", "List available ACE tracker adapter kinds", {}, async () => ({
1284
+ content: [
1285
+ {
1286
+ type: "text",
1287
+ text: JSON.stringify(listTrackerAdapterKinds(), null, 2),
1288
+ },
1289
+ ],
1290
+ }));
1291
+ server.tool("get_tracker_adapter_health", "Run the active or selected tracker adapter health check", {
1292
+ kind: z
1293
+ .string()
1294
+ .optional()
1295
+ .describe("Optional tracker adapter kind override (none, memory, external)"),
1296
+ }, async ({ kind }) => {
1297
+ try {
1298
+ const adapter = getTrackerAdapter(kind);
1299
+ const health = adapter.healthCheck
1300
+ ? await adapter.healthCheck()
1301
+ : { ok: true, detail: "No health check implemented." };
1302
+ return {
1303
+ content: [
1304
+ {
1305
+ type: "text",
1306
+ text: JSON.stringify({
1307
+ kind: adapter.kind,
1308
+ ...health,
1309
+ }, null, 2),
1310
+ },
1311
+ ],
1312
+ };
1313
+ }
1314
+ catch (error) {
1315
+ return {
1316
+ content: [
1317
+ {
1318
+ type: "text",
1319
+ text: `❌ ${error instanceof Error ? error.message : String(error)}`,
1320
+ },
1321
+ ],
1322
+ };
1323
+ }
1324
+ });
1325
+ server.tool("list_tracker_items", "List normalized tracker items through the active or selected tracker adapter", {
1326
+ kind: z
1327
+ .string()
1328
+ .optional()
1329
+ .describe("Optional tracker adapter kind override (none, memory, external)"),
1330
+ ids: z.array(z.string()).optional().describe("Optional item ids or external ids to include"),
1331
+ states: z.array(z.string()).optional().describe("Optional allowed item states"),
1332
+ labels: z.array(z.string()).optional().describe("Optional required labels"),
1333
+ assignee: z.string().optional().describe("Optional assignee filter"),
1334
+ query: z
1335
+ .string()
1336
+ .optional()
1337
+ .describe("Optional case-insensitive title/body substring filter"),
1338
+ }, async ({ kind, ids, states, labels, assignee, query }) => {
1339
+ const adapter = getTrackerAdapter(kind);
1340
+ const items = adapter.listActiveItems
1341
+ ? await adapter.listActiveItems({
1342
+ ids,
1343
+ states,
1344
+ labels,
1345
+ assignee,
1346
+ query,
1347
+ })
1348
+ : [];
1349
+ return {
1350
+ content: [
1351
+ {
1352
+ type: "text",
1353
+ text: JSON.stringify(items, null, 2),
1354
+ },
1355
+ ],
1356
+ };
1357
+ });
1358
+ server.tool("create_tracker_comment", "Create a tracker comment through the active or selected adapter", {
1359
+ item_id: z.string().describe("Normalized tracker item id"),
1360
+ body: z.string().describe("Comment body"),
1361
+ kind: z
1362
+ .string()
1363
+ .optional()
1364
+ .describe("Optional tracker adapter kind override (none, memory, external)"),
1365
+ }, async ({ item_id, body, kind }) => {
1366
+ const adapter = getTrackerAdapter(kind);
1367
+ const result = adapter.createComment
1368
+ ? await adapter.createComment(item_id, body)
1369
+ : { ok: false, error: `Tracker adapter '${adapter.kind}' does not support comments.` };
1370
+ return {
1371
+ content: [
1372
+ {
1373
+ type: "text",
1374
+ text: result.ok
1375
+ ? [
1376
+ "✅ Tracker comment created",
1377
+ `Adapter: ${adapter.kind}`,
1378
+ result.comment_id ? `Comment ID: ${result.comment_id}` : "",
1379
+ ]
1380
+ .filter(Boolean)
1381
+ .join("\n")
1382
+ : [
1383
+ "❌ Tracker comment failed",
1384
+ `Adapter: ${adapter.kind}`,
1385
+ result.error ?? "Unknown error",
1386
+ ].join("\n"),
1387
+ },
1388
+ ],
1389
+ };
1390
+ });
1391
+ server.tool("update_tracker_item_state", "Update a tracker item state through the active or selected adapter", {
1392
+ item_id: z.string().describe("Normalized tracker item id"),
1393
+ state: z.string().describe("New tracker state"),
1394
+ kind: z
1395
+ .string()
1396
+ .optional()
1397
+ .describe("Optional tracker adapter kind override (none, memory, external)"),
1398
+ }, async ({ item_id, state, kind }) => {
1399
+ const adapter = getTrackerAdapter(kind);
1400
+ const result = adapter.updateItemState
1401
+ ? await adapter.updateItemState(item_id, state)
1402
+ : { ok: false, error: `Tracker adapter '${adapter.kind}' does not support state updates.` };
1403
+ return {
1404
+ content: [
1405
+ {
1406
+ type: "text",
1407
+ text: result.ok
1408
+ ? [
1409
+ "✅ Tracker state updated",
1410
+ `Adapter: ${adapter.kind}`,
1411
+ `Item: ${item_id}`,
1412
+ `State: ${state}`,
1413
+ ].join("\n")
1414
+ : [
1415
+ "❌ Tracker state update failed",
1416
+ `Adapter: ${adapter.kind}`,
1417
+ result.error ?? "Unknown error",
1418
+ ].join("\n"),
1419
+ },
1420
+ ],
1421
+ };
1422
+ });
1423
+ server.tool("refresh_tracker_snapshot", "Refresh tracker-snapshot.json through the active or selected tracker adapter", {
1424
+ kind: z
1425
+ .string()
1426
+ .optional()
1427
+ .describe("Optional tracker adapter kind override (none, memory, external)"),
1428
+ }, async ({ kind }) => {
1429
+ const result = await refreshTrackerSnapshot(kind);
1430
+ return {
1431
+ content: [
1432
+ {
1433
+ type: "text",
1434
+ text: result.ok
1435
+ ? [
1436
+ "✅ Tracker snapshot refreshed",
1437
+ `Adapter: ${result.adapter_kind}`,
1438
+ `Path: ${result.snapshot_path}`,
1439
+ "```json",
1440
+ JSON.stringify(result.snapshot, null, 2),
1441
+ "```",
1442
+ ].join("\n")
1443
+ : [
1444
+ "❌ Tracker snapshot refresh failed",
1445
+ `Adapter: ${result.adapter_kind}`,
1446
+ `Path: ${result.snapshot_path}`,
1447
+ result.error ?? "Unknown error",
1448
+ ].join("\n"),
1449
+ },
1450
+ ],
1451
+ };
1452
+ });
1453
+ // ── Skills ────────────────────────────────────────────────────────
1454
+ server.tool("list_skills", "List all discoverable ACE skills with source paths", {}, async () => {
1455
+ const skills = listAvailableSkills();
1456
+ const lines = [
1457
+ "# ACE Skills",
1458
+ "",
1459
+ ...skills.map((skill) => `- ${skill.name} (${skill.source}) -> ${skill.path}`),
1460
+ ];
1461
+ return {
1462
+ content: [{ type: "text", text: lines.join("\n") }],
1463
+ };
1464
+ });
1465
+ server.tool("get_skill_instructions", "Load SKILL.md for a specific ACE skill", {
1466
+ name: z.string().describe("Skill name (e.g., codemunch, codesnipe)"),
1467
+ }, async ({ name }) => {
1468
+ const skills = listAvailableSkills();
1469
+ const match = skills.find((skill) => skill.name.toLowerCase() === name.trim().toLowerCase());
1470
+ const prefix = match
1471
+ ? `# Skill: ${match.name}\n\nSource: ${match.source} (${match.path})\n\n`
1472
+ : `# Skill: ${name}\n\n`;
1473
+ return {
1474
+ content: [
1475
+ {
1476
+ type: "text",
1477
+ text: `${prefix}${readSkillInstructions(name)}`,
1478
+ },
1479
+ ],
1480
+ };
1481
+ });
1482
+ // ── Task Pack ─────────────────────────────────────────────────────
1483
+ server.tool("get_task_pack", "Get responsibilities and evidence requirements for a specific ACE role", {
1484
+ role: ROLE_ENUM.describe("Agent role"),
1485
+ }, async ({ role }) => {
1486
+ const full = readTaskArtifact("role_tasks");
1487
+ const headerSuffix = ROLE_TITLES[role] ?? role;
1488
+ const roleHeader = `## ACE-${headerSuffix} Task Pack`;
1489
+ const start = full.indexOf(roleHeader);
1490
+ if (start === -1) {
1491
+ const lowerFull = full.toLowerCase();
1492
+ const lowerHeader = roleHeader.toLowerCase();
1493
+ const ciStart = lowerFull.indexOf(lowerHeader);
1494
+ if (ciStart === -1) {
1495
+ return {
1496
+ content: [{ type: "text", text: `Task pack section not found for role: ${role}` }],
1497
+ };
1498
+ }
1499
+ const ciNext = lowerFull.indexOf("\n## ", ciStart + lowerHeader.length);
1500
+ const section = ciNext === -1 ? full.slice(ciStart) : full.slice(ciStart, ciNext);
1501
+ return { content: [{ type: "text", text: section.trim() }] };
1502
+ }
1503
+ const next = full.indexOf("\n## ", start + roleHeader.length);
1504
+ const section = next === -1 ? full.slice(start) : full.slice(start, next);
1505
+ return {
1506
+ content: [{ type: "text", text: section.trim() }],
1507
+ };
1508
+ });
1509
+ // ── Lessons ───────────────────────────────────────────────────────
1510
+ server.tool("get_lessons", "Read all accumulated lessons and guardrails", {}, async () => ({
1511
+ content: [{ type: "text", text: readTaskArtifact("lessons") }],
1512
+ }));
1513
+ server.tool("add_lesson", "Record a new lesson/guardrail after a correction or failure", {
1514
+ context: z.string().describe("What happened"),
1515
+ failure_pattern: z.string().describe("What went wrong"),
1516
+ guardrail: z.string().describe("Rule to prevent recurrence"),
1517
+ verification_check: z.string().describe("How to verify compliance"),
1518
+ }, async ({ context, failure_pattern, guardrail, verification_check }) => {
1519
+ const date = new Date().toISOString().slice(0, 10);
1520
+ const entry = [
1521
+ "",
1522
+ `## Lesson — ${date}`,
1523
+ "",
1524
+ `- **Date:** ${date}`,
1525
+ `- **Context:** ${context}`,
1526
+ `- **Failure Pattern:** ${failure_pattern}`,
1527
+ `- **Guardrail:** ${guardrail}`,
1528
+ `- **Verification Check:** ${verification_check}`,
1529
+ "",
1530
+ ].join("\n");
1531
+ const existing = readTaskArtifact("lessons");
1532
+ const path = safeWrite(resolveWritableTaskPath("lessons"), `${existing}${entry}`);
1533
+ return {
1534
+ content: [{ type: "text", text: `✅ Lesson recorded in ${path}` }],
1535
+ };
1536
+ });
1537
+ // ── CLI Work Split ────────────────────────────────────────────────
1538
+ server.tool("get_cli_split", "Get the CLI work split contract (Codex vs Gemini routing)", {}, async () => ({
1539
+ content: [{ type: "text", text: readTaskArtifact("cli_work_split") }],
1540
+ }));
1541
+ }
1542
+ //# sourceMappingURL=tools-agent.js.map