@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,368 @@
1
+ /**
2
+ * ACE-TUI Chat Panel
3
+ *
4
+ * Interactive chat with provider-aware streaming.
5
+ * Supports streaming responses, token counting, and conversation history.
6
+ */
7
+ import { diagnoseChatRuntimeConfig, } from "./openai-compatible.js";
8
+ import { estimateTokenCount } from "./telemetry.js";
9
+ import { EventEmitter } from "node:events";
10
+ import { existsSync } from "node:fs";
11
+ import { resolve } from "node:path";
12
+ import { ModelBridge } from "../model-bridge.js";
13
+ export class ChatSession extends EventEmitter {
14
+ clients;
15
+ telemetry;
16
+ messages = [];
17
+ displayMessages = [];
18
+ provider;
19
+ model;
20
+ streaming = false;
21
+ activeStreamProvider = null;
22
+ currentStreamText = "";
23
+ systemPrompt;
24
+ temperature;
25
+ topP;
26
+ numCtx;
27
+ workspaceRoot;
28
+ aceToolsMode;
29
+ aceRole;
30
+ aceTier;
31
+ maxTurns;
32
+ aceBridge;
33
+ activeAceBridge = false;
34
+ providerBaseUrls;
35
+ constructor(clients, telemetry, options) {
36
+ super();
37
+ this.clients = clients;
38
+ this.telemetry = telemetry;
39
+ this.provider = normalizeProvider(options.provider);
40
+ this.model = options.model;
41
+ this.providerBaseUrls = { ...(options.providerBaseUrls ?? {}) };
42
+ this.systemPrompt = options.systemPrompt;
43
+ this.temperature = options.temperature ?? 0.7;
44
+ this.topP = options.topP ?? 0.9;
45
+ this.numCtx = options.numCtx ?? 8192;
46
+ this.workspaceRoot = options.workspaceRoot ? resolve(options.workspaceRoot) : undefined;
47
+ this.aceToolsMode = options.aceTools ?? "auto";
48
+ this.aceRole = options.aceRole?.trim() || "orchestrator";
49
+ this.aceTier = options.aceTier;
50
+ this.maxTurns = options.maxTurns ?? 6;
51
+ this.aceBridge = options.bridge ?? new ModelBridge(clients);
52
+ // Add system prompt if provided
53
+ if (this.systemPrompt) {
54
+ this.messages.push({ role: "system", content: this.systemPrompt });
55
+ this.displayMessages.push({
56
+ role: "system",
57
+ content: `System prompt loaded (${this.systemPrompt.length} chars)`,
58
+ timestamp: Date.now(),
59
+ });
60
+ }
61
+ }
62
+ /** Get display messages for rendering */
63
+ getDisplayMessages() {
64
+ return this.displayMessages;
65
+ }
66
+ /** Is currently streaming a response? */
67
+ isStreaming() {
68
+ return this.streaming;
69
+ }
70
+ /** Get current model */
71
+ getModel() {
72
+ return this.model;
73
+ }
74
+ /** Get current provider */
75
+ getProvider() {
76
+ return this.provider;
77
+ }
78
+ /** Change provider */
79
+ setProvider(provider) {
80
+ const normalized = normalizeProvider(provider);
81
+ if (normalized === this.provider)
82
+ return;
83
+ this.provider = normalized;
84
+ this.displayMessages.push({
85
+ role: "system",
86
+ content: `Provider switched to: ${normalized}`,
87
+ timestamp: Date.now(),
88
+ });
89
+ this.emit("updated");
90
+ }
91
+ /** Change model */
92
+ setModel(model) {
93
+ const trimmed = model.trim();
94
+ if (!trimmed || trimmed === this.model)
95
+ return;
96
+ this.model = trimmed;
97
+ this.displayMessages.push({
98
+ role: "system",
99
+ content: `Model switched to: ${trimmed}`,
100
+ timestamp: Date.now(),
101
+ });
102
+ this.emit("updated");
103
+ }
104
+ /** Send a user message and stream the response */
105
+ async sendMessage(text) {
106
+ if (this.streaming) {
107
+ this.emit("error", "Already streaming a response. Wait or press Ctrl+C to interrupt.");
108
+ return;
109
+ }
110
+ // Add user message
111
+ this.messages.push({ role: "user", content: text });
112
+ this.displayMessages.push({
113
+ role: "user",
114
+ content: text,
115
+ timestamp: Date.now(),
116
+ tokens: estimateTokenCount(text),
117
+ });
118
+ this.emit("updated");
119
+ // Start streaming response
120
+ this.streaming = true;
121
+ this.currentStreamText = "";
122
+ const streamProvider = this.provider;
123
+ const streamModel = this.model;
124
+ this.activeStreamProvider = streamProvider;
125
+ const startTime = Date.now();
126
+ try {
127
+ if (this.shouldUseAceBridge()) {
128
+ await this.runAceBridge(text, startTime, streamProvider, streamModel);
129
+ return;
130
+ }
131
+ for await (const chunk of this.streamResponse(streamProvider, streamModel)) {
132
+ if (!this.streaming)
133
+ break; // interrupted
134
+ if (chunk.text.length > 0) {
135
+ this.currentStreamText += chunk.text;
136
+ this.emit("stream_chunk", chunk.text, this.currentStreamText);
137
+ }
138
+ // Record token telemetry
139
+ if (chunk.done) {
140
+ const promptTokens = chunk.promptTokens ?? estimateTokenCount(text);
141
+ const completionTokens = chunk.completionTokens ?? estimateTokenCount(this.currentStreamText);
142
+ this.telemetry.recordRequest({
143
+ startTime,
144
+ endTime: Date.now(),
145
+ promptTokens,
146
+ completionTokens,
147
+ model: streamModel,
148
+ });
149
+ if (typeof chunk.evalDurationNs === "number" && chunk.evalDurationNs > 0) {
150
+ const evalSec = chunk.evalDurationNs / 1_000_000_000;
151
+ const tokPerSec = completionTokens / evalSec;
152
+ this.emit("telemetry", { tokPerSec, promptTokens, completionTokens });
153
+ }
154
+ }
155
+ }
156
+ // Finalize the assistant message
157
+ this.messages.push({ role: "assistant", content: this.currentStreamText });
158
+ this.displayMessages.push({
159
+ role: "assistant",
160
+ content: this.currentStreamText,
161
+ timestamp: Date.now(),
162
+ tokens: estimateTokenCount(this.currentStreamText),
163
+ });
164
+ }
165
+ catch (err) {
166
+ if (err?.name === "AbortError") {
167
+ // User interrupted
168
+ this.displayMessages.push({
169
+ role: "system",
170
+ content: "[Interrupted]",
171
+ timestamp: Date.now(),
172
+ });
173
+ }
174
+ else {
175
+ const msg = err instanceof Error ? err.message : String(err);
176
+ this.displayMessages.push({
177
+ role: "system",
178
+ content: `Error: ${msg}`,
179
+ timestamp: Date.now(),
180
+ });
181
+ this.emit("error", msg);
182
+ }
183
+ }
184
+ finally {
185
+ this.streaming = false;
186
+ this.activeStreamProvider = null;
187
+ this.activeAceBridge = false;
188
+ this.currentStreamText = "";
189
+ this.emit("updated");
190
+ this.emit("stream_done");
191
+ }
192
+ }
193
+ /** Interrupt current stream */
194
+ interrupt() {
195
+ if (!this.streaming)
196
+ return;
197
+ const activeProvider = this.activeStreamProvider ?? this.provider;
198
+ this.streaming = false;
199
+ if (this.activeAceBridge) {
200
+ this.aceBridge.interrupt();
201
+ return;
202
+ }
203
+ if (activeProvider === "ollama") {
204
+ this.clients.ollama.abort();
205
+ return;
206
+ }
207
+ this.clients.openai.abort();
208
+ }
209
+ /** Clear conversation history */
210
+ clear() {
211
+ this.messages = [];
212
+ this.displayMessages = [];
213
+ if (this.systemPrompt) {
214
+ this.messages.push({ role: "system", content: this.systemPrompt });
215
+ this.displayMessages.push({
216
+ role: "system",
217
+ content: "Conversation cleared. System prompt retained.",
218
+ timestamp: Date.now(),
219
+ });
220
+ }
221
+ this.emit("updated");
222
+ }
223
+ /** Get conversation for export/save */
224
+ getConversation() {
225
+ return [...this.messages];
226
+ }
227
+ async *streamResponse(provider, model) {
228
+ if (provider === "ollama") {
229
+ const stream = this.clients.ollama.chat({
230
+ model,
231
+ messages: this.messages,
232
+ stream: true,
233
+ options: {
234
+ temperature: this.temperature,
235
+ top_p: this.topP,
236
+ num_ctx: this.numCtx,
237
+ },
238
+ });
239
+ for await (const chunk of stream) {
240
+ yield {
241
+ text: chunk.message?.content ?? "",
242
+ done: Boolean(chunk.done),
243
+ promptTokens: chunk.prompt_eval_count,
244
+ completionTokens: chunk.eval_count,
245
+ evalDurationNs: chunk.eval_duration,
246
+ };
247
+ }
248
+ return;
249
+ }
250
+ const diagnosis = diagnoseChatRuntimeConfig(provider, model, {
251
+ baseUrl: this.providerBaseUrls[provider],
252
+ });
253
+ if (!diagnosis.ok && diagnosis.missing.length === 0) {
254
+ throw new Error(diagnosis.message);
255
+ }
256
+ const stream = this.clients.openai.chat({
257
+ provider,
258
+ model,
259
+ messages: this.messages,
260
+ temperature: this.temperature,
261
+ topP: this.topP,
262
+ });
263
+ for await (const chunk of stream) {
264
+ yield {
265
+ text: chunk.text,
266
+ done: chunk.done,
267
+ promptTokens: chunk.promptTokens,
268
+ completionTokens: chunk.completionTokens,
269
+ };
270
+ }
271
+ }
272
+ shouldUseAceBridge() {
273
+ if (this.aceToolsMode === "off")
274
+ return false;
275
+ if (!this.workspaceRoot)
276
+ return false;
277
+ if (!existsSync(resolve(this.workspaceRoot, ".agents", "ACE", "agent-state", "TASK.md"))) {
278
+ return false;
279
+ }
280
+ return true;
281
+ }
282
+ buildBridgeTask() {
283
+ const recentConversation = this.messages
284
+ .filter((message) => message.role !== "system")
285
+ .slice(-6)
286
+ .map((message) => `${message.role}: ${message.content}`)
287
+ .join("\n");
288
+ return recentConversation || "user: continue";
289
+ }
290
+ pushSystemMessage(content) {
291
+ this.displayMessages.push({
292
+ role: "system",
293
+ content,
294
+ timestamp: Date.now(),
295
+ });
296
+ this.emit("updated");
297
+ }
298
+ async runAceBridge(text, startTime, streamProvider, streamModel) {
299
+ if (!this.workspaceRoot) {
300
+ throw new Error("ACE bridge requires a workspace root.");
301
+ }
302
+ this.activeAceBridge = true;
303
+ let bridgeOutput = "";
304
+ const result = await this.aceBridge.run({
305
+ task: this.buildBridgeTask(),
306
+ role: this.aceRole,
307
+ workspace: this.workspaceRoot,
308
+ tier: this.aceTier ?? (this.aceRole === "orchestrator" ? "compressed" : "brief"),
309
+ maxTurns: this.maxTurns,
310
+ provider: streamProvider,
311
+ model: streamModel,
312
+ numCtx: this.numCtx,
313
+ onThinking: (thinking) => {
314
+ this.pushSystemMessage(`Thinking: ${thinking}`);
315
+ },
316
+ onToolCall: (tool, args) => {
317
+ this.pushSystemMessage(`Tool call: ${tool} ${safeStringify(args)}`);
318
+ this.emit("tool_call", tool, args);
319
+ },
320
+ onToolResult: (tool, toolResult) => {
321
+ this.pushSystemMessage(`Tool ${toolResult.ok ? "ok" : "error"}: ${tool} — ${toolResult.summary}`);
322
+ this.emit("tool_result", tool, toolResult);
323
+ },
324
+ onOutput: (output) => {
325
+ bridgeOutput = output;
326
+ },
327
+ });
328
+ const assistantText = bridgeOutput.trim() || result.summary.trim() || "ACE bridge completed.";
329
+ this.messages.push({ role: "assistant", content: assistantText });
330
+ this.displayMessages.push({
331
+ role: "assistant",
332
+ content: assistantText,
333
+ timestamp: Date.now(),
334
+ tokens: estimateTokenCount(assistantText),
335
+ });
336
+ if (result.status === "needs_input") {
337
+ this.pushSystemMessage("[Awaiting operator follow-up]");
338
+ }
339
+ this.telemetry.recordRequest({
340
+ startTime,
341
+ endTime: Date.now(),
342
+ promptTokens: estimateTokenCount(text),
343
+ completionTokens: estimateTokenCount(assistantText),
344
+ model: streamModel,
345
+ });
346
+ }
347
+ }
348
+ function normalizeProvider(input) {
349
+ const normalized = input.trim().toLowerCase();
350
+ if (normalized === "openai")
351
+ return "codex";
352
+ if (normalized === "anthropic")
353
+ return "claude";
354
+ if (normalized === "google")
355
+ return "gemini";
356
+ if (["llamacpp", "llama-cpp", "llama.cpp"].includes(normalized))
357
+ return "llama.cpp";
358
+ return normalized || "ollama";
359
+ }
360
+ function safeStringify(value) {
361
+ try {
362
+ return JSON.stringify(value ?? {});
363
+ }
364
+ catch {
365
+ return "{}";
366
+ }
367
+ }
368
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1,57 @@
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
+ export interface CommandDef {
8
+ name: string;
9
+ aliases: string[];
10
+ description: string;
11
+ usage: string;
12
+ handler: (args: string[], ctx: CommandContext) => Promise<void> | void;
13
+ completeFn?: (partial: string, ctx: CommandContext) => string[];
14
+ }
15
+ export interface CommandContext {
16
+ tui: TuiController;
17
+ }
18
+ /** Interface that the TUI main module must implement for commands to interact with it */
19
+ export interface TuiController {
20
+ setProvider(name: string): boolean;
21
+ getProvider(): string;
22
+ getProviders(): string[];
23
+ setModel(name: string): void;
24
+ getModel(): string;
25
+ getProviderModels(provider?: string): Promise<string[]>;
26
+ searchModels(query: string): string[];
27
+ getOllamaModels(): Promise<string[]>;
28
+ pullModel(name: string): Promise<void>;
29
+ startAgent(role: string): Promise<void>;
30
+ stopAgent(role: string): void;
31
+ getActiveAgents(): string[];
32
+ getAllAgentRoles(): string[];
33
+ switchTab(index: number): void;
34
+ createChatTab(): void;
35
+ createLogTab(): void;
36
+ closeCurrentTab(): void;
37
+ showMessage(text: string, level?: "info" | "warn" | "error"): void;
38
+ clearView(): void;
39
+ refresh(): void;
40
+ getStatus(): Record<string, unknown>;
41
+ quit(): void;
42
+ sendChatMessage(text: string): Promise<void>;
43
+ setConfig(key: string, value: string): void;
44
+ getConfig(key: string): string | undefined;
45
+ }
46
+ export declare class CommandRegistry {
47
+ private commands;
48
+ register(cmd: CommandDef): void;
49
+ get(name: string): CommandDef | undefined;
50
+ getAll(): CommandDef[];
51
+ /** Parse and execute a command string */
52
+ execute(input: string, ctx: CommandContext): Promise<void>;
53
+ /** Get completions for a partial command */
54
+ complete(partial: string, ctx?: CommandContext): string[];
55
+ }
56
+ export declare function registerBuiltinCommands(registry: CommandRegistry): void;
57
+ //# sourceMappingURL=commands.d.ts.map