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,547 @@
1
+ /**
2
+ * Fixo UI render layer.
3
+ *
4
+ * This module owns:
5
+ * 1. The static, line-by-line helpers used by the REPL welcome /
6
+ * help screens (preserved verbatim for backwards compatibility).
7
+ * 2. A new type-safe, double-buffered, non-blocking dashboard
8
+ * renderer used during agent execution.
9
+ *
10
+ * The dashboard is opt-in: the default {@link dashboard} singleton is
11
+ * shared across the tool loop and the prompt REPL, but tests / CI
12
+ * environments that pipe stdout can call {@link Dashboard.deactivate}
13
+ * to force the single-line / off modes without touching the call
14
+ * sites that emit events.
15
+ */
16
+ import fs from "fs";
17
+ import path from "path";
18
+ import { colors, renderStatusLabel } from "./colors.js";
19
+ const c = { ...colors, renderStatusLabel };
20
+ const MAX_LOG_ENTRIES = 5;
21
+ const DEFAULT_PROMPT_COST_USD_PER_1K = 3 / 1000;
22
+ const DEFAULT_COMPLETION_COST_USD_PER_1K = 15 / 1000;
23
+ /* ────────────────────────────────────────────────────────────────── */
24
+ /* Dashboard — state holder + typed event fan-out */
25
+ /* ────────────────────────────────────────────────────────────────── */
26
+ export class Dashboard {
27
+ state;
28
+ subs = new Set();
29
+ /** Errors thrown by subscribers are counted but never propagate. */
30
+ subscriberErrors = 0;
31
+ /** Wall-clock anchor for elapsedTimeMs. */
32
+ runStartedAt = Date.now();
33
+ constructor(initial) {
34
+ this.state = {
35
+ runId: initial?.runId ?? `run-${Date.now().toString(36)}`,
36
+ activeTask: initial?.activeTask ?? "",
37
+ executionMode: initial?.executionMode ?? "BUILD",
38
+ activeAgent: initial?.activeAgent ?? "single-agent",
39
+ modelId: initial?.modelId ?? "auto",
40
+ status: initial?.status ?? "Idle",
41
+ elapsedTimeMs: 0,
42
+ tokensConsumed: 0,
43
+ estimatedCostUsd: 0,
44
+ progressPercent: -1,
45
+ activeTool: null,
46
+ logs: [],
47
+ };
48
+ }
49
+ /** Subscribe to the event stream. Returns an unsubscribe fn. */
50
+ subscribe(sub) {
51
+ this.subs.add(sub);
52
+ return () => {
53
+ this.subs.delete(sub);
54
+ };
55
+ }
56
+ /** Number of active subscribers. Useful for tests. */
57
+ subscriberCount() {
58
+ return this.subs.size;
59
+ }
60
+ /** Type-safe accessor for the current frame. */
61
+ snapshot() {
62
+ return { ...this.state, logs: [...this.state.logs] };
63
+ }
64
+ /** Wipe state and start a fresh run with the given task. */
65
+ reset(task, mode, modelId, agentName = "single-agent") {
66
+ this.runStartedAt = Date.now();
67
+ this.state = {
68
+ runId: `run-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`,
69
+ activeTask: task,
70
+ executionMode: mode,
71
+ activeAgent: agentName,
72
+ modelId,
73
+ status: "Starting",
74
+ elapsedTimeMs: 0,
75
+ tokensConsumed: 0,
76
+ estimatedCostUsd: 0,
77
+ progressPercent: -1,
78
+ activeTool: null,
79
+ logs: [],
80
+ };
81
+ this.notify({ type: "turn-start", turnIndex: 0, task });
82
+ }
83
+ /** Apply a typed event, mutating the state. Pure — never throws. */
84
+ emit(event) {
85
+ try {
86
+ switch (event.type) {
87
+ case "turn-start":
88
+ this.state.activeTask = event.task;
89
+ this.state.status = `Thinking (turn ${event.turnIndex + 1})`;
90
+ this.state.activeTool = null;
91
+ this.state.progressPercent = -1;
92
+ break;
93
+ case "tool-start":
94
+ this.state.activeTool = {
95
+ name: event.tool,
96
+ target: event.target,
97
+ state: "executing",
98
+ };
99
+ this.state.status = `Running ${event.tool}`;
100
+ this.pushLog(`${event.tool} → ${event.target}`);
101
+ break;
102
+ case "tool-finish":
103
+ if (this.state.activeTool &&
104
+ this.state.activeTool.name === event.tool) {
105
+ this.state.activeTool = { ...this.state.activeTool, state: event.state };
106
+ }
107
+ this.state.status = event.state === "failed" ? `Failed ${event.tool}` : `Idle`;
108
+ break;
109
+ case "log":
110
+ this.pushLog(`[${event.level}] ${event.message}`);
111
+ break;
112
+ case "tokens":
113
+ this.state.tokensConsumed = event.total;
114
+ this.state.estimatedCostUsd =
115
+ (event.prompt / 1000) * DEFAULT_PROMPT_COST_USD_PER_1K +
116
+ (event.completion / 1000) * DEFAULT_COMPLETION_COST_USD_PER_1K;
117
+ break;
118
+ case "status":
119
+ this.state.status = event.message;
120
+ break;
121
+ case "mode":
122
+ this.state.executionMode = event.mode;
123
+ break;
124
+ case "done":
125
+ this.state.status = event.success ? "Completed" : "Failed";
126
+ this.state.activeTool = null;
127
+ this.state.progressPercent = event.success ? 100 : this.state.progressPercent;
128
+ break;
129
+ }
130
+ this.state.elapsedTimeMs = Date.now() - this.runStartedAt;
131
+ }
132
+ catch {
133
+ // Defensive — never let a state-mutation error crash the agent.
134
+ }
135
+ this.notify(event);
136
+ }
137
+ /** Same as {@link emit} but synchronous and silent — for hot paths. */
138
+ emitSilent(event) {
139
+ this.emit(event);
140
+ }
141
+ pushLog(line) {
142
+ const sanitized = line.length > 200 ? `${line.slice(0, 197)}…` : line;
143
+ const next = [...this.state.logs, sanitized];
144
+ this.state.logs =
145
+ next.length > MAX_LOG_ENTRIES ? next.slice(next.length - MAX_LOG_ENTRIES) : next;
146
+ }
147
+ notify(event) {
148
+ for (const sub of this.subs) {
149
+ try {
150
+ sub.onEvent(event);
151
+ }
152
+ catch {
153
+ this.subscriberErrors += 1;
154
+ }
155
+ }
156
+ }
157
+ }
158
+ /** Process-wide default. All call sites emit to this instance. */
159
+ export const dashboard = new Dashboard();
160
+ /* ────────────────────────────────────────────────────────────────── */
161
+ /* AnsiRenderer — pure double-buffered screen math */
162
+ /* ────────────────────────────────────────────────────────────────── */
163
+ const HIDE_CURSOR = "\x1b[?25l";
164
+ const SHOW_CURSOR = "\x1b[?25h";
165
+ const SAVE_CURSOR = "\x1b[s";
166
+ const RESTORE_CURSOR = "\x1b[u";
167
+ const CURSOR_HOME = "\x1b[H";
168
+ const CLEAR_DOWN = "\x1b[J";
169
+ const CLEAR_LINE = "\x1b[K";
170
+ const RESET = "\x1b[0m";
171
+ /** Pick the active render mode based on TTY + terminal size. */
172
+ export function selectRenderMode(isTTY, columns, rows) {
173
+ if (!isTTY)
174
+ return "off";
175
+ if (columns < 80 || rows < 24)
176
+ return "single-line";
177
+ return "dashboard";
178
+ }
179
+ function pad(line, width) {
180
+ const visible = stripAnsi(line).length;
181
+ if (visible >= width)
182
+ return line;
183
+ return line + " ".repeat(width - visible);
184
+ }
185
+ function stripAnsi(s) {
186
+ return s.replace(/\x1b\[[0-9;?]*[A-Za-z]/g, "");
187
+ }
188
+ function shortStatus(s, max) {
189
+ return s.length <= max ? s : `${s.slice(0, max - 1)}…`;
190
+ }
191
+ function fmtMs(ms) {
192
+ if (ms < 1000)
193
+ return `${ms}ms`;
194
+ const s = ms / 1000;
195
+ if (s < 60)
196
+ return `${s.toFixed(1)}s`;
197
+ const m = Math.floor(s / 60);
198
+ const r = Math.floor(s - m * 60);
199
+ return `${m}m${r}s`;
200
+ }
201
+ function fmtUsd(usd) {
202
+ if (usd < 0.01)
203
+ return `$${usd.toFixed(4)}`;
204
+ return `$${usd.toFixed(2)}`;
205
+ }
206
+ export class AnsiRenderer {
207
+ isTTY;
208
+ columns;
209
+ rows;
210
+ mode = "off";
211
+ lastRenderedHeight = 0;
212
+ lastEventLine = "";
213
+ mounted = false;
214
+ exitHandlers = [];
215
+ constructor(isTTY = () => Boolean(process.stdout.isTTY), columns = () => process.stdout.columns ?? 80, rows = () => process.stdout.rows ?? 24) {
216
+ this.isTTY = isTTY;
217
+ this.columns = columns;
218
+ this.rows = rows;
219
+ }
220
+ setMode(mode) {
221
+ if (this.mode === mode)
222
+ return;
223
+ // Wipe any prior dashboard surface so the new mode starts clean.
224
+ this.wipePrevious();
225
+ this.mode = mode;
226
+ }
227
+ getMode() {
228
+ return this.mode;
229
+ }
230
+ /** Draw a single frame from the given dashboard state. */
231
+ render(state) {
232
+ this.mode = selectRenderMode(this.isTTY(), this.columns(), this.rows());
233
+ if (this.mode === "off") {
234
+ // Emit nothing — stdout is being captured (CI, tests, pipes).
235
+ this.lastRenderedHeight = 0;
236
+ return;
237
+ }
238
+ if (this.mode === "single-line") {
239
+ this.renderSingleLine(state);
240
+ return;
241
+ }
242
+ this.renderDashboard(state);
243
+ }
244
+ /** Render a transient event line (e.g. tool call progress) without
245
+ * re-painting the full dashboard. */
246
+ renderEventLine(line) {
247
+ if (this.mode === "off" || !this.isTTY())
248
+ return;
249
+ const trimmed = shortStatus(stripAnsi(line).replace(/\n/g, " ⏎ "), 200);
250
+ this.lastEventLine = trimmed;
251
+ if (this.mode === "single-line") {
252
+ this.write(`${HIDE_CURSOR}${SAVE_CURSOR}${trimmed}${RESET}${RESTORE_CURSOR}${SHOW_CURSOR}`);
253
+ }
254
+ }
255
+ /** Mount: install exit hooks that restore the cursor. Idempotent. */
256
+ mount() {
257
+ if (this.mounted)
258
+ return;
259
+ this.mounted = true;
260
+ const restore = () => {
261
+ try {
262
+ process.stdout.write(`${SHOW_CURSOR}${RESET}`);
263
+ }
264
+ catch {
265
+ // ignore — process may already be tearing down
266
+ }
267
+ };
268
+ this.exitHandlers.push(restore);
269
+ process.on("exit", restore);
270
+ process.on("SIGINT", () => {
271
+ restore();
272
+ process.exit(130);
273
+ });
274
+ process.on("SIGTERM", () => {
275
+ restore();
276
+ process.exit(143);
277
+ });
278
+ }
279
+ /** Unmount: remove the exit hooks we installed and reset the
280
+ * `mounted` flag. Idempotent — safe to call twice. Primarily
281
+ * useful in tests so process.on() listeners don't pile up. */
282
+ unmount() {
283
+ if (!this.mounted)
284
+ return;
285
+ this.mounted = false;
286
+ for (const handler of this.exitHandlers) {
287
+ process.removeListener("exit", handler);
288
+ }
289
+ this.exitHandlers.length = 0;
290
+ }
291
+ /** Force-clear whatever was previously painted (e.g. on shutdown). */
292
+ wipePrevious() {
293
+ if (this.lastRenderedHeight === 0 || !this.isTTY())
294
+ return;
295
+ const out = [SAVE_CURSOR];
296
+ for (let i = 0; i < this.lastRenderedHeight; i++) {
297
+ out.push("\x1b[1A", CLEAR_LINE);
298
+ }
299
+ out.push(RESTORE_CURSOR, SHOW_CURSOR);
300
+ this.write(out.join(""));
301
+ this.lastRenderedHeight = 0;
302
+ }
303
+ /* ── private renderers ──────────────────────────────────────── */
304
+ renderSingleLine(state) {
305
+ const tool = state.activeTool
306
+ ? `[${state.activeTool.name}:${state.activeTool.state}] ${state.activeTool.target}`
307
+ : "—";
308
+ const tokens = state.tokensConsumed > 0 ? `${state.tokensConsumed} tok` : "—";
309
+ const line = `${colors.cyan}[${state.executionMode}]${RESET} ` +
310
+ `${colors.bold}${shortStatus(state.activeTask, 60)}${RESET} ` +
311
+ `${colors.dim}${state.modelId}${RESET} · ${state.status} · ${tool} · ` +
312
+ `${tokens} · ${fmtMs(state.elapsedTimeMs)}`;
313
+ this.write(`${SAVE_CURSOR}${CLEAR_LINE}${line}${RESET}${RESTORE_CURSOR}`);
314
+ this.lastRenderedHeight = 1;
315
+ }
316
+ renderDashboard(state) {
317
+ const cols = Math.max(80, this.columns());
318
+ const width = Math.min(cols, 110);
319
+ const inner = width - 2; // for the two box characters
320
+ const out = [];
321
+ out.push(HIDE_CURSOR, SAVE_CURSOR, CURSOR_HOME, CLEAR_DOWN);
322
+ out.push(this.box(width, "─", "─", "─"));
323
+ out.push(`${colors.cyan}│${RESET}` +
324
+ ` ${this.modeBadge(state.executionMode)} ` +
325
+ `${colors.bold}${shortStatus(state.activeTask, inner - 30)}${RESET}` +
326
+ ` ${colors.dim}· run ${state.runId.slice(-8)} · ${state.modelId}${RESET}` +
327
+ `${" ".repeat(Math.max(0, inner - 50 - state.activeTask.length))}` +
328
+ `${colors.cyan}│${RESET}\n`);
329
+ out.push(this.box(width, "─", "─", "─"));
330
+ // Diagnostic metrics
331
+ out.push(`${colors.cyan}│${RESET} ${colors.dim}tokens${RESET} ${bold(String(state.tokensConsumed))}` +
332
+ ` ${colors.dim}cost${RESET} ${bold(fmtUsd(state.estimatedCostUsd))}` +
333
+ ` ${colors.dim}elapsed${RESET} ${bold(fmtMs(state.elapsedTimeMs))}` +
334
+ ` ${colors.dim}progress${RESET} ${bold(this.progressLabel(state.progressPercent))}` +
335
+ `${" ".repeat(Math.max(0, inner - 65))}` +
336
+ `${colors.cyan}│${RESET}\n`);
337
+ // Action stream (single dynamic spinner line)
338
+ const tool = state.activeTool;
339
+ const actionText = tool
340
+ ? `${spinnerFor(tool.state)} ${colors.cyan}[${tool.name.toUpperCase()}]${RESET} ` +
341
+ `${shortStatus(tool.target, inner - 24)} ${colors.dim}(${tool.state})${RESET}`
342
+ : `${colors.dim}${spinnerFor("thinking")} ${state.status}${RESET}`;
343
+ out.push(`${colors.cyan}│${RESET} ${actionText}` +
344
+ `${" ".repeat(Math.max(0, inner - stripAnsi(actionText).length - 2))}` +
345
+ `${colors.cyan}│${RESET}\n`);
346
+ out.push(this.box(width, "─", "─", "─"));
347
+ // Recent events box (5 entries)
348
+ out.push(`${colors.cyan}│${RESET} ${colors.dim}Recent events${RESET}` +
349
+ `${" ".repeat(Math.max(0, inner - 15))}` +
350
+ `${colors.cyan}│${RESET}\n`);
351
+ const logs = state.logs;
352
+ for (let i = 0; i < MAX_LOG_ENTRIES; i++) {
353
+ const line = logs[i] ?? "";
354
+ out.push(`${colors.cyan}│${RESET} ${pad(line ? `${colors.dim}•${RESET} ${shortStatus(line, inner - 4)}` : "", inner - 2)} ${colors.cyan}│${RESET}\n`);
355
+ }
356
+ out.push(this.box(width, "─", "─", "─"));
357
+ out.push(RESTORE_CURSOR, SHOW_CURSOR);
358
+ this.write(out.join(""));
359
+ this.lastRenderedHeight = 7 + MAX_LOG_ENTRIES;
360
+ }
361
+ modeBadge(mode) {
362
+ return mode === "BUILD"
363
+ ? `${colors.bgCyan}${colors.bold} ${mode} ${RESET}`
364
+ : `${colors.bgLiquidLava}${colors.bold} ${mode} ${RESET}`;
365
+ }
366
+ progressLabel(p) {
367
+ if (p < 0)
368
+ return "—";
369
+ if (p > 100)
370
+ return "100%";
371
+ return `${p}%`;
372
+ }
373
+ box(width, _l, _m, _r) {
374
+ return `${colors.cyan}┌${"─".repeat(width - 2)}┐${RESET}\n`;
375
+ }
376
+ write(buf) {
377
+ try {
378
+ process.stdout.write(buf);
379
+ }
380
+ catch {
381
+ // pipe closed mid-write — nothing we can do
382
+ }
383
+ }
384
+ }
385
+ function bold(s) {
386
+ return `${colors.bold}${s}${RESET}`;
387
+ }
388
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
389
+ let spinnerTick = 0;
390
+ function spinnerFor(state) {
391
+ spinnerTick = (spinnerTick + 1) % SPINNER_FRAMES.length;
392
+ const frame = SPINNER_FRAMES[spinnerTick] ?? "*";
393
+ switch (state) {
394
+ case "executing":
395
+ return `${colors.cyan}${frame}${RESET}`;
396
+ case "completed":
397
+ return `${colors.green}✓${RESET}`;
398
+ case "failed":
399
+ return `${colors.red}✗${RESET}`;
400
+ case "thinking":
401
+ default:
402
+ return `${colors.dim}${frame}${RESET}`;
403
+ }
404
+ }
405
+ /* ────────────────────────────────────────────────────────────────── */
406
+ /* Default renderer instance + auto-mount */
407
+ /* ────────────────────────────────────────────────────────────────── */
408
+ export const renderer = new AnsiRenderer();
409
+ renderer.mount();
410
+ /* ────────────────────────────────────────────────────────────────── */
411
+ /* Backwards-compatible exports (originals preserved verbatim) */
412
+ /* ────────────────────────────────────────────────────────────────── */
413
+ export const COMMANDS_WITH_DESC = [
414
+ // Core
415
+ { cmd: '/help', desc: 'Show all commands and usage' },
416
+ { cmd: '/exit', desc: 'Exit FixO CLI (alias: /quit)' },
417
+ // Model & Providers
418
+ { cmd: '/model', desc: 'Interactive model picker or set model' },
419
+ { cmd: '/providers', desc: 'Manage AI provider API keys (add/list/remove/test)' },
420
+ // Files & Context
421
+ { cmd: '/select', desc: 'Pin a file for agent context' },
422
+ { cmd: '/unselect', desc: 'Clear all pinned files' },
423
+ { cmd: '/index', desc: 'Build the local repo index' },
424
+ { cmd: '/find', desc: 'Search the repo index' },
425
+ { cmd: '/explain', desc: 'Explain a file or symbol from index' },
426
+ // Conversation
427
+ { cmd: '/clear', desc: 'Clear conversation history' },
428
+ { cmd: '/compact', desc: 'Summarise & compress conversation (frees context tokens)' },
429
+ { cmd: '/stats', desc: 'Show session token usage statistics' },
430
+ { cmd: '/session', desc: 'Manage sessions: list | load <uuid> | new' },
431
+ { cmd: '/todo', desc: 'Manage todo list: list | add <text> | done <id> | remove <id> | clear' },
432
+ { cmd: '/mcp', desc: 'Manage MCP servers: list | add <name> <cmd> [args] | remove <name> | test <name>' },
433
+ // Agent modes & plans
434
+ { cmd: '/mode', desc: 'Toggle or set PLAN / BUILD execution mode' },
435
+ { cmd: '/plan', desc: 'Generate a task execution plan' },
436
+ { cmd: '/run-plan', desc: 'Execute the last generated plan' },
437
+ // Git
438
+ { cmd: '/diff', desc: 'Show git diff of workspace' },
439
+ { cmd: '/undo', desc: 'Undo last AI change' },
440
+ { cmd: '/log', desc: 'Show recent git commits' },
441
+ { cmd: '/snapshot', desc: 'Create a named git snapshot' },
442
+ // Quality & review
443
+ { cmd: '/review', desc: 'Review the current workspace diff' },
444
+ { cmd: '/test', desc: 'Run detected project checks' },
445
+ { cmd: '/fix-tests', desc: 'Run tests and auto-fix failures' },
446
+ { cmd: '/fix-ci', desc: 'Fix CI failures (paste logs)' },
447
+ // Runs & memory
448
+ { cmd: '/runs', desc: 'List task run ledgers' },
449
+ { cmd: '/show-run', desc: 'Show details of a specific run' },
450
+ { cmd: '/memory', desc: 'Show project memory facts' },
451
+ { cmd: '/remember', desc: 'Add a project fact to memory' },
452
+ { cmd: '/forget', desc: 'Clear all project memory' },
453
+ // Tools & skills
454
+ { cmd: '/skills', desc: 'List all registered skill profiles' },
455
+ { cmd: '/doctor', desc: 'Run FixO diagnostics / doctor checks' },
456
+ // Privacy
457
+ { cmd: '/telemetry', desc: 'Toggle telemetry on/off or view status' },
458
+ // Theme
459
+ { cmd: '/theme', desc: 'Toggle Dark Void / Inverted theme' },
460
+ { cmd: '/variant', desc: 'Toggle theme color variant' },
461
+ ];
462
+ export function printHelp() {
463
+ const w = 72;
464
+ const line = (cmd, args, desc) => {
465
+ const left = ` ${c.cyan}${cmd}${c.reset} ${c.dim}${args}${c.reset}`;
466
+ const stripped = ` ${cmd} ${args}`;
467
+ const pad = Math.max(1, 32 - stripped.length);
468
+ console.log(`${left}${' '.repeat(pad)}${desc}`);
469
+ };
470
+ console.log('');
471
+ console.log(`${c.bold}${c.cyan}FixO CLI — All Commands${c.reset}`);
472
+ console.log(`${c.dim}${'─'.repeat(w)}${c.reset}`);
473
+ console.log(`\n${c.snow}${c.bold}🤖 Model & Providers${c.reset}`);
474
+ line('/model', '[name|list]', 'Interactive model picker, or set model by name');
475
+ line('/providers', '<sub-command>', 'Manage provider API keys: list | add <name> | remove <name> | test <name>');
476
+ console.log(`\n${c.snow}${c.bold}📂 Files & Context${c.reset}`);
477
+ line('/select', '[file]', 'Pin a file for focused agent context');
478
+ line('/unselect', '', 'Clear all pinned files');
479
+ line('/index', '', 'Build / refresh the local repo index');
480
+ line('/find', '<query>', 'Search the repo index for symbols or files');
481
+ line('/explain', '<target>', 'Explain a file, symbol, or function from the index');
482
+ console.log(`\n${c.snow}${c.bold}💬 Conversation${c.reset}`);
483
+ line('/clear', '', 'Clear conversation history');
484
+ line('/compact', '', 'Summarise & compress conversation (frees context tokens)');
485
+ line('/stats', '', 'Show session token usage and cost savings');
486
+ line('/session', '<sub-command>', 'Manage sessions: list | load <uuid> | new');
487
+ console.log(`\n${c.snow}${c.bold}⚙️ Agent Modes & Plans${c.reset}`);
488
+ line('/mode', '[PLAN|BUILD]', 'Toggle or set execution mode (PLAN = read-only, BUILD = write)');
489
+ line('/plan', '<task>', 'Generate a structured multi-phase execution plan');
490
+ line('/run-plan', '', 'Execute the last saved plan via the Agent Pool');
491
+ console.log(`\n${c.snow}${c.bold}🌳 Git Operations${c.reset}`);
492
+ line('/diff', '', 'Show git diff of the workspace');
493
+ line('/undo', '', 'Undo the last FixO auto-committed change');
494
+ line('/log', '', 'Show recent git commits');
495
+ line('/snapshot', '[label]', 'Create a named git snapshot commit of current workspace');
496
+ console.log(`\n${c.snow}${c.bold}🔍 Quality & Review${c.reset}`);
497
+ line('/review', '', 'Review the current diff for issues');
498
+ line('/test', '', 'Run detected project tests');
499
+ line('/fix-tests', '', 'Run tests and automatically fix failures');
500
+ line('/fix-ci', '', 'Fix CI failures (paste CI logs into the task)');
501
+ console.log(`\n${c.snow}${c.bold}📋 Runs & Memory${c.reset}`);
502
+ line('/runs', '', 'List all recorded task run ledgers');
503
+ line('/show-run', '<id>', 'Show details of a specific run');
504
+ line('/memory', '', 'Show all project memory facts');
505
+ line('/remember', '<fact>', 'Add a project fact to persistent memory');
506
+ line('/forget', '', 'Clear all project memory');
507
+ console.log(`\n${c.snow}${c.bold}🛠 Tools & Skills${c.reset}`);
508
+ line('/skills', '', 'List all registered and auto-detected skill profiles');
509
+ line('/doctor', '', 'Run FixO diagnostics and troubleshooting checks');
510
+ console.log(`\n${c.snow}${c.bold}🔒 Privacy${c.reset}`);
511
+ line('/telemetry', '<on|off>', 'View or toggle telemetry collection');
512
+ console.log(`\n${c.snow}${c.bold}🎨 Theme${c.reset}`);
513
+ line('/theme', '', 'Toggle Dark Void Minimalist / High-Contrast Inverted theme');
514
+ line('/variant', '', 'Toggle theme color variant');
515
+ console.log(`\n${c.snow}${c.bold}🚪 Exit${c.reset}`);
516
+ line('/exit', '', 'Exit FixO CLI cleanly (alias: /quit)');
517
+ console.log(`\n${c.dim}${'─'.repeat(w)}${c.reset}`);
518
+ console.log(`${c.dim} Shell commands prefix with ! e.g. !npm test, !ls -la${c.reset}`);
519
+ console.log(`${c.dim} Autocomplete type / for commands, @ for files & agents${c.reset}`);
520
+ console.log(`${c.dim} Mode toggle press [TAB] on an empty line to switch PLAN ↔ BUILD${c.reset}`);
521
+ console.log('');
522
+ }
523
+ export function buildPromptString(cwd, model, branch) {
524
+ const dirName = path.basename(cwd);
525
+ const dirLabel = c.renderStatusLabel(`📂 ${dirName}`);
526
+ const branchLabel = branch ? ` ${c.renderStatusLabel(`🌳 ${branch}`)}` : '';
527
+ const modelLabel = ` ${c.renderStatusLabel(`🤖 ${model}`)}`;
528
+ return `\n${dirLabel}${branchLabel}${modelLabel}\n${c.cyan}❯${c.reset} `;
529
+ }
530
+ export function formatInputPaths(input, cwd) {
531
+ const commands = COMMANDS_WITH_DESC.map((item) => item.cmd);
532
+ return input.replace(/(?:\/[\w.-]+)+/g, (match) => {
533
+ if (match.startsWith('/')) {
534
+ const commandName = match.split(/\s+/)[0];
535
+ if (commands.includes(commandName) || commandName.length <= 4) {
536
+ return match;
537
+ }
538
+ }
539
+ const resolved = path.isAbsolute(match) ? match : path.resolve(cwd, match);
540
+ if (fs.existsSync(resolved)) {
541
+ const basename = path.basename(match);
542
+ return `${c.cyan}${c.bold}${basename}${c.reset}`;
543
+ }
544
+ return match;
545
+ });
546
+ }
547
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * session-header.ts — The boxed session summary rendered once
3
+ * when a session starts or is resumed.
4
+ *
5
+ * The header uses the lava top/bottom border and a SNOW4 side
6
+ * border so it sits inside the same visual family as the AI
7
+ * response frame and the plan renderer.
8
+ */
9
+ export interface SessionHeaderOptions {
10
+ /** `New session` / `Resumed session` / `Imported session`. */
11
+ status: 'new' | 'resumed' | 'imported';
12
+ /** ISO-8601 timestamp. */
13
+ startedAt: string;
14
+ /** Provider display name (`Google (Gemini)`). */
15
+ provider: string;
16
+ /** Model id (`gemini-2.5-flash`). */
17
+ model: string;
18
+ /** `BUILD` / `PLAN` / `REVIEW`. */
19
+ mode: 'BUILD' | 'PLAN' | 'REVIEW';
20
+ /** `auto` / `single` / `multi`. */
21
+ routing: 'auto' | 'single' | 'multi';
22
+ /** Context window, e.g. `200k`. */
23
+ contextWindow: string;
24
+ }
25
+ /**
26
+ * Print the session header box. The box width is `columns - 4`,
27
+ * capped at 100. Safe to call on a non-TTY.
28
+ */
29
+ export declare function renderSessionHeader(opts: SessionHeaderOptions): void;
30
+ //# sourceMappingURL=session-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-header.d.ts","sourceRoot":"","sources":["../../src/ui/session-header.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,MAAM,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IACvC,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,mCAAmC;IACnC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAC;CACvB;AA4BD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI,CAmBpE"}