@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,240 @@
1
+ import { buildAceContinuityPacket, buildAceRecallContext, formatAceContinuityPacketMarkdown, formatAceRecallMarkdown, normalizeAutonomyPolicy, normalizeContinuityPolicy, } from "./ace-autonomy.js";
2
+ import { listAceInternalToolCatalog, } from "./ace-internal-tools.js";
3
+ import { ALL_AGENTS, readAgentInstructions } from "./helpers.js";
4
+ import { readRuntimeProfileState, renderRuntimePrompt } from "./runtime-profile.js";
5
+ const ROLE_TOOL_DEFAULTS = {
6
+ orchestrator: [
7
+ "recall_context",
8
+ "route_task",
9
+ "run_local_model",
10
+ "get_vericify_context",
11
+ "get_vericify_delta",
12
+ "create_handoff",
13
+ "ack_handoff",
14
+ "enqueue_job",
15
+ "dispatch_jobs",
16
+ "list_jobs",
17
+ "execute_gates",
18
+ "context_snapshot",
19
+ "append_vericify_process_post",
20
+ "emit_status_event",
21
+ ],
22
+ coders: [
23
+ "read_workspace_file",
24
+ "write_workspace_file",
25
+ "safe_edit_file",
26
+ "run_tests",
27
+ "git_diff",
28
+ "git_status",
29
+ "execute_gates",
30
+ "append_vericify_process_post",
31
+ ],
32
+ qa: [
33
+ "read_workspace_file",
34
+ "run_tests",
35
+ "execute_gates",
36
+ "git_diff",
37
+ "append_vericify_process_post",
38
+ ],
39
+ docs: [
40
+ "read_workspace_file",
41
+ "write_workspace_file",
42
+ "git_diff",
43
+ "append_vericify_process_post",
44
+ ],
45
+ research: [
46
+ "recall_context",
47
+ "read_workspace_file",
48
+ "build_continuity_packet",
49
+ "append_vericify_process_post",
50
+ ],
51
+ spec: [
52
+ "read_workspace_file",
53
+ "write_workspace_file",
54
+ "execute_gates",
55
+ "append_vericify_process_post",
56
+ ],
57
+ };
58
+ function resolveRoleInstructions(role) {
59
+ const normalized = role.trim().toLowerCase().replace(/^agent-/, "");
60
+ if (ALL_AGENTS.includes(normalized)) {
61
+ return readAgentInstructions(normalized);
62
+ }
63
+ return `No ACE role instructions found for '${role}'. Use route_task if role selection is uncertain.`;
64
+ }
65
+ export function renderAceRecallPromptBlock(recall, includeSlices = true) {
66
+ if (!recall)
67
+ return "";
68
+ const slices = includeSlices
69
+ ? recall.state_slices
70
+ .filter((entry) => entry.present)
71
+ .slice(0, 6)
72
+ .flatMap((entry) => [`### ${entry.path}`, "```text", entry.excerpt, "```"])
73
+ : [];
74
+ return [formatAceRecallMarkdown(recall), ...(slices.length > 0 ? ["", ...slices] : [])].join("\n");
75
+ }
76
+ export function renderAceSnapshotPromptBlock(recall) {
77
+ if (!recall?.snapshot)
78
+ return "";
79
+ return [
80
+ `Name: ${recall.snapshot.name}`,
81
+ `Timestamp: ${recall.snapshot.timestamp}`,
82
+ `Summary: ${recall.snapshot.summary}`,
83
+ "```json",
84
+ recall.snapshot.content,
85
+ "```",
86
+ ].join("\n");
87
+ }
88
+ export function renderAceContinuityPromptBlock(packet) {
89
+ return packet ? formatAceContinuityPacketMarkdown(packet) : "";
90
+ }
91
+ function keywordScore(task, tool) {
92
+ const haystack = `${tool.name} ${tool.description} ${tool.input_keys.join(" ")}`.toLowerCase();
93
+ return task
94
+ .toLowerCase()
95
+ .split(/[^a-z0-9_]+/)
96
+ .filter((token) => token.length > 2)
97
+ .reduce((score, token) => (haystack.includes(token) ? score + 1 : score), 0);
98
+ }
99
+ function selectToolCount(tier) {
100
+ if (tier === "brief")
101
+ return 5;
102
+ if (tier === "compressed")
103
+ return 12;
104
+ return 20;
105
+ }
106
+ function scopeTools(role, task, tier, explicitTools) {
107
+ const catalog = listAceInternalToolCatalog();
108
+ if (explicitTools && explicitTools.length > 0) {
109
+ const explicitSet = new Set(explicitTools);
110
+ return catalog.filter((tool) => explicitSet.has(tool.name));
111
+ }
112
+ const roleDefaults = new Set(ROLE_TOOL_DEFAULTS[role.trim().toLowerCase()] ?? []);
113
+ const ranked = catalog
114
+ .map((tool) => ({
115
+ tool,
116
+ score: (roleDefaults.has(tool.name) ? 5 : 0) + keywordScore(task, tool),
117
+ }))
118
+ .sort((left, right) => right.score - left.score || left.tool.name.localeCompare(right.tool.name))
119
+ .slice(0, selectToolCount(tier))
120
+ .map((entry) => entry.tool);
121
+ if (ranked.length > 0 && ranked.some((tool) => roleDefaults.has(tool.name))) {
122
+ return ranked;
123
+ }
124
+ return catalog.slice(0, selectToolCount(tier));
125
+ }
126
+ function renderToolCatalogMarkdown(tools, tier) {
127
+ const includeInputs = tier !== "brief";
128
+ return tools
129
+ .map((tool) => {
130
+ const parts = [`- \`${tool.name}\` — ${tool.description || "ACE MCP tool"}`];
131
+ if (includeInputs && tool.input_keys.length > 0) {
132
+ parts.push(` - input keys: ${tool.input_keys.join(", ")}`);
133
+ }
134
+ return parts.join("\n");
135
+ })
136
+ .join("\n");
137
+ }
138
+ function selectPlanningCatalogCount(tier) {
139
+ if (tier === "brief")
140
+ return 24;
141
+ if (tier === "compressed")
142
+ return 40;
143
+ return Number.POSITIVE_INFINITY;
144
+ }
145
+ function buildPlanningCatalog(role, task, tier) {
146
+ const roleDefaults = new Set(ROLE_TOOL_DEFAULTS[role.trim().toLowerCase()] ?? []);
147
+ const ranked = listAceInternalToolCatalog().map((tool) => ({
148
+ tool,
149
+ score: (roleDefaults.has(tool.name) ? 5 : 0) + keywordScore(task, tool),
150
+ }));
151
+ const limit = selectPlanningCatalogCount(tier);
152
+ return ranked
153
+ .sort((left, right) => right.score - left.score || left.tool.name.localeCompare(right.tool.name))
154
+ .slice(0, limit)
155
+ .map((entry) => entry.tool);
156
+ }
157
+ export function buildToolPlan(options) {
158
+ const tier = options.tier ?? "compressed";
159
+ const catalog = Array.isArray(options.tools) && options.tools.length > 0
160
+ ? listAceInternalToolCatalog().filter((tool) => options.tools?.includes(tool.name))
161
+ : buildPlanningCatalog(options.role, options.task, tier);
162
+ const recommended = scopeTools(options.role, options.task, tier, options.tools).map((tool) => tool.name);
163
+ const selectionLimit = tier === "brief" ? 8 : tier === "compressed" ? 12 : 15;
164
+ const catalogLines = catalog.map((tool) => `- ${tool.name} — ${tool.description || "ACE internal tool"}`);
165
+ return {
166
+ prompt: [
167
+ `You are selecting ACE tools for role '${options.role}'.`,
168
+ `Task: ${options.task}`,
169
+ "",
170
+ `Choose between 1 and ${selectionLimit} tools from this catalog.`,
171
+ "Prefer the smallest tool set that can make real progress.",
172
+ "Prioritize the default ACE tools for the role when they fit the task.",
173
+ 'Respond with JSON only: {"selected_tools":["tool_a","tool_b"],"reasoning":"short reason"}',
174
+ "",
175
+ "## Tool Catalog",
176
+ ...catalogLines,
177
+ "",
178
+ `## Role-biased recommendations`,
179
+ recommended.length > 0 ? `- ${recommended.join(", ")}` : "- none",
180
+ ].join("\n"),
181
+ catalog,
182
+ recommended_tools: recommended,
183
+ selection_limit: selectionLimit,
184
+ };
185
+ }
186
+ export function renderAceContext(options) {
187
+ const tier = options.tier ?? "compressed";
188
+ const active = readRuntimeProfileState();
189
+ const autonomy = normalizeAutonomyPolicy(active.profile.autonomy);
190
+ const continuity = normalizeContinuityPolicy(active.profile.continuity);
191
+ const recall = buildAceRecallContext({
192
+ state_sources: autonomy.state_sources,
193
+ });
194
+ const continuityPacket = continuity.enabled
195
+ ? buildAceContinuityPacket({
196
+ policy: continuity,
197
+ })
198
+ : undefined;
199
+ const tools = scopeTools(options.role, options.task, tier, options.tools);
200
+ const runtimePrompt = renderRuntimePrompt({
201
+ task: options.task,
202
+ workspace_path: options.workspace,
203
+ autonomy,
204
+ continuity,
205
+ ace_state_recall_md: renderAceRecallPromptBlock(recall, !continuity.enabled),
206
+ ace_context_snapshot_md: renderAceSnapshotPromptBlock(recall),
207
+ ace_continuity_packet_md: renderAceContinuityPromptBlock(continuityPacket),
208
+ });
209
+ const roleInstructions = resolveRoleInstructions(options.role);
210
+ const toolCatalog = renderToolCatalogMarkdown(tools, tier);
211
+ const stateDigest = recall.task_contract.summary;
212
+ const systemPrompt = [
213
+ runtimePrompt,
214
+ "",
215
+ "## Active Role",
216
+ `- Role: ${options.role}`,
217
+ "",
218
+ "## Role Instructions",
219
+ roleInstructions,
220
+ "",
221
+ "## Tool Scope",
222
+ toolCatalog || "- No ACE tools available.",
223
+ "",
224
+ "## Output Contract",
225
+ 'Respond in JSON only with one of these shapes:',
226
+ '- `{"status":"tool","thinking":"...","tool_calls":[{"tool":"name","input":{}}]}`',
227
+ '- `{"status":"message","thinking":"...","message":"..."}`',
228
+ '- `{"status":"complete","thinking":"...","summary":"..."}`',
229
+ '- `{"status":"need_input","thinking":"...","message":"..."}`',
230
+ ].join("\n");
231
+ return {
232
+ systemPrompt,
233
+ tools,
234
+ stateDigest,
235
+ // TODO: replace with model-aware token counting when context window management lands.
236
+ tokenEstimate: Math.max(1, Math.ceil(systemPrompt.length / 4)),
237
+ tier,
238
+ };
239
+ }
240
+ //# sourceMappingURL=ace-context.js.map
@@ -0,0 +1,8 @@
1
+ export interface AceInternalToolCatalogEntry {
2
+ name: string;
3
+ description: string;
4
+ input_keys: string[];
5
+ }
6
+ export declare function listAceInternalToolCatalog(): AceInternalToolCatalogEntry[];
7
+ export declare function executeAceInternalTool(name: string, input: Record<string, unknown> | undefined, sessionId?: string): Promise<any>;
8
+ //# sourceMappingURL=ace-internal-tools.d.ts.map
@@ -0,0 +1,76 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createAceServer } from "./server.js";
3
+ let internalServer;
4
+ function getServer() {
5
+ if (!internalServer) {
6
+ internalServer = createAceServer({ toolGovernance: false });
7
+ }
8
+ return internalServer;
9
+ }
10
+ function getRegistry() {
11
+ const server = getServer();
12
+ if (!server._registeredTools) {
13
+ throw new Error("MCP SDK internal API changed: _registeredTools not found. Update ace-internal-tools.ts to match the new SDK structure.");
14
+ }
15
+ return server._registeredTools;
16
+ }
17
+ function summarizeSchemaKeys(schema) {
18
+ if (!schema)
19
+ return [];
20
+ const shapeSource = schema.shape;
21
+ if (shapeSource && typeof shapeSource === "object") {
22
+ return Object.keys(shapeSource);
23
+ }
24
+ return [];
25
+ }
26
+ function buildRequestExtra(sessionId) {
27
+ return {
28
+ signal: new AbortController().signal,
29
+ sessionId,
30
+ requestId: randomUUID(),
31
+ sendNotification: async () => undefined,
32
+ sendRequest: async () => ({}),
33
+ };
34
+ }
35
+ export function listAceInternalToolCatalog() {
36
+ return Object.entries(getRegistry())
37
+ .filter(([, tool]) => tool.enabled)
38
+ .map(([name, tool]) => ({
39
+ name,
40
+ description: tool.description ?? "",
41
+ input_keys: summarizeSchemaKeys(tool.inputSchema),
42
+ }))
43
+ .sort((left, right) => left.name.localeCompare(right.name));
44
+ }
45
+ export async function executeAceInternalTool(name, input, sessionId) {
46
+ const tool = getRegistry()[name];
47
+ if (!tool || !tool.enabled) {
48
+ return {
49
+ content: [{ type: "text", text: `ACE tool '${name}' is not registered.` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ const parsedInput = tool.inputSchema
54
+ ? tool.inputSchema.safeParse(input ?? {})
55
+ : { success: true, data: undefined };
56
+ if (!parsedInput.success) {
57
+ const errorText = parsedInput.error.issues
58
+ .map((issue) => issue.message)
59
+ .join("; ");
60
+ return {
61
+ content: [
62
+ {
63
+ type: "text",
64
+ text: `Invalid arguments for '${name}': ${errorText}`,
65
+ },
66
+ ],
67
+ isError: true,
68
+ };
69
+ }
70
+ const extra = buildRequestExtra(sessionId);
71
+ if (tool.inputSchema) {
72
+ return tool.handler(parsedInput.data, extra);
73
+ }
74
+ return tool.handler(extra);
75
+ }
76
+ //# sourceMappingURL=ace-internal-tools.js.map
@@ -0,0 +1,12 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function buildAceDigest(workspaceRoot: string): string;
3
+ export declare function buildServerInstructions(workspaceRoot: string): string;
4
+ export declare function buildHostInstructionText(host: "claude" | "copilot" | "cursor" | "codex", workspaceRoot: string): string;
5
+ export declare function buildBootstrapNudge(workspaceRoot: string): string;
6
+ export declare function buildBootstrapGuidance(workspaceRoot: string, toolName: string): string;
7
+ export declare function buildMutationGuidance(workspaceRoot: string, toolName: string): string;
8
+ export declare function buildRefreshGuidance(workspaceRoot: string, toolName: string): string;
9
+ export declare function installAceToolGovernance(server: McpServer, workspaceRoot: string): void;
10
+ export declare function buildHookAdditionalContext(workspaceRoot: string): string;
11
+ export declare function buildScopeReminder(workspaceRoot: string): string | undefined;
12
+ //# sourceMappingURL=ace-server-instructions.d.ts.map
@@ -0,0 +1,324 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ const ACE_ROOT_REL = ".agents/ACE";
4
+ const CORE_FILES = [
5
+ `${ACE_ROOT_REL}/agent-state/TASK.md`,
6
+ `${ACE_ROOT_REL}/agent-state/STATUS.md`,
7
+ `${ACE_ROOT_REL}/agent-state/SCOPE.md`,
8
+ `${ACE_ROOT_REL}/agent-state/EVIDENCE_LOG.md`,
9
+ ];
10
+ const STATE_DIRS = [
11
+ `${ACE_ROOT_REL}/agent-state`,
12
+ `${ACE_ROOT_REL}/global-state`,
13
+ `${ACE_ROOT_REL}/venture-state`,
14
+ `${ACE_ROOT_REL}/brand-state`,
15
+ `${ACE_ROOT_REL}/engineering-state`,
16
+ ];
17
+ const BOOTSTRAP_TOOLS = new Set([
18
+ "bootstrap_state",
19
+ "recall_context",
20
+ "build_continuity_packet",
21
+ ]);
22
+ // Named set — new refresh_* tools must be added here explicitly.
23
+ // These tools rewrite snapshot files but don't need EVIDENCE_LOG reconciliation guidance.
24
+ const REFRESH_TOOLS = new Set([
25
+ "refresh_astgrep_index",
26
+ "refresh_tracker_snapshot",
27
+ "refresh_vericify_bridge",
28
+ ]);
29
+ // Named set — tools that mutate state but do not match any MUTATION_PREFIXES entry.
30
+ // New mutation tools with non-standard prefixes must be added here explicitly.
31
+ const NAMED_MUTATION_TOOLS = new Set([
32
+ "rewrite_targets",
33
+ ]);
34
+ const MUTATION_PREFIXES = [
35
+ "ack_",
36
+ "add_",
37
+ "append_",
38
+ "close_",
39
+ "complete_",
40
+ "context_",
41
+ "create_",
42
+ "dispatch_",
43
+ "emit_",
44
+ "enqueue_",
45
+ "execute_",
46
+ "git_",
47
+ "open_",
48
+ "remove_",
49
+ "resume_",
50
+ "run_",
51
+ "safe_",
52
+ "scan_",
53
+ "snapshot_",
54
+ "start_",
55
+ "stop_",
56
+ "update_",
57
+ "write_",
58
+ ];
59
+ function readIfPresent(filePath) {
60
+ if (!existsSync(filePath))
61
+ return undefined;
62
+ try {
63
+ return readFileSync(filePath, "utf-8");
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ function nonEmptyLines(input) {
70
+ return input
71
+ .split(/\r?\n/)
72
+ .map((line) => line.trim())
73
+ .filter(Boolean);
74
+ }
75
+ function oneLine(input) {
76
+ return input.replace(/\s+/g, " ").trim();
77
+ }
78
+ function truncate(input, max = 140) {
79
+ if (input.length <= max)
80
+ return input;
81
+ return `${input.slice(0, Math.max(0, max - 1)).trimEnd()}…`;
82
+ }
83
+ function resolveWorkspacePath(workspaceRoot, relativePath) {
84
+ const canonicalRel = relativePath.startsWith(`${ACE_ROOT_REL}/`)
85
+ ? relativePath
86
+ : `agent-state|global-state|venture-state|brand-state|engineering-state`
87
+ .split("|")
88
+ .some((prefix) => relativePath === prefix || relativePath.startsWith(`${prefix}/`))
89
+ ? `${ACE_ROOT_REL}/${relativePath}`
90
+ : relativePath;
91
+ const canonicalPath = resolve(workspaceRoot, canonicalRel);
92
+ if (canonicalRel !== relativePath) {
93
+ const legacyPath = resolve(workspaceRoot, relativePath);
94
+ if (!existsSync(canonicalPath) && existsSync(legacyPath)) {
95
+ return legacyPath;
96
+ }
97
+ }
98
+ return canonicalPath;
99
+ }
100
+ function listExistingCoreFiles(workspaceRoot) {
101
+ return CORE_FILES.filter((relativePath) => existsSync(resolveWorkspacePath(workspaceRoot, relativePath)));
102
+ }
103
+ function listExistingStateDirs(workspaceRoot) {
104
+ return STATE_DIRS.filter((relativePath) => existsSync(resolveWorkspacePath(workspaceRoot, relativePath)));
105
+ }
106
+ function extractObjective(taskRaw) {
107
+ if (!taskRaw)
108
+ return undefined;
109
+ const match = taskRaw.match(/## Objective\s+([\s\S]*?)(?:\n## |\n# |$)/);
110
+ if (match?.[1]) {
111
+ return truncate(oneLine(match[1]));
112
+ }
113
+ const bodyLine = nonEmptyLines(taskRaw).find((line) => !line.startsWith("#"));
114
+ if (bodyLine) {
115
+ return truncate(oneLine(bodyLine));
116
+ }
117
+ const heading = taskRaw.match(/^#\s+(.+)$/m)?.[1];
118
+ return heading ? truncate(oneLine(heading)) : undefined;
119
+ }
120
+ function extractStatusValue(statusRaw, label) {
121
+ if (!statusRaw)
122
+ return undefined;
123
+ const pattern = new RegExp(`^- ${label}:\\s*(.+)$`, "m");
124
+ const match = statusRaw.match(pattern);
125
+ return match?.[1] ? truncate(oneLine(match[1])) : undefined;
126
+ }
127
+ function extractAutonomyHint(workspaceRoot) {
128
+ const workflowRaw = readIfPresent(resolveWorkspacePath(workspaceRoot, "agent-state/ACE_WORKFLOW.md"));
129
+ if (!workflowRaw)
130
+ return undefined;
131
+ const hints = [];
132
+ if (/^\s*orchestrator_preflight:\s*true\s*$/m.test(workflowRaw)) {
133
+ hints.push("orchestrator preflight");
134
+ }
135
+ if (/^\s*recall_context:\s*true\s*$/m.test(workflowRaw)) {
136
+ hints.push("context recall");
137
+ }
138
+ const reviewMode = workflowRaw.match(/^\s*review_mode:\s*["']?([A-Za-z0-9_-]+)["']?\s*$/m)?.[1];
139
+ if (reviewMode) {
140
+ hints.push(`review mode ${reviewMode}`);
141
+ }
142
+ return hints.length > 0 ? hints.join(", ") : undefined;
143
+ }
144
+ export function buildAceDigest(workspaceRoot) {
145
+ const taskRaw = readIfPresent(resolveWorkspacePath(workspaceRoot, "agent-state/TASK.md"));
146
+ const statusRaw = readIfPresent(resolveWorkspacePath(workspaceRoot, "agent-state/STATUS.md"));
147
+ const objective = extractObjective(taskRaw);
148
+ const phase = extractStatusValue(statusRaw, "Current phase");
149
+ const blockers = extractStatusValue(statusRaw, "Blockers");
150
+ const parts = [
151
+ objective ? `task=${objective}` : undefined,
152
+ phase ? `phase=${phase}` : undefined,
153
+ blockers ? `blockers=${blockers}` : undefined,
154
+ ].filter((value) => Boolean(value));
155
+ return parts.length > 0 ? parts.join(" | ") : "ACE state detected; load recall_context for task and status.";
156
+ }
157
+ export function buildServerInstructions(workspaceRoot) {
158
+ const coreFiles = listExistingCoreFiles(workspaceRoot);
159
+ const stateDirs = listExistingStateDirs(workspaceRoot);
160
+ const digest = buildAceDigest(workspaceRoot);
161
+ const autonomyHint = extractAutonomyHint(workspaceRoot);
162
+ const lines = [
163
+ "You are operating in an ACE-governed workspace.",
164
+ coreFiles.length > 0
165
+ ? `Ground truth lives in ${coreFiles.join(", ")}.`
166
+ : `Ground truth lives in ${ACE_ROOT_REL}/agent-state/* artifacts, not chat history.`,
167
+ stateDirs.length > 0
168
+ ? `Durable artifacts belong under ${stateDirs.map((entry) => `${entry}/`).join(", ")}.`
169
+ : undefined,
170
+ "Before significant work, call recall_context to load current task, scope, and status.",
171
+ "Use route_task and get_agent_instructions for role guidance; do not self-assign by guesswork.",
172
+ "After meaningful edits or state changes, call execute_gates and persist evidence/handoffs in ACE artifacts.",
173
+ "For delegated or long-running work, use create_handoff / ack_handoff and append_vericify_process_post instead of ad-hoc status notes.",
174
+ `Current ACE digest: ${digest}.`,
175
+ autonomyHint ? `Runtime autonomy signals: ${autonomyHint}.` : undefined,
176
+ ];
177
+ return lines.filter((line) => Boolean(line)).join("\n");
178
+ }
179
+ export function buildHostInstructionText(host, workspaceRoot) {
180
+ const hostLabel = {
181
+ claude: "Claude Code",
182
+ copilot: "GitHub Copilot",
183
+ cursor: "Cursor",
184
+ codex: "Codex",
185
+ }[host];
186
+ return [
187
+ `# ACE Bootstrap For ${hostLabel}`,
188
+ "",
189
+ "This is a thin ACE bootstrap stub.",
190
+ "Full instructions, skills, task packs, and runtime state live inside `.agents/ACE/ace-state.zarr` and should be accessed through the ACE MCP server.",
191
+ "",
192
+ "Session start protocol:",
193
+ "1. Call `recall_context` to load task, scope, and status from ACE state.",
194
+ "2. Call `route_task` and `get_agent_instructions` before choosing a role.",
195
+ "3. Prefer ACE prompts/resources (`ace-orchestrator`, `get_task_pack`, `get_skill_instructions`) over relying on this file.",
196
+ "",
197
+ "Ground truth:",
198
+ "- `.agents/ACE/ace-state.zarr` is authoritative.",
199
+ "- `.agents/ACE/tasks/todo.md` is the human-facing todo surface.",
200
+ "- `.agents/ACE/ace-hook-context.json` is the compact hook snapshot.",
201
+ "",
202
+ `Workspace digest hint: ${buildAceDigest(workspaceRoot)}.`,
203
+ ].join("\n");
204
+ }
205
+ export function buildBootstrapNudge(workspaceRoot) {
206
+ const coreFiles = listExistingCoreFiles(workspaceRoot);
207
+ return [
208
+ "ACE bootstrap hint: call `recall_context` before significant work so task and scope come from file-backed state.",
209
+ `ACE digest: ${buildAceDigest(workspaceRoot)}.`,
210
+ coreFiles.length > 0 ? `Current core files: ${coreFiles.join(", ")}.` : undefined,
211
+ ]
212
+ .filter((value) => Boolean(value))
213
+ .join(" ");
214
+ }
215
+ export function buildBootstrapGuidance(workspaceRoot, toolName) {
216
+ return `ACE context loaded via \`${toolName}\`. Current digest: ${buildAceDigest(workspaceRoot)}.`;
217
+ }
218
+ export function buildMutationGuidance(workspaceRoot, toolName) {
219
+ return [
220
+ `ACE digest after \`${toolName}\`: ${buildAceDigest(workspaceRoot)}.`,
221
+ `If this changed code or state, reconcile \`${ACE_ROOT_REL}/agent-state/EVIDENCE_LOG.md\`, run \`execute_gates\` when appropriate, and use structured handoffs/process posts for delegated follow-up.`,
222
+ ].join(" ");
223
+ }
224
+ export function buildRefreshGuidance(workspaceRoot, toolName) {
225
+ return [
226
+ `ACE snapshot refresh completed via \`${toolName}\`.`,
227
+ `Current digest: ${buildAceDigest(workspaceRoot)}.`,
228
+ ].join(" ");
229
+ }
230
+ function isBootstrapTool(toolName) {
231
+ return BOOTSTRAP_TOOLS.has(toolName);
232
+ }
233
+ function isRefreshTool(toolName) {
234
+ return REFRESH_TOOLS.has(toolName);
235
+ }
236
+ function isMutationTool(toolName) {
237
+ if (isBootstrapTool(toolName) || isRefreshTool(toolName))
238
+ return false;
239
+ if (NAMED_MUTATION_TOOLS.has(toolName))
240
+ return true;
241
+ return MUTATION_PREFIXES.some((prefix) => toolName.startsWith(prefix));
242
+ }
243
+ function normalizeCallToolResult(result) {
244
+ return {
245
+ ...result,
246
+ content: Array.isArray(result.content) ? [...result.content] : [],
247
+ };
248
+ }
249
+ function appendTextContent(result, text) {
250
+ const normalized = normalizeCallToolResult(result);
251
+ const existing = normalized.content
252
+ .filter((entry) => entry.type === "text")
253
+ .map((entry) => entry.text);
254
+ if (existing.some((entry) => entry.includes(text))) {
255
+ return normalized;
256
+ }
257
+ normalized.content.push({ type: "text", text });
258
+ return normalized;
259
+ }
260
+ function isCallToolResult(value) {
261
+ return Boolean(value) && typeof value === "object" && "content" in value;
262
+ }
263
+ export function installAceToolGovernance(server, workspaceRoot) {
264
+ const bootstrappedSessions = new Set();
265
+ const wrapToolCallback = (toolName, callback) => async (...args) => {
266
+ const extra = args.at(-1);
267
+ const sessionId = typeof extra?.sessionId === "string" ? extra.sessionId : undefined;
268
+ const rawResult = await callback(...args);
269
+ const failed = Boolean(rawResult && typeof rawResult === "object" && rawResult.isError);
270
+ if (sessionId && !failed && isBootstrapTool(toolName)) {
271
+ bootstrappedSessions.add(sessionId);
272
+ }
273
+ if (!isCallToolResult(rawResult)) {
274
+ return rawResult;
275
+ }
276
+ let next = rawResult;
277
+ if (sessionId && !bootstrappedSessions.has(sessionId) && !isBootstrapTool(toolName)) {
278
+ next = appendTextContent(next, buildBootstrapNudge(workspaceRoot));
279
+ }
280
+ if (isBootstrapTool(toolName)) {
281
+ next = appendTextContent(next, buildBootstrapGuidance(workspaceRoot, toolName));
282
+ }
283
+ else if (isRefreshTool(toolName)) {
284
+ next = appendTextContent(next, buildRefreshGuidance(workspaceRoot, toolName));
285
+ }
286
+ else if (isMutationTool(toolName)) {
287
+ next = appendTextContent(next, buildMutationGuidance(workspaceRoot, toolName));
288
+ }
289
+ return next;
290
+ };
291
+ const originalTool = server.tool.bind(server);
292
+ server.tool = (name, ...rest) => {
293
+ const maybeCallback = rest.at(-1);
294
+ if (typeof maybeCallback !== "function") {
295
+ return originalTool(name, ...rest);
296
+ }
297
+ return originalTool(name, ...rest.slice(0, -1), wrapToolCallback(name, maybeCallback));
298
+ };
299
+ const originalRegisterTool = server.registerTool.bind(server);
300
+ server.registerTool = (name, config, callback) => {
301
+ if (typeof callback !== "function") {
302
+ return originalRegisterTool(name, config, callback);
303
+ }
304
+ return originalRegisterTool(name, config, wrapToolCallback(name, callback));
305
+ };
306
+ }
307
+ export function buildHookAdditionalContext(workspaceRoot) {
308
+ const parts = [
309
+ buildServerInstructions(workspaceRoot),
310
+ `State digest: ${buildAceDigest(workspaceRoot)}.`,
311
+ ];
312
+ return parts.join("\n");
313
+ }
314
+ export function buildScopeReminder(workspaceRoot) {
315
+ const scopeRaw = readIfPresent(resolveWorkspacePath(workspaceRoot, "agent-state/SCOPE.md"));
316
+ if (!scopeRaw)
317
+ return undefined;
318
+ const scopeLines = nonEmptyLines(scopeRaw).filter((line) => !line.startsWith("#"));
319
+ if (scopeLines.length === 0) {
320
+ return `ACE scope reminder: review ${ACE_ROOT_REL}/agent-state/SCOPE.md before mutating files or state.`;
321
+ }
322
+ return `ACE scope reminder: ${truncate(oneLine(scopeLines.slice(0, 4).join(" ")), 220)}`;
323
+ }
324
+ //# sourceMappingURL=ace-server-instructions.js.map