fixo-cli 1.0.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 (303) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +530 -0
  3. package/dist/agent/agent-client.d.ts +108 -0
  4. package/dist/agent/agent-client.d.ts.map +1 -0
  5. package/dist/agent/agent-client.js +1247 -0
  6. package/dist/agent/agent-client.js.map +1 -0
  7. package/dist/agent/agent-pool.d.ts +20 -0
  8. package/dist/agent/agent-pool.d.ts.map +1 -0
  9. package/dist/agent/agent-pool.js +217 -0
  10. package/dist/agent/agent-pool.js.map +1 -0
  11. package/dist/agent/background-awareness.d.ts +55 -0
  12. package/dist/agent/background-awareness.d.ts.map +1 -0
  13. package/dist/agent/background-awareness.js +104 -0
  14. package/dist/agent/background-awareness.js.map +1 -0
  15. package/dist/agent/command-parser.d.ts +33 -0
  16. package/dist/agent/command-parser.d.ts.map +1 -0
  17. package/dist/agent/command-parser.js +120 -0
  18. package/dist/agent/command-parser.js.map +1 -0
  19. package/dist/agent/context-budget.d.ts +91 -0
  20. package/dist/agent/context-budget.d.ts.map +1 -0
  21. package/dist/agent/context-budget.js +219 -0
  22. package/dist/agent/context-budget.js.map +1 -0
  23. package/dist/agent/conversation.d.ts +190 -0
  24. package/dist/agent/conversation.d.ts.map +1 -0
  25. package/dist/agent/conversation.js +547 -0
  26. package/dist/agent/conversation.js.map +1 -0
  27. package/dist/agent/hooks.d.ts +72 -0
  28. package/dist/agent/hooks.d.ts.map +1 -0
  29. package/dist/agent/hooks.js +214 -0
  30. package/dist/agent/hooks.js.map +1 -0
  31. package/dist/agent/mcp-bridge.d.ts +13 -0
  32. package/dist/agent/mcp-bridge.d.ts.map +1 -0
  33. package/dist/agent/mcp-bridge.js +86 -0
  34. package/dist/agent/mcp-bridge.js.map +1 -0
  35. package/dist/agent/mcp-client.d.ts +24 -0
  36. package/dist/agent/mcp-client.d.ts.map +1 -0
  37. package/dist/agent/mcp-client.js +146 -0
  38. package/dist/agent/mcp-client.js.map +1 -0
  39. package/dist/agent/mcp-manager.d.ts +13 -0
  40. package/dist/agent/mcp-manager.d.ts.map +1 -0
  41. package/dist/agent/mcp-manager.js +84 -0
  42. package/dist/agent/mcp-manager.js.map +1 -0
  43. package/dist/agent/mcp-registry.d.ts +45 -0
  44. package/dist/agent/mcp-registry.d.ts.map +1 -0
  45. package/dist/agent/mcp-registry.js +98 -0
  46. package/dist/agent/mcp-registry.js.map +1 -0
  47. package/dist/agent/orchestrator.d.ts +14 -0
  48. package/dist/agent/orchestrator.d.ts.map +1 -0
  49. package/dist/agent/orchestrator.js +118 -0
  50. package/dist/agent/orchestrator.js.map +1 -0
  51. package/dist/agent/parser-adapter.d.ts +120 -0
  52. package/dist/agent/parser-adapter.d.ts.map +1 -0
  53. package/dist/agent/parser-adapter.js +265 -0
  54. package/dist/agent/parser-adapter.js.map +1 -0
  55. package/dist/agent/parsers/imports.d.ts +11 -0
  56. package/dist/agent/parsers/imports.d.ts.map +1 -0
  57. package/dist/agent/parsers/imports.js +94 -0
  58. package/dist/agent/parsers/imports.js.map +1 -0
  59. package/dist/agent/parsers/shell.d.ts +23 -0
  60. package/dist/agent/parsers/shell.d.ts.map +1 -0
  61. package/dist/agent/parsers/shell.js +200 -0
  62. package/dist/agent/parsers/shell.js.map +1 -0
  63. package/dist/agent/parsers/symbols.d.ts +17 -0
  64. package/dist/agent/parsers/symbols.d.ts.map +1 -0
  65. package/dist/agent/parsers/symbols.js +103 -0
  66. package/dist/agent/parsers/symbols.js.map +1 -0
  67. package/dist/agent/permissions.d.ts +65 -0
  68. package/dist/agent/permissions.d.ts.map +1 -0
  69. package/dist/agent/permissions.js +219 -0
  70. package/dist/agent/permissions.js.map +1 -0
  71. package/dist/agent/predictive-gate.d.ts +69 -0
  72. package/dist/agent/predictive-gate.d.ts.map +1 -0
  73. package/dist/agent/predictive-gate.js +128 -0
  74. package/dist/agent/predictive-gate.js.map +1 -0
  75. package/dist/agent/provider-cooldown.d.ts +144 -0
  76. package/dist/agent/provider-cooldown.d.ts.map +1 -0
  77. package/dist/agent/provider-cooldown.js +300 -0
  78. package/dist/agent/provider-cooldown.js.map +1 -0
  79. package/dist/agent/providers-manager.d.ts +109 -0
  80. package/dist/agent/providers-manager.d.ts.map +1 -0
  81. package/dist/agent/providers-manager.js +464 -0
  82. package/dist/agent/providers-manager.js.map +1 -0
  83. package/dist/agent/repo-map.d.ts +6 -0
  84. package/dist/agent/repo-map.d.ts.map +1 -0
  85. package/dist/agent/repo-map.js +221 -0
  86. package/dist/agent/repo-map.js.map +1 -0
  87. package/dist/agent/retry.d.ts +103 -0
  88. package/dist/agent/retry.d.ts.map +1 -0
  89. package/dist/agent/retry.js +276 -0
  90. package/dist/agent/retry.js.map +1 -0
  91. package/dist/agent/search/index.d.ts +61 -0
  92. package/dist/agent/search/index.d.ts.map +1 -0
  93. package/dist/agent/search/index.js +314 -0
  94. package/dist/agent/search/index.js.map +1 -0
  95. package/dist/agent/single-agent.d.ts +76 -0
  96. package/dist/agent/single-agent.d.ts.map +1 -0
  97. package/dist/agent/single-agent.js +697 -0
  98. package/dist/agent/single-agent.js.map +1 -0
  99. package/dist/agent/skills.d.ts +22 -0
  100. package/dist/agent/skills.d.ts.map +1 -0
  101. package/dist/agent/skills.js +139 -0
  102. package/dist/agent/skills.js.map +1 -0
  103. package/dist/agent/stream-glue.d.ts +85 -0
  104. package/dist/agent/stream-glue.d.ts.map +1 -0
  105. package/dist/agent/stream-glue.js +120 -0
  106. package/dist/agent/stream-glue.js.map +1 -0
  107. package/dist/agent/subagent.d.ts +72 -0
  108. package/dist/agent/subagent.d.ts.map +1 -0
  109. package/dist/agent/subagent.js +193 -0
  110. package/dist/agent/subagent.js.map +1 -0
  111. package/dist/agent/telemetry.d.ts +192 -0
  112. package/dist/agent/telemetry.d.ts.map +1 -0
  113. package/dist/agent/telemetry.js +400 -0
  114. package/dist/agent/telemetry.js.map +1 -0
  115. package/dist/agent/tokenizer.d.ts +42 -0
  116. package/dist/agent/tokenizer.d.ts.map +1 -0
  117. package/dist/agent/tokenizer.js +107 -0
  118. package/dist/agent/tokenizer.js.map +1 -0
  119. package/dist/agent/tool-executor.d.ts +289 -0
  120. package/dist/agent/tool-executor.d.ts.map +1 -0
  121. package/dist/agent/tool-executor.js +2519 -0
  122. package/dist/agent/tool-executor.js.map +1 -0
  123. package/dist/agent/web-impl.d.ts +2 -0
  124. package/dist/agent/web-impl.d.ts.map +1 -0
  125. package/dist/agent/web-impl.js +34 -0
  126. package/dist/agent/web-impl.js.map +1 -0
  127. package/dist/agent/web.d.ts +8 -0
  128. package/dist/agent/web.d.ts.map +1 -0
  129. package/dist/agent/web.js +8 -0
  130. package/dist/agent/web.js.map +1 -0
  131. package/dist/agent/worker-agent.d.ts +27 -0
  132. package/dist/agent/worker-agent.d.ts.map +1 -0
  133. package/dist/agent/worker-agent.js +503 -0
  134. package/dist/agent/worker-agent.js.map +1 -0
  135. package/dist/config.d.ts +162 -0
  136. package/dist/config.d.ts.map +1 -0
  137. package/dist/config.js +138 -0
  138. package/dist/config.js.map +1 -0
  139. package/dist/context/fixo-md-watcher.d.ts +42 -0
  140. package/dist/context/fixo-md-watcher.d.ts.map +1 -0
  141. package/dist/context/fixo-md-watcher.js +126 -0
  142. package/dist/context/fixo-md-watcher.js.map +1 -0
  143. package/dist/context/fixo-md.d.ts +50 -0
  144. package/dist/context/fixo-md.d.ts.map +1 -0
  145. package/dist/context/fixo-md.js +118 -0
  146. package/dist/context/fixo-md.js.map +1 -0
  147. package/dist/context/todo.d.ts +65 -0
  148. package/dist/context/todo.d.ts.map +1 -0
  149. package/dist/context/todo.js +194 -0
  150. package/dist/context/todo.js.map +1 -0
  151. package/dist/git/git-manager.d.ts +33 -0
  152. package/dist/git/git-manager.d.ts.map +1 -0
  153. package/dist/git/git-manager.js +293 -0
  154. package/dist/git/git-manager.js.map +1 -0
  155. package/dist/git/git-ops.d.ts +10 -0
  156. package/dist/git/git-ops.d.ts.map +1 -0
  157. package/dist/git/git-ops.js +131 -0
  158. package/dist/git/git-ops.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +352 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/indexer.d.ts +30 -0
  164. package/dist/indexer.d.ts.map +1 -0
  165. package/dist/indexer.js +273 -0
  166. package/dist/indexer.js.map +1 -0
  167. package/dist/lsp/lsp-client.d.ts +24 -0
  168. package/dist/lsp/lsp-client.d.ts.map +1 -0
  169. package/dist/lsp/lsp-client.js +205 -0
  170. package/dist/lsp/lsp-client.js.map +1 -0
  171. package/dist/lsp/lsp-manager.d.ts +17 -0
  172. package/dist/lsp/lsp-manager.d.ts.map +1 -0
  173. package/dist/lsp/lsp-manager.js +154 -0
  174. package/dist/lsp/lsp-manager.js.map +1 -0
  175. package/dist/lsp/lsp-pre-save.d.ts +137 -0
  176. package/dist/lsp/lsp-pre-save.d.ts.map +1 -0
  177. package/dist/lsp/lsp-pre-save.js +245 -0
  178. package/dist/lsp/lsp-pre-save.js.map +1 -0
  179. package/dist/lsp/syntax-fallback.d.ts +83 -0
  180. package/dist/lsp/syntax-fallback.d.ts.map +1 -0
  181. package/dist/lsp/syntax-fallback.js +275 -0
  182. package/dist/lsp/syntax-fallback.js.map +1 -0
  183. package/dist/model-outcomes.d.ts +12 -0
  184. package/dist/model-outcomes.d.ts.map +1 -0
  185. package/dist/model-outcomes.js +46 -0
  186. package/dist/model-outcomes.js.map +1 -0
  187. package/dist/planner.d.ts +32 -0
  188. package/dist/planner.d.ts.map +1 -0
  189. package/dist/planner.js +163 -0
  190. package/dist/planner.js.map +1 -0
  191. package/dist/project-memory.d.ts +29 -0
  192. package/dist/project-memory.d.ts.map +1 -0
  193. package/dist/project-memory.js +349 -0
  194. package/dist/project-memory.js.map +1 -0
  195. package/dist/review.d.ts +2 -0
  196. package/dist/review.d.ts.map +1 -0
  197. package/dist/review.js +61 -0
  198. package/dist/review.js.map +1 -0
  199. package/dist/runtime/background-jobs.d.ts +97 -0
  200. package/dist/runtime/background-jobs.d.ts.map +1 -0
  201. package/dist/runtime/background-jobs.js +331 -0
  202. package/dist/runtime/background-jobs.js.map +1 -0
  203. package/dist/runtime/credential-vault.d.ts +124 -0
  204. package/dist/runtime/credential-vault.d.ts.map +1 -0
  205. package/dist/runtime/credential-vault.js +184 -0
  206. package/dist/runtime/credential-vault.js.map +1 -0
  207. package/dist/runtime/loop-trap.d.ts +197 -0
  208. package/dist/runtime/loop-trap.d.ts.map +1 -0
  209. package/dist/runtime/loop-trap.js +420 -0
  210. package/dist/runtime/loop-trap.js.map +1 -0
  211. package/dist/runtime/policy.d.ts +15 -0
  212. package/dist/runtime/policy.d.ts.map +1 -0
  213. package/dist/runtime/policy.js +60 -0
  214. package/dist/runtime/policy.js.map +1 -0
  215. package/dist/runtime/redaction.d.ts +66 -0
  216. package/dist/runtime/redaction.d.ts.map +1 -0
  217. package/dist/runtime/redaction.js +155 -0
  218. package/dist/runtime/redaction.js.map +1 -0
  219. package/dist/runtime/session-snapshots.d.ts +76 -0
  220. package/dist/runtime/session-snapshots.d.ts.map +1 -0
  221. package/dist/runtime/session-snapshots.js +166 -0
  222. package/dist/runtime/session-snapshots.js.map +1 -0
  223. package/dist/runtime/staging.d.ts +205 -0
  224. package/dist/runtime/staging.d.ts.map +1 -0
  225. package/dist/runtime/staging.js +526 -0
  226. package/dist/runtime/staging.js.map +1 -0
  227. package/dist/runtime/task-session.d.ts +95 -0
  228. package/dist/runtime/task-session.d.ts.map +1 -0
  229. package/dist/runtime/task-session.js +263 -0
  230. package/dist/runtime/task-session.js.map +1 -0
  231. package/dist/runtime/worktree.d.ts +55 -0
  232. package/dist/runtime/worktree.d.ts.map +1 -0
  233. package/dist/runtime/worktree.js +175 -0
  234. package/dist/runtime/worktree.js.map +1 -0
  235. package/dist/setup-wizard.d.ts +8 -0
  236. package/dist/setup-wizard.d.ts.map +1 -0
  237. package/dist/setup-wizard.js +73 -0
  238. package/dist/setup-wizard.js.map +1 -0
  239. package/dist/shared/content.d.ts +43 -0
  240. package/dist/shared/content.d.ts.map +1 -0
  241. package/dist/shared/content.js +61 -0
  242. package/dist/shared/content.js.map +1 -0
  243. package/dist/shared/types.d.ts +217 -0
  244. package/dist/shared/types.d.ts.map +1 -0
  245. package/dist/shared/types.js +3 -0
  246. package/dist/shared/types.js.map +1 -0
  247. package/dist/test-runner.d.ts +5 -0
  248. package/dist/test-runner.d.ts.map +1 -0
  249. package/dist/test-runner.js +42 -0
  250. package/dist/test-runner.js.map +1 -0
  251. package/dist/types.d.ts +85 -0
  252. package/dist/types.d.ts.map +1 -0
  253. package/dist/types.js +2 -0
  254. package/dist/types.js.map +1 -0
  255. package/dist/ui/ascii.d.ts +23 -0
  256. package/dist/ui/ascii.d.ts.map +1 -0
  257. package/dist/ui/ascii.js +45 -0
  258. package/dist/ui/ascii.js.map +1 -0
  259. package/dist/ui/colors.d.ts +111 -0
  260. package/dist/ui/colors.d.ts.map +1 -0
  261. package/dist/ui/colors.js +166 -0
  262. package/dist/ui/colors.js.map +1 -0
  263. package/dist/ui/image-attach.d.ts +27 -0
  264. package/dist/ui/image-attach.d.ts.map +1 -0
  265. package/dist/ui/image-attach.js +100 -0
  266. package/dist/ui/image-attach.js.map +1 -0
  267. package/dist/ui/index.d.ts +18 -0
  268. package/dist/ui/index.d.ts.map +1 -0
  269. package/dist/ui/index.js +18 -0
  270. package/dist/ui/index.js.map +1 -0
  271. package/dist/ui/markdown-stream.d.ts +91 -0
  272. package/dist/ui/markdown-stream.d.ts.map +1 -0
  273. package/dist/ui/markdown-stream.js +524 -0
  274. package/dist/ui/markdown-stream.js.map +1 -0
  275. package/dist/ui/plan-renderer.d.ts +36 -0
  276. package/dist/ui/plan-renderer.d.ts.map +1 -0
  277. package/dist/ui/plan-renderer.js +79 -0
  278. package/dist/ui/plan-renderer.js.map +1 -0
  279. package/dist/ui/prompt.d.ts +11 -0
  280. package/dist/ui/prompt.d.ts.map +1 -0
  281. package/dist/ui/prompt.js +1960 -0
  282. package/dist/ui/prompt.js.map +1 -0
  283. package/dist/ui/render-primitives.d.ts +117 -0
  284. package/dist/ui/render-primitives.d.ts.map +1 -0
  285. package/dist/ui/render-primitives.js +322 -0
  286. package/dist/ui/render-primitives.js.map +1 -0
  287. package/dist/ui/render.d.ts +133 -0
  288. package/dist/ui/render.d.ts.map +1 -0
  289. package/dist/ui/render.js +547 -0
  290. package/dist/ui/render.js.map +1 -0
  291. package/dist/ui/session-header.d.ts +30 -0
  292. package/dist/ui/session-header.d.ts.map +1 -0
  293. package/dist/ui/session-header.js +74 -0
  294. package/dist/ui/session-header.js.map +1 -0
  295. package/dist/workspace-guard.d.ts +68 -0
  296. package/dist/workspace-guard.d.ts.map +1 -0
  297. package/dist/workspace-guard.js +168 -0
  298. package/dist/workspace-guard.js.map +1 -0
  299. package/dist/workspace-lock.d.ts +27 -0
  300. package/dist/workspace-lock.d.ts.map +1 -0
  301. package/dist/workspace-lock.js +95 -0
  302. package/dist/workspace-lock.js.map +1 -0
  303. package/package.json +63 -0
@@ -0,0 +1,524 @@
1
+ /**
2
+ * markdown-stream.ts — incremental ANSI markdown renderer for
3
+ * streaming model output.
4
+ *
5
+ * Design contract:
6
+ * - `write(chunk)` accepts arbitrary chunks (a single byte, half
7
+ * a word, a full paragraph). Lines are buffered until the
8
+ * trailing `\n` arrives; partial lines stay in the buffer.
9
+ * - `flush()` closes the renderer and emits any remaining buffer.
10
+ *
11
+ * State machine: `text` → `code-fence` → `text`, `text` → `table`
12
+ * → `text`. Transitions trigger on a complete line; partial lines
13
+ * never push the renderer into a new mode.
14
+ *
15
+ * Fenced code blocks use a hybrid presentation:
16
+ * - TTY path: stream a dim preview with side borders + the top
17
+ * border, then on close fence cursor-up + clear-to-end-of-screen
18
+ * and re-emit the finalised framed block with syntax highlight.
19
+ * - Non-TTY path (tests, pipes): suppress the preview and emit
20
+ * only the finalised framed block. Output is deterministic.
21
+ *
22
+ * Tables are buffered until a blank line / non-table line arrives,
23
+ * then rendered with Unicode box drawing.
24
+ */
25
+ import { C, visLen, padToVisual } from './colors.js';
26
+ /* ──────────────────────── width helpers ──────────────────────── */
27
+ const FRAME_FALLBACK = 76;
28
+ function frameWidth() {
29
+ const cols = process.stdout.columns ?? FRAME_FALLBACK + 4;
30
+ return Math.max(20, Math.min(100, cols - 4));
31
+ }
32
+ function isTTY() {
33
+ return process.stdout.isTTY === true;
34
+ }
35
+ function safeWrite(s) {
36
+ try {
37
+ process.stdout.write(s);
38
+ }
39
+ catch { /* stdout may be closed */ }
40
+ }
41
+ function safeWriteLine(s) {
42
+ safeWrite(s + '\n');
43
+ }
44
+ /* ──────────────────────── inline formatting ──────────────────────── */
45
+ const ITALIC_ON = '\x1b[3m';
46
+ /**
47
+ * Apply inline markdown formatting to a single line: bold, italic,
48
+ * inline code, links, file paths, error keywords. Returns an
49
+ * ANSI-coloured string suitable for embedding in a wider line.
50
+ *
51
+ * Order matters: bold (`**`) before italic (`*`) so the longer
52
+ * delimiter wins. Inline code uses backticks and runs after the
53
+ * emphasis pass so backticks inside emphasis are honoured.
54
+ */
55
+ function inlineFormat(text) {
56
+ let out = text;
57
+ // Links: [text](url) → just the text in blue + underline.
58
+ out = out.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_m, txt) => `${C.BLUE}\x1b[4m${txt}${C.RESET}`);
59
+ // Inline code first so its body is not re-formatted by the
60
+ // emphasis pass below.
61
+ out = out.replace(/`([^`]+)`/g, (_m, code) => `${C.PURPLE}${code}${C.RESET}`);
62
+ // Bold (**...**).
63
+ out = out.replace(/\*\*([^*]+)\*\*/g, (_m, c) => `${C.BOLD}${C.SNOW}${c}${C.RESET}`);
64
+ // Italic (*...* or _..._), skipping the bold escape we just emitted.
65
+ out = out.replace(/(?<![*\\])\*([^*\n]+)\*(?!\*)/g, (_m, c) => `${ITALIC_ON}${C.SNOW3}${c}${C.RESET}`);
66
+ out = out.replace(/(?<![_\\])_([^_\n]+)_(?!_)/g, (_m, c) => `${ITALIC_ON}${C.SNOW3}${c}${C.RESET}`);
67
+ // Warning keywords.
68
+ out = out.replace(/\b(error|errors|failed|warning|warn)\b/gi, (m) => `${C.LAVA}${m}${C.RESET}`);
69
+ return out;
70
+ }
71
+ /* ──────────────────────── code highlight ──────────────────────── */
72
+ const LANG_KEYWORDS = {
73
+ typescript: new Set(['const', 'let', 'var', 'function', 'class', 'import', 'export', 'from', 'return', 'if', 'else', 'for', 'while', 'async', 'await', 'interface', 'type', 'enum', 'extends', 'implements', 'new', 'throw', 'try', 'catch', 'finally', 'public', 'private', 'protected', 'readonly', 'static', 'this', 'super', 'void', 'true', 'false', 'null', 'undefined']),
74
+ javascript: new Set(['const', 'let', 'var', 'function', 'class', 'import', 'export', 'from', 'return', 'if', 'else', 'for', 'while', 'async', 'await', 'new', 'throw', 'try', 'catch', 'finally', 'this', 'super', 'true', 'false', 'null', 'undefined']),
75
+ python: new Set(['def', 'class', 'import', 'from', 'return', 'if', 'elif', 'else', 'for', 'while', 'async', 'await', 'try', 'except', 'finally', 'with', 'as', 'in', 'is', 'not', 'and', 'or', 'pass', 'raise', 'lambda', 'yield', 'True', 'False', 'None', 'self']),
76
+ rust: new Set(['fn', 'let', 'mut', 'const', 'struct', 'enum', 'impl', 'trait', 'use', 'pub', 'mod', 'return', 'if', 'else', 'for', 'while', 'loop', 'match', 'self', 'Self', 'true', 'false']),
77
+ go: new Set(['func', 'var', 'const', 'package', 'import', 'return', 'if', 'else', 'for', 'range', 'switch', 'case', 'defer', 'go', 'chan', 'struct', 'interface', 'type', 'true', 'false', 'nil']),
78
+ bash: new Set(['if', 'then', 'else', 'elif', 'fi', 'for', 'in', 'do', 'done', 'while', 'function', 'return', 'export', 'local', 'echo']),
79
+ sh: new Set(['if', 'then', 'else', 'elif', 'fi', 'for', 'in', 'do', 'done', 'while', 'function', 'return', 'export', 'local', 'echo']),
80
+ json: new Set(['true', 'false', 'null']),
81
+ };
82
+ function langKey(raw) {
83
+ const k = raw.toLowerCase().trim();
84
+ if (k === 'ts' || k === 'tsx')
85
+ return 'typescript';
86
+ if (k === 'js' || k === 'jsx' || k === 'mjs')
87
+ return 'javascript';
88
+ if (k === 'py')
89
+ return 'python';
90
+ if (k === 'rs')
91
+ return 'rust';
92
+ if (k === 'shell' || k === 'zsh')
93
+ return 'bash';
94
+ return k;
95
+ }
96
+ /**
97
+ * Tokenise a single line of code and emit ANSI-coloured output.
98
+ * Token rules (in scan order, first match wins):
99
+ * - Line comment (`//` for C-family, `#` for python/bash) → SNOW4.
100
+ * - String literal (`"`, `'`, `` ` ``) → GREEN.
101
+ * - Numeric literal → YELLOW.
102
+ * - Identifier / keyword → PURPLE if keyword, SNOW2 otherwise.
103
+ * - Punctuation / whitespace → SNOW3.
104
+ *
105
+ * Languages without an entry in {@link LANG_KEYWORDS} get a plain
106
+ * SNOW2 rendering (no highlighting).
107
+ */
108
+ function highlightCodeLine(line, lang) {
109
+ const key = langKey(lang);
110
+ const keywords = LANG_KEYWORDS[key];
111
+ if (!keywords)
112
+ return `${C.SNOW2}${line}${C.RESET}`;
113
+ const usesHashComment = key === 'python' || key === 'bash' || key === 'sh';
114
+ const out = [];
115
+ let i = 0;
116
+ while (i < line.length) {
117
+ const c = line[i];
118
+ // Comment-to-end-of-line.
119
+ if (c === '/' && line[i + 1] === '/') {
120
+ out.push(`${C.SNOW4}${line.slice(i)}${C.RESET}`);
121
+ break;
122
+ }
123
+ if (c === '#' && usesHashComment) {
124
+ out.push(`${C.SNOW4}${line.slice(i)}${C.RESET}`);
125
+ break;
126
+ }
127
+ // String literal.
128
+ if (c === '"' || c === "'" || c === '`') {
129
+ let j = i + 1;
130
+ while (j < line.length && line[j] !== c) {
131
+ if (line[j] === '\\' && j + 1 < line.length)
132
+ j++;
133
+ j++;
134
+ }
135
+ j = Math.min(j + 1, line.length);
136
+ out.push(`${C.GREEN}${line.slice(i, j)}${C.RESET}`);
137
+ i = j;
138
+ continue;
139
+ }
140
+ // Number.
141
+ if (/\d/.test(c) && (i === 0 || !/[A-Za-z_]/.test(line[i - 1]))) {
142
+ let j = i;
143
+ while (j < line.length && /[\d.]/.test(line[j]))
144
+ j++;
145
+ out.push(`${C.YELLOW}${line.slice(i, j)}${C.RESET}`);
146
+ i = j;
147
+ continue;
148
+ }
149
+ // Identifier.
150
+ if (/[A-Za-z_]/.test(c)) {
151
+ let j = i;
152
+ while (j < line.length && /[A-Za-z0-9_]/.test(line[j]))
153
+ j++;
154
+ const word = line.slice(i, j);
155
+ if (keywords.has(word))
156
+ out.push(`${C.PURPLE}${word}${C.RESET}`);
157
+ else
158
+ out.push(`${C.SNOW2}${word}${C.RESET}`);
159
+ i = j;
160
+ continue;
161
+ }
162
+ // Everything else (punctuation, whitespace).
163
+ out.push(`${C.SNOW3}${c}${C.RESET}`);
164
+ i++;
165
+ }
166
+ return out.join('');
167
+ }
168
+ /* ──────────────────────── word wrap ──────────────────────── */
169
+ function wrapToWidth(text, width) {
170
+ if (width <= 0)
171
+ return [text];
172
+ if (text.length === 0)
173
+ return [''];
174
+ const words = text.split(/\s+/).filter(Boolean);
175
+ if (words.length === 0)
176
+ return [''];
177
+ const out = [];
178
+ let line = '';
179
+ const pushWord = (w) => {
180
+ // Hard-break words that don't fit on a line by themselves.
181
+ while (w.length > width) {
182
+ if (line.length > 0) {
183
+ out.push(line);
184
+ line = '';
185
+ }
186
+ out.push(w.slice(0, width));
187
+ w = w.slice(width);
188
+ }
189
+ if (line.length === 0) {
190
+ line = w;
191
+ }
192
+ else if (line.length + 1 + w.length <= width) {
193
+ line += ' ' + w;
194
+ }
195
+ else {
196
+ out.push(line);
197
+ line = w;
198
+ }
199
+ };
200
+ for (const w of words)
201
+ pushWord(w);
202
+ if (line.length > 0)
203
+ out.push(line);
204
+ return out;
205
+ }
206
+ export class MarkdownStreamRenderer {
207
+ buf = '';
208
+ state = 'text';
209
+ codeLang = '';
210
+ codeLines = [];
211
+ previewLineCount = 0;
212
+ tableRows = [];
213
+ firstWrite = true;
214
+ /**
215
+ * Feed a chunk of streamed text. Lines are emitted as they
216
+ * complete; the trailing fragment (text after the last `\n`)
217
+ * stays in the buffer until the next write or flush.
218
+ */
219
+ write(chunk) {
220
+ if (this.firstWrite) {
221
+ // Match the leading newline the legacy console.log path used,
222
+ // so the rendered block lifts off the prompt cleanly.
223
+ safeWrite('\n');
224
+ this.firstWrite = false;
225
+ }
226
+ this.buf += chunk;
227
+ let nl;
228
+ while ((nl = this.buf.indexOf('\n')) !== -1) {
229
+ const line = this.buf.slice(0, nl);
230
+ this.buf = this.buf.slice(nl + 1);
231
+ this.handleLine(line);
232
+ }
233
+ }
234
+ /**
235
+ * Close the renderer. Emits any buffered partial line, closes
236
+ * any open code fence (treating EOF as an implicit close), and
237
+ * flushes any open table.
238
+ */
239
+ flush() {
240
+ if (this.buf.length > 0) {
241
+ const tail = this.buf;
242
+ this.buf = '';
243
+ this.handleLine(tail);
244
+ }
245
+ if (this.state === 'code-fence')
246
+ this.closeCodeFence();
247
+ if (this.state === 'table')
248
+ this.flushTable();
249
+ }
250
+ /* ────────── line dispatch ────────── */
251
+ handleLine(line) {
252
+ if (this.state === 'code-fence') {
253
+ if (/^\s*```\s*$/.test(line)) {
254
+ this.closeCodeFence();
255
+ return;
256
+ }
257
+ this.codeLines.push(line);
258
+ this.streamCodePreviewLine(line);
259
+ return;
260
+ }
261
+ if (this.state === 'table') {
262
+ if (this.looksLikeTableRow(line)) {
263
+ this.tableRows.push(line);
264
+ return;
265
+ }
266
+ this.flushTable();
267
+ // Fall through to text handling for this line.
268
+ }
269
+ const fence = line.match(/^\s*```\s*(\S+)?\s*$/);
270
+ if (fence) {
271
+ this.openCodeFence(fence[1] ?? '');
272
+ return;
273
+ }
274
+ if (this.looksLikeTableRow(line)) {
275
+ this.state = 'table';
276
+ this.tableRows.push(line);
277
+ return;
278
+ }
279
+ this.renderTextLine(line);
280
+ }
281
+ /* ────────── text-mode renderers ────────── */
282
+ renderTextLine(line) {
283
+ if (line.trim() === '') {
284
+ safeWriteLine('');
285
+ return;
286
+ }
287
+ // Heading.
288
+ const h = line.match(/^(#{1,6})\s+(.+)$/);
289
+ if (h) {
290
+ const level = h[1].length;
291
+ const text = h[2];
292
+ const color = level === 1 ? C.LAVA : level === 2 ? C.LAVA : C.SNOW;
293
+ const underline = level <= 2 ? '\x1b[4m' : '';
294
+ safeWriteLine(` ${C.BOLD}${color}${underline}${text}${C.RESET}`);
295
+ // h1/h2 get a blank line for breathing room.
296
+ if (level <= 2)
297
+ safeWriteLine('');
298
+ return;
299
+ }
300
+ // Horizontal rule.
301
+ if (/^\s*([-*_])\1{2,}\s*$/.test(line)) {
302
+ const w = frameWidth();
303
+ safeWriteLine(` ${C.SNOW4}${'─'.repeat(w)}${C.RESET}`);
304
+ return;
305
+ }
306
+ // Blockquote.
307
+ if (/^\s*>\s?/.test(line)) {
308
+ const rest = line.replace(/^\s*>\s?/, '');
309
+ safeWriteLine(` ${C.LAVA}│${C.RESET} ${C.SNOW3}${inlineFormat(rest)}${C.RESET}`);
310
+ return;
311
+ }
312
+ // Bulleted list.
313
+ const b = line.match(/^(\s*)([-*+])\s+(.+)$/);
314
+ if (b) {
315
+ const sp = b[1];
316
+ const rest = b[3];
317
+ safeWriteLine(` ${sp}${C.LAVA}•${C.RESET} ${inlineFormat(rest)}`);
318
+ return;
319
+ }
320
+ // Numbered list.
321
+ const n = line.match(/^(\s*)(\d+)\.\s+(.+)$/);
322
+ if (n) {
323
+ const sp = n[1];
324
+ const num = n[2];
325
+ const rest = n[3];
326
+ safeWriteLine(` ${sp}${C.LAVA}${num}.${C.RESET} ${inlineFormat(rest)}`);
327
+ return;
328
+ }
329
+ // Plain paragraph — wrap.
330
+ const w = frameWidth();
331
+ for (const wrapped of wrapToWidth(line, w - 2)) {
332
+ safeWriteLine(` ${inlineFormat(wrapped)}`);
333
+ }
334
+ }
335
+ /* ────────── code fence ────────── */
336
+ openCodeFence(lang) {
337
+ this.state = 'code-fence';
338
+ this.codeLang = lang;
339
+ this.codeLines = [];
340
+ this.previewLineCount = 0;
341
+ if (!isTTY())
342
+ return;
343
+ // Stream a top border immediately so the user sees the box
344
+ // appearing. The lang tag (or "stream") sits in the top edge.
345
+ safeWriteLine(this.codeTopBorder(lang || 'stream'));
346
+ this.previewLineCount++;
347
+ }
348
+ streamCodePreviewLine(line) {
349
+ if (!isTTY())
350
+ return;
351
+ const w = frameWidth();
352
+ const inner = w - 2;
353
+ const truncated = line.length > inner ? line.slice(0, inner) : line;
354
+ const pad = Math.max(0, inner - truncated.length);
355
+ safeWriteLine(` ${C.LAVA}│${C.RESET} ${C.SNOW4}${truncated}${C.RESET}${' '.repeat(pad)} ${C.LAVA}│${C.RESET}`);
356
+ this.previewLineCount++;
357
+ }
358
+ closeCodeFence() {
359
+ if (isTTY() && this.previewLineCount > 0) {
360
+ // Erase the dim preview + its top border, then re-render
361
+ // with syntax highlighting.
362
+ safeWrite(`\x1b[${this.previewLineCount}A\r\x1b[J`);
363
+ }
364
+ safeWriteLine(this.codeTopBorder(this.codeLang || 'code'));
365
+ const w = frameWidth();
366
+ const inner = w - 2;
367
+ for (const raw of this.codeLines) {
368
+ const truncated = raw.length > inner ? raw.slice(0, inner) : raw;
369
+ const highlighted = highlightCodeLine(truncated, this.codeLang);
370
+ const pad = Math.max(0, inner - visLen(highlighted));
371
+ safeWriteLine(` ${C.LAVA}│${C.RESET} ${highlighted}${' '.repeat(pad)} ${C.LAVA}│${C.RESET}`);
372
+ }
373
+ safeWriteLine(` ${C.LAVA}└${'─'.repeat(frameWidth())}┘${C.RESET}`);
374
+ this.state = 'text';
375
+ this.codeLang = '';
376
+ this.codeLines = [];
377
+ this.previewLineCount = 0;
378
+ }
379
+ codeTopBorder(label) {
380
+ const w = frameWidth();
381
+ const tag = ` ${label} `;
382
+ const fillLen = Math.max(0, w - tag.length - 1);
383
+ return ` ${C.LAVA}┌${C.RESET}${C.LAVA}${tag}${C.RESET}${C.LAVA}${'─'.repeat(fillLen)}┐${C.RESET}`;
384
+ }
385
+ /* ────────── tables ────────── */
386
+ looksLikeTableRow(line) {
387
+ const t = line.trim();
388
+ return t.startsWith('|') && t.endsWith('|') && t.length >= 3;
389
+ }
390
+ flushTable() {
391
+ const rawRows = this.tableRows.map((row) => {
392
+ const t = row.trim().slice(1, -1);
393
+ return t.split('|').map((cell) => cell.trim());
394
+ });
395
+ this.tableRows = [];
396
+ this.state = 'text';
397
+ if (rawRows.length === 0)
398
+ return;
399
+ const isDivider = (cells) => cells.length > 0 && cells.every((c) => /^:?-+:?$/.test(c.trim()));
400
+ const header = rawRows[0];
401
+ let bodyStart = 1;
402
+ if (rawRows.length > 1 && isDivider(rawRows[1]))
403
+ bodyStart = 2;
404
+ const body = rawRows.slice(bodyStart);
405
+ const cols = header.length;
406
+ if (cols === 0)
407
+ return;
408
+ // Split each cell on <br>, <br/>, <br />, and real newlines so
409
+ // models emitting `<br>` for "wrap inside cell" produce real
410
+ // visual line breaks. Pre-segment per cell.
411
+ const segmentCell = (raw) => raw
412
+ .split(/<br\s*\/?>|\\n|\n/i)
413
+ .map((s) => s.trim())
414
+ .filter((_s, i, arr) => arr.length === 1 || _s.length > 0 || i < arr.length - 1);
415
+ const segHeader = header.map(segmentCell);
416
+ const segBody = body.map((row) => row.map(segmentCell));
417
+ // Natural width per column = longest single segment in any
418
+ // cell, after inline formatting (so escape codes don't count).
419
+ const natural = new Array(cols).fill(0);
420
+ for (const segRow of [segHeader, ...segBody]) {
421
+ for (let i = 0; i < cols; i++) {
422
+ for (const seg of segRow[i] ?? []) {
423
+ const len = visLen(inlineFormat(seg));
424
+ if (len > natural[i])
425
+ natural[i] = len;
426
+ }
427
+ }
428
+ }
429
+ // Available inner width: terminal width minus the 2-char margin
430
+ // minus the (cols+1) vertical separators minus (cols*2) cell
431
+ // padding (one space each side).
432
+ const margin = 2;
433
+ const cellPad = 2; // ' x ' adds 2
434
+ const sepCount = cols + 1;
435
+ const available = Math.max(cols * 3, frameWidth() - sepCount - cols * cellPad);
436
+ // Shrink the widest columns iteratively until the sum fits.
437
+ const widths = natural.slice();
438
+ // Clamp tiny minimum so each column can hold ~one short word.
439
+ const MIN = 4;
440
+ while (widths.reduce((a, b) => a + b, 0) > available) {
441
+ let maxIdx = 0;
442
+ for (let i = 1; i < cols; i++)
443
+ if (widths[i] > widths[maxIdx])
444
+ maxIdx = i;
445
+ if (widths[maxIdx] <= MIN)
446
+ break;
447
+ widths[maxIdx] = widths[maxIdx] - 1;
448
+ }
449
+ // Final safety: if even MIN-per-col overflows, accept overflow
450
+ // gracefully rather than infinite-loop above (loop exits via `break`).
451
+ void margin;
452
+ const border = (l, m, r) => {
453
+ const segs = widths.map((wd) => '─'.repeat(wd + 2));
454
+ return ` ${C.SNOW4}${l}${segs.join(m)}${r}${C.RESET}`;
455
+ };
456
+ // Render one logical table row, possibly across multiple
457
+ // visual lines if any cell needs wrapping. The result is an
458
+ // array of visual lines.
459
+ const renderLogicalRow = (segCells, bold = false) => {
460
+ // Wrap each cell to its column width, joining segments with
461
+ // forced line breaks first.
462
+ const wrappedCells = [];
463
+ let height = 1;
464
+ for (let i = 0; i < cols; i++) {
465
+ const segments = segCells[i] ?? [''];
466
+ const lines = [];
467
+ for (const seg of segments) {
468
+ for (const wrapped of wrapToWidth(seg, widths[i])) {
469
+ lines.push(wrapped);
470
+ }
471
+ }
472
+ if (lines.length === 0)
473
+ lines.push('');
474
+ wrappedCells.push(lines);
475
+ if (lines.length > height)
476
+ height = lines.length;
477
+ }
478
+ const visualLines = [];
479
+ for (let row = 0; row < height; row++) {
480
+ const parts = [];
481
+ for (let i = 0; i < cols; i++) {
482
+ const raw = wrappedCells[i][row] ?? '';
483
+ const formatted = bold
484
+ ? `${C.BOLD}${C.SNOW}${raw}${C.RESET}`
485
+ : inlineFormat(raw);
486
+ const pad = Math.max(0, widths[i] - visLen(formatted));
487
+ parts.push(` ${formatted}${' '.repeat(pad)} `);
488
+ }
489
+ visualLines.push(` ${C.SNOW4}│${C.RESET}${parts.join(`${C.SNOW4}│${C.RESET}`)}${C.SNOW4}│${C.RESET}`);
490
+ }
491
+ return visualLines;
492
+ };
493
+ safeWriteLine(border('┌', '┬', '┐'));
494
+ for (const line of renderLogicalRow(segHeader, true))
495
+ safeWriteLine(line);
496
+ safeWriteLine(border('├', '┼', '┤'));
497
+ for (let r = 0; r < segBody.length; r++) {
498
+ for (const line of renderLogicalRow(segBody[r]))
499
+ safeWriteLine(line);
500
+ // Light row separator for multi-line bodies so rows stay
501
+ // visually distinct. Skip after the last body row — the
502
+ // closing border handles that.
503
+ if (segBody.length > 1 && r < segBody.length - 1) {
504
+ safeWriteLine(border('├', '┼', '┤'));
505
+ }
506
+ }
507
+ safeWriteLine(border('└', '┴', '┘'));
508
+ }
509
+ }
510
+ /* ──────────────────────── one-shot helper ──────────────────────── */
511
+ /**
512
+ * Render a complete markdown string (non-streaming path). Used by
513
+ * the post-tool response print site in single-agent.ts.
514
+ */
515
+ export function renderMarkdown(text) {
516
+ const r = new MarkdownStreamRenderer();
517
+ r.write(text);
518
+ if (!text.endsWith('\n'))
519
+ r.write('\n');
520
+ r.flush();
521
+ }
522
+ /* ──────────────────────── exports for tests ──────────────────────── */
523
+ export const __internal = { inlineFormat, highlightCodeLine, langKey, padToVisual };
524
+ //# sourceMappingURL=markdown-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-stream.js","sourceRoot":"","sources":["../../src/ui/markdown-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * plan-renderer.ts — Renders an agent execution plan as the
3
+ * numbered step list the user sees during PLAN mode (and as
4
+ * the first phase of BUILD mode if the planner produced a
5
+ * plan).
6
+ *
7
+ * Steps advance through four states: `pending`, `active`,
8
+ * `done`, `failed`. The renderer draws a top rule, the steps,
9
+ * a bottom rule, and an approval prompt.
10
+ */
11
+ export type PlanStepState = 'pending' | 'active' | 'done' | 'failed';
12
+ export interface PlanStep {
13
+ /** Display text for the step, e.g. `Analyze src/auth/provider.ts with ReadFile`. */
14
+ text: string;
15
+ state: PlanStepState;
16
+ }
17
+ /**
18
+ * Render the full plan block: title, steps, bottom rule, and
19
+ * approval prompt. The prompt's `[Y/n]` portion is lava so the
20
+ * user knows where to type.
21
+ */
22
+ export declare function renderPlan(steps: ReadonlyArray<PlanStep>): void;
23
+ /**
24
+ * Re-render a single step in-place. Useful when an agent's
25
+ * step state changes (e.g. just transitioned from `active` to
26
+ * `done`) and the rest of the plan is still on screen. Returns
27
+ * the ANSI sequence to write; the caller decides whether to
28
+ * print it on the current line or after a clear.
29
+ */
30
+ export declare function renderStepUpdate(step: PlanStep, index: number): string;
31
+ /**
32
+ * The approval prompt line, in case the agent wants to ask
33
+ * for plan confirmation outside the `renderPlan` flow.
34
+ */
35
+ export declare function renderApprovalPrompt(): void;
36
+ //# sourceMappingURL=plan-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-renderer.d.ts","sourceRoot":"","sources":["../../src/ui/plan-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;CACtB;AA6BD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAkB/D;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}