@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,51 @@
1
+ export interface IndexedFileEntry {
2
+ size: number;
3
+ mtime_ms: number;
4
+ fingerprint: string;
5
+ }
6
+ export interface IndexSnapshot {
7
+ version: 1;
8
+ root: string;
9
+ generated_at: string;
10
+ discovery: {
11
+ mode: "ast_grep_commands";
12
+ command_pack: string;
13
+ subagent: string;
14
+ skill: string;
15
+ fingerprint_store: string;
16
+ };
17
+ options: {
18
+ depth: number;
19
+ max_files: number;
20
+ include_hidden: boolean;
21
+ exclude: string[];
22
+ file_entry_cap: number;
23
+ };
24
+ file_count: number;
25
+ stored_file_count: number;
26
+ directories: Record<string, number>;
27
+ extensions: Record<string, number>;
28
+ files: Record<string, IndexedFileEntry>;
29
+ }
30
+ export interface DeltaScanResult {
31
+ index_path: string;
32
+ fingerprint_path: string;
33
+ snapshot: IndexSnapshot;
34
+ changed: string[];
35
+ unchanged: string[];
36
+ deleted: string[];
37
+ truncated: boolean;
38
+ scanned_count: number;
39
+ }
40
+ export interface ScanWorkspaceDeltaInput {
41
+ path?: string;
42
+ depth?: number;
43
+ max_files?: number;
44
+ include_hidden?: boolean;
45
+ exclude?: string[];
46
+ file_entry_cap?: number;
47
+ index_path?: string;
48
+ }
49
+ export declare function scanWorkspaceDelta(input?: ScanWorkspaceDeltaInput): DeltaScanResult;
50
+ export declare function getDefaultIndexPath(): string;
51
+ //# sourceMappingURL=index-store.d.ts.map
@@ -0,0 +1,328 @@
1
+ import { readdirSync, statSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { safeRead, safeWrite, WORKSPACE_ROOT, wsPath } from "./helpers.js";
4
+ import { isReadError, isInside, normalizeRelPath } from "./shared.js";
5
+ const DEFAULT_INDEX_REL = "agent-state/index.json";
6
+ const DEFAULT_FINGERPRINT_INDEX_REL = "agent-state/index-fingerprints.json";
7
+ const DEFAULT_EXCLUDES = [
8
+ ".git",
9
+ "node_modules",
10
+ "dist",
11
+ "target",
12
+ ".venv",
13
+ "__pycache__",
14
+ ".DS_Store",
15
+ ];
16
+ const DEFAULT_FILE_ENTRY_CAP = 0;
17
+ const DEFAULT_DISCOVERY = {
18
+ mode: "ast_grep_commands",
19
+ command_pack: "agent-state/AST_GREP_COMMANDS.md",
20
+ subagent: "astgrep",
21
+ skill: "astgrep-index",
22
+ fingerprint_store: DEFAULT_FINGERPRINT_INDEX_REL,
23
+ };
24
+ function parseSnapshot(raw) {
25
+ try {
26
+ const parsed = JSON.parse(raw);
27
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
28
+ return undefined;
29
+ }
30
+ const candidate = parsed;
31
+ if (candidate.version !== 1 ||
32
+ typeof candidate.root !== "string" ||
33
+ typeof candidate.generated_at !== "string" ||
34
+ typeof candidate.file_count !== "number" ||
35
+ !candidate.files ||
36
+ typeof candidate.files !== "object") {
37
+ return undefined;
38
+ }
39
+ const files = {};
40
+ for (const [filePath, value] of Object.entries(candidate.files)) {
41
+ if (!value || typeof value !== "object" || Array.isArray(value))
42
+ continue;
43
+ const row = value;
44
+ if (typeof row.size !== "number" ||
45
+ typeof row.mtime_ms !== "number" ||
46
+ typeof row.fingerprint !== "string") {
47
+ continue;
48
+ }
49
+ files[filePath] = {
50
+ size: row.size,
51
+ mtime_ms: row.mtime_ms,
52
+ fingerprint: row.fingerprint,
53
+ };
54
+ }
55
+ const parseCounts = (value) => {
56
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
57
+ return {};
58
+ }
59
+ const output = {};
60
+ for (const [key, count] of Object.entries(value)) {
61
+ if (typeof count === "number" && Number.isFinite(count) && count >= 0) {
62
+ output[key] = count;
63
+ }
64
+ }
65
+ return output;
66
+ };
67
+ const directories = parseCounts(candidate.directories);
68
+ const extensions = parseCounts(candidate.extensions);
69
+ const storedFileCount = (() => {
70
+ if (typeof candidate.stored_file_count === "number" &&
71
+ Number.isFinite(candidate.stored_file_count) &&
72
+ candidate.stored_file_count >= 0) {
73
+ return candidate.stored_file_count;
74
+ }
75
+ return Object.keys(files).length;
76
+ })();
77
+ return {
78
+ version: 1,
79
+ root: candidate.root,
80
+ generated_at: candidate.generated_at,
81
+ discovery: {
82
+ ...DEFAULT_DISCOVERY,
83
+ fingerprint_store: typeof candidate.discovery?.fingerprint_store === "string"
84
+ ? candidate.discovery.fingerprint_store
85
+ : DEFAULT_DISCOVERY.fingerprint_store,
86
+ },
87
+ options: {
88
+ depth: candidate.options?.depth ?? 6,
89
+ max_files: candidate.options?.max_files ?? 10000,
90
+ include_hidden: candidate.options?.include_hidden ?? false,
91
+ exclude: Array.isArray(candidate.options?.exclude)
92
+ ? candidate.options?.exclude.filter((name) => typeof name === "string")
93
+ : DEFAULT_EXCLUDES,
94
+ file_entry_cap: candidate.options?.file_entry_cap ?? DEFAULT_FILE_ENTRY_CAP,
95
+ },
96
+ file_count: candidate.file_count,
97
+ stored_file_count: storedFileCount,
98
+ directories,
99
+ extensions,
100
+ files,
101
+ };
102
+ }
103
+ catch {
104
+ return undefined;
105
+ }
106
+ }
107
+ function parseFingerprintSnapshot(raw) {
108
+ try {
109
+ const parsed = JSON.parse(raw);
110
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
111
+ return undefined;
112
+ }
113
+ const candidate = parsed;
114
+ if (candidate.version !== 1 ||
115
+ typeof candidate.root !== "string" ||
116
+ typeof candidate.generated_at !== "string" ||
117
+ typeof candidate.file_count !== "number" ||
118
+ !candidate.fingerprints ||
119
+ typeof candidate.fingerprints !== "object" ||
120
+ Array.isArray(candidate.fingerprints)) {
121
+ return undefined;
122
+ }
123
+ const fingerprints = {};
124
+ for (const [path, fingerprint] of Object.entries(candidate.fingerprints)) {
125
+ if (typeof fingerprint === "string") {
126
+ fingerprints[path] = fingerprint;
127
+ }
128
+ }
129
+ return {
130
+ version: 1,
131
+ root: candidate.root,
132
+ generated_at: candidate.generated_at,
133
+ file_count: candidate.file_count,
134
+ fingerprints,
135
+ };
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ }
141
+ function fileFingerprint(size, mtimeMs) {
142
+ return `${size}:${Math.floor(mtimeMs)}`;
143
+ }
144
+ function fileExtension(name) {
145
+ const dot = name.lastIndexOf(".");
146
+ if (dot <= 0 || dot === name.length - 1)
147
+ return "[no_ext]";
148
+ return name.slice(dot + 1).toLowerCase();
149
+ }
150
+ function sortCountMap(input) {
151
+ return Object.fromEntries(Object.entries(input).sort((a, b) => a[0].localeCompare(b[0])));
152
+ }
153
+ function shouldSkipName(name, includeHidden, excludeSet) {
154
+ if (!includeHidden && name.startsWith(".")) {
155
+ return true;
156
+ }
157
+ return excludeSet.has(name);
158
+ }
159
+ function readPriorIndex(indexPath) {
160
+ const raw = safeRead(indexPath);
161
+ if (isReadError(raw)) {
162
+ return undefined;
163
+ }
164
+ return parseSnapshot(raw);
165
+ }
166
+ function readPriorFingerprints(fingerprintPath) {
167
+ const raw = safeRead(fingerprintPath);
168
+ if (isReadError(raw))
169
+ return undefined;
170
+ return parseFingerprintSnapshot(raw)?.fingerprints;
171
+ }
172
+ function buildSnapshot(input) {
173
+ const depth = input.depth ?? 6;
174
+ const maxFiles = input.max_files ?? 10000;
175
+ const includeHidden = input.include_hidden ?? false;
176
+ const fileEntryCap = input.file_entry_cap ?? DEFAULT_FILE_ENTRY_CAP;
177
+ const exclude = input.exclude?.length ? input.exclude : DEFAULT_EXCLUDES;
178
+ const excludeSet = new Set(exclude);
179
+ const requestedRoot = normalizeRelPath(input.path ?? ".");
180
+ const rootRel = requestedRoot === "" ? "." : requestedRoot;
181
+ const rootAbs = resolve(WORKSPACE_ROOT, rootRel);
182
+ if (!isInside(WORKSPACE_ROOT, rootAbs)) {
183
+ throw new Error(`Path escapes workspace root: ${rootRel}`);
184
+ }
185
+ const files = {};
186
+ const fingerprints = {};
187
+ const directories = {};
188
+ const extensions = {};
189
+ let scanned = 0;
190
+ let stored = 0;
191
+ let truncated = false;
192
+ function walk(currentAbs, currentRel, remainingDepth) {
193
+ if (truncated || remainingDepth < 0)
194
+ return;
195
+ const entries = readdirSync(currentAbs, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
196
+ for (const entry of entries) {
197
+ if (truncated)
198
+ return;
199
+ if (shouldSkipName(entry.name, includeHidden, excludeSet))
200
+ continue;
201
+ const entryAbs = resolve(currentAbs, entry.name);
202
+ const entryRel = currentRel ? `${currentRel}/${entry.name}` : entry.name;
203
+ const normalized = normalizeRelPath(entryRel);
204
+ if (entry.isDirectory()) {
205
+ walk(entryAbs, normalized, remainingDepth - 1);
206
+ continue;
207
+ }
208
+ if (!entry.isFile()) {
209
+ continue;
210
+ }
211
+ if (scanned >= maxFiles) {
212
+ truncated = true;
213
+ return;
214
+ }
215
+ const stats = statSync(entryAbs);
216
+ const fingerprint = fileFingerprint(stats.size, stats.mtimeMs);
217
+ const topLevel = normalized.includes("/") ? normalized.split("/")[0] : normalized;
218
+ directories[topLevel] = (directories[topLevel] ?? 0) + 1;
219
+ const ext = fileExtension(entry.name);
220
+ extensions[ext] = (extensions[ext] ?? 0) + 1;
221
+ fingerprints[normalized] = fingerprint;
222
+ if (stored < fileEntryCap) {
223
+ files[normalized] = {
224
+ size: stats.size,
225
+ mtime_ms: stats.mtimeMs,
226
+ fingerprint,
227
+ };
228
+ stored += 1;
229
+ }
230
+ scanned += 1;
231
+ }
232
+ }
233
+ walk(rootAbs, rootRel === "." ? "" : rootRel, depth);
234
+ const snapshot = {
235
+ version: 1,
236
+ root: rootRel,
237
+ generated_at: new Date().toISOString(),
238
+ discovery: {
239
+ ...DEFAULT_DISCOVERY,
240
+ // Use the actual fingerprint store path so custom indexes report
241
+ // accurate metadata instead of always claiming the default store.
242
+ fingerprint_store: input.index_path
243
+ ? (/\.json$/.test(normalizeRelPath(input.index_path))
244
+ ? normalizeRelPath(input.index_path).replace(/\.json$/, "-fingerprints.json")
245
+ : `${normalizeRelPath(input.index_path)}-fingerprints.json`)
246
+ : DEFAULT_DISCOVERY.fingerprint_store,
247
+ },
248
+ options: {
249
+ depth,
250
+ max_files: maxFiles,
251
+ include_hidden: includeHidden,
252
+ exclude,
253
+ file_entry_cap: fileEntryCap,
254
+ },
255
+ file_count: scanned,
256
+ stored_file_count: stored,
257
+ directories: sortCountMap(directories),
258
+ extensions: sortCountMap(extensions),
259
+ files,
260
+ };
261
+ return { snapshot, fingerprints, truncated, scanned_count: scanned };
262
+ }
263
+ export function scanWorkspaceDelta(input = {}) {
264
+ const indexRel = normalizeRelPath(input.index_path ?? DEFAULT_INDEX_REL);
265
+ // Derive fingerprint path from the index path to avoid cross-scope contamination.
266
+ // If a custom index_path is provided (e.g. "agent-state/index-src.json"), the
267
+ // fingerprint store becomes "agent-state/index-src-fingerprints.json".
268
+ // Guard: if the path has no .json extension, append "-fingerprints.json" to
269
+ // avoid index and fingerprint paths colliding (which would overwrite the index).
270
+ const fingerprintRel = indexRel === normalizeRelPath(DEFAULT_INDEX_REL)
271
+ ? DEFAULT_DISCOVERY.fingerprint_store
272
+ : /\.json$/.test(indexRel)
273
+ ? indexRel.replace(/\.json$/, "-fingerprints.json")
274
+ : `${indexRel}-fingerprints.json`;
275
+ const previous = readPriorIndex(indexRel);
276
+ const previousFingerprints = readPriorFingerprints(fingerprintRel) ??
277
+ (() => {
278
+ const fallback = {};
279
+ const previousFiles = previous?.files ?? {};
280
+ for (const [path, row] of Object.entries(previousFiles)) {
281
+ fallback[path] = row.fingerprint;
282
+ }
283
+ return fallback;
284
+ })();
285
+ const { snapshot, fingerprints, truncated, scanned_count } = buildSnapshot(input);
286
+ const changed = [];
287
+ const unchanged = [];
288
+ const deleted = [];
289
+ for (const [path, nextFingerprint] of Object.entries(fingerprints)) {
290
+ const oldFingerprint = previousFingerprints[path];
291
+ if (!oldFingerprint || oldFingerprint !== nextFingerprint) {
292
+ changed.push(path);
293
+ }
294
+ else {
295
+ unchanged.push(path);
296
+ }
297
+ }
298
+ for (const oldPath of Object.keys(previousFingerprints)) {
299
+ if (!fingerprints[oldPath]) {
300
+ deleted.push(oldPath);
301
+ }
302
+ }
303
+ changed.sort((a, b) => a.localeCompare(b));
304
+ unchanged.sort((a, b) => a.localeCompare(b));
305
+ deleted.sort((a, b) => a.localeCompare(b));
306
+ const indexPath = safeWrite(indexRel, JSON.stringify(snapshot, null, 2));
307
+ const fingerprintPath = safeWrite(fingerprintRel, JSON.stringify({
308
+ version: 1,
309
+ root: snapshot.root,
310
+ generated_at: snapshot.generated_at,
311
+ file_count: snapshot.file_count,
312
+ fingerprints,
313
+ }, null, 2));
314
+ return {
315
+ index_path: indexPath,
316
+ fingerprint_path: fingerprintPath,
317
+ snapshot,
318
+ changed,
319
+ unchanged,
320
+ deleted,
321
+ truncated,
322
+ scanned_count,
323
+ };
324
+ }
325
+ export function getDefaultIndexPath() {
326
+ return wsPath(DEFAULT_INDEX_REL);
327
+ }
328
+ //# sourceMappingURL=index-store.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { startStdioServer } from "./server.js";
3
+ startStdioServer().catch((err) => {
4
+ console.error("Fatal error:", err);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,21 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ export interface InternalToolDescriptor {
3
+ name: string;
4
+ description: string;
5
+ inputSchema?: unknown;
6
+ outputSchema?: unknown;
7
+ }
8
+ export interface InternalToolExecutionContext {
9
+ sessionId?: string;
10
+ }
11
+ export interface InternalToolExecutionResult {
12
+ ok: boolean;
13
+ name: string;
14
+ summary: string;
15
+ result?: CallToolResult;
16
+ error?: string;
17
+ }
18
+ export declare function listInternalTools(toolScope?: string[]): InternalToolDescriptor[];
19
+ export declare function executeInternalTool(name: string, args?: Record<string, unknown>, context?: InternalToolExecutionContext): Promise<InternalToolExecutionResult>;
20
+ export declare function resetInternalToolRuntime(): void;
21
+ //# sourceMappingURL=internal-tool-runtime.d.ts.map
@@ -0,0 +1,136 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { z } from "zod";
3
+ import { createAceServer } from "./server.js";
4
+ function isPlainObject(value) {
5
+ return !!value && typeof value === "object" && !Array.isArray(value);
6
+ }
7
+ function isZodSchema(value) {
8
+ return Boolean(value) && typeof value === "object" && "safeParseAsync" in value;
9
+ }
10
+ function buildZodObject(shape) {
11
+ if (!isPlainObject(shape))
12
+ return undefined;
13
+ const values = Object.values(shape);
14
+ if (!values.every((value) => isZodSchema(value)))
15
+ return undefined;
16
+ return z.object(shape);
17
+ }
18
+ function describeSchema(schema) {
19
+ if (isPlainObject(schema)) {
20
+ const properties = Object.fromEntries(Object.entries(schema).map(([key, value]) => [
21
+ key,
22
+ {
23
+ description: isZodSchema(value)
24
+ ? value.description ?? value._def?.typeName ?? "input"
25
+ : "input",
26
+ },
27
+ ]));
28
+ return { type: "object", properties };
29
+ }
30
+ if (isZodSchema(schema)) {
31
+ return {
32
+ type: schema._def?.typeName ?? "schema",
33
+ description: schema.description ?? "tool input",
34
+ };
35
+ }
36
+ return undefined;
37
+ }
38
+ function summarizeResult(name, result) {
39
+ const textBlocks = Array.isArray(result.content)
40
+ ? result.content
41
+ .filter((entry) => {
42
+ return isPlainObject(entry) && entry.type === "text" && typeof entry.text === "string";
43
+ })
44
+ .map((entry) => entry.text.trim())
45
+ .filter(Boolean)
46
+ : [];
47
+ const summary = textBlocks[0] ?? `${name} completed`;
48
+ return summary.length <= 240 ? summary : `${summary.slice(0, 239).trimEnd()}…`;
49
+ }
50
+ let cachedTools;
51
+ function getRegisteredTools() {
52
+ if (cachedTools)
53
+ return cachedTools;
54
+ const server = createAceServer({ toolGovernance: false });
55
+ const registry = server
56
+ ._registeredTools;
57
+ cachedTools = new Map(Object.entries(registry ?? {}).filter(([, tool]) => tool.enabled !== false));
58
+ return cachedTools;
59
+ }
60
+ export function listInternalTools(toolScope) {
61
+ const allowed = toolScope ? new Set(toolScope) : undefined;
62
+ return [...getRegisteredTools().entries()]
63
+ .filter(([name]) => !allowed || allowed.has(name))
64
+ .map(([name, tool]) => ({
65
+ name,
66
+ description: tool.description ?? tool.title ?? "ACE MCP tool",
67
+ inputSchema: describeSchema(tool.inputSchema),
68
+ outputSchema: describeSchema(tool.outputSchema),
69
+ }))
70
+ .sort((left, right) => left.name.localeCompare(right.name));
71
+ }
72
+ export async function executeInternalTool(name, args = {}, context = {}) {
73
+ const tool = getRegisteredTools().get(name);
74
+ if (!tool) {
75
+ return {
76
+ ok: false,
77
+ name,
78
+ summary: `Unknown tool: ${name}`,
79
+ error: `Unknown tool: ${name}`,
80
+ };
81
+ }
82
+ let validatedArgs = args;
83
+ try {
84
+ if (tool.inputSchema) {
85
+ const schema = isZodSchema(tool.inputSchema) ? tool.inputSchema : buildZodObject(tool.inputSchema);
86
+ if (schema) {
87
+ const parsed = await schema.safeParseAsync(args);
88
+ if (!parsed.success) {
89
+ const message = parsed.error.issues.map((issue) => issue.message).join("; ");
90
+ return {
91
+ ok: false,
92
+ name,
93
+ summary: `Input validation failed for ${name}`,
94
+ error: message,
95
+ };
96
+ }
97
+ if (isPlainObject(parsed.data)) {
98
+ validatedArgs = parsed.data;
99
+ }
100
+ }
101
+ }
102
+ const extra = {
103
+ signal: new AbortController().signal,
104
+ sessionId: context.sessionId ?? `internal-${randomUUID()}`,
105
+ requestId: `internal-${randomUUID()}`,
106
+ sendNotification: async () => undefined,
107
+ sendRequest: async () => {
108
+ throw new Error("Internal tool runtime does not support nested MCP requests.");
109
+ },
110
+ };
111
+ const raw = tool.inputSchema
112
+ ? await tool.handler(validatedArgs, extra)
113
+ : await tool.handler(extra);
114
+ const result = raw;
115
+ return {
116
+ ok: !Boolean(result?.isError),
117
+ name,
118
+ summary: summarizeResult(name, result),
119
+ result,
120
+ error: result.isError ? summarizeResult(name, result) : undefined,
121
+ };
122
+ }
123
+ catch (error) {
124
+ const message = error instanceof Error ? error.message : String(error);
125
+ return {
126
+ ok: false,
127
+ name,
128
+ summary: `${name} failed`,
129
+ error: message,
130
+ };
131
+ }
132
+ }
133
+ export function resetInternalToolRuntime() {
134
+ cachedTools = undefined;
135
+ }
136
+ //# sourceMappingURL=internal-tool-runtime.js.map