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,111 @@
1
+ /**
2
+ * 24-bit TrueColor ANSI escape sequences for the FixO Theme.
3
+ * Supports dynamic toggling between Dark Mode ('dark') and High-Contrast Inverted Mode ('inverted').
4
+ *
5
+ * The legacy `colors` object is preserved for backward compatibility
6
+ * with the 305+ tests that import it. The new `C` palette is the
7
+ * canonical brand identity — the "Liquid Lava" / "Dark Void" / "Snow"
8
+ * triad that's used across the new UI primitives in
9
+ * `src/ui/render.ts` and friends.
10
+ */
11
+ export declare let themeMode: 'dark' | 'inverted';
12
+ export declare function setThemeMode(mode: 'dark' | 'inverted'): void;
13
+ export declare const colors: {
14
+ readonly reset: string;
15
+ readonly bold: string;
16
+ readonly dim: string;
17
+ readonly underline: string;
18
+ readonly snow: "\u001B[38;2;21;20;25m" | "\u001B[38;2;251;251;251m";
19
+ readonly bgSnow: "\u001B[48;2;251;251;251m" | "\u001B[48;2;21;20;25m";
20
+ readonly darkVoid: "\u001B[38;2;21;20;25m" | "\u001B[38;2;251;251;251m";
21
+ readonly bgDarkVoid: "\u001B[48;2;251;251;251m" | "\u001B[48;2;21;20;25m";
22
+ readonly liquidLava: string;
23
+ readonly bgLiquidLava: string;
24
+ readonly cyan: string;
25
+ readonly blue: string;
26
+ readonly magenta: string;
27
+ readonly white: "\u001B[38;2;21;20;25m" | "\u001B[38;2;251;251;251m";
28
+ readonly green: string;
29
+ readonly yellow: string;
30
+ readonly red: string;
31
+ readonly gray: string;
32
+ readonly bgCyan: string;
33
+ };
34
+ /** Helper to render a high-contrast label with Snow background and Dark Void text */
35
+ export declare function renderStatusLabel(text: string): string;
36
+ /**
37
+ * Canonical FixO brand palette. The first class — `LAVA` —
38
+ * is the primary accent used on EVERY key highlight, the
39
+ * ASCII logo, the prompt glyph, the status-bar pills, and the
40
+ * top border of the AI response frame.
41
+ *
42
+ * The hex values are duplicated as comment annotations so the
43
+ * palette can be audited without an external reference.
44
+ */
45
+ export declare const C: {
46
+ readonly LAVA: "\u001B[38;2;245;110;15m";
47
+ readonly LAVA_BG: "\u001B[48;2;42;26;10m";
48
+ readonly LAVA_DIM: "\u001B[38;2;122;54;8m";
49
+ readonly VOID: "\u001B[48;2;21;20;25m";
50
+ readonly VOID2: "\u001B[48;2;28;27;33m";
51
+ readonly VOID3: "\u001B[48;2;35;34;40m";
52
+ readonly VOID4_FG: "\u001B[38;2;46;45;53m";
53
+ readonly SNOW: "\u001B[38;2;251;251;251m";
54
+ readonly SNOW2: "\u001B[38;2;200;200;200m";
55
+ readonly SNOW3: "\u001B[38;2;136;136;136m";
56
+ readonly SNOW4: "\u001B[38;2;68;68;68m";
57
+ readonly BLUE: "\u001B[38;2;96;165;250m";
58
+ readonly GREEN: "\u001B[38;2;74;222;128m";
59
+ readonly YELLOW: "\u001B[38;2;250;204;21m";
60
+ readonly PURPLE: "\u001B[38;2;192;132;252m";
61
+ readonly RED: "\u001B[38;2;248;113;113m";
62
+ readonly P_ANTHROPIC: "\u001B[38;2;245;110;15m";
63
+ readonly P_GOOGLE: "\u001B[38;2;74;222;128m";
64
+ readonly P_GROQ: "\u001B[38;2;250;204;21m";
65
+ readonly P_OPENAI: "\u001B[38;2;96;165;250m";
66
+ readonly P_ZEN: "\u001B[38;2;192;132;252m";
67
+ readonly P_MISTRAL: "\u001B[38;2;251;191;36m";
68
+ readonly P_NVIDIA: "\u001B[38;2;134;239;172m";
69
+ readonly BOLD: "\u001B[1m";
70
+ readonly DIM: "\u001B[2m";
71
+ readonly RESET: "\u001B[0m";
72
+ readonly NL: "\n";
73
+ };
74
+ /**
75
+ * Helper wrappers that wrap a string in a colour + RESET.
76
+ * Pure, allocation-light, safe to use in any hot path.
77
+ */
78
+ export declare function lava(text: string): string;
79
+ export declare function snow(text: string): string;
80
+ export declare function dim(text: string): string;
81
+ export declare function green(text: string): string;
82
+ export declare function blue(text: string): string;
83
+ export declare function yellow(text: string): string;
84
+ export declare function purple(text: string): string;
85
+ export declare function red(text: string): string;
86
+ export declare function bold(text: string): string;
87
+ /**
88
+ * Visible-character length of a string with ANSI escapes removed.
89
+ * Use this whenever you need to pad an ANSI-coloured string to a
90
+ * target column width — `.length` over-counts because it includes
91
+ * the escape bytes.
92
+ */
93
+ export declare function visLen(s: string): number;
94
+ /**
95
+ * Pad a string (which may contain ANSI escapes) to a target
96
+ * visual width. If the string is already at or beyond the target,
97
+ * it is returned unchanged. Negative widths are treated as zero.
98
+ */
99
+ export declare function padToVisual(s: string, width: number, char?: string): string;
100
+ /**
101
+ * Pick the brand colour for a provider by its display name.
102
+ * Returns the colour code; callers add the text and RESET.
103
+ */
104
+ export declare function providerColor(name: string): string;
105
+ /**
106
+ * Render a single pill: `${bg}${fg} ${text} ${RESET}`.
107
+ * Used by the status bar and any other place a labelled chip
108
+ * needs a coloured background.
109
+ */
110
+ export declare function pill(text: string, fg: string, bg: string): string;
111
+ //# sourceMappingURL=colors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,UAAmB,CAAC;AAEnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,QAErD;AAID,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;CAwClB,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAID;;;;;;;;GAQG;AACH,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCJ,CAAC;AAIX;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACrF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACrF,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA6C;AACtF,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACtF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACrF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACvF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACvF,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AACpF,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAA2C;AAErF;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,MAAM,CAIxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEjE"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * 24-bit TrueColor ANSI escape sequences for the FixO Theme.
3
+ * Supports dynamic toggling between Dark Mode ('dark') and High-Contrast Inverted Mode ('inverted').
4
+ *
5
+ * The legacy `colors` object is preserved for backward compatibility
6
+ * with the 305+ tests that import it. The new `C` palette is the
7
+ * canonical brand identity — the "Liquid Lava" / "Dark Void" / "Snow"
8
+ * triad that's used across the new UI primitives in
9
+ * `src/ui/render.ts` and friends.
10
+ */
11
+ export let themeMode = 'dark';
12
+ export function setThemeMode(mode) {
13
+ themeMode = mode;
14
+ }
15
+ /* ──────────────────────── Legacy palette (preserved) ──────────────────────── */
16
+ export const colors = {
17
+ get reset() { return '\x1b[0m'; },
18
+ get bold() { return '\x1b[1m'; },
19
+ get dim() { return '\x1b[2m'; },
20
+ get underline() { return '\x1b[4m'; },
21
+ // Snow (#FBFBFB)
22
+ get snow() {
23
+ return themeMode === 'dark' ? '\x1b[38;2;251;251;251m' : '\x1b[38;2;21;20;25m';
24
+ },
25
+ get bgSnow() {
26
+ return themeMode === 'dark' ? '\x1b[48;2;251;251;251m' : '\x1b[48;2;21;20;25m';
27
+ },
28
+ // Dark Void (#151419)
29
+ get darkVoid() {
30
+ return themeMode === 'dark' ? '\x1b[38;2;21;20;25m' : '\x1b[38;2;251;251;251m';
31
+ },
32
+ get bgDarkVoid() {
33
+ return themeMode === 'dark' ? '\x1b[48;2;21;20;25m' : '\x1b[48;2;251;251;251m';
34
+ },
35
+ // Liquid Lava (#F56E0F)
36
+ get liquidLava() {
37
+ return '\x1b[38;2;245;110;15m';
38
+ },
39
+ get bgLiquidLava() {
40
+ return '\x1b[48;2;245;110;15m';
41
+ },
42
+ // Compatibility Mappings mapped to our Theme Palette
43
+ get cyan() { return '\x1b[38;2;56;189;248m'; },
44
+ get blue() { return '\x1b[38;2;96;165;250m'; },
45
+ get magenta() { return '\x1b[38;2;236;72;153m'; },
46
+ get white() { return this.snow; },
47
+ get green() { return '\x1b[38;2;76;175;80m'; },
48
+ get yellow() { return '\x1b[38;2;245;180;64m'; },
49
+ get red() { return '\x1b[38;2;244;67;54m'; },
50
+ get gray() { return '\x1b[38;2;145;145;155m'; },
51
+ get bgCyan() { return '\x1b[48;2;56;189;248m'; },
52
+ };
53
+ /** Helper to render a high-contrast label with Snow background and Dark Void text */
54
+ export function renderStatusLabel(text) {
55
+ return `${colors.bgSnow}${colors.darkVoid} ${text} ${colors.reset}`;
56
+ }
57
+ /* ──────────────────────── C palette (brand identity) ──────────────────────── */
58
+ /**
59
+ * Canonical FixO brand palette. The first class — `LAVA` —
60
+ * is the primary accent used on EVERY key highlight, the
61
+ * ASCII logo, the prompt glyph, the status-bar pills, and the
62
+ * top border of the AI response frame.
63
+ *
64
+ * The hex values are duplicated as comment annotations so the
65
+ * palette can be audited without an external reference.
66
+ */
67
+ export const C = {
68
+ // Brand
69
+ LAVA: '\x1b[38;2;245;110;15m', // #F56E0F — primary accent
70
+ LAVA_BG: '\x1b[48;2;42;26;10m', // dark orange surface
71
+ LAVA_DIM: '\x1b[38;2;122;54;8m', // muted lava for secondary accents
72
+ // Backgrounds (used as surface layers)
73
+ VOID: '\x1b[48;2;21;20;25m', // #151419 — deepest bg
74
+ VOID2: '\x1b[48;2;28;27;33m', // slightly lifted surface
75
+ VOID3: '\x1b[48;2;35;34;40m', // hover / selected row bg
76
+ VOID4_FG: '\x1b[38;2;46;45;53m', // border color as foreground
77
+ // Text
78
+ SNOW: '\x1b[38;2;251;251;251m', // #FBFBFB — primary text
79
+ SNOW2: '\x1b[38;2;200;200;200m', // secondary text
80
+ SNOW3: '\x1b[38;2;136;136;136m', // muted / hints
81
+ SNOW4: '\x1b[38;2;68;68;68m', // very dim / decorative
82
+ // Semantic (tool call types)
83
+ BLUE: '\x1b[38;2;96;165;250m', // ReadFile, info
84
+ GREEN: '\x1b[38;2;74;222;128m', // success
85
+ YELLOW: '\x1b[38;2;250;204;21m', // Bash, warnings
86
+ PURPLE: '\x1b[38;2;192;132;252m', // WriteFile, AI highlights
87
+ RED: '\x1b[38;2;248;113;113m', // errors
88
+ // Provider colors
89
+ P_ANTHROPIC: '\x1b[38;2;245;110;15m',
90
+ P_GOOGLE: '\x1b[38;2;74;222;128m',
91
+ P_GROQ: '\x1b[38;2;250;204;21m',
92
+ P_OPENAI: '\x1b[38;2;96;165;250m',
93
+ P_ZEN: '\x1b[38;2;192;132;252m',
94
+ P_MISTRAL: '\x1b[38;2;251;191;36m',
95
+ P_NVIDIA: '\x1b[38;2;134;239;172m',
96
+ // Formatting
97
+ BOLD: '\x1b[1m',
98
+ DIM: '\x1b[2m',
99
+ RESET: '\x1b[0m',
100
+ NL: '\n',
101
+ };
102
+ /* ──────────────────────── Helper wrappers ──────────────────────── */
103
+ /**
104
+ * Helper wrappers that wrap a string in a colour + RESET.
105
+ * Pure, allocation-light, safe to use in any hot path.
106
+ */
107
+ export function lava(text) { return `${C.LAVA}${text}${C.RESET}`; }
108
+ export function snow(text) { return `${C.SNOW}${text}${C.RESET}`; }
109
+ export function dim(text) { return `${C.SNOW4}${text}${C.RESET}`; }
110
+ export function green(text) { return `${C.GREEN}${text}${C.RESET}`; }
111
+ export function blue(text) { return `${C.BLUE}${text}${C.RESET}`; }
112
+ export function yellow(text) { return `${C.YELLOW}${text}${C.RESET}`; }
113
+ export function purple(text) { return `${C.PURPLE}${text}${C.RESET}`; }
114
+ export function red(text) { return `${C.RED}${text}${C.RESET}`; }
115
+ export function bold(text) { return `${C.BOLD}${text}${C.RESET}`; }
116
+ /**
117
+ * Visible-character length of a string with ANSI escapes removed.
118
+ * Use this whenever you need to pad an ANSI-coloured string to a
119
+ * target column width — `.length` over-counts because it includes
120
+ * the escape bytes.
121
+ */
122
+ export function visLen(s) {
123
+ return s.replace(/\x1b\[[0-9;]*m/g, '').length;
124
+ }
125
+ /**
126
+ * Pad a string (which may contain ANSI escapes) to a target
127
+ * visual width. If the string is already at or beyond the target,
128
+ * it is returned unchanged. Negative widths are treated as zero.
129
+ */
130
+ export function padToVisual(s, width, char = ' ') {
131
+ const v = visLen(s);
132
+ if (v >= width)
133
+ return s;
134
+ return s + char.repeat(width - v);
135
+ }
136
+ /**
137
+ * Pick the brand colour for a provider by its display name.
138
+ * Returns the colour code; callers add the text and RESET.
139
+ */
140
+ export function providerColor(name) {
141
+ const lower = name.toLowerCase();
142
+ if (lower.includes('anthropic') || lower.includes('claude'))
143
+ return C.P_ANTHROPIC;
144
+ if (lower.includes('google') || lower.includes('gemini'))
145
+ return C.P_GOOGLE;
146
+ if (lower.includes('groq'))
147
+ return C.P_GROQ;
148
+ if (lower.includes('openai'))
149
+ return C.P_OPENAI;
150
+ if (lower.includes('zen') || lower.includes('opencode'))
151
+ return C.P_ZEN;
152
+ if (lower.includes('mistral'))
153
+ return C.P_MISTRAL;
154
+ if (lower.includes('nvidia') || lower.includes('nim'))
155
+ return C.P_NVIDIA;
156
+ return C.SNOW2;
157
+ }
158
+ /**
159
+ * Render a single pill: `${bg}${fg} ${text} ${RESET}`.
160
+ * Used by the status bar and any other place a labelled chip
161
+ * needs a coloured background.
162
+ */
163
+ export function pill(text, fg, bg) {
164
+ return `${bg}${fg} ${text} ${C.RESET}`;
165
+ }
166
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/ui/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { ChatContentBlock, ChatImageMediaType } from '../shared/types.js';
2
+ /** Hard cap before base64 encoding. 5 MiB ≈ 7 MiB once encoded. */
3
+ export declare const MAX_IMAGE_BYTES: number;
4
+ export type AttachImageResult = {
5
+ ok: true;
6
+ block: ChatContentBlock;
7
+ mediaType: ChatImageMediaType;
8
+ bytes: number;
9
+ } | {
10
+ ok: false;
11
+ error: string;
12
+ };
13
+ /**
14
+ * Sniff the image MIME type from the file's leading bytes. We
15
+ * deliberately avoid pulling in a MIME-detection library — these
16
+ * four magic numbers are enough for every format we support.
17
+ */
18
+ export declare function sniffImageMediaType(prefix: Buffer): ChatImageMediaType | null;
19
+ /**
20
+ * Load an image off disk and return a typed content block.
21
+ * Failures (missing file, oversized, unsupported MIME, workspace
22
+ * escape) return `{ ok: false, error }` rather than throwing, so
23
+ * the slash-command dispatcher can render a friendly message
24
+ * instead of crashing the REPL.
25
+ */
26
+ export declare function loadImageAsBlock(rawPath: string, cwd: string): AttachImageResult;
27
+ //# sourceMappingURL=image-attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-attach.d.ts","sourceRoot":"","sources":["../../src/ui/image-attach.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,mEAAmE;AACnE,eAAO,MAAM,eAAe,QAAkB,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAwB7E;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAsDhF"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * image-attach.ts — Phase 2 helper for the `/image` slash command.
3
+ *
4
+ * Reads an image off disk through `WorkspaceGuard`, sniffs the
5
+ * MIME type by looking at the byte prefix (no external lib), caps
6
+ * the byte size at 5 MiB (matches Anthropic's documented ceiling),
7
+ * and returns either a typed `ChatContentBlock` or a structured
8
+ * error. Pure read-side — never writes, never spawns processes.
9
+ */
10
+ import fs from 'node:fs';
11
+ import { WorkspaceGuard } from '../workspace-guard.js';
12
+ /** Hard cap before base64 encoding. 5 MiB ≈ 7 MiB once encoded. */
13
+ export const MAX_IMAGE_BYTES = 5 * 1024 * 1024;
14
+ /**
15
+ * Sniff the image MIME type from the file's leading bytes. We
16
+ * deliberately avoid pulling in a MIME-detection library — these
17
+ * four magic numbers are enough for every format we support.
18
+ */
19
+ export function sniffImageMediaType(prefix) {
20
+ if (prefix.length >= 8 && prefix[0] === 0x89 && prefix[1] === 0x50 && prefix[2] === 0x4e && prefix[3] === 0x47) {
21
+ return 'image/png';
22
+ }
23
+ if (prefix.length >= 3 && prefix[0] === 0xff && prefix[1] === 0xd8 && prefix[2] === 0xff) {
24
+ return 'image/jpeg';
25
+ }
26
+ // WebP: 'RIFF' .... 'WEBP'
27
+ if (prefix.length >= 12 &&
28
+ prefix[0] === 0x52 && prefix[1] === 0x49 && prefix[2] === 0x46 && prefix[3] === 0x46 &&
29
+ prefix[8] === 0x57 && prefix[9] === 0x45 && prefix[10] === 0x42 && prefix[11] === 0x50) {
30
+ return 'image/webp';
31
+ }
32
+ // GIF: 'GIF87a' or 'GIF89a'
33
+ if (prefix.length >= 6 &&
34
+ prefix[0] === 0x47 && prefix[1] === 0x49 && prefix[2] === 0x46 && prefix[3] === 0x38 &&
35
+ (prefix[4] === 0x37 || prefix[4] === 0x39) && prefix[5] === 0x61) {
36
+ return 'image/gif';
37
+ }
38
+ return null;
39
+ }
40
+ /**
41
+ * Load an image off disk and return a typed content block.
42
+ * Failures (missing file, oversized, unsupported MIME, workspace
43
+ * escape) return `{ ok: false, error }` rather than throwing, so
44
+ * the slash-command dispatcher can render a friendly message
45
+ * instead of crashing the REPL.
46
+ */
47
+ export function loadImageAsBlock(rawPath, cwd) {
48
+ let resolved;
49
+ try {
50
+ const guard = new WorkspaceGuard(cwd);
51
+ resolved = guard.resolve(rawPath, 'image');
52
+ }
53
+ catch (err) {
54
+ return { ok: false, error: `path rejected: ${err.message}` };
55
+ }
56
+ let stat;
57
+ try {
58
+ stat = fs.statSync(resolved);
59
+ }
60
+ catch {
61
+ return { ok: false, error: `file not found: ${rawPath}` };
62
+ }
63
+ if (!stat.isFile()) {
64
+ return { ok: false, error: `not a regular file: ${rawPath}` };
65
+ }
66
+ if (stat.size > MAX_IMAGE_BYTES) {
67
+ return {
68
+ ok: false,
69
+ error: `image too large: ${stat.size} bytes (cap ${MAX_IMAGE_BYTES}).`,
70
+ };
71
+ }
72
+ if (stat.size === 0) {
73
+ return { ok: false, error: `image is empty: ${rawPath}` };
74
+ }
75
+ let bytes;
76
+ try {
77
+ bytes = fs.readFileSync(resolved);
78
+ }
79
+ catch (err) {
80
+ return { ok: false, error: `read failed: ${err.message}` };
81
+ }
82
+ const mediaType = sniffImageMediaType(bytes.subarray(0, 16));
83
+ if (mediaType == null) {
84
+ return {
85
+ ok: false,
86
+ error: `unsupported image format. Supported: PNG, JPEG, WebP, GIF. ` +
87
+ `(File magic did not match.)`,
88
+ };
89
+ }
90
+ const block = {
91
+ type: 'image',
92
+ source: {
93
+ kind: 'base64',
94
+ mediaType,
95
+ data: bytes.toString('base64'),
96
+ },
97
+ };
98
+ return { ok: true, block, mediaType, bytes: stat.size };
99
+ }
100
+ //# sourceMappingURL=image-attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-attach.js","sourceRoot":"","sources":["../../src/ui/image-attach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ui/index.ts — Barrel export for the FixO UI surface.
3
+ *
4
+ * Re-exports the brand palette (`C` + helpers), the logo, all
5
+ * high-level render primitives, the session header, the plan
6
+ * renderer, and the legacy `colors` object / `renderStatusLabel`
7
+ * used by the rest of the codebase.
8
+ *
9
+ * Existing callers continue to import from the granular files
10
+ * (e.g. `import { colors } from './colors.js'`); this barrel is
11
+ * for the new code and the new tests.
12
+ */
13
+ export * from './colors.js';
14
+ export * from './ascii.js';
15
+ export * from './render-primitives.js';
16
+ export * from './session-header.js';
17
+ export * from './plan-renderer.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ui/index.ts — Barrel export for the FixO UI surface.
3
+ *
4
+ * Re-exports the brand palette (`C` + helpers), the logo, all
5
+ * high-level render primitives, the session header, the plan
6
+ * renderer, and the legacy `colors` object / `renderStatusLabel`
7
+ * used by the rest of the codebase.
8
+ *
9
+ * Existing callers continue to import from the granular files
10
+ * (e.g. `import { colors } from './colors.js'`); this barrel is
11
+ * for the new code and the new tests.
12
+ */
13
+ export * from './colors.js';
14
+ export * from './ascii.js';
15
+ export * from './render-primitives.js';
16
+ export * from './session-header.js';
17
+ export * from './plan-renderer.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,91 @@
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 { padToVisual } from './colors.js';
26
+ /**
27
+ * Apply inline markdown formatting to a single line: bold, italic,
28
+ * inline code, links, file paths, error keywords. Returns an
29
+ * ANSI-coloured string suitable for embedding in a wider line.
30
+ *
31
+ * Order matters: bold (`**`) before italic (`*`) so the longer
32
+ * delimiter wins. Inline code uses backticks and runs after the
33
+ * emphasis pass so backticks inside emphasis are honoured.
34
+ */
35
+ declare function inlineFormat(text: string): string;
36
+ declare function langKey(raw: string): string;
37
+ /**
38
+ * Tokenise a single line of code and emit ANSI-coloured output.
39
+ * Token rules (in scan order, first match wins):
40
+ * - Line comment (`//` for C-family, `#` for python/bash) → SNOW4.
41
+ * - String literal (`"`, `'`, `` ` ``) → GREEN.
42
+ * - Numeric literal → YELLOW.
43
+ * - Identifier / keyword → PURPLE if keyword, SNOW2 otherwise.
44
+ * - Punctuation / whitespace → SNOW3.
45
+ *
46
+ * Languages without an entry in {@link LANG_KEYWORDS} get a plain
47
+ * SNOW2 rendering (no highlighting).
48
+ */
49
+ declare function highlightCodeLine(line: string, lang: string): string;
50
+ export declare class MarkdownStreamRenderer {
51
+ private buf;
52
+ private state;
53
+ private codeLang;
54
+ private codeLines;
55
+ private previewLineCount;
56
+ private tableRows;
57
+ private firstWrite;
58
+ /**
59
+ * Feed a chunk of streamed text. Lines are emitted as they
60
+ * complete; the trailing fragment (text after the last `\n`)
61
+ * stays in the buffer until the next write or flush.
62
+ */
63
+ write(chunk: string): void;
64
+ /**
65
+ * Close the renderer. Emits any buffered partial line, closes
66
+ * any open code fence (treating EOF as an implicit close), and
67
+ * flushes any open table.
68
+ */
69
+ flush(): void;
70
+ private handleLine;
71
+ private renderTextLine;
72
+ private openCodeFence;
73
+ private streamCodePreviewLine;
74
+ private closeCodeFence;
75
+ private codeTopBorder;
76
+ private looksLikeTableRow;
77
+ private flushTable;
78
+ }
79
+ /**
80
+ * Render a complete markdown string (non-streaming path). Used by
81
+ * the post-tool response print site in single-agent.ts.
82
+ */
83
+ export declare function renderMarkdown(text: string): void;
84
+ export declare const __internal: {
85
+ inlineFormat: typeof inlineFormat;
86
+ highlightCodeLine: typeof highlightCodeLine;
87
+ langKey: typeof langKey;
88
+ padToVisual: typeof padToVisual;
89
+ };
90
+ export {};
91
+ //# sourceMappingURL=markdown-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-stream.d.ts","sourceRoot":"","sources":["../../src/ui/markdown-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AA2BrD;;;;;;;;GAQG;AACH,iBAAS,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAe1C;AAeD,iBAAS,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQpC;AAED;;;;;;;;;;;GAWG;AACH,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAqD7D;AAoCD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAQ;IAE1B;;;;OAIG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAgB1B;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,UAAU;CAwHnB;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKjD;AAID,eAAO,MAAM,UAAU;;;;;CAA4D,CAAC"}