@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,432 @@
1
+ /**
2
+ * ACE-TUI Command Registry
3
+ *
4
+ * KFE (Keys For Everything) command definitions.
5
+ * Single command vocabulary for human operators, agents, and playbooks.
6
+ */
7
+ // ── Command registry ─────────────────────────────────────────────────
8
+ export class CommandRegistry {
9
+ commands = new Map();
10
+ register(cmd) {
11
+ this.commands.set(cmd.name, cmd);
12
+ for (const alias of cmd.aliases) {
13
+ this.commands.set(alias, cmd);
14
+ }
15
+ }
16
+ get(name) {
17
+ return this.commands.get(name);
18
+ }
19
+ getAll() {
20
+ const seen = new Set();
21
+ const result = [];
22
+ for (const cmd of this.commands.values()) {
23
+ if (!seen.has(cmd.name)) {
24
+ seen.add(cmd.name);
25
+ result.push(cmd);
26
+ }
27
+ }
28
+ return result;
29
+ }
30
+ /** Parse and execute a command string */
31
+ async execute(input, ctx) {
32
+ const trimmed = input.trim();
33
+ // Must start with /
34
+ if (!trimmed.startsWith("/")) {
35
+ // Not a command — treat as chat input
36
+ await ctx.tui.sendChatMessage(trimmed);
37
+ return;
38
+ }
39
+ const parts = trimmed.slice(1).split(/\s+/);
40
+ const cmdName = parts[0]?.toLowerCase();
41
+ const args = parts.slice(1);
42
+ if (!cmdName)
43
+ return;
44
+ const cmd = this.commands.get(cmdName);
45
+ if (!cmd) {
46
+ ctx.tui.showMessage(`Unknown command: /${cmdName}. Type /help for available commands.`, "warn");
47
+ return;
48
+ }
49
+ try {
50
+ await cmd.handler(args, ctx);
51
+ }
52
+ catch (err) {
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ ctx.tui.showMessage(`Error: ${msg}`, "error");
55
+ }
56
+ }
57
+ /** Get completions for a partial command */
58
+ complete(partial, ctx) {
59
+ if (!partial.startsWith("/"))
60
+ return [];
61
+ const parts = partial.slice(1).split(/\s+/);
62
+ const cmdName = parts[0]?.toLowerCase();
63
+ // Completing command name
64
+ if (parts.length <= 1) {
65
+ return this.getAll()
66
+ .filter(c => c.name.startsWith(cmdName ?? ""))
67
+ .map(c => `/${c.name}`);
68
+ }
69
+ // Completing arguments — delegate to command's completeFn
70
+ const cmd = this.commands.get(cmdName);
71
+ if (cmd?.completeFn && ctx) {
72
+ const argPartial = parts.slice(1).join(" ");
73
+ return cmd.completeFn(argPartial, ctx);
74
+ }
75
+ return [];
76
+ }
77
+ }
78
+ // ── Built-in commands ────────────────────────────────────────────────
79
+ export function registerBuiltinCommands(registry) {
80
+ // /provider [name] — Switch active provider
81
+ registry.register({
82
+ name: "provider",
83
+ aliases: ["pvd"],
84
+ description: "Show or switch active provider",
85
+ usage: "/provider [name]",
86
+ handler: (args, ctx) => {
87
+ if (args.length === 0) {
88
+ ctx.tui.showMessage(`Current provider: ${ctx.tui.getProvider()}`);
89
+ return;
90
+ }
91
+ const ok = ctx.tui.setProvider(args[0]);
92
+ if (!ok) {
93
+ ctx.tui.showMessage(`Unknown provider: ${args[0]}. Available: ${ctx.tui.getProviders().join(", ")}`, "warn");
94
+ return;
95
+ }
96
+ const provider = ctx.tui.getProvider();
97
+ ctx.tui.showMessage(`Provider switched to: ${provider}`);
98
+ },
99
+ completeFn: (partial, ctx) => {
100
+ const needle = partial.trim().toLowerCase();
101
+ return ctx.tui.getProviders().filter((p) => p.startsWith(needle));
102
+ },
103
+ });
104
+ // /providers — List discovered providers
105
+ registry.register({
106
+ name: "providers",
107
+ aliases: ["pvds"],
108
+ description: "List discovered providers",
109
+ usage: "/providers",
110
+ handler: (args, ctx) => {
111
+ const providers = ctx.tui.getProviders();
112
+ const active = ctx.tui.getProvider();
113
+ const lines = providers.map((p) => (p === active ? `[${p}]` : p));
114
+ ctx.tui.showMessage(`Providers: ${lines.join(", ")}`);
115
+ },
116
+ });
117
+ // /model <name> — Switch active model
118
+ registry.register({
119
+ name: "model",
120
+ aliases: ["m"],
121
+ description: "Switch active model",
122
+ usage: "/model <name>",
123
+ handler: async (args, ctx) => {
124
+ if (args.length === 0) {
125
+ ctx.tui.showMessage(`Current model: ${ctx.tui.getModel()} (${ctx.tui.getProvider()})`);
126
+ return;
127
+ }
128
+ ctx.tui.setModel(args[0]);
129
+ ctx.tui.showMessage(`Model switched to: ${args[0]}`);
130
+ },
131
+ completeFn: (partial, ctx) => {
132
+ return ctx.tui.searchModels(partial);
133
+ },
134
+ });
135
+ // /models — List available models
136
+ registry.register({
137
+ name: "models",
138
+ aliases: ["ml"],
139
+ description: "List available models for the active provider",
140
+ usage: "/models",
141
+ handler: async (args, ctx) => {
142
+ const provider = ctx.tui.getProvider();
143
+ const models = await ctx.tui.getProviderModels(provider);
144
+ if (models.length === 0) {
145
+ ctx.tui.showMessage(`No models discovered for provider '${provider}'.`, "warn");
146
+ }
147
+ else {
148
+ ctx.tui.showMessage(`${provider} models (${models.length}): ${models.join(", ")}`);
149
+ }
150
+ },
151
+ });
152
+ // /pull <name> — Pull an Ollama model
153
+ registry.register({
154
+ name: "pull",
155
+ aliases: [],
156
+ description: "Pull an Ollama model",
157
+ usage: "/pull <model-name>",
158
+ handler: async (args, ctx) => {
159
+ if (args.length === 0) {
160
+ ctx.tui.showMessage("Usage: /pull <model-name> (e.g. /pull llama3.1:8b)", "warn");
161
+ return;
162
+ }
163
+ ctx.tui.showMessage(`Pulling model: ${args[0]}...`);
164
+ await ctx.tui.pullModel(args[0]);
165
+ },
166
+ });
167
+ // /ollama — Show Ollama status and management hints
168
+ registry.register({
169
+ name: "ollama",
170
+ aliases: ["ol"],
171
+ description: "Show Ollama status (connection, models, management commands)",
172
+ usage: "/ollama [check|serve|models|url <url>]",
173
+ handler: async (args, ctx) => {
174
+ const sub = args[0]?.toLowerCase();
175
+ if (sub === "url" && args[1]) {
176
+ ctx.tui.setConfig("ollama_url", args[1]);
177
+ ctx.tui.showMessage(`Ollama URL updated to: ${args[1]}. Reconnecting...`);
178
+ return;
179
+ }
180
+ if (sub === "serve") {
181
+ ctx.tui.showMessage("To start Ollama, run in a separate terminal: ollama serve");
182
+ return;
183
+ }
184
+ // Default: status check
185
+ const models = await ctx.tui.getOllamaModels();
186
+ const url = ctx.tui.getConfig("ollama_url") ?? "(not configured)";
187
+ if (models.length > 0) {
188
+ const current = ctx.tui.getModel();
189
+ const modelList = models.slice(0, 8).join(", ");
190
+ ctx.tui.showMessage(`Ollama OK at ${url} | Current: ${current} | Available (${models.length}): ${modelList}`);
191
+ }
192
+ else {
193
+ ctx.tui.showMessage(`Ollama not reachable at ${url}. Start it: ollama serve | Change URL: /ollama url <url>`, "warn");
194
+ }
195
+ },
196
+ completeFn: () => ["check", "serve", "models", "url"],
197
+ });
198
+ // /agent <role> — Start a subagent
199
+ registry.register({
200
+ name: "agent",
201
+ aliases: ["a"],
202
+ description: "Start a subagent",
203
+ usage: "/agent <role>",
204
+ handler: async (args, ctx) => {
205
+ if (args.length === 0) {
206
+ const active = ctx.tui.getActiveAgents();
207
+ ctx.tui.showMessage(`Active agents: ${active.length ? active.join(", ") : "none"}`);
208
+ return;
209
+ }
210
+ await ctx.tui.startAgent(args[0]);
211
+ },
212
+ completeFn: (partial, ctx) => {
213
+ return ctx.tui.getAllAgentRoles().filter(r => r.startsWith(partial));
214
+ },
215
+ });
216
+ // /agents — List agents
217
+ registry.register({
218
+ name: "agents",
219
+ aliases: ["as"],
220
+ description: "List all agents and their status",
221
+ usage: "/agents",
222
+ handler: async (args, ctx) => {
223
+ const all = ctx.tui.getAllAgentRoles();
224
+ const active = ctx.tui.getActiveAgents();
225
+ const lines = all.map(r => {
226
+ const isActive = active.includes(r);
227
+ return `${isActive ? "●" : "○"} ${r}`;
228
+ });
229
+ ctx.tui.showMessage(lines.join(" | "));
230
+ },
231
+ });
232
+ // /kill <role> — Stop a subagent
233
+ registry.register({
234
+ name: "kill",
235
+ aliases: ["k"],
236
+ description: "Stop a subagent",
237
+ usage: "/kill <role>",
238
+ handler: (args, ctx) => {
239
+ if (args.length === 0) {
240
+ ctx.tui.showMessage("Usage: /kill <role>", "warn");
241
+ return;
242
+ }
243
+ ctx.tui.stopAgent(args[0]);
244
+ ctx.tui.showMessage(`Agent stopped: ${args[0]}`);
245
+ },
246
+ completeFn: (partial, ctx) => {
247
+ return ctx.tui.getActiveAgents().filter(r => r.startsWith(partial));
248
+ },
249
+ });
250
+ // /tasks — Show task board
251
+ registry.register({
252
+ name: "tasks",
253
+ aliases: ["t"],
254
+ description: "Show task board",
255
+ usage: "/tasks",
256
+ handler: (args, ctx) => {
257
+ ctx.tui.showMessage("Task board displayed on dashboard");
258
+ ctx.tui.switchTab(0); // Dashboard tab
259
+ },
260
+ });
261
+ // /task <description> — Create a new task
262
+ registry.register({
263
+ name: "task",
264
+ aliases: [],
265
+ description: "Create a new task",
266
+ usage: "/task <description>",
267
+ handler: (args, ctx) => {
268
+ if (args.length === 0) {
269
+ ctx.tui.showMessage("Usage: /task <description>", "warn");
270
+ return;
271
+ }
272
+ const desc = args.join(" ");
273
+ ctx.tui.showMessage(`Task created: ${desc}`);
274
+ },
275
+ });
276
+ // /handoff <from> <to> — Trigger agent handoff
277
+ registry.register({
278
+ name: "handoff",
279
+ aliases: ["ho"],
280
+ description: "Trigger agent handoff",
281
+ usage: "/handoff <from-agent> <to-agent>",
282
+ handler: async (args, ctx) => {
283
+ if (args.length < 2) {
284
+ ctx.tui.showMessage("Usage: /handoff <from> <to>", "warn");
285
+ return;
286
+ }
287
+ ctx.tui.showMessage(`Handoff initiated: ${args[0]} → ${args[1]}`);
288
+ },
289
+ completeFn: (partial, ctx) => {
290
+ return ctx.tui.getAllAgentRoles().filter(r => r.startsWith(partial));
291
+ },
292
+ });
293
+ // /status — Show orchestrator status
294
+ registry.register({
295
+ name: "status",
296
+ aliases: ["s"],
297
+ description: "Show orchestrator status",
298
+ usage: "/status",
299
+ handler: (args, ctx) => {
300
+ const status = ctx.tui.getStatus();
301
+ const lines = Object.entries(status)
302
+ .map(([k, v]) => `${k}: ${v}`)
303
+ .join(" | ");
304
+ ctx.tui.showMessage(lines);
305
+ },
306
+ });
307
+ // /skill <name> — Load a skill
308
+ registry.register({
309
+ name: "skill",
310
+ aliases: [],
311
+ description: "Load a skill",
312
+ usage: "/skill <name>",
313
+ handler: (args, ctx) => {
314
+ if (args.length === 0) {
315
+ ctx.tui.showMessage("Usage: /skill <name>", "warn");
316
+ return;
317
+ }
318
+ ctx.tui.showMessage(`Skill loaded: ${args[0]}`);
319
+ },
320
+ });
321
+ // /skills — List available skills
322
+ registry.register({
323
+ name: "skills",
324
+ aliases: [],
325
+ description: "List available skills",
326
+ usage: "/skills",
327
+ handler: (args, ctx) => {
328
+ ctx.tui.showMessage("Skills listed on dashboard");
329
+ },
330
+ });
331
+ // /config <key> <value> — Set configuration
332
+ registry.register({
333
+ name: "config",
334
+ aliases: ["cfg"],
335
+ description: "Set a configuration value",
336
+ usage: "/config <key> <value>",
337
+ handler: (args, ctx) => {
338
+ if (args.length < 1) {
339
+ ctx.tui.showMessage("Usage: /config <key> [value]", "warn");
340
+ return;
341
+ }
342
+ if (args.length === 1) {
343
+ const val = ctx.tui.getConfig(args[0]);
344
+ ctx.tui.showMessage(`${args[0]} = ${val ?? "(not set)"}`);
345
+ }
346
+ else {
347
+ ctx.tui.setConfig(args[0], args.slice(1).join(" "));
348
+ ctx.tui.showMessage(`Config set: ${args[0]} = ${args.slice(1).join(" ")}`);
349
+ }
350
+ },
351
+ completeFn: () => {
352
+ return ["provider", "model", "temperature", "top_p", "num_ctx", "num_predict", "theme", "ollama_url"];
353
+ },
354
+ });
355
+ // /theme <dark|light> — Switch theme
356
+ registry.register({
357
+ name: "theme",
358
+ aliases: [],
359
+ description: "Switch theme",
360
+ usage: "/theme <dark|light>",
361
+ handler: (args, ctx) => {
362
+ const theme = args[0] ?? "dark";
363
+ ctx.tui.setConfig("theme", theme);
364
+ ctx.tui.showMessage(`Theme set to: ${theme}`);
365
+ ctx.tui.refresh();
366
+ },
367
+ completeFn: () => ["dark", "light"],
368
+ });
369
+ // /chat — Open new chat tab
370
+ registry.register({
371
+ name: "chat",
372
+ aliases: ["c"],
373
+ description: "Open new chat tab",
374
+ usage: "/chat",
375
+ handler: (args, ctx) => {
376
+ ctx.tui.createChatTab();
377
+ },
378
+ });
379
+ // /logs — Open logs tab
380
+ registry.register({
381
+ name: "logs",
382
+ aliases: ["l"],
383
+ description: "Open logs tab",
384
+ usage: "/logs",
385
+ handler: (args, ctx) => {
386
+ ctx.tui.createLogTab();
387
+ },
388
+ });
389
+ // /clear — Clear current view
390
+ registry.register({
391
+ name: "clear",
392
+ aliases: ["cls"],
393
+ description: "Clear current view",
394
+ usage: "/clear",
395
+ handler: (args, ctx) => {
396
+ ctx.tui.clearView();
397
+ },
398
+ });
399
+ // /help — Show available commands
400
+ registry.register({
401
+ name: "help",
402
+ aliases: ["h", "?"],
403
+ description: "Show available commands",
404
+ usage: "/help [command]",
405
+ handler: (args, ctx) => {
406
+ if (args.length > 0) {
407
+ const cmd = registry.get(args[0]);
408
+ if (cmd) {
409
+ ctx.tui.showMessage(`${cmd.usage} — ${cmd.description}`);
410
+ }
411
+ else {
412
+ ctx.tui.showMessage(`Unknown command: ${args[0]}`, "warn");
413
+ }
414
+ return;
415
+ }
416
+ const cmds = registry.getAll();
417
+ const lines = cmds.map(c => `/${c.name}`).join(" ");
418
+ ctx.tui.showMessage(`Commands: ${lines}. Type /help <cmd> for details.`);
419
+ },
420
+ });
421
+ // /quit — Exit TUI
422
+ registry.register({
423
+ name: "quit",
424
+ aliases: ["q", "exit"],
425
+ description: "Exit TUI",
426
+ usage: "/quit",
427
+ handler: (args, ctx) => {
428
+ ctx.tui.quit();
429
+ },
430
+ });
431
+ }
432
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ACE-TUI Dashboard
3
+ *
4
+ * Store-first dashboard ingestion over ace-state.zarr.
5
+ * The TUI never tails compatibility files directly.
6
+ */
7
+ import { EventEmitter } from "node:events";
8
+ import type { DashboardData } from "./layout.js";
9
+ export declare class DashboardState extends EventEmitter {
10
+ private workspaceRoot;
11
+ private readonly storePath;
12
+ private stopPolling;
13
+ private tasks;
14
+ private persistedEvents;
15
+ private runtimeEvents;
16
+ private phase;
17
+ constructor(workspaceRoot: string);
18
+ startWatching(): void;
19
+ stopWatching(): void;
20
+ getData(provider: string, model: string, startTime: number, tokensIn: number, tokensOut: number, tokensPerSec: number, activeAgents: number, totalAgents: number): DashboardData;
21
+ addEvent(agent: string, message: string): void;
22
+ private applySnapshot;
23
+ }
24
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1,110 @@
1
+ /**
2
+ * ACE-TUI Dashboard
3
+ *
4
+ * Store-first dashboard ingestion over ace-state.zarr.
5
+ * The TUI never tails compatibility files directly.
6
+ */
7
+ import { EventEmitter } from "node:events";
8
+ import { resolve } from "node:path";
9
+ import { pollStore } from "../store/state-reader.js";
10
+ function dedupeEvents(events) {
11
+ const seen = new Set();
12
+ const ordered = [];
13
+ for (const event of events.sort((a, b) => a.timestamp - b.timestamp)) {
14
+ const key = `${event.timestamp}:${event.agent}:${event.message}`;
15
+ if (seen.has(key))
16
+ continue;
17
+ seen.add(key);
18
+ ordered.push(event);
19
+ }
20
+ return ordered.slice(-500);
21
+ }
22
+ function derivePhase(snapshot) {
23
+ if (snapshot.jobs.some((job) => String(job.status ?? "") === "running")) {
24
+ return "Running";
25
+ }
26
+ if (snapshot.todos.some((todo) => todo.status === "in_progress")) {
27
+ return "In Progress";
28
+ }
29
+ if (snapshot.todos.some((todo) => todo.status === "blocked")) {
30
+ return "Blocked";
31
+ }
32
+ if (snapshot.handoffs.length > 0) {
33
+ return "Coordinating";
34
+ }
35
+ return "Ready";
36
+ }
37
+ export class DashboardState extends EventEmitter {
38
+ workspaceRoot;
39
+ storePath;
40
+ stopPolling = null;
41
+ tasks = [];
42
+ persistedEvents = [];
43
+ runtimeEvents = [];
44
+ phase = "Initializing";
45
+ constructor(workspaceRoot) {
46
+ super();
47
+ this.workspaceRoot = workspaceRoot;
48
+ this.storePath = resolve(workspaceRoot, ".agents", "ACE", "ace-state.zarr");
49
+ }
50
+ startWatching() {
51
+ if (this.stopPolling)
52
+ return;
53
+ this.stopPolling = pollStore(this.storePath, 1000, (snapshot) => {
54
+ this.applySnapshot(snapshot);
55
+ this.emit("updated");
56
+ }, (error) => {
57
+ this.addEvent("system", `dashboard store refresh failed: ${error.message}`);
58
+ });
59
+ }
60
+ stopWatching() {
61
+ if (this.stopPolling) {
62
+ this.stopPolling();
63
+ this.stopPolling = null;
64
+ }
65
+ }
66
+ getData(provider, model, startTime, tokensIn, tokensOut, tokensPerSec, activeAgents, totalAgents) {
67
+ return {
68
+ phase: this.phase,
69
+ provider,
70
+ model,
71
+ activeAgents,
72
+ totalAgents,
73
+ startTime,
74
+ tokensIn,
75
+ tokensOut,
76
+ tokensPerSec,
77
+ tasks: this.tasks,
78
+ events: dedupeEvents([...this.persistedEvents, ...this.runtimeEvents]).slice(-50),
79
+ };
80
+ }
81
+ addEvent(agent, message) {
82
+ this.runtimeEvents.push({
83
+ timestamp: Date.now(),
84
+ agent,
85
+ message,
86
+ });
87
+ this.runtimeEvents = this.runtimeEvents.slice(-200);
88
+ this.emit("updated");
89
+ }
90
+ applySnapshot(snapshot) {
91
+ this.tasks = snapshot.todos.map((todo) => ({
92
+ title: todo.title,
93
+ done: todo.status === "done",
94
+ priority: todo.priority,
95
+ }));
96
+ const trackerEvents = snapshot.events.map((event) => ({
97
+ timestamp: event.ts,
98
+ agent: event.agent ?? "system",
99
+ message: event.summary,
100
+ }));
101
+ const ledgerEvents = snapshot.ledger.map((event) => ({
102
+ timestamp: event.ts,
103
+ agent: event.agent ?? "system",
104
+ message: event.summary,
105
+ }));
106
+ this.persistedEvents = dedupeEvents([...trackerEvents, ...ledgerEvents]).slice(-300);
107
+ this.phase = derivePhase(snapshot);
108
+ }
109
+ }
110
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1,114 @@
1
+ /**
2
+ * ACE-TUI Main Entry Point
3
+ *
4
+ * Wires together all TUI modules and implements TuiController.
5
+ * This is the process entry when `ace tui` is invoked.
6
+ */
7
+ import { type TuiController } from "./commands.js";
8
+ export declare class AceTui implements TuiController {
9
+ private input;
10
+ private layout;
11
+ private ollama;
12
+ private openai;
13
+ private commands;
14
+ private telemetry;
15
+ private tabs;
16
+ private agentRunner;
17
+ private dashboard;
18
+ private chatSessions;
19
+ private activeChatSession;
20
+ private provider;
21
+ private model;
22
+ private ollamaAvailable;
23
+ private providers;
24
+ private modelsByProvider;
25
+ private dashboardControlIndex;
26
+ private config;
27
+ private startTime;
28
+ private running;
29
+ private tickTimer;
30
+ private messageQueue;
31
+ private workspaceRoot;
32
+ private providerBaseUrls;
33
+ constructor(options?: {
34
+ provider?: string;
35
+ model?: string;
36
+ providers?: string[];
37
+ modelsByProvider?: Record<string, string[]>;
38
+ baseUrl?: string;
39
+ ollamaUrl?: string;
40
+ providerBaseUrls?: Record<string, string>;
41
+ workspaceRoot?: string;
42
+ systemPrompt?: string;
43
+ });
44
+ start(): Promise<void>;
45
+ stop(): void;
46
+ private suspend;
47
+ private resume;
48
+ private wireEvents;
49
+ private handleKey;
50
+ private isDashboardControlContext;
51
+ private tryHandleDashboardControlKey;
52
+ private moveDashboardControl;
53
+ private adjustDashboardControl;
54
+ private activateDashboardControl;
55
+ private cycleProvider;
56
+ private cycleModel;
57
+ private getDashboardControls;
58
+ private fullRender;
59
+ private renderTabBar;
60
+ private renderActiveView;
61
+ private renderStatusBar;
62
+ private renderInputArea;
63
+ private getTaskState;
64
+ private syncTabState;
65
+ /** 1-second tick for status bar, message expiry */
66
+ private tick;
67
+ private normalizeProvider;
68
+ static defaultSystemPrompt(): string;
69
+ private ensureProvider;
70
+ private setProviderBaseUrl;
71
+ private getProviderBaseUrl;
72
+ private setProviderModels;
73
+ private addModelToProvider;
74
+ private getCachedModels;
75
+ private findProviderForModel;
76
+ private refreshOllamaModelCatalog;
77
+ private checkProviderRuntimeConfig;
78
+ setProvider(name: string): boolean;
79
+ getProvider(): string;
80
+ getProviders(): string[];
81
+ setModel(name: string): void;
82
+ getModel(): string;
83
+ getProviderModels(provider?: string): Promise<string[]>;
84
+ searchModels(query: string): string[];
85
+ getOllamaModels(): Promise<string[]>;
86
+ pullModel(name: string): Promise<void>;
87
+ startAgent(role: string): Promise<void>;
88
+ stopAgent(role: string): void;
89
+ getActiveAgents(): string[];
90
+ getAllAgentRoles(): string[];
91
+ switchTab(index: number): void;
92
+ createChatTab(): void;
93
+ createLogTab(): void;
94
+ closeCurrentTab(): void;
95
+ showMessage(text: string, level?: "info" | "warn" | "error"): void;
96
+ clearView(): void;
97
+ refresh(): void;
98
+ getStatus(): Record<string, unknown>;
99
+ quit(): void;
100
+ sendChatMessage(text: string): Promise<void>;
101
+ setConfig(key: string, value: string): void;
102
+ getConfig(key: string): string | undefined;
103
+ }
104
+ export declare function runTui(options?: {
105
+ provider?: string;
106
+ model?: string;
107
+ providers?: string[];
108
+ modelsByProvider?: Record<string, string[]>;
109
+ baseUrl?: string;
110
+ ollamaUrl?: string;
111
+ providerBaseUrls?: Record<string, string>;
112
+ workspaceRoot?: string;
113
+ }): Promise<void>;
114
+ //# sourceMappingURL=index.d.ts.map