@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,304 @@
1
+ /**
2
+ * ACE-TUI ANSI Renderer
3
+ *
4
+ * Direct terminal rendering via ANSI escape sequences.
5
+ * Zero dependencies — uses process.stdout.write() exclusively.
6
+ * Inspired by arttime's rendering approach.
7
+ */
8
+ // ── ANSI escape sequences ────────────────────────────────────────────
9
+ const ESC = "\x1b";
10
+ const CSI = `${ESC}[`;
11
+ /** Cursor movement */
12
+ export const cursor = {
13
+ to: (x, y) => `${CSI}${y + 1};${x + 1}H`,
14
+ up: (n = 1) => `${CSI}${n}A`,
15
+ down: (n = 1) => `${CSI}${n}B`,
16
+ right: (n = 1) => `${CSI}${n}C`,
17
+ left: (n = 1) => `${CSI}${n}D`,
18
+ hide: `${CSI}?25l`,
19
+ show: `${CSI}?25h`,
20
+ save: `${ESC}7`,
21
+ restore: `${ESC}8`,
22
+ home: `${CSI}H`,
23
+ };
24
+ /** Screen operations */
25
+ export const screen = {
26
+ clear: `${CSI}2J`,
27
+ clearLine: `${CSI}2K`,
28
+ clearDown: `${CSI}J`,
29
+ clearRight: `${CSI}K`,
30
+ altBuffer: `${CSI}?1049h`,
31
+ mainBuffer: `${CSI}?1049l`,
32
+ enableMouse: `${CSI}?1003h${CSI}?1006h`,
33
+ disableMouse: `${CSI}?1003l${CSI}?1006l`,
34
+ };
35
+ /** Style codes */
36
+ export const style = {
37
+ reset: `${CSI}0m`,
38
+ bold: `${CSI}1m`,
39
+ dim: `${CSI}2m`,
40
+ italic: `${CSI}3m`,
41
+ underline: `${CSI}4m`,
42
+ inverse: `${CSI}7m`,
43
+ strikethrough: `${CSI}9m`,
44
+ };
45
+ export function detectColorLevel() {
46
+ if (!process.stdout.isTTY)
47
+ return "none";
48
+ const ct = process.env.COLORTERM?.toLowerCase();
49
+ if (ct === "truecolor" || ct === "24bit")
50
+ return "truecolor";
51
+ const term = process.env.TERM ?? "";
52
+ if (term.includes("256color"))
53
+ return "256";
54
+ if (term)
55
+ return "basic";
56
+ return "none";
57
+ }
58
+ /** 16-color CGA foreground */
59
+ export const fg = {
60
+ black: `${CSI}30m`,
61
+ red: `${CSI}31m`,
62
+ green: `${CSI}32m`,
63
+ yellow: `${CSI}33m`,
64
+ blue: `${CSI}34m`,
65
+ magenta: `${CSI}35m`,
66
+ cyan: `${CSI}36m`,
67
+ white: `${CSI}37m`,
68
+ gray: `${CSI}90m`,
69
+ brightRed: `${CSI}91m`,
70
+ brightGreen: `${CSI}92m`,
71
+ brightYellow: `${CSI}93m`,
72
+ brightBlue: `${CSI}94m`,
73
+ brightMagenta: `${CSI}95m`,
74
+ brightCyan: `${CSI}96m`,
75
+ brightWhite: `${CSI}97m`,
76
+ };
77
+ /** 16-color CGA background */
78
+ export const bg = {
79
+ black: `${CSI}40m`,
80
+ red: `${CSI}41m`,
81
+ green: `${CSI}42m`,
82
+ yellow: `${CSI}43m`,
83
+ blue: `${CSI}44m`,
84
+ magenta: `${CSI}45m`,
85
+ cyan: `${CSI}46m`,
86
+ white: `${CSI}47m`,
87
+ gray: `${CSI}100m`,
88
+ brightBlue: `${CSI}104m`,
89
+ brightCyan: `${CSI}106m`,
90
+ };
91
+ /** 256-color codes */
92
+ export function fg256(n) {
93
+ return `${CSI}38;5;${n}m`;
94
+ }
95
+ export function bg256(n) {
96
+ return `${CSI}48;5;${n}m`;
97
+ }
98
+ /** 24-bit RGB colors */
99
+ export function fgRgb(r, g, b) {
100
+ return `${CSI}38;2;${r};${g};${b}m`;
101
+ }
102
+ export function bgRgb(r, g, b) {
103
+ return `${CSI}48;2;${r};${g};${b}m`;
104
+ }
105
+ // ── Box drawing characters ───────────────────────────────────────────
106
+ export const box = {
107
+ // Single-line box
108
+ topLeft: "┌",
109
+ topRight: "┐",
110
+ bottomLeft: "└",
111
+ bottomRight: "┘",
112
+ horizontal: "─",
113
+ vertical: "│",
114
+ teeRight: "├",
115
+ teeLeft: "┤",
116
+ teeDown: "┬",
117
+ teeUp: "┴",
118
+ cross: "┼",
119
+ // Heavy/double
120
+ heavyHorizontal: "━",
121
+ heavyVertical: "┃",
122
+ // Rounded corners
123
+ roundTopLeft: "╭",
124
+ roundTopRight: "╮",
125
+ roundBottomLeft: "╰",
126
+ roundBottomRight: "╯",
127
+ };
128
+ // ── Symbols ──────────────────────────────────────────────────────────
129
+ export const symbols = {
130
+ check: "✓",
131
+ cross: "✗",
132
+ bullet: "●",
133
+ hollowBullet: "○",
134
+ arrow: "→",
135
+ arrowLeft: "←",
136
+ arrowUp: "↑",
137
+ arrowDown: "↓",
138
+ spinner: ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"],
139
+ progress: { filled: "█", partial: "▓", empty: "░" },
140
+ tab: "▎",
141
+ activeTab: "▌",
142
+ };
143
+ // ── Text utilities ───────────────────────────────────────────────────
144
+ /** Strip ANSI escape codes from a string (arttime: sed -e 's/\x1b\[[0-9;]*m//g') */
145
+ export function stripAnsi(text) {
146
+ // eslint-disable-next-line no-control-regex
147
+ return text.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, "");
148
+ }
149
+ /** Get visible width of a string (ANSI-aware) */
150
+ export function visibleWidth(text) {
151
+ return stripAnsi(text).length;
152
+ }
153
+ /** Truncate text to fit width, add ellipsis if needed */
154
+ export function truncate(text, maxWidth) {
155
+ const stripped = stripAnsi(text);
156
+ if (stripped.length <= maxWidth)
157
+ return text;
158
+ // For ANSI-containing text, character-by-character approach
159
+ let visible = 0;
160
+ let result = "";
161
+ const chars = [...text];
162
+ let inEscape = false;
163
+ for (const char of chars) {
164
+ if (char === "\x1b") {
165
+ inEscape = true;
166
+ result += char;
167
+ continue;
168
+ }
169
+ if (inEscape) {
170
+ result += char;
171
+ if (/[a-zA-Z]/.test(char))
172
+ inEscape = false;
173
+ continue;
174
+ }
175
+ if (visible >= maxWidth - 1) {
176
+ result += "…";
177
+ break;
178
+ }
179
+ result += char;
180
+ visible++;
181
+ }
182
+ return result + style.reset;
183
+ }
184
+ /** Pad text to exact width (ANSI-aware) */
185
+ export function padRight(text, width) {
186
+ const w = visibleWidth(text);
187
+ if (w >= width)
188
+ return truncate(text, width);
189
+ return text + " ".repeat(width - w);
190
+ }
191
+ /** Center text in width (ANSI-aware, arttime centering math) */
192
+ export function center(text, width) {
193
+ const w = visibleWidth(text);
194
+ if (w >= width)
195
+ return truncate(text, width);
196
+ const leftPad = Math.floor((width - w) / 2);
197
+ const rightPad = width - w - leftPad;
198
+ return " ".repeat(leftPad) + text + " ".repeat(rightPad);
199
+ }
200
+ // ── High-level rendering ─────────────────────────────────────────────
201
+ /** Write raw string to stdout */
202
+ export function write(s) {
203
+ process.stdout.write(s);
204
+ }
205
+ /** Write at specific position */
206
+ export function writeAt(x, y, text) {
207
+ write(cursor.to(x, y) + text);
208
+ }
209
+ /** Draw a horizontal line */
210
+ export function hline(x, y, width, char = box.horizontal) {
211
+ writeAt(x, y, char.repeat(width));
212
+ }
213
+ /** Draw a vertical line */
214
+ export function vline(x, y, height, char = box.vertical) {
215
+ for (let i = 0; i < height; i++) {
216
+ writeAt(x, y + i, char);
217
+ }
218
+ }
219
+ /** Draw a box with optional title */
220
+ export function drawBox(x, y, width, height, opts) {
221
+ const tl = opts?.rounded ? box.roundTopLeft : box.topLeft;
222
+ const tr = opts?.rounded ? box.roundTopRight : box.topRight;
223
+ const bl = opts?.rounded ? box.roundBottomLeft : box.bottomLeft;
224
+ const br = opts?.rounded ? box.roundBottomRight : box.bottomRight;
225
+ const bc = opts?.borderColor ?? "";
226
+ const reset = bc ? style.reset : "";
227
+ // Top border
228
+ let top = `${bc}${tl}${box.horizontal.repeat(width - 2)}${tr}${reset}`;
229
+ if (opts?.title) {
230
+ const tc = opts.titleColor ?? fg.brightWhite;
231
+ const titleText = ` ${opts.title} `;
232
+ const titleLen = visibleWidth(titleText);
233
+ if (titleLen < width - 4) {
234
+ top = `${bc}${tl}${box.horizontal}${tc}${style.bold}${titleText}${style.reset}${bc}${box.horizontal.repeat(width - 3 - titleLen)}${tr}${reset}`;
235
+ }
236
+ }
237
+ writeAt(x, y, top);
238
+ // Side borders
239
+ for (let i = 1; i < height - 1; i++) {
240
+ writeAt(x, y + i, `${bc}${box.vertical}${reset}`);
241
+ writeAt(x + width - 1, y + i, `${bc}${box.vertical}${reset}`);
242
+ }
243
+ // Bottom border
244
+ writeAt(x, y + height - 1, `${bc}${bl}${box.horizontal.repeat(width - 2)}${br}${reset}`);
245
+ }
246
+ /** Fill a rectangular region with spaces (clear region) */
247
+ export function clearRegion(x, y, width, height) {
248
+ const blank = " ".repeat(width);
249
+ for (let i = 0; i < height; i++) {
250
+ writeAt(x, y + i, blank);
251
+ }
252
+ }
253
+ /** Draw a progress bar (arttime-inspired) */
254
+ export function progressBar(x, y, width, ratio, opts) {
255
+ const barWidth = opts?.showPercent ? width - 5 : width;
256
+ const filled = Math.round(barWidth * Math.max(0, Math.min(1, ratio)));
257
+ const empty = barWidth - filled;
258
+ const fc = opts?.filledColor ?? fg.green;
259
+ const ec = opts?.emptyColor ?? fg.gray;
260
+ let bar = `${fc}${symbols.progress.filled.repeat(filled)}${ec}${symbols.progress.empty.repeat(empty)}${style.reset}`;
261
+ if (opts?.showPercent) {
262
+ bar += ` ${Math.round(ratio * 100).toString().padStart(3)}%`;
263
+ }
264
+ writeAt(x, y, bar);
265
+ }
266
+ /** Draw a spinner frame */
267
+ export function spinnerFrame(frame) {
268
+ return symbols.spinner[frame % symbols.spinner.length];
269
+ }
270
+ /** Get terminal dimensions */
271
+ export function getTermSize() {
272
+ return {
273
+ cols: process.stdout.columns ?? 80,
274
+ rows: process.stdout.rows ?? 24,
275
+ };
276
+ }
277
+ /** Format elapsed time (arttime contextual time display) */
278
+ export function formatElapsed(ms) {
279
+ const totalSec = Math.floor(ms / 1000);
280
+ if (totalSec < 60)
281
+ return `${totalSec}s`;
282
+ const min = Math.floor(totalSec / 60);
283
+ const sec = totalSec % 60;
284
+ if (min < 60)
285
+ return `${min}m ${sec}s`;
286
+ const hr = Math.floor(min / 60);
287
+ const remMin = min % 60;
288
+ if (hr < 24)
289
+ return `${hr}h ${remMin}m`;
290
+ const days = Math.floor(hr / 24);
291
+ const remHr = hr % 24;
292
+ return `${days}d ${remHr}h`;
293
+ }
294
+ /** Format timestamp as HH:MM:SS */
295
+ export function formatTime(date = new Date()) {
296
+ return date.toLocaleTimeString("en-US", { hour12: false });
297
+ }
298
+ /** Format a number with commas */
299
+ export function formatNumber(n) {
300
+ if (n < 1000)
301
+ return n.toString();
302
+ return n.toLocaleString("en-US");
303
+ }
304
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ACE-TUI Tab Manager
3
+ *
4
+ * Manages tabbed views for dashboard, agent outputs, chat sessions, and logs.
5
+ * Each tab is an isolated view with its own state — arttime hermetic isolation pattern.
6
+ */
7
+ import type { ChatMessage, ActivityEvent } from "./layout.js";
8
+ export type TabType = "dashboard" | "agent" | "chat" | "logs";
9
+ export interface Tab {
10
+ id: string;
11
+ label: string;
12
+ type: TabType;
13
+ hasActivity: boolean;
14
+ closeable: boolean;
15
+ agentRole?: string;
16
+ chatMessages?: ChatMessage[];
17
+ agentOutput?: string[];
18
+ agentThinking?: string;
19
+ logEntries?: ActivityEvent[];
20
+ scrollOffset?: number;
21
+ }
22
+ export declare class TabManager {
23
+ private tabs;
24
+ private activeIndex;
25
+ private nextId;
26
+ constructor();
27
+ /** Get all tabs */
28
+ getTabs(): Tab[];
29
+ /** Get active tab */
30
+ getActiveTab(): Tab;
31
+ /** Get active tab index */
32
+ getActiveIndex(): number;
33
+ /** Switch to tab by index */
34
+ switchTo(index: number): void;
35
+ /** Switch to next tab */
36
+ nextTab(): void;
37
+ /** Switch to previous tab */
38
+ prevTab(): void;
39
+ /** Find tab by agent role */
40
+ findAgentTab(role: string): number;
41
+ /** Create and return an agent tab */
42
+ createAgentTab(role: string): Tab;
43
+ /** Create a new chat tab */
44
+ createChatTab(): Tab;
45
+ /** Create a logs tab */
46
+ createLogTab(): Tab;
47
+ /** Close the active tab (if closeable) */
48
+ closeActive(): boolean;
49
+ /** Close a specific tab by id */
50
+ closeTab(id: string): boolean;
51
+ /** Append output to an agent tab */
52
+ appendAgentOutput(role: string, text: string): void;
53
+ /** Set agent thinking text */
54
+ setAgentThinking(role: string, text: string | undefined): void;
55
+ /** Add a message to a chat tab */
56
+ addChatMessage(tabId: string, message: ChatMessage): void;
57
+ /** Get chat messages for active tab */
58
+ getActiveChatMessages(): ChatMessage[];
59
+ /** Add a log entry to all log tabs */
60
+ addLogEntry(entry: ActivityEvent): void;
61
+ /** Get tab info for layout rendering */
62
+ getTabInfos(): Array<{
63
+ id: string;
64
+ label: string;
65
+ type: TabType;
66
+ hasActivity: boolean;
67
+ agentRole?: string;
68
+ }>;
69
+ }
70
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1,208 @@
1
+ /**
2
+ * ACE-TUI Tab Manager
3
+ *
4
+ * Manages tabbed views for dashboard, agent outputs, chat sessions, and logs.
5
+ * Each tab is an isolated view with its own state — arttime hermetic isolation pattern.
6
+ */
7
+ // ── Tab manager ──────────────────────────────────────────────────────
8
+ export class TabManager {
9
+ tabs = [];
10
+ activeIndex = 0;
11
+ nextId = 1;
12
+ constructor() {
13
+ // Always start with Dashboard tab
14
+ this.tabs.push({
15
+ id: "dashboard",
16
+ label: "Dashboard",
17
+ type: "dashboard",
18
+ hasActivity: false,
19
+ closeable: false,
20
+ });
21
+ }
22
+ /** Get all tabs */
23
+ getTabs() {
24
+ return this.tabs;
25
+ }
26
+ /** Get active tab */
27
+ getActiveTab() {
28
+ return this.tabs[this.activeIndex];
29
+ }
30
+ /** Get active tab index */
31
+ getActiveIndex() {
32
+ return this.activeIndex;
33
+ }
34
+ /** Switch to tab by index */
35
+ switchTo(index) {
36
+ if (index >= 0 && index < this.tabs.length) {
37
+ this.activeIndex = index;
38
+ this.tabs[index].hasActivity = false;
39
+ }
40
+ }
41
+ /** Switch to next tab */
42
+ nextTab() {
43
+ this.switchTo((this.activeIndex + 1) % this.tabs.length);
44
+ }
45
+ /** Switch to previous tab */
46
+ prevTab() {
47
+ this.switchTo((this.activeIndex - 1 + this.tabs.length) % this.tabs.length);
48
+ }
49
+ /** Find tab by agent role */
50
+ findAgentTab(role) {
51
+ return this.tabs.findIndex(t => t.type === "agent" && t.agentRole === role);
52
+ }
53
+ /** Create and return an agent tab */
54
+ createAgentTab(role) {
55
+ // If tab already exists, switch to it
56
+ const existing = this.findAgentTab(role);
57
+ if (existing >= 0) {
58
+ this.switchTo(existing);
59
+ return this.tabs[existing];
60
+ }
61
+ const tab = {
62
+ id: `agent-${role}-${this.nextId++}`,
63
+ label: `Agent:${role}`,
64
+ type: "agent",
65
+ hasActivity: false,
66
+ closeable: true,
67
+ agentRole: role,
68
+ agentOutput: [],
69
+ agentThinking: undefined,
70
+ };
71
+ this.tabs.push(tab);
72
+ this.switchTo(this.tabs.length - 1);
73
+ return tab;
74
+ }
75
+ /** Create a new chat tab */
76
+ createChatTab() {
77
+ const chatCount = this.tabs.filter(t => t.type === "chat").length;
78
+ const tab = {
79
+ id: `chat-${this.nextId++}`,
80
+ label: chatCount === 0 ? "Chat" : `Chat ${chatCount + 1}`,
81
+ type: "chat",
82
+ hasActivity: false,
83
+ closeable: true,
84
+ chatMessages: [],
85
+ };
86
+ this.tabs.push(tab);
87
+ this.switchTo(this.tabs.length - 1);
88
+ return tab;
89
+ }
90
+ /** Create a logs tab */
91
+ createLogTab() {
92
+ const existing = this.tabs.findIndex(t => t.type === "logs");
93
+ if (existing >= 0) {
94
+ this.switchTo(existing);
95
+ return this.tabs[existing];
96
+ }
97
+ const tab = {
98
+ id: `logs-${this.nextId++}`,
99
+ label: "Logs",
100
+ type: "logs",
101
+ hasActivity: false,
102
+ closeable: true,
103
+ logEntries: [],
104
+ };
105
+ this.tabs.push(tab);
106
+ this.switchTo(this.tabs.length - 1);
107
+ return tab;
108
+ }
109
+ /** Close the active tab (if closeable) */
110
+ closeActive() {
111
+ const tab = this.tabs[this.activeIndex];
112
+ if (!tab.closeable)
113
+ return false;
114
+ this.tabs.splice(this.activeIndex, 1);
115
+ if (this.activeIndex >= this.tabs.length) {
116
+ this.activeIndex = this.tabs.length - 1;
117
+ }
118
+ return true;
119
+ }
120
+ /** Close a specific tab by id */
121
+ closeTab(id) {
122
+ const index = this.tabs.findIndex(t => t.id === id);
123
+ if (index < 0)
124
+ return false;
125
+ if (!this.tabs[index].closeable)
126
+ return false;
127
+ this.tabs.splice(index, 1);
128
+ if (this.activeIndex >= this.tabs.length) {
129
+ this.activeIndex = Math.max(0, this.tabs.length - 1);
130
+ }
131
+ else if (this.activeIndex > index) {
132
+ this.activeIndex--;
133
+ }
134
+ return true;
135
+ }
136
+ // ── Agent output management ──────────────────────────────────────
137
+ /** Append output to an agent tab */
138
+ appendAgentOutput(role, text) {
139
+ const index = this.findAgentTab(role);
140
+ if (index < 0)
141
+ return;
142
+ const tab = this.tabs[index];
143
+ if (!tab.agentOutput)
144
+ tab.agentOutput = [];
145
+ tab.agentOutput.push(text);
146
+ // Cap output buffer (don't hold unlimited history in memory)
147
+ if (tab.agentOutput.length > 500) {
148
+ tab.agentOutput = tab.agentOutput.slice(-400);
149
+ }
150
+ // Mark activity if not the active tab
151
+ if (index !== this.activeIndex) {
152
+ tab.hasActivity = true;
153
+ }
154
+ }
155
+ /** Set agent thinking text */
156
+ setAgentThinking(role, text) {
157
+ const index = this.findAgentTab(role);
158
+ if (index < 0)
159
+ return;
160
+ this.tabs[index].agentThinking = text;
161
+ }
162
+ // ── Chat message management ──────────────────────────────────────
163
+ /** Add a message to a chat tab */
164
+ addChatMessage(tabId, message) {
165
+ const tab = this.tabs.find(t => t.id === tabId);
166
+ if (!tab || !tab.chatMessages)
167
+ return;
168
+ tab.chatMessages.push(message);
169
+ // Cap message history
170
+ if (tab.chatMessages.length > 200) {
171
+ tab.chatMessages = tab.chatMessages.slice(-150);
172
+ }
173
+ }
174
+ /** Get chat messages for active tab */
175
+ getActiveChatMessages() {
176
+ const tab = this.tabs[this.activeIndex];
177
+ return tab.chatMessages ?? [];
178
+ }
179
+ // ── Log management ───────────────────────────────────────────────
180
+ /** Add a log entry to all log tabs */
181
+ addLogEntry(entry) {
182
+ for (const tab of this.tabs) {
183
+ if (tab.type === "logs") {
184
+ if (!tab.logEntries)
185
+ tab.logEntries = [];
186
+ tab.logEntries.push(entry);
187
+ if (tab.logEntries.length > 1000) {
188
+ tab.logEntries = tab.logEntries.slice(-800);
189
+ }
190
+ const index = this.tabs.indexOf(tab);
191
+ if (index !== this.activeIndex) {
192
+ tab.hasActivity = true;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ /** Get tab info for layout rendering */
198
+ getTabInfos() {
199
+ return this.tabs.map(t => ({
200
+ id: t.id,
201
+ label: t.label,
202
+ type: t.type,
203
+ hasActivity: t.hasActivity,
204
+ agentRole: t.agentRole,
205
+ }));
206
+ }
207
+ }
208
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1,56 @@
1
+ /**
2
+ * ACE-TUI Telemetry
3
+ *
4
+ * Token counting, throughput measurement, and cost estimation.
5
+ */
6
+ export interface TelemetrySnapshot {
7
+ tokensIn: number;
8
+ tokensOut: number;
9
+ totalTokens: number;
10
+ tokensPerSec: number;
11
+ requestCount: number;
12
+ avgLatencyMs: number;
13
+ costEstimate: number;
14
+ uptime: number;
15
+ modelName: string;
16
+ contextUsed: number;
17
+ contextMax: number;
18
+ }
19
+ export interface RequestTelemetry {
20
+ startTime: number;
21
+ endTime: number;
22
+ promptTokens: number;
23
+ completionTokens: number;
24
+ model: string;
25
+ }
26
+ export declare class TelemetryTracker {
27
+ private tokensIn;
28
+ private tokensOut;
29
+ private requestCount;
30
+ private totalLatencyMs;
31
+ private startTime;
32
+ private model;
33
+ private contextMax;
34
+ private contextUsed;
35
+ private recentTokens;
36
+ private windowMs;
37
+ constructor();
38
+ /** Record a completed request */
39
+ recordRequest(telemetry: RequestTelemetry): void;
40
+ /** Record incremental tokens (for streaming) */
41
+ recordTokens(input: number, output: number): void;
42
+ /** Update context window info */
43
+ setContext(used: number, max: number): void;
44
+ setModel(name: string): void;
45
+ /** Get current snapshot */
46
+ getSnapshot(): TelemetrySnapshot;
47
+ /** Reset all counters */
48
+ reset(): void;
49
+ private pruneWindow;
50
+ private calculateThroughput;
51
+ /** Estimate cost — Ollama is free, but show equivalent cloud cost for reference */
52
+ private estimateCost;
53
+ }
54
+ /** Rough token count estimation (for when Ollama doesn't return counts) */
55
+ export declare function estimateTokenCount(text: string): number;
56
+ //# sourceMappingURL=telemetry.d.ts.map