open-multi-agent-kit 0.95.1 → 0.95.2

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 (279) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +1 -1
  3. package/dist/approvals/approval-receipt-store.d.ts +18 -0
  4. package/dist/approvals/approval-receipt-store.d.ts.map +1 -0
  5. package/dist/approvals/approval-receipt-store.js +169 -0
  6. package/dist/approvals/approval-receipt-store.js.map +1 -0
  7. package/dist/approvals/approval-receipt.d.ts +43 -0
  8. package/dist/approvals/approval-receipt.d.ts.map +1 -0
  9. package/dist/approvals/approval-receipt.js +208 -0
  10. package/dist/approvals/approval-receipt.js.map +1 -0
  11. package/dist/approvals/approval-verifier.d.ts +17 -0
  12. package/dist/approvals/approval-verifier.d.ts.map +1 -0
  13. package/dist/approvals/approval-verifier.js +23 -0
  14. package/dist/approvals/approval-verifier.js.map +1 -0
  15. package/dist/approvals/plannotator-approval-bridge.d.ts +58 -0
  16. package/dist/approvals/plannotator-approval-bridge.d.ts.map +1 -0
  17. package/dist/approvals/plannotator-approval-bridge.js +169 -0
  18. package/dist/approvals/plannotator-approval-bridge.js.map +1 -0
  19. package/dist/cli/args.d.ts.map +1 -1
  20. package/dist/cli/args.js +2 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/commands/package-doctor-cli.d.ts +13 -0
  23. package/dist/commands/package-doctor-cli.d.ts.map +1 -0
  24. package/dist/commands/package-doctor-cli.js +80 -0
  25. package/dist/commands/package-doctor-cli.js.map +1 -0
  26. package/dist/commands/router-feedback-cli.d.ts +11 -0
  27. package/dist/commands/router-feedback-cli.d.ts.map +1 -0
  28. package/dist/commands/router-feedback-cli.js +99 -0
  29. package/dist/commands/router-feedback-cli.js.map +1 -0
  30. package/dist/commands/stats-cli.d.ts +20 -0
  31. package/dist/commands/stats-cli.d.ts.map +1 -0
  32. package/dist/commands/stats-cli.js +99 -0
  33. package/dist/commands/stats-cli.js.map +1 -0
  34. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  35. package/dist/core/agent-session-runtime.js +4 -1
  36. package/dist/core/agent-session-runtime.js.map +1 -1
  37. package/dist/core/agent-session.d.ts +97 -29
  38. package/dist/core/agent-session.d.ts.map +1 -1
  39. package/dist/core/agent-session.js +583 -199
  40. package/dist/core/agent-session.js.map +1 -1
  41. package/dist/core/bash-executor.d.ts.map +1 -1
  42. package/dist/core/bash-executor.js +8 -2
  43. package/dist/core/bash-executor.js.map +1 -1
  44. package/dist/core/compaction/transaction.d.ts +9 -0
  45. package/dist/core/compaction/transaction.d.ts.map +1 -1
  46. package/dist/core/compaction/transaction.js +17 -2
  47. package/dist/core/compaction/transaction.js.map +1 -1
  48. package/dist/core/context-budget-compressors.d.ts +50 -0
  49. package/dist/core/context-budget-compressors.d.ts.map +1 -0
  50. package/dist/core/context-budget-compressors.js +166 -0
  51. package/dist/core/context-budget-compressors.js.map +1 -0
  52. package/dist/core/context-budget-governor-v2.d.ts +1 -1
  53. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  54. package/dist/core/context-budget-governor-v2.js +1 -1
  55. package/dist/core/context-budget-governor-v2.js.map +1 -1
  56. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  57. package/dist/core/context-budget-system-prompt.js +18 -2
  58. package/dist/core/context-budget-system-prompt.js.map +1 -1
  59. package/dist/core/context-budget-v2-cache-disk.d.ts +109 -0
  60. package/dist/core/context-budget-v2-cache-disk.d.ts.map +1 -0
  61. package/dist/core/context-budget-v2-cache-disk.js +343 -0
  62. package/dist/core/context-budget-v2-cache-disk.js.map +1 -0
  63. package/dist/core/context-budget-v2-cache-keys.d.ts +22 -0
  64. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -1
  65. package/dist/core/context-budget-v2-cache-keys.js +4 -4
  66. package/dist/core/context-budget-v2-cache-keys.js.map +1 -1
  67. package/dist/core/context-budget-v2-cache.d.ts +1 -0
  68. package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
  69. package/dist/core/context-budget-v2-cache.js +1 -0
  70. package/dist/core/context-budget-v2-cache.js.map +1 -1
  71. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  72. package/dist/core/context-budget-v2-planner.js +17 -14
  73. package/dist/core/context-budget-v2-planner.js.map +1 -1
  74. package/dist/core/context-budget-v2-types.d.ts +1 -0
  75. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  76. package/dist/core/context-budget-v2-types.js.map +1 -1
  77. package/dist/core/extensions/loader.d.ts.map +1 -1
  78. package/dist/core/extensions/loader.js +45 -22
  79. package/dist/core/extensions/loader.js.bak-sharedjiti-20260812-111246 +553 -0
  80. package/dist/core/extensions/loader.js.map +1 -1
  81. package/dist/core/extensions/types.d.ts +4 -0
  82. package/dist/core/extensions/types.d.ts.map +1 -1
  83. package/dist/core/extensions/types.js.map +1 -1
  84. package/dist/core/mcp/client.d.ts +105 -0
  85. package/dist/core/mcp/client.d.ts.map +1 -0
  86. package/dist/core/mcp/client.js +198 -0
  87. package/dist/core/mcp/client.js.map +1 -0
  88. package/dist/core/mcp/config.d.ts +23 -0
  89. package/dist/core/mcp/config.d.ts.map +1 -0
  90. package/dist/core/mcp/config.js +89 -0
  91. package/dist/core/mcp/config.js.map +1 -0
  92. package/dist/core/mcp/index.d.ts +15 -0
  93. package/dist/core/mcp/index.d.ts.map +1 -0
  94. package/dist/core/mcp/index.js +15 -0
  95. package/dist/core/mcp/index.js.map +1 -0
  96. package/dist/core/mcp/manager.d.ts +84 -0
  97. package/dist/core/mcp/manager.d.ts.map +1 -0
  98. package/dist/core/mcp/manager.js +173 -0
  99. package/dist/core/mcp/manager.js.map +1 -0
  100. package/dist/core/mcp/protocol.d.ts +59 -0
  101. package/dist/core/mcp/protocol.d.ts.map +1 -0
  102. package/dist/core/mcp/protocol.js +103 -0
  103. package/dist/core/mcp/protocol.js.map +1 -0
  104. package/dist/core/mcp/stdio-transport.d.ts +63 -0
  105. package/dist/core/mcp/stdio-transport.d.ts.map +1 -0
  106. package/dist/core/mcp/stdio-transport.js +132 -0
  107. package/dist/core/mcp/stdio-transport.js.map +1 -0
  108. package/dist/core/mcp/tools.d.ts +47 -0
  109. package/dist/core/mcp/tools.d.ts.map +1 -0
  110. package/dist/core/mcp/tools.js +102 -0
  111. package/dist/core/mcp/tools.js.map +1 -0
  112. package/dist/core/package-archive.d.ts +3 -0
  113. package/dist/core/package-archive.d.ts.map +1 -0
  114. package/dist/core/package-archive.js +161 -0
  115. package/dist/core/package-archive.js.map +1 -0
  116. package/dist/core/package-doctor-source-scan.d.ts +13 -0
  117. package/dist/core/package-doctor-source-scan.d.ts.map +1 -0
  118. package/dist/core/package-doctor-source-scan.js +124 -0
  119. package/dist/core/package-doctor-source-scan.js.map +1 -0
  120. package/dist/core/package-doctor.d.ts +41 -0
  121. package/dist/core/package-doctor.d.ts.map +1 -0
  122. package/dist/core/package-doctor.js +145 -0
  123. package/dist/core/package-doctor.js.map +1 -0
  124. package/dist/core/package-manager.d.ts +10 -1
  125. package/dist/core/package-manager.d.ts.map +1 -1
  126. package/dist/core/package-manager.js +175 -42
  127. package/dist/core/package-manager.js.map +1 -1
  128. package/dist/core/package-manifest.d.ts +26 -0
  129. package/dist/core/package-manifest.d.ts.map +1 -0
  130. package/dist/core/package-manifest.js +85 -0
  131. package/dist/core/package-manifest.js.map +1 -0
  132. package/dist/core/pi-compat.d.ts +5 -0
  133. package/dist/core/pi-compat.d.ts.map +1 -0
  134. package/dist/core/pi-compat.js +18 -0
  135. package/dist/core/pi-compat.js.map +1 -0
  136. package/dist/core/reasoning-router-bias.d.ts +10 -14
  137. package/dist/core/reasoning-router-bias.d.ts.map +1 -1
  138. package/dist/core/reasoning-router-bias.js +22 -15
  139. package/dist/core/reasoning-router-bias.js.map +1 -1
  140. package/dist/core/reasoning-router-v4.d.ts +9 -1
  141. package/dist/core/reasoning-router-v4.d.ts.map +1 -1
  142. package/dist/core/reasoning-router-v4.js +20 -5
  143. package/dist/core/reasoning-router-v4.js.map +1 -1
  144. package/dist/core/redaction.d.ts +2 -5
  145. package/dist/core/redaction.d.ts.map +1 -1
  146. package/dist/core/redaction.js +14 -1
  147. package/dist/core/redaction.js.map +1 -1
  148. package/dist/core/repository-learning-scope.d.ts +10 -0
  149. package/dist/core/repository-learning-scope.d.ts.map +1 -0
  150. package/dist/core/repository-learning-scope.js +42 -0
  151. package/dist/core/repository-learning-scope.js.map +1 -0
  152. package/dist/core/resource-loader.d.ts.map +1 -1
  153. package/dist/core/resource-loader.js +16 -1
  154. package/dist/core/resource-loader.js.map +1 -1
  155. package/dist/core/router-feedback-collector.d.ts +2 -1
  156. package/dist/core/router-feedback-collector.d.ts.map +1 -1
  157. package/dist/core/router-feedback-collector.js +2 -2
  158. package/dist/core/router-feedback-collector.js.map +1 -1
  159. package/dist/core/runtime-provenance.d.ts +54 -0
  160. package/dist/core/runtime-provenance.d.ts.map +1 -0
  161. package/dist/core/runtime-provenance.js +115 -0
  162. package/dist/core/runtime-provenance.js.map +1 -0
  163. package/dist/core/sandbox/backend.d.ts.map +1 -1
  164. package/dist/core/sandbox/backend.js +39 -21
  165. package/dist/core/sandbox/backend.js.map +1 -1
  166. package/dist/core/sandbox/default-policy.d.ts +4 -5
  167. package/dist/core/sandbox/default-policy.d.ts.map +1 -1
  168. package/dist/core/sandbox/default-policy.js +9 -11
  169. package/dist/core/sandbox/default-policy.js.map +1 -1
  170. package/dist/core/session-bash-runtime.d.ts +4 -4
  171. package/dist/core/session-bash-runtime.d.ts.map +1 -1
  172. package/dist/core/session-bash-runtime.js +6 -5
  173. package/dist/core/session-bash-runtime.js.map +1 -1
  174. package/dist/core/session-compaction-service.d.ts.map +1 -1
  175. package/dist/core/session-compaction-service.js +7 -7
  176. package/dist/core/session-compaction-service.js.map +1 -1
  177. package/dist/core/session-manager.d.ts +4 -1
  178. package/dist/core/session-manager.d.ts.map +1 -1
  179. package/dist/core/session-manager.js +47 -7
  180. package/dist/core/session-manager.js.map +1 -1
  181. package/dist/core/settings-manager.d.ts +7 -4
  182. package/dist/core/settings-manager.d.ts.map +1 -1
  183. package/dist/core/settings-manager.js +11 -3
  184. package/dist/core/settings-manager.js.map +1 -1
  185. package/dist/core/system-prompt.d.ts +9 -1
  186. package/dist/core/system-prompt.d.ts.map +1 -1
  187. package/dist/core/system-prompt.js +10 -4
  188. package/dist/core/system-prompt.js.map +1 -1
  189. package/dist/core/tools/bash.d.ts +2 -2
  190. package/dist/core/tools/bash.d.ts.map +1 -1
  191. package/dist/core/tools/bash.js +2 -1
  192. package/dist/core/tools/bash.js.map +1 -1
  193. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  194. package/dist/core/tools/tool-definition-wrapper.js +15 -0
  195. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  196. package/dist/core/turn-metrics.d.ts +135 -0
  197. package/dist/core/turn-metrics.d.ts.map +1 -0
  198. package/dist/core/turn-metrics.js +261 -0
  199. package/dist/core/turn-metrics.js.map +1 -0
  200. package/dist/core/verified-bash-runtime.d.ts.map +1 -1
  201. package/dist/core/verified-bash-runtime.js +10 -4
  202. package/dist/core/verified-bash-runtime.js.map +1 -1
  203. package/dist/guardrails/replay-ledger-lock-owner.d.ts +7 -0
  204. package/dist/guardrails/replay-ledger-lock-owner.d.ts.map +1 -1
  205. package/dist/guardrails/replay-ledger-lock-owner.js +39 -0
  206. package/dist/guardrails/replay-ledger-lock-owner.js.map +1 -1
  207. package/dist/index.d.ts +6 -1
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +6 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/main.d.ts.map +1 -1
  212. package/dist/main.js +18 -0
  213. package/dist/main.js.map +1 -1
  214. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/control-panel-layout.js +2 -2
  216. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  217. package/dist/modes/interactive/components/footer.d.ts +3 -0
  218. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/footer.js +40 -12
  220. package/dist/modes/interactive/components/footer.js.map +1 -1
  221. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  222. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  223. package/dist/modes/interactive/components/settings-selector.js +10 -0
  224. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  225. package/dist/modes/interactive/components/status-sidebar.d.ts +14 -2
  226. package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
  227. package/dist/modes/interactive/components/status-sidebar.js +106 -19
  228. package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
  229. package/dist/modes/interactive/interactive-mode.d.ts +10 -1
  230. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  231. package/dist/modes/interactive/interactive-mode.js +104 -17
  232. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  233. package/dist/modes/interactive/theme/dark.json +1 -1
  234. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  235. package/dist/modes/interactive/theme/theme.js +1 -0
  236. package/dist/modes/interactive/theme/theme.js.map +1 -1
  237. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  238. package/dist/modes/rpc/rpc-mode.js +1 -1
  239. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  240. package/docs/compaction.md +25 -3
  241. package/docs/containerization.md +14 -2
  242. package/docs/docs.json +8 -0
  243. package/docs/environment-variables.md +1 -1
  244. package/docs/extensions.md +75 -16
  245. package/docs/mcp.md +97 -0
  246. package/docs/metrics.md +87 -0
  247. package/docs/packages.md +25 -4
  248. package/docs/providers.md +1 -1
  249. package/docs/sdk.md +25 -4
  250. package/docs/settings.md +8 -7
  251. package/docs/usage.md +13 -3
  252. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  253. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  254. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  255. package/examples/extensions/gondolin/package-lock.json +2 -2
  256. package/examples/extensions/gondolin/package.json +1 -1
  257. package/examples/extensions/plannotator-approval-bridge.ts +83 -0
  258. package/examples/extensions/sandbox/package-lock.json +2 -2
  259. package/examples/extensions/sandbox/package.json +1 -1
  260. package/examples/extensions/subagent/README.md +21 -11
  261. package/examples/extensions/subagent/adaptive-agent-runtime.ts +9 -3
  262. package/examples/extensions/subagent/agents/planner.md +0 -2
  263. package/examples/extensions/subagent/agents/reviewer.md +0 -2
  264. package/examples/extensions/subagent/agents/scout.md +0 -2
  265. package/examples/extensions/subagent/agents/worker.md +0 -1
  266. package/examples/extensions/subagent/agents.test.ts +9 -0
  267. package/examples/extensions/subagent/agents.ts +11 -4
  268. package/examples/extensions/subagent/deadline-budget.test.ts +32 -0
  269. package/examples/extensions/subagent/deadline-budget.ts +25 -1
  270. package/examples/extensions/subagent/fixtures/fake-omk-json.mjs +10 -0
  271. package/examples/extensions/subagent/index.ts +234 -55
  272. package/examples/extensions/subagent/subagent-execution-policy.test.ts +27 -0
  273. package/examples/extensions/subagent/subagent-extension-smoke.test.ts +167 -2
  274. package/examples/extensions/subagent/workflow-graph.test.ts +80 -0
  275. package/examples/extensions/subagent/workflow-graph.ts +89 -0
  276. package/examples/extensions/with-deps/package-lock.json +2 -2
  277. package/examples/extensions/with-deps/package.json +1 -1
  278. package/npm-shrinkwrap.json +253 -439
  279. package/package.json +8 -8
@@ -37,6 +37,10 @@ const SPARK_WINDOW = 44;
37
37
  const SPARK_SAMPLE_MS = 1000;
38
38
  /** MCP inventory is read from disk; cache it so per-frame renders stay cheap. */
39
39
  const MCP_CACHE_TTL_MS = 5000;
40
+ /** Protocol-ping cadence for live MCP connectivity (render-triggered, fire-and-forget). */
41
+ const MCP_HEALTH_INTERVAL_MS = 15_000;
42
+ /** Failed servers are re-attempted on this slower cadence, never on every probe. */
43
+ const MCP_RECONNECT_INTERVAL_MS = 60_000;
40
44
  const SPARK_CHARS = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
41
45
  /**
42
46
  * Fixed right-rail sidebar that shows the bottom-bar (footer) status vertically,
@@ -57,6 +61,9 @@ export class StatusSidebarComponent {
57
61
  cpuHistory = [];
58
62
  lastSparkSampleAt = 0;
59
63
  mcpCache;
64
+ lastMcpProbeAt = 0;
65
+ lastMcpReconnectAt = 0;
66
+ mcpProbeInFlight = false;
60
67
  subscriptionUsage = new Map();
61
68
  subscriptionUsageSession;
62
69
  subscriptionUsageProviders = [];
@@ -85,6 +92,7 @@ export class StatusSidebarComponent {
85
92
  render(width) {
86
93
  const session = this.getSession();
87
94
  const state = session.state;
95
+ this.refreshMcpHealth(session);
88
96
  this.refreshSubscriptionUsage(session);
89
97
  const lines = [boxTop(width, "STATUS RAIL")];
90
98
  // --- Live header: session uptime + CPU activity sparkline ---
@@ -144,8 +152,8 @@ export class StatusSidebarComponent {
144
152
  if (totalCost || usingSubscription) {
145
153
  lines.push(boxTextLine(width, `${theme.fg("muted", "cost ")}${theme.fg("warning", `$${totalCost.toFixed(3)}${usingSubscription ? " (sub)" : ""}`)}`));
146
154
  }
147
- // --- MCP roster (opencode-style server list with stability dots) ---
148
- lines.push(...this.mcpSection(width, session.sessionManager.getCwd(), usageLines.length));
155
+ // --- MCP roster (live connectivity + opencode-style stability dots) ---
156
+ lines.push(...this.mcpSection(width, session, usageLines.length));
149
157
  // --- System ---
150
158
  lines.push(sidebarRule(width, "SYSTEM"));
151
159
  const cpu = this.footerData.getCpuPercent();
@@ -257,14 +265,29 @@ export class StatusSidebarComponent {
257
265
  return lines.length === 1 ? [] : lines;
258
266
  }
259
267
  /**
260
- * MCP server roster with a stable/total counter in the section rule and a
261
- * stability dot per server. Reads are cached so the rail stays cheap to render.
268
+ * MCP server roster with a live-connected/total counter in the section
269
+ * rule and a per-server state badge. Config inventory reads are cached;
270
+ * live status comes from the session's MCP manager each frame.
262
271
  */
263
- mcpSection(width, cwd, reservedRows = 0) {
272
+ mcpSection(width, session, reservedRows = 0) {
273
+ const cwd = session.sessionManager.getCwd();
264
274
  const entries = this.loadMcpEntries(cwd);
275
+ const live = new Map(session.mcpServerStatus().map((status) => [status.name, status]));
276
+ const ready = [...live.values()].filter((status) => status.state === "ready").length;
277
+ const anyFailed = [...live.values()].some((status) => status.state === "failed");
265
278
  const stable = entries.filter((entry) => classifyMcpStability(entry) === "stable").length;
266
- const countColor = entries.length === 0 ? "dim" : stable === entries.length ? "success" : "warning";
267
- const count = entries.length === 0 ? "0" : `${stable}/${entries.length}`;
279
+ const countColor = entries.length === 0
280
+ ? "dim"
281
+ : live.size > 0
282
+ ? anyFailed
283
+ ? "error"
284
+ : ready === live.size
285
+ ? "success"
286
+ : "warning"
287
+ : stable === entries.length
288
+ ? "success"
289
+ : "warning";
290
+ const count = entries.length === 0 ? "0" : live.size > 0 ? `${ready}/${live.size}` : `${stable}/${entries.length}`;
268
291
  const lines = [railRule(width, "MCP", theme.fg(countColor, count))];
269
292
  if (entries.length === 0) {
270
293
  lines.push(boxTextLine(width, theme.fg("dim", "none configured")));
@@ -272,7 +295,7 @@ export class StatusSidebarComponent {
272
295
  }
273
296
  const shown = entries.slice(0, mcpMaxRows(this.getTerminalRows() - reservedRows));
274
297
  for (const entry of shown) {
275
- lines.push(boxTextLine(width, mcpRow(entry, width)));
298
+ lines.push(boxTextLine(width, mcpRow(entry, width, live.get(entry.name))));
276
299
  }
277
300
  const hidden = entries.length - shown.length;
278
301
  if (hidden > 0) {
@@ -280,6 +303,35 @@ export class StatusSidebarComponent {
280
303
  }
281
304
  return lines;
282
305
  }
306
+ /**
307
+ * Keep the rail's MCP rows truthful: ping connected servers on a slow
308
+ * cadence and retry failed ones even slower. Fire-and-forget from render —
309
+ * the 2s metrics repaint supplies the ticks, so no extra timer exists to
310
+ * leak. Probing never spawns connections: idle servers stay idle until a
311
+ * tool call attaches them (manager lazy-connect design).
312
+ */
313
+ refreshMcpHealth(session) {
314
+ const now = Date.now();
315
+ if (this.mcpProbeInFlight)
316
+ return;
317
+ const probeDue = now - this.lastMcpProbeAt >= MCP_HEALTH_INTERVAL_MS;
318
+ const reconnectDue = now - this.lastMcpReconnectAt >= MCP_RECONNECT_INTERVAL_MS;
319
+ if (!probeDue && !reconnectDue)
320
+ return;
321
+ if (session.mcpServerStatus().length === 0)
322
+ return; // no MCP manager attached
323
+ this.mcpProbeInFlight = true;
324
+ this.lastMcpProbeAt = now;
325
+ if (reconnectDue)
326
+ this.lastMcpReconnectAt = now;
327
+ void session
328
+ .mcpCheckHealth({ reconnectFailed: reconnectDue })
329
+ .catch(() => { })
330
+ .finally(() => {
331
+ this.mcpProbeInFlight = false;
332
+ this.requestRender();
333
+ });
334
+ }
283
335
  loadMcpEntries(cwd) {
284
336
  const now = Date.now();
285
337
  if (this.mcpCache && this.mcpCache.cwd === cwd && now - this.mcpCache.at < MCP_CACHE_TTL_MS) {
@@ -327,23 +379,58 @@ function railRule(width, label, right) {
327
379
  const line = `${theme.fg("borderMuted", "│")}${left}${theme.fg("borderMuted", "─".repeat(fill))}${rightText}${theme.fg("borderMuted", "│")}`;
328
380
  return visibleWidth(line) <= width ? line : truncateToWidth(line, width, "");
329
381
  }
330
- /** One MCP server row: stability dot + name, truncated to the rail width. */
331
- function mcpRow(entry, width) {
332
- const stability = classifyMcpStability(entry);
333
- const dot = stability === "stable"
334
- ? theme.fg("success", "●")
335
- : stability === "overridden"
336
- ? theme.fg("dim", "◐")
337
- : theme.fg("warning", "○");
338
- const nameColor = stability === "stable" ? "text" : stability === "overridden" ? "dim" : "warning";
339
- const nameWidth = Math.max(1, width - 4 - 2); // frame (4) + dot + space (2)
382
+ /** One MCP server row: live-state badge + name + right-aligned detail, truncated to the rail width. */
383
+ function mcpRow(entry, width, live) {
384
+ const badge = live ? liveMcpBadge(live) : configMcpBadge(entry);
340
385
  const safeName = stripAnsi(entry.name)
341
386
  .replace(/[\t\r\n]+/g, " ")
342
387
  .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u200b-\u200f\u202a-\u202e\u2060-\u206f]/g, "")
343
388
  .replace(/\s+/g, " ")
344
389
  .trim();
390
+ const detail = live ? liveMcpDetail(live) : "";
391
+ // frame (4) + dot + space (2); detail is right-aligned with one gap column.
392
+ const detailText = detail ? ` ${detail}` : "";
393
+ const nameWidth = Math.max(1, width - 4 - 2 - visibleWidth(detailText));
345
394
  const name = truncateToWidth(safeName || "<unnamed>", nameWidth, "…");
346
- return `${dot} ${theme.fg(nameColor, name)}`;
395
+ const pad = Math.max(0, width - 4 - 2 - visibleWidth(name) - visibleWidth(detailText));
396
+ return `${badge.dot} ${theme.fg(badge.nameColor, name)}${" ".repeat(pad)}${detail ? theme.fg("dim", detailText) : ""}`;
397
+ }
398
+ function configMcpBadge(entry) {
399
+ const stability = classifyMcpStability(entry);
400
+ return {
401
+ dot: stability === "stable"
402
+ ? theme.fg("success", "●")
403
+ : stability === "overridden"
404
+ ? theme.fg("dim", "◐")
405
+ : theme.fg("warning", "○"),
406
+ nameColor: stability === "stable" ? "text" : stability === "overridden" ? "dim" : "warning",
407
+ };
408
+ }
409
+ function liveMcpBadge(status) {
410
+ switch (status.state) {
411
+ case "ready":
412
+ return { dot: theme.fg("success", "●"), nameColor: "text" };
413
+ case "connecting":
414
+ return { dot: theme.fg("warning", "◐"), nameColor: "text" };
415
+ case "failed":
416
+ return status.error === "disabled by configuration"
417
+ ? { dot: theme.fg("dim", "○"), nameColor: "dim" }
418
+ : { dot: theme.fg("error", "✕"), nameColor: "error" };
419
+ default:
420
+ return { dot: theme.fg("dim", "○"), nameColor: "dim" };
421
+ }
422
+ }
423
+ function liveMcpDetail(status) {
424
+ switch (status.state) {
425
+ case "ready":
426
+ return `${status.toolCount}t`;
427
+ case "connecting":
428
+ return "…";
429
+ case "failed":
430
+ return status.error === "disabled by configuration" ? "off" : "failed";
431
+ default:
432
+ return "idle";
433
+ }
347
434
  }
348
435
  function formatUptime(seconds) {
349
436
  const total = Math.max(0, Math.floor(seconds));
@@ -1 +1 @@
1
- {"version":3,"file":"status-sidebar.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-sidebar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,gCAAgC,CAAC;AACvF,OAAO,EAEN,uCAAuC,EACvC,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,uBAAuB,GAGvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAmB,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,gGAAgG;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAU;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,CACxG;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAU;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,CAChD;AAED,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,mGAAmG;AACnG,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,oFAAoF;AACpF,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,iFAAiF;AACjF,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,WAAW,GAAG,CAAC,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,EAAE,KAAG,CAAU,CAAC;AActE;;;;;;;GAOG;AACH,MAAM,OAAO,sBAAsB;IAC1B,UAAU,CAAqB;IAC/B,UAAU,CAA6B;IACvC,qBAAqB,CAAgB;IACrC,eAAe,CAAe;IAC9B,aAAa,CAAa;IAC1B,sBAAsB,CAA2B;IAEzD,yEAAyE;IACjE,UAAU,GAAa,EAAE,CAAC;IAC1B,iBAAiB,GAAG,CAAC,CAAC;IACtB,QAAQ,CAAqE;IAC7E,iBAAiB,GAAG,IAAI,GAAG,EAAqC,CAAC;IACjE,wBAAwB,CAA2B;IACnD,0BAA0B,GAAsB,EAAE,CAAC;IACnD,0BAA0B,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,yBAAyB,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5D,yBAAyB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9D,YACC,UAA8B,EAC9B,UAAsC,EACtC,qBAAoC,EACpC,eAAe,GAAiB,GAAG,EAAE,CAAC,EAAE,EACxC,OAAO,GAAyB,EAAE,EACjC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,sBAAsB;YAC1B,OAAO,CAAC,sBAAsB;gBAC9B,CAAC,aAAa;oBACb,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAC5B,0BAA0B,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,OAAO;wBACrD,CAAC,CAAC,yBAAyB,CAAC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;wBACzD,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;oBACxD,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAAA,CAChF;IAED,UAAU,GAAS;QAClB,yEAAyE;QACzE,kEAAkE;IAF/C,CAGnB;IAED,MAAM,CAAC,KAAa,EAAY;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;QAEvD,+DAA+D;QAC/D,KAAK,CAAC,IAAI,CACT,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CACxG,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtD,mBAAmB;QACnB,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7G,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QAC5D,IAAI,WAAW,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QAED,gBAAgB;QAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CACT,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC,CACvG,CAAC;QACF,IAAI,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CACT,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,EAAE,CAAC,CACvG,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAE1B,kBAAkB;QAClB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,IAAI,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,YAAY,GACjB,OAAO,KAAK,IAAI;YACf,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE;YAC3C,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,EAAE,CAAC;QACnE,MAAM,YAAY,GACjB,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QACvG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtD,6EAA6E;QAC7E,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;YACzD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpE,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBACxC,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC1C,cAAc,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChD,eAAe,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;gBAClD,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7C,CAAC;QACF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CACT,WAAW,CACV,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAC/G,CACD,CAAC;QACF,KAAK,CAAC,IAAI,CACT,WAAW,CACV,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,YAAY,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACpH,CACD,CAAC;QACF,MAAM,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChG,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CACT,WAAW,CACV,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CACrH,CACD,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAE1F,iBAAiB;QACjB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,GAAG,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhH,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1F,CAAC;QACF,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,wBAAwB,CAAC,OAAqB,EAAQ;QAC7D,IAAI,IAAI,CAAC,wBAAwB,KAAK,OAAO,EAAE,CAAC;YAC/C,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC;QACzC,CAAC;QAED,MAAM,SAAS,GAAG,uCAAuC,CAAC,OAAO,CAAC,CAAC;QACnE,IAAI,CAAC,0BAA0B,GAAG,SAAS,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjD,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,CAAC;QACF,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,eAAe,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACzF,IACC,CAAC,MAAM;gBACP,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAC5C,CAAC,CAAC,eAAe,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EAC9F,CAAC;gBACF,SAAS;YACV,CAAC;YACD,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACnD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC;iBACjD,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACnB,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAChD,CAAC;YAAA,CACD,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,CAAC;gBACZ,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzF,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE;wBACpC,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,OAAO,EAAE,EAAE;wBACX,OAAO,EAAE,mBAAmB;qBAC5B,CAAC,CAAC;gBACJ,CAAC;YAAA,CACD,CAAC;iBACD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC9D,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjD,CAAC;gBACD,IAAI,CAAC,aAAa,EAAE,CAAC;YAAA,CACrB,CAAC,CAAC;QACL,CAAC;IAAA,CACD;IAEO,wBAAwB,CAAC,KAAa,EAAY;QACzD,IAAI,IAAI,CAAC,0BAA0B,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,CAAC;YAC/C,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAClD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,YAAU,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/F,CAAC;gBACD,SAAS;YACV,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBACzF,SAAS;YACV,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAClD,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CACxF,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,MAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAAA,CACvC;IAED;;;OAGG;IACK,UAAU,CAAC,KAAa,EAAE,GAAW,EAAE,YAAY,GAAG,CAAC,EAAY;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC1F,MAAM,UAAU,GAAe,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAChH,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAEzE,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;YACnE,OAAO,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC;QAClF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,MAAM,UAAQ,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,KAAK,CAAC;IAAA,CACb;IAEO,cAAc,CAAC,GAAW,EAAoB;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC7F,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,GAAqB,EAAE,CAAC;QACnC,IAAI,CAAC;YACJ,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,GAAG,EAAE,CAAC;QACd,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IAAA,CACf;IAED,0EAAwE;IAChE,SAAS,CAAC,KAAa,EAAU;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,iBAAiB,IAAI,eAAe,EAAE,CAAC;YACrE,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACF,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,CAAC;QAED,uEAAuE;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClG,MAAM,GAAG,GAAG,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;IAAA,CAC5E;CACD;AAED,oGAAgF;AAChF,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAU;IACtE,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,KAAK,GAAG,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,EAAE,CAAC;IAC7I,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAAA,CAC7E;AAED,6EAA6E;AAC7E,SAAS,MAAM,CAAC,KAAqB,EAAE,KAAa,EAAU;IAC7D,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,GAAG,GACR,SAAS,KAAK,QAAQ;QACrB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAG,CAAC;QAC1B,CAAC,CAAC,SAAS,KAAK,YAAY;YAC3B,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAG,CAAC;YACtB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAG,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAe,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/G,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B;IAC5E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;SACpC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;SAC1B,OAAO,CAAC,+FAA+F,EAAE,EAAE,CAAC;SAC5G,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACT,MAAM,IAAI,GAAG,eAAe,CAAC,QAAQ,IAAI,WAAW,EAAE,SAAS,EAAE,KAAG,CAAC,CAAC;IACtE,OAAO,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,CAC7C;AAED,SAAS,YAAY,CAAC,OAAe,EAAU;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CAClE;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAA+B,EAAE,KAAa,EAAU;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IAC9C,MAAM,SAAS,GAAG,GAAG,KAAK,IAAI,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,CACrK;AAED,SAAS,UAAU,CAAC,OAAe,EAAc;IAChD,IAAI,OAAO,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC;IAClC,IAAI,OAAO,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,yBAAyB,CAAC,QAAwC,EAAyC;IACnH,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO;QACN,KAAK,EAAE,OAAO;QACd,OAAO,EAAE;YACR,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YACrE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAqC,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC;KAC7E,CAAC;AAAA,CACF;AAED,SAAS,WAAW,CAAC,QAAgB,EAAU;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAC7C,IAAI,YAAY,GAAG,EAAE;QAAE,OAAO,GAAG,YAAY,GAAG,CAAC;IACjD,IAAI,YAAY,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,GAAG,EAAE,CAAC;IAC9B,OAAO,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAAA,CACjD;AAED,SAAS,KAAK,CAAC,OAAsB,EAAE,KAAa,EAAU;IAC7D,qEAAqE;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAe,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3F,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAAA,CACpJ","sourcesContent":["import type { Component } from \"omk-tui\";\nimport { truncateToWidth, visibleWidth } from \"omk-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { loadMcpInventory, type McpServerEntry } from \"../../../core/mcp-inventory.ts\";\nimport {\n\ttype CodexUsageSnapshot,\n\tgetConfiguredSubscriptionUsageProviders,\n\tgetSubscriptionUsageRevision,\n\tgetSubscriptionUsageSource,\n\tloadSubscriptionUsage,\n\tparseCodexUsageSnapshot,\n\ttype SubscriptionUsageSnapshot,\n\ttype SubscriptionUsageWindow,\n} from \"../../../core/provider-usage.ts\";\n\nexport { parseCodexUsageSnapshot };\n\nimport { stripAnsi } from \"../../../utils/ansi.ts\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\nimport { boxBottom, boxTextLine, boxTop, sidebarRule } from \"./control-panel-box.ts\";\nimport { classifyMcpStability } from \"./control-panel-runtime-status.ts\";\nimport { formatBytes, formatCwdForFooter, formatPackageIntake, formatTokens } from \"./footer.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\n\nexport const STATUS_SIDEBAR_WIDTH = 34;\nexport const STATUS_SIDEBAR_MAX_WIDTH = 48;\nexport const STATUS_SIDEBAR_MIN_WIDTH = 96;\n/** Blank columns between the main content and the pinned rail (part of the reserved gutter). */\nexport const STATUS_SIDEBAR_GUTTER_GAP = 1;\n\n/**\n * Responsive rail width: ~26% of the terminal, clamped to [34, 48] so the rail\n * grows on fullscreen terminals while the content column stays dominant.\n * The pinned overlay and the reserved gutter must both use this function.\n */\nexport function statusSidebarWidth(termWidth: number): number {\n\treturn Math.max(STATUS_SIDEBAR_WIDTH, Math.min(STATUS_SIDEBAR_MAX_WIDTH, Math.floor(termWidth * 0.26)));\n}\n\n/**\n * Responsive MCP roster rows: taller terminals list more servers before the\n * \"+N more\" collapse. ~24 rows of the rail are fixed chrome (header, model,\n * context, tokens, system), the rest is available to the roster.\n */\nexport function mcpMaxRows(termRows: number): number {\n\treturn Math.max(4, Math.min(18, termRows - 24));\n}\n\nconst METER_CELLS = 12;\nconst METER_MAX_CELLS = 24;\n/** Rolling window of CPU samples feeding the activity sparkline (wide rails show more history). */\nconst SPARK_WINDOW = 44;\n/** Minimum interval between sparkline samples so the rail animates, not jitters. */\nconst SPARK_SAMPLE_MS = 1000;\n/** MCP inventory is read from disk; cache it so per-frame renders stay cheap. */\nconst MCP_CACHE_TTL_MS = 5000;\nconst SPARK_CHARS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"] as const;\n\ntype SubscriptionUsageFetcher = (\n\tsession: AgentSession,\n\tprovider?: string,\n) => Promise<SubscriptionUsageSnapshot | undefined>;\ntype CodexUsageFetcher = (session: AgentSession) => Promise<CodexUsageSnapshot | undefined>;\ntype StatusSidebarOptions = Readonly<{\n\trequestRender?: () => void;\n\tfetchSubscriptionUsage?: SubscriptionUsageFetcher;\n\t/** Compatibility for callers that injected the original Codex-only fetcher. */\n\tfetchCodexUsage?: CodexUsageFetcher;\n}>;\n\n/**\n * Fixed right-rail sidebar that shows the bottom-bar (footer) status vertically,\n * styled after opencode's pinned side rails plus a live MCP server roster.\n *\n * Pinned via the `pinStatusSidebar` setting (or OMK_PIN_STATUS_SIDEBAR=1) and\n * toggled with app.sidebar.toggle (Ctrl+Q). While pinned, the bottom footer is\n * removed so the same data is not rendered twice.\n */\nexport class StatusSidebarComponent implements Component {\n\tprivate getSession: () => AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\tprivate getAutoCompactEnabled: () => boolean;\n\tprivate getTerminalRows: () => number;\n\tprivate requestRender: () => void;\n\tprivate fetchSubscriptionUsage: SubscriptionUsageFetcher;\n\n\t// --- living elements: rolling CPU sparkline + cached MCP/usage data ---\n\tprivate cpuHistory: number[] = [];\n\tprivate lastSparkSampleAt = 0;\n\tprivate mcpCache: { at: number; cwd: string; entries: McpServerEntry[] } | undefined;\n\tprivate subscriptionUsage = new Map<string, SubscriptionUsageSnapshot>();\n\tprivate subscriptionUsageSession: AgentSession | undefined;\n\tprivate subscriptionUsageProviders: readonly string[] = [];\n\tprivate subscriptionUsageFetchedAt = new Map<string, number>();\n\tprivate subscriptionUsageInFlight = new Map<string, AgentSession>();\n\tprivate subscriptionUsageRevision = new Map<string, number>();\n\n\tconstructor(\n\t\tgetSession: () => AgentSession,\n\t\tfooterData: ReadonlyFooterDataProvider,\n\t\tgetAutoCompactEnabled: () => boolean,\n\t\tgetTerminalRows: () => number = () => 32,\n\t\toptions: StatusSidebarOptions = {},\n\t) {\n\t\tthis.getSession = getSession;\n\t\tthis.footerData = footerData;\n\t\tthis.getAutoCompactEnabled = getAutoCompactEnabled;\n\t\tthis.getTerminalRows = getTerminalRows;\n\t\tthis.requestRender = options.requestRender ?? (() => {});\n\t\tconst legacyFetcher = options.fetchCodexUsage;\n\t\tthis.fetchSubscriptionUsage =\n\t\t\toptions.fetchSubscriptionUsage ??\n\t\t\t(legacyFetcher\n\t\t\t\t? async (session, provider) =>\n\t\t\t\t\t\tgetSubscriptionUsageSource(provider)?.kind === \"codex\"\n\t\t\t\t\t\t\t? codexSubscriptionSnapshot(await legacyFetcher(session))\n\t\t\t\t\t\t\t: loadSubscriptionUsage(session, undefined, provider)\n\t\t\t\t: (session, provider) => loadSubscriptionUsage(session, undefined, provider));\n\t}\n\n\tinvalidate(): void {\n\t\t// Mostly stateless: status recomputes from the live session each render.\n\t\t// Only the sparkline history and MCP cache persist across frames.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst session = this.getSession();\n\t\tconst state = session.state;\n\t\tthis.refreshSubscriptionUsage(session);\n\t\tconst lines: string[] = [boxTop(width, \"STATUS RAIL\")];\n\n\t\t// --- Live header: session uptime + CPU activity sparkline ---\n\t\tlines.push(\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"up \")}${theme.fg(\"accent\", formatUptime(process.uptime()))}`),\n\t\t);\n\t\tlines.push(boxTextLine(width, this.sparkline(width)));\n\n\t\t// --- Location ---\n\t\tconst cwd = formatCwdForFooter(session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"cwd \")}${theme.fg(\"text\", cwd)}`));\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"git \")}${theme.fg(\"accent\", branch)}`));\n\t\t}\n\t\tconst sessionName = session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"sess \")}${theme.fg(\"text\", sessionName)}`));\n\t\t}\n\n\t\t// --- Model ---\n\t\tlines.push(sidebarRule(width, \"MODEL\"));\n\t\tlines.push(\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"id \")}${theme.fg(\"accent\", state.model?.id ?? \"no-model\")}`),\n\t\t);\n\t\tif (state.model?.reasoning) {\n\t\t\tlines.push(\n\t\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"think \")}${theme.fg(\"mdCode\", state.thinkingLevel || \"off\")}`),\n\t\t\t);\n\t\t}\n\n\t\t// --- Active provider subscription quota ---\n\t\tconst usageLines = this.subscriptionUsageSection(width);\n\t\tlines.push(...usageLines);\n\n\t\t// --- Context ---\n\t\tlines.push(sidebarRule(width, \"CONTEXT\"));\n\t\tconst contextUsage = session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst percent = contextUsage?.percent ?? null;\n\t\tconst auto = this.getAutoCompactEnabled() ? \" (auto)\" : \"\";\n\t\tconst percentLabel =\n\t\t\tpercent === null\n\t\t\t\t? `?/${formatTokens(contextWindow)}${auto}`\n\t\t\t\t: `${percent.toFixed(1)}%/${formatTokens(contextWindow)}${auto}`;\n\t\tconst percentColor: ThemeColor =\n\t\t\tpercent !== null && percent > 90 ? \"error\" : percent !== null && percent > 70 ? \"warning\" : \"success\";\n\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"ctx \")}${theme.fg(percentColor, percentLabel)}`));\n\t\tlines.push(boxTextLine(width, meter(percent, width)));\n\n\t\t// --- Tokens (cumulative across all session entries, mirrors the footer) ---\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tlines.push(sidebarRule(width, \"TOKENS\"));\n\t\tlines.push(\n\t\t\tboxTextLine(\n\t\t\t\twidth,\n\t\t\t\t`${theme.fg(\"success\", `↑${formatTokens(totalInput)}`)} ${theme.fg(\"accent\", `↓${formatTokens(totalOutput)}`)}`,\n\t\t\t),\n\t\t);\n\t\tlines.push(\n\t\t\tboxTextLine(\n\t\t\t\twidth,\n\t\t\t\t`${theme.fg(\"muted\", `R${formatTokens(totalCacheRead)}`)} ${theme.fg(\"muted\", `W${formatTokens(totalCacheWrite)}`)}`,\n\t\t\t),\n\t\t);\n\t\tconst usingSubscription = state.model ? session.modelRegistry.isUsingOAuth(state.model) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tlines.push(\n\t\t\t\tboxTextLine(\n\t\t\t\t\twidth,\n\t\t\t\t\t`${theme.fg(\"muted\", \"cost \")}${theme.fg(\"warning\", `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`)}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// --- MCP roster (opencode-style server list with stability dots) ---\n\t\tlines.push(...this.mcpSection(width, session.sessionManager.getCwd(), usageLines.length));\n\n\t\t// --- System ---\n\t\tlines.push(sidebarRule(width, \"SYSTEM\"));\n\t\tconst cpu = this.footerData.getCpuPercent();\n\t\tconst mem = this.footerData.getMemoryRssBytes();\n\t\tconst sysParts: string[] = [];\n\t\tif (cpu !== null) sysParts.push(`cpu ${cpu.toFixed(0)}%`);\n\t\tif (mem !== null) sysParts.push(`mem ${formatBytes(mem)}`);\n\t\tif (sysParts.length > 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"muted\", sysParts.join(\" \"))));\n\t\t}\n\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", formatPackageIntake(this.footerData.getPackageIntakeSummary()))));\n\n\t\t// --- Extension statuses ---\n\t\tconst statuses = this.footerData.getExtensionStatuses();\n\t\tif (statuses.size > 0) {\n\t\t\tlines.push(sidebarRule(width, \"EXT\"));\n\t\t\tfor (const [key, value] of statuses) {\n\t\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"mdCode\", key)} ${theme.fg(\"muted\", value)}`));\n\t\t\t}\n\t\t}\n\n\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", `${keyText(\"app.sidebar.toggle\")} unpin`)));\n\t\tlines.push(boxBottom(width));\n\t\treturn lines;\n\t}\n\n\tprivate refreshSubscriptionUsage(session: AgentSession): void {\n\t\tif (this.subscriptionUsageSession !== session) {\n\t\t\tthis.subscriptionUsage.clear();\n\t\t\tthis.subscriptionUsageFetchedAt.clear();\n\t\t\tthis.subscriptionUsageInFlight.clear();\n\t\t\tthis.subscriptionUsageRevision.clear();\n\t\t\tthis.subscriptionUsageSession = session;\n\t\t}\n\n\t\tconst providers = getConfiguredSubscriptionUsageProviders(session);\n\t\tthis.subscriptionUsageProviders = providers;\n\t\tconst configured = new Set(providers);\n\t\tfor (const provider of this.subscriptionUsage.keys()) {\n\t\t\tif (!configured.has(provider)) {\n\t\t\t\tthis.subscriptionUsage.delete(provider);\n\t\t\t\tthis.subscriptionUsageFetchedAt.delete(provider);\n\t\t\t\tthis.subscriptionUsageRevision.delete(provider);\n\t\t\t}\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tfor (const provider of providers) {\n\t\t\tconst source = getSubscriptionUsageSource(provider);\n\t\t\tconst revision = getSubscriptionUsageRevision(provider);\n\t\t\tconst revisionChanged = revision !== (this.subscriptionUsageRevision.get(provider) ?? 0);\n\t\t\tif (\n\t\t\t\t!source ||\n\t\t\t\tthis.subscriptionUsageInFlight.has(provider) ||\n\t\t\t\t(!revisionChanged && now - (this.subscriptionUsageFetchedAt.get(provider) ?? 0) < source.ttlMs)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.subscriptionUsageFetchedAt.set(provider, now);\n\t\t\tthis.subscriptionUsageRevision.set(provider, revision);\n\t\t\tthis.subscriptionUsageInFlight.set(provider, session);\n\t\t\tvoid this.fetchSubscriptionUsage(session, provider)\n\t\t\t\t.then((snapshot) => {\n\t\t\t\t\tif (snapshot && this.getSession() === session && this.subscriptionUsageProviders.includes(provider)) {\n\t\t\t\t\t\tthis.subscriptionUsage.set(provider, snapshot);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tif (this.getSession() === session && this.subscriptionUsageProviders.includes(provider)) {\n\t\t\t\t\t\tthis.subscriptionUsage.set(provider, {\n\t\t\t\t\t\t\tlabel: source.label,\n\t\t\t\t\t\t\twindows: [],\n\t\t\t\t\t\t\tmessage: \"usage unavailable\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tif (this.subscriptionUsageInFlight.get(provider) === session) {\n\t\t\t\t\t\tthis.subscriptionUsageInFlight.delete(provider);\n\t\t\t\t\t}\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t});\n\t\t}\n\t}\n\n\tprivate subscriptionUsageSection(width: number): string[] {\n\t\tif (this.subscriptionUsageProviders.length === 0) return [];\n\t\tconst lines = [railRule(width, \"USAGE\", theme.fg(\"accent\", String(this.subscriptionUsageProviders.length)))];\n\t\tfor (const provider of this.subscriptionUsageProviders) {\n\t\t\tconst source = getSubscriptionUsageSource(provider);\n\t\t\tconst snapshot = this.subscriptionUsage.get(provider);\n\t\t\tconst label = snapshot?.label ?? source?.label;\n\t\t\tif (!label) continue;\n\t\t\tif (!snapshot) {\n\t\t\t\tif (this.subscriptionUsageInFlight.has(provider)) {\n\t\t\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"accent\", label)} ${theme.fg(\"dim\", \"loading…\")}`));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (snapshot.windows.length === 0) {\n\t\t\t\tlines.push(boxTextLine(width, theme.fg(\"accent\", label)));\n\t\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", snapshot.message ?? \"usage unavailable\")));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"accent\", label)));\n\t\t\tfor (const window of snapshot.windows) {\n\t\t\t\tlines.push(boxTextLine(width, usageMeter(window.label, window, width)));\n\t\t\t}\n\t\t\tconst resets = snapshot.windows.flatMap((window) =>\n\t\t\t\twindow.resetsAt === undefined ? [] : [`${window.label} ${formatReset(window.resetsAt)}`],\n\t\t\t);\n\t\t\tif (resets.length > 0) lines.push(boxTextLine(width, theme.fg(\"dim\", `reset ${resets.join(\" · \")}`)));\n\t\t}\n\t\treturn lines.length === 1 ? [] : lines;\n\t}\n\n\t/**\n\t * MCP server roster with a stable/total counter in the section rule and a\n\t * stability dot per server. Reads are cached so the rail stays cheap to render.\n\t */\n\tprivate mcpSection(width: number, cwd: string, reservedRows = 0): string[] {\n\t\tconst entries = this.loadMcpEntries(cwd);\n\t\tconst stable = entries.filter((entry) => classifyMcpStability(entry) === \"stable\").length;\n\t\tconst countColor: ThemeColor = entries.length === 0 ? \"dim\" : stable === entries.length ? \"success\" : \"warning\";\n\t\tconst count = entries.length === 0 ? \"0\" : `${stable}/${entries.length}`;\n\n\t\tconst lines: string[] = [railRule(width, \"MCP\", theme.fg(countColor, count))];\n\t\tif (entries.length === 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", \"none configured\")));\n\t\t\treturn lines;\n\t\t}\n\n\t\tconst shown = entries.slice(0, mcpMaxRows(this.getTerminalRows() - reservedRows));\n\t\tfor (const entry of shown) {\n\t\t\tlines.push(boxTextLine(width, mcpRow(entry, width)));\n\t\t}\n\t\tconst hidden = entries.length - shown.length;\n\t\tif (hidden > 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", `+${hidden} more…`)));\n\t\t}\n\t\treturn lines;\n\t}\n\n\tprivate loadMcpEntries(cwd: string): McpServerEntry[] {\n\t\tconst now = Date.now();\n\t\tif (this.mcpCache && this.mcpCache.cwd === cwd && now - this.mcpCache.at < MCP_CACHE_TTL_MS) {\n\t\t\treturn this.mcpCache.entries;\n\t\t}\n\t\tlet entries: McpServerEntry[] = [];\n\t\ttry {\n\t\t\tentries = loadMcpInventory(cwd).entries;\n\t\t} catch {\n\t\t\tentries = [];\n\t\t}\n\t\tthis.mcpCache = { at: now, cwd, entries };\n\t\treturn entries;\n\t}\n\n\t/** Rolling CPU sparkline — a living pulse along the top of the rail. */\n\tprivate sparkline(width: number): string {\n\t\tconst now = Date.now();\n\t\tconst cpu = this.footerData.getCpuPercent();\n\t\tif (cpu !== null && now - this.lastSparkSampleAt >= SPARK_SAMPLE_MS) {\n\t\t\tthis.lastSparkSampleAt = now;\n\t\t\tthis.cpuHistory.push(Math.max(0, Math.min(100, cpu)));\n\t\t\tif (this.cpuHistory.length > SPARK_WINDOW) {\n\t\t\t\tthis.cpuHistory.shift();\n\t\t\t}\n\t\t}\n\n\t\tconst inner = Math.max(0, width - 4);\n\t\tconst label = theme.fg(\"muted\", \"act \");\n\t\tconst cells = Math.max(0, inner - visibleWidth(label));\n\t\tif (cells === 0 || this.cpuHistory.length === 0) {\n\t\t\treturn `${label}${theme.fg(\"borderMuted\", \"▁\".repeat(Math.max(0, cells)))}`;\n\t\t}\n\n\t\t// Right-align the window so the sparkline grows in from the left edge.\n\t\tconst window = this.cpuHistory.slice(-cells);\n\t\tconst bars = window.map((sample) => SPARK_CHARS[Math.min(7, Math.floor(sample / 12.6))]).join(\"\");\n\t\tconst pad = \"▁\".repeat(Math.max(0, cells - window.length));\n\t\treturn `${label}${theme.fg(\"borderMuted\", pad)}${theme.fg(\"accent\", bars)}`;\n\t}\n}\n\n/** Section rule with a right-aligned counter, e.g. `│─ MCP ─────── 22/24 │`. */\nfunction railRule(width: number, label: string, right: string): string {\n\tconst left = `${theme.fg(\"borderMuted\", \"─\")}${theme.fg(\"accent\", ` ${label} `)}`;\n\tconst rightText = ` ${right} `;\n\tconst fill = Math.max(0, width - 2 - visibleWidth(left) - visibleWidth(rightText));\n\tconst line = `${theme.fg(\"borderMuted\", \"│\")}${left}${theme.fg(\"borderMuted\", \"─\".repeat(fill))}${rightText}${theme.fg(\"borderMuted\", \"│\")}`;\n\treturn visibleWidth(line) <= width ? line : truncateToWidth(line, width, \"\");\n}\n\n/** One MCP server row: stability dot + name, truncated to the rail width. */\nfunction mcpRow(entry: McpServerEntry, width: number): string {\n\tconst stability = classifyMcpStability(entry);\n\tconst dot =\n\t\tstability === \"stable\"\n\t\t\t? theme.fg(\"success\", \"●\")\n\t\t\t: stability === \"overridden\"\n\t\t\t\t? theme.fg(\"dim\", \"◐\")\n\t\t\t\t: theme.fg(\"warning\", \"○\");\n\tconst nameColor: ThemeColor = stability === \"stable\" ? \"text\" : stability === \"overridden\" ? \"dim\" : \"warning\";\n\tconst nameWidth = Math.max(1, width - 4 - 2); // frame (4) + dot + space (2)\n\tconst safeName = stripAnsi(entry.name)\n\t\t.replace(/[\\t\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u206f]/g, \"\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tconst name = truncateToWidth(safeName || \"<unnamed>\", nameWidth, \"…\");\n\treturn `${dot} ${theme.fg(nameColor, name)}`;\n}\n\nfunction formatUptime(seconds: number): string {\n\tconst total = Math.max(0, Math.floor(seconds));\n\tconst h = Math.floor(total / 3600);\n\tconst m = Math.floor((total % 3600) / 60);\n\tconst s = total % 60;\n\tconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\treturn h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;\n}\n\nfunction usageMeter(label: string, window: SubscriptionUsageWindow, width: number): string {\n\tconst percent = Math.max(0, Math.min(100, window.usedPercent));\n\tconst percentText = `${Math.round(percent)}%`;\n\tconst labelText = `${label} `;\n\tconst innerWidth = Math.max(0, width - 4);\n\tconst cells = Math.max(4, Math.min(METER_MAX_CELLS, innerWidth - labelText.length - percentText.length - 1));\n\tconst filled = Math.round((percent / 100) * cells);\n\tconst color = usageColor(percent);\n\treturn `${theme.fg(\"muted\", labelText)}${theme.fg(color, \"█\".repeat(filled))}${theme.fg(\"borderMuted\", \"░\".repeat(cells - filled))} ${theme.fg(color, percentText)}`;\n}\n\nfunction usageColor(percent: number): ThemeColor {\n\tif (percent >= 90) return \"error\";\n\tif (percent >= 75) return \"warning\";\n\treturn \"success\";\n}\n\nfunction codexSubscriptionSnapshot(snapshot: CodexUsageSnapshot | undefined): SubscriptionUsageSnapshot | undefined {\n\tif (!snapshot) return undefined;\n\treturn {\n\t\tlabel: \"CODEX\",\n\t\twindows: [\n\t\t\tsnapshot.fiveHour ? { label: \"5H\", ...snapshot.fiveHour } : undefined,\n\t\t\tsnapshot.sevenDay ? { label: \"7D\", ...snapshot.sevenDay } : undefined,\n\t\t].filter((window): window is SubscriptionUsageWindow => window !== undefined),\n\t};\n}\n\nfunction formatReset(resetsAt: number): string {\n\tconst seconds = Math.max(0, Math.ceil(resetsAt - Date.now() / 1000));\n\tif (seconds < 60) return \"now\";\n\tconst totalMinutes = Math.ceil(seconds / 60);\n\tif (totalMinutes < 60) return `${totalMinutes}m`;\n\tif (totalMinutes < 24 * 60) {\n\t\tconst hours = Math.floor(totalMinutes / 60);\n\t\tconst minutes = totalMinutes % 60;\n\t\treturn `${hours}h${minutes > 0 ? `${minutes}m` : \"\"}`;\n\t}\n\tconst totalHours = Math.ceil(totalMinutes / 60);\n\tconst days = Math.floor(totalHours / 24);\n\tconst hours = totalHours % 24;\n\treturn `${days}d${hours > 0 ? `${hours}h` : \"\"}`;\n}\n\nfunction meter(percent: number | null, width: number): string {\n\t// Fill the rail: frame (4) + space + up to \"100%\" (4) stay reserved.\n\tconst cells = Math.max(METER_CELLS, Math.min(METER_MAX_CELLS, width - 9));\n\tif (percent === null) {\n\t\treturn `${theme.fg(\"borderMuted\", \"░\".repeat(cells))} ${theme.fg(\"muted\", \"??%\")}`;\n\t}\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filled = Math.round((clamped / 100) * cells);\n\tconst color: ThemeColor = clamped >= 85 ? \"warning\" : clamped >= 65 ? \"mdCode\" : \"success\";\n\treturn `${theme.fg(color, \"█\".repeat(filled))}${theme.fg(\"borderMuted\", \"░\".repeat(cells - filled))} ${theme.fg(color, `${Math.round(clamped)}%`)}`;\n}\n"]}
1
+ {"version":3,"file":"status-sidebar.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/status-sidebar.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Component } from \"omk-tui\";\nimport { truncateToWidth, visibleWidth } from \"omk-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport type { McpServerStatus } from \"../../../core/mcp/manager.ts\";\nimport { loadMcpInventory, type McpServerEntry } from \"../../../core/mcp-inventory.ts\";\nimport {\n\ttype CodexUsageSnapshot,\n\tgetConfiguredSubscriptionUsageProviders,\n\tgetSubscriptionUsageRevision,\n\tgetSubscriptionUsageSource,\n\tloadSubscriptionUsage,\n\tparseCodexUsageSnapshot,\n\ttype SubscriptionUsageSnapshot,\n\ttype SubscriptionUsageWindow,\n} from \"../../../core/provider-usage.ts\";\n\nexport { parseCodexUsageSnapshot };\n\nimport { stripAnsi } from \"../../../utils/ansi.ts\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\nimport { boxBottom, boxTextLine, boxTop, sidebarRule } from \"./control-panel-box.ts\";\nimport { classifyMcpStability } from \"./control-panel-runtime-status.ts\";\nimport { formatBytes, formatCwdForFooter, formatPackageIntake, formatTokens } from \"./footer.ts\";\nimport { keyText } from \"./keybinding-hints.ts\";\n\nexport const STATUS_SIDEBAR_WIDTH = 34;\nexport const STATUS_SIDEBAR_MAX_WIDTH = 48;\nexport const STATUS_SIDEBAR_MIN_WIDTH = 96;\n/** Blank columns between the main content and the pinned rail (part of the reserved gutter). */\nexport const STATUS_SIDEBAR_GUTTER_GAP = 1;\n\n/**\n * Responsive rail width: ~26% of the terminal, clamped to [34, 48] so the rail\n * grows on fullscreen terminals while the content column stays dominant.\n * The pinned overlay and the reserved gutter must both use this function.\n */\nexport function statusSidebarWidth(termWidth: number): number {\n\treturn Math.max(STATUS_SIDEBAR_WIDTH, Math.min(STATUS_SIDEBAR_MAX_WIDTH, Math.floor(termWidth * 0.26)));\n}\n\n/**\n * Responsive MCP roster rows: taller terminals list more servers before the\n * \"+N more\" collapse. ~24 rows of the rail are fixed chrome (header, model,\n * context, tokens, system), the rest is available to the roster.\n */\nexport function mcpMaxRows(termRows: number): number {\n\treturn Math.max(4, Math.min(18, termRows - 24));\n}\n\nconst METER_CELLS = 12;\nconst METER_MAX_CELLS = 24;\n/** Rolling window of CPU samples feeding the activity sparkline (wide rails show more history). */\nconst SPARK_WINDOW = 44;\n/** Minimum interval between sparkline samples so the rail animates, not jitters. */\nconst SPARK_SAMPLE_MS = 1000;\n/** MCP inventory is read from disk; cache it so per-frame renders stay cheap. */\nconst MCP_CACHE_TTL_MS = 5000;\n/** Protocol-ping cadence for live MCP connectivity (render-triggered, fire-and-forget). */\nconst MCP_HEALTH_INTERVAL_MS = 15_000;\n/** Failed servers are re-attempted on this slower cadence, never on every probe. */\nconst MCP_RECONNECT_INTERVAL_MS = 60_000;\nconst SPARK_CHARS = [\"▁\", \"▂\", \"▃\", \"▄\", \"▅\", \"▆\", \"▇\", \"█\"] as const;\n\ntype SubscriptionUsageFetcher = (\n\tsession: AgentSession,\n\tprovider?: string,\n) => Promise<SubscriptionUsageSnapshot | undefined>;\ntype CodexUsageFetcher = (session: AgentSession) => Promise<CodexUsageSnapshot | undefined>;\ntype StatusSidebarOptions = Readonly<{\n\trequestRender?: () => void;\n\tfetchSubscriptionUsage?: SubscriptionUsageFetcher;\n\t/** Compatibility for callers that injected the original Codex-only fetcher. */\n\tfetchCodexUsage?: CodexUsageFetcher;\n}>;\n\n/**\n * Fixed right-rail sidebar that shows the bottom-bar (footer) status vertically,\n * styled after opencode's pinned side rails plus a live MCP server roster.\n *\n * Pinned via the `pinStatusSidebar` setting (or OMK_PIN_STATUS_SIDEBAR=1) and\n * toggled with app.sidebar.toggle (Ctrl+Q). While pinned, the bottom footer is\n * removed so the same data is not rendered twice.\n */\nexport class StatusSidebarComponent implements Component {\n\tprivate getSession: () => AgentSession;\n\tprivate footerData: ReadonlyFooterDataProvider;\n\tprivate getAutoCompactEnabled: () => boolean;\n\tprivate getTerminalRows: () => number;\n\tprivate requestRender: () => void;\n\tprivate fetchSubscriptionUsage: SubscriptionUsageFetcher;\n\n\t// --- living elements: rolling CPU sparkline + cached MCP/usage data ---\n\tprivate cpuHistory: number[] = [];\n\tprivate lastSparkSampleAt = 0;\n\tprivate mcpCache: { at: number; cwd: string; entries: McpServerEntry[] } | undefined;\n\tprivate lastMcpProbeAt = 0;\n\tprivate lastMcpReconnectAt = 0;\n\tprivate mcpProbeInFlight = false;\n\tprivate subscriptionUsage = new Map<string, SubscriptionUsageSnapshot>();\n\tprivate subscriptionUsageSession: AgentSession | undefined;\n\tprivate subscriptionUsageProviders: readonly string[] = [];\n\tprivate subscriptionUsageFetchedAt = new Map<string, number>();\n\tprivate subscriptionUsageInFlight = new Map<string, AgentSession>();\n\tprivate subscriptionUsageRevision = new Map<string, number>();\n\n\tconstructor(\n\t\tgetSession: () => AgentSession,\n\t\tfooterData: ReadonlyFooterDataProvider,\n\t\tgetAutoCompactEnabled: () => boolean,\n\t\tgetTerminalRows: () => number = () => 32,\n\t\toptions: StatusSidebarOptions = {},\n\t) {\n\t\tthis.getSession = getSession;\n\t\tthis.footerData = footerData;\n\t\tthis.getAutoCompactEnabled = getAutoCompactEnabled;\n\t\tthis.getTerminalRows = getTerminalRows;\n\t\tthis.requestRender = options.requestRender ?? (() => {});\n\t\tconst legacyFetcher = options.fetchCodexUsage;\n\t\tthis.fetchSubscriptionUsage =\n\t\t\toptions.fetchSubscriptionUsage ??\n\t\t\t(legacyFetcher\n\t\t\t\t? async (session, provider) =>\n\t\t\t\t\t\tgetSubscriptionUsageSource(provider)?.kind === \"codex\"\n\t\t\t\t\t\t\t? codexSubscriptionSnapshot(await legacyFetcher(session))\n\t\t\t\t\t\t\t: loadSubscriptionUsage(session, undefined, provider)\n\t\t\t\t: (session, provider) => loadSubscriptionUsage(session, undefined, provider));\n\t}\n\n\tinvalidate(): void {\n\t\t// Mostly stateless: status recomputes from the live session each render.\n\t\t// Only the sparkline history and MCP cache persist across frames.\n\t}\n\n\trender(width: number): string[] {\n\t\tconst session = this.getSession();\n\t\tconst state = session.state;\n\t\tthis.refreshMcpHealth(session);\n\t\tthis.refreshSubscriptionUsage(session);\n\t\tconst lines: string[] = [boxTop(width, \"STATUS RAIL\")];\n\n\t\t// --- Live header: session uptime + CPU activity sparkline ---\n\t\tlines.push(\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"up \")}${theme.fg(\"accent\", formatUptime(process.uptime()))}`),\n\t\t);\n\t\tlines.push(boxTextLine(width, this.sparkline(width)));\n\n\t\t// --- Location ---\n\t\tconst cwd = formatCwdForFooter(session.sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"cwd \")}${theme.fg(\"text\", cwd)}`));\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"git \")}${theme.fg(\"accent\", branch)}`));\n\t\t}\n\t\tconst sessionName = session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"sess \")}${theme.fg(\"text\", sessionName)}`));\n\t\t}\n\n\t\t// --- Model ---\n\t\tlines.push(sidebarRule(width, \"MODEL\"));\n\t\tlines.push(\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"id \")}${theme.fg(\"accent\", state.model?.id ?? \"no-model\")}`),\n\t\t);\n\t\tif (state.model?.reasoning) {\n\t\t\tlines.push(\n\t\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"think \")}${theme.fg(\"mdCode\", state.thinkingLevel || \"off\")}`),\n\t\t\t);\n\t\t}\n\n\t\t// --- Active provider subscription quota ---\n\t\tconst usageLines = this.subscriptionUsageSection(width);\n\t\tlines.push(...usageLines);\n\n\t\t// --- Context ---\n\t\tlines.push(sidebarRule(width, \"CONTEXT\"));\n\t\tconst contextUsage = session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? state.model?.contextWindow ?? 0;\n\t\tconst percent = contextUsage?.percent ?? null;\n\t\tconst auto = this.getAutoCompactEnabled() ? \" (auto)\" : \"\";\n\t\tconst percentLabel =\n\t\t\tpercent === null\n\t\t\t\t? `?/${formatTokens(contextWindow)}${auto}`\n\t\t\t\t: `${percent.toFixed(1)}%/${formatTokens(contextWindow)}${auto}`;\n\t\tconst percentColor: ThemeColor =\n\t\t\tpercent !== null && percent > 90 ? \"error\" : percent !== null && percent > 70 ? \"warning\" : \"success\";\n\t\tlines.push(boxTextLine(width, `${theme.fg(\"muted\", \"ctx \")}${theme.fg(percentColor, percentLabel)}`));\n\t\tlines.push(boxTextLine(width, meter(percent, width)));\n\n\t\t// --- Tokens (cumulative across all session entries, mirrors the footer) ---\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\t\tfor (const entry of session.sessionManager.getEntries()) {\n\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\ttotalInput += entry.message.usage.input;\n\t\t\t\ttotalOutput += entry.message.usage.output;\n\t\t\t\ttotalCacheRead += entry.message.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += entry.message.usage.cacheWrite;\n\t\t\t\ttotalCost += entry.message.usage.cost.total;\n\t\t\t}\n\t\t}\n\t\tlines.push(sidebarRule(width, \"TOKENS\"));\n\t\tlines.push(\n\t\t\tboxTextLine(\n\t\t\t\twidth,\n\t\t\t\t`${theme.fg(\"success\", `↑${formatTokens(totalInput)}`)} ${theme.fg(\"accent\", `↓${formatTokens(totalOutput)}`)}`,\n\t\t\t),\n\t\t);\n\t\tlines.push(\n\t\t\tboxTextLine(\n\t\t\t\twidth,\n\t\t\t\t`${theme.fg(\"muted\", `R${formatTokens(totalCacheRead)}`)} ${theme.fg(\"muted\", `W${formatTokens(totalCacheWrite)}`)}`,\n\t\t\t),\n\t\t);\n\t\tconst usingSubscription = state.model ? session.modelRegistry.isUsingOAuth(state.model) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tlines.push(\n\t\t\t\tboxTextLine(\n\t\t\t\t\twidth,\n\t\t\t\t\t`${theme.fg(\"muted\", \"cost \")}${theme.fg(\"warning\", `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`)}`,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// --- MCP roster (live connectivity + opencode-style stability dots) ---\n\t\tlines.push(...this.mcpSection(width, session, usageLines.length));\n\n\t\t// --- System ---\n\t\tlines.push(sidebarRule(width, \"SYSTEM\"));\n\t\tconst cpu = this.footerData.getCpuPercent();\n\t\tconst mem = this.footerData.getMemoryRssBytes();\n\t\tconst sysParts: string[] = [];\n\t\tif (cpu !== null) sysParts.push(`cpu ${cpu.toFixed(0)}%`);\n\t\tif (mem !== null) sysParts.push(`mem ${formatBytes(mem)}`);\n\t\tif (sysParts.length > 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"muted\", sysParts.join(\" \"))));\n\t\t}\n\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", formatPackageIntake(this.footerData.getPackageIntakeSummary()))));\n\n\t\t// --- Extension statuses ---\n\t\tconst statuses = this.footerData.getExtensionStatuses();\n\t\tif (statuses.size > 0) {\n\t\t\tlines.push(sidebarRule(width, \"EXT\"));\n\t\t\tfor (const [key, value] of statuses) {\n\t\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"mdCode\", key)} ${theme.fg(\"muted\", value)}`));\n\t\t\t}\n\t\t}\n\n\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", `${keyText(\"app.sidebar.toggle\")} unpin`)));\n\t\tlines.push(boxBottom(width));\n\t\treturn lines;\n\t}\n\n\tprivate refreshSubscriptionUsage(session: AgentSession): void {\n\t\tif (this.subscriptionUsageSession !== session) {\n\t\t\tthis.subscriptionUsage.clear();\n\t\t\tthis.subscriptionUsageFetchedAt.clear();\n\t\t\tthis.subscriptionUsageInFlight.clear();\n\t\t\tthis.subscriptionUsageRevision.clear();\n\t\t\tthis.subscriptionUsageSession = session;\n\t\t}\n\n\t\tconst providers = getConfiguredSubscriptionUsageProviders(session);\n\t\tthis.subscriptionUsageProviders = providers;\n\t\tconst configured = new Set(providers);\n\t\tfor (const provider of this.subscriptionUsage.keys()) {\n\t\t\tif (!configured.has(provider)) {\n\t\t\t\tthis.subscriptionUsage.delete(provider);\n\t\t\t\tthis.subscriptionUsageFetchedAt.delete(provider);\n\t\t\t\tthis.subscriptionUsageRevision.delete(provider);\n\t\t\t}\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tfor (const provider of providers) {\n\t\t\tconst source = getSubscriptionUsageSource(provider);\n\t\t\tconst revision = getSubscriptionUsageRevision(provider);\n\t\t\tconst revisionChanged = revision !== (this.subscriptionUsageRevision.get(provider) ?? 0);\n\t\t\tif (\n\t\t\t\t!source ||\n\t\t\t\tthis.subscriptionUsageInFlight.has(provider) ||\n\t\t\t\t(!revisionChanged && now - (this.subscriptionUsageFetchedAt.get(provider) ?? 0) < source.ttlMs)\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.subscriptionUsageFetchedAt.set(provider, now);\n\t\t\tthis.subscriptionUsageRevision.set(provider, revision);\n\t\t\tthis.subscriptionUsageInFlight.set(provider, session);\n\t\t\tvoid this.fetchSubscriptionUsage(session, provider)\n\t\t\t\t.then((snapshot) => {\n\t\t\t\t\tif (snapshot && this.getSession() === session && this.subscriptionUsageProviders.includes(provider)) {\n\t\t\t\t\t\tthis.subscriptionUsage.set(provider, snapshot);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(() => {\n\t\t\t\t\tif (this.getSession() === session && this.subscriptionUsageProviders.includes(provider)) {\n\t\t\t\t\t\tthis.subscriptionUsage.set(provider, {\n\t\t\t\t\t\t\tlabel: source.label,\n\t\t\t\t\t\t\twindows: [],\n\t\t\t\t\t\t\tmessage: \"usage unavailable\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tif (this.subscriptionUsageInFlight.get(provider) === session) {\n\t\t\t\t\t\tthis.subscriptionUsageInFlight.delete(provider);\n\t\t\t\t\t}\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t});\n\t\t}\n\t}\n\n\tprivate subscriptionUsageSection(width: number): string[] {\n\t\tif (this.subscriptionUsageProviders.length === 0) return [];\n\t\tconst lines = [railRule(width, \"USAGE\", theme.fg(\"accent\", String(this.subscriptionUsageProviders.length)))];\n\t\tfor (const provider of this.subscriptionUsageProviders) {\n\t\t\tconst source = getSubscriptionUsageSource(provider);\n\t\t\tconst snapshot = this.subscriptionUsage.get(provider);\n\t\t\tconst label = snapshot?.label ?? source?.label;\n\t\t\tif (!label) continue;\n\t\t\tif (!snapshot) {\n\t\t\t\tif (this.subscriptionUsageInFlight.has(provider)) {\n\t\t\t\t\tlines.push(boxTextLine(width, `${theme.fg(\"accent\", label)} ${theme.fg(\"dim\", \"loading…\")}`));\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (snapshot.windows.length === 0) {\n\t\t\t\tlines.push(boxTextLine(width, theme.fg(\"accent\", label)));\n\t\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", snapshot.message ?? \"usage unavailable\")));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"accent\", label)));\n\t\t\tfor (const window of snapshot.windows) {\n\t\t\t\tlines.push(boxTextLine(width, usageMeter(window.label, window, width)));\n\t\t\t}\n\t\t\tconst resets = snapshot.windows.flatMap((window) =>\n\t\t\t\twindow.resetsAt === undefined ? [] : [`${window.label} ${formatReset(window.resetsAt)}`],\n\t\t\t);\n\t\t\tif (resets.length > 0) lines.push(boxTextLine(width, theme.fg(\"dim\", `reset ${resets.join(\" · \")}`)));\n\t\t}\n\t\treturn lines.length === 1 ? [] : lines;\n\t}\n\n\t/**\n\t * MCP server roster with a live-connected/total counter in the section\n\t * rule and a per-server state badge. Config inventory reads are cached;\n\t * live status comes from the session's MCP manager each frame.\n\t */\n\tprivate mcpSection(width: number, session: AgentSession, reservedRows = 0): string[] {\n\t\tconst cwd = session.sessionManager.getCwd();\n\t\tconst entries = this.loadMcpEntries(cwd);\n\t\tconst live = new Map(session.mcpServerStatus().map((status) => [status.name, status]));\n\t\tconst ready = [...live.values()].filter((status) => status.state === \"ready\").length;\n\t\tconst anyFailed = [...live.values()].some((status) => status.state === \"failed\");\n\t\tconst stable = entries.filter((entry) => classifyMcpStability(entry) === \"stable\").length;\n\t\tconst countColor: ThemeColor =\n\t\t\tentries.length === 0\n\t\t\t\t? \"dim\"\n\t\t\t\t: live.size > 0\n\t\t\t\t\t? anyFailed\n\t\t\t\t\t\t? \"error\"\n\t\t\t\t\t\t: ready === live.size\n\t\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t\t: \"warning\"\n\t\t\t\t\t: stable === entries.length\n\t\t\t\t\t\t? \"success\"\n\t\t\t\t\t\t: \"warning\";\n\t\tconst count =\n\t\t\tentries.length === 0 ? \"0\" : live.size > 0 ? `${ready}/${live.size}` : `${stable}/${entries.length}`;\n\n\t\tconst lines: string[] = [railRule(width, \"MCP\", theme.fg(countColor, count))];\n\t\tif (entries.length === 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", \"none configured\")));\n\t\t\treturn lines;\n\t\t}\n\n\t\tconst shown = entries.slice(0, mcpMaxRows(this.getTerminalRows() - reservedRows));\n\t\tfor (const entry of shown) {\n\t\t\tlines.push(boxTextLine(width, mcpRow(entry, width, live.get(entry.name))));\n\t\t}\n\t\tconst hidden = entries.length - shown.length;\n\t\tif (hidden > 0) {\n\t\t\tlines.push(boxTextLine(width, theme.fg(\"dim\", `+${hidden} more…`)));\n\t\t}\n\t\treturn lines;\n\t}\n\n\t/**\n\t * Keep the rail's MCP rows truthful: ping connected servers on a slow\n\t * cadence and retry failed ones even slower. Fire-and-forget from render —\n\t * the 2s metrics repaint supplies the ticks, so no extra timer exists to\n\t * leak. Probing never spawns connections: idle servers stay idle until a\n\t * tool call attaches them (manager lazy-connect design).\n\t */\n\tprivate refreshMcpHealth(session: AgentSession): void {\n\t\tconst now = Date.now();\n\t\tif (this.mcpProbeInFlight) return;\n\t\tconst probeDue = now - this.lastMcpProbeAt >= MCP_HEALTH_INTERVAL_MS;\n\t\tconst reconnectDue = now - this.lastMcpReconnectAt >= MCP_RECONNECT_INTERVAL_MS;\n\t\tif (!probeDue && !reconnectDue) return;\n\t\tif (session.mcpServerStatus().length === 0) return; // no MCP manager attached\n\t\tthis.mcpProbeInFlight = true;\n\t\tthis.lastMcpProbeAt = now;\n\t\tif (reconnectDue) this.lastMcpReconnectAt = now;\n\t\tvoid session\n\t\t\t.mcpCheckHealth({ reconnectFailed: reconnectDue })\n\t\t\t.catch(() => {})\n\t\t\t.finally(() => {\n\t\t\t\tthis.mcpProbeInFlight = false;\n\t\t\t\tthis.requestRender();\n\t\t\t});\n\t}\n\n\tprivate loadMcpEntries(cwd: string): McpServerEntry[] {\n\t\tconst now = Date.now();\n\t\tif (this.mcpCache && this.mcpCache.cwd === cwd && now - this.mcpCache.at < MCP_CACHE_TTL_MS) {\n\t\t\treturn this.mcpCache.entries;\n\t\t}\n\t\tlet entries: McpServerEntry[] = [];\n\t\ttry {\n\t\t\tentries = loadMcpInventory(cwd).entries;\n\t\t} catch {\n\t\t\tentries = [];\n\t\t}\n\t\tthis.mcpCache = { at: now, cwd, entries };\n\t\treturn entries;\n\t}\n\n\t/** Rolling CPU sparkline — a living pulse along the top of the rail. */\n\tprivate sparkline(width: number): string {\n\t\tconst now = Date.now();\n\t\tconst cpu = this.footerData.getCpuPercent();\n\t\tif (cpu !== null && now - this.lastSparkSampleAt >= SPARK_SAMPLE_MS) {\n\t\t\tthis.lastSparkSampleAt = now;\n\t\t\tthis.cpuHistory.push(Math.max(0, Math.min(100, cpu)));\n\t\t\tif (this.cpuHistory.length > SPARK_WINDOW) {\n\t\t\t\tthis.cpuHistory.shift();\n\t\t\t}\n\t\t}\n\n\t\tconst inner = Math.max(0, width - 4);\n\t\tconst label = theme.fg(\"muted\", \"act \");\n\t\tconst cells = Math.max(0, inner - visibleWidth(label));\n\t\tif (cells === 0 || this.cpuHistory.length === 0) {\n\t\t\treturn `${label}${theme.fg(\"borderMuted\", \"▁\".repeat(Math.max(0, cells)))}`;\n\t\t}\n\n\t\t// Right-align the window so the sparkline grows in from the left edge.\n\t\tconst window = this.cpuHistory.slice(-cells);\n\t\tconst bars = window.map((sample) => SPARK_CHARS[Math.min(7, Math.floor(sample / 12.6))]).join(\"\");\n\t\tconst pad = \"▁\".repeat(Math.max(0, cells - window.length));\n\t\treturn `${label}${theme.fg(\"borderMuted\", pad)}${theme.fg(\"accent\", bars)}`;\n\t}\n}\n\n/** Section rule with a right-aligned counter, e.g. `│─ MCP ─────── 22/24 │`. */\nfunction railRule(width: number, label: string, right: string): string {\n\tconst left = `${theme.fg(\"borderMuted\", \"─\")}${theme.fg(\"accent\", ` ${label} `)}`;\n\tconst rightText = ` ${right} `;\n\tconst fill = Math.max(0, width - 2 - visibleWidth(left) - visibleWidth(rightText));\n\tconst line = `${theme.fg(\"borderMuted\", \"│\")}${left}${theme.fg(\"borderMuted\", \"─\".repeat(fill))}${rightText}${theme.fg(\"borderMuted\", \"│\")}`;\n\treturn visibleWidth(line) <= width ? line : truncateToWidth(line, width, \"\");\n}\n\n/** One MCP server row: live-state badge + name + right-aligned detail, truncated to the rail width. */\nfunction mcpRow(entry: McpServerEntry, width: number, live?: McpServerStatus): string {\n\tconst badge = live ? liveMcpBadge(live) : configMcpBadge(entry);\n\tconst safeName = stripAnsi(entry.name)\n\t\t.replace(/[\\t\\r\\n]+/g, \" \")\n\t\t.replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f\\u200b-\\u200f\\u202a-\\u202e\\u2060-\\u206f]/g, \"\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\tconst detail = live ? liveMcpDetail(live) : \"\";\n\t// frame (4) + dot + space (2); detail is right-aligned with one gap column.\n\tconst detailText = detail ? ` ${detail}` : \"\";\n\tconst nameWidth = Math.max(1, width - 4 - 2 - visibleWidth(detailText));\n\tconst name = truncateToWidth(safeName || \"<unnamed>\", nameWidth, \"…\");\n\tconst pad = Math.max(0, width - 4 - 2 - visibleWidth(name) - visibleWidth(detailText));\n\treturn `${badge.dot} ${theme.fg(badge.nameColor, name)}${\" \".repeat(pad)}${detail ? theme.fg(\"dim\", detailText) : \"\"}`;\n}\n\nfunction configMcpBadge(entry: McpServerEntry): { dot: string; nameColor: ThemeColor } {\n\tconst stability = classifyMcpStability(entry);\n\treturn {\n\t\tdot:\n\t\t\tstability === \"stable\"\n\t\t\t\t? theme.fg(\"success\", \"●\")\n\t\t\t\t: stability === \"overridden\"\n\t\t\t\t\t? theme.fg(\"dim\", \"◐\")\n\t\t\t\t\t: theme.fg(\"warning\", \"○\"),\n\t\tnameColor: stability === \"stable\" ? \"text\" : stability === \"overridden\" ? \"dim\" : \"warning\",\n\t};\n}\n\nfunction liveMcpBadge(status: McpServerStatus): { dot: string; nameColor: ThemeColor } {\n\tswitch (status.state) {\n\t\tcase \"ready\":\n\t\t\treturn { dot: theme.fg(\"success\", \"●\"), nameColor: \"text\" };\n\t\tcase \"connecting\":\n\t\t\treturn { dot: theme.fg(\"warning\", \"◐\"), nameColor: \"text\" };\n\t\tcase \"failed\":\n\t\t\treturn status.error === \"disabled by configuration\"\n\t\t\t\t? { dot: theme.fg(\"dim\", \"○\"), nameColor: \"dim\" }\n\t\t\t\t: { dot: theme.fg(\"error\", \"✕\"), nameColor: \"error\" };\n\t\tdefault:\n\t\t\treturn { dot: theme.fg(\"dim\", \"○\"), nameColor: \"dim\" };\n\t}\n}\n\nfunction liveMcpDetail(status: McpServerStatus): string {\n\tswitch (status.state) {\n\t\tcase \"ready\":\n\t\t\treturn `${status.toolCount}t`;\n\t\tcase \"connecting\":\n\t\t\treturn \"…\";\n\t\tcase \"failed\":\n\t\t\treturn status.error === \"disabled by configuration\" ? \"off\" : \"failed\";\n\t\tdefault:\n\t\t\treturn \"idle\";\n\t}\n}\n\nfunction formatUptime(seconds: number): string {\n\tconst total = Math.max(0, Math.floor(seconds));\n\tconst h = Math.floor(total / 3600);\n\tconst m = Math.floor((total % 3600) / 60);\n\tconst s = total % 60;\n\tconst pad = (n: number) => n.toString().padStart(2, \"0\");\n\treturn h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;\n}\n\nfunction usageMeter(label: string, window: SubscriptionUsageWindow, width: number): string {\n\tconst percent = Math.max(0, Math.min(100, window.usedPercent));\n\tconst percentText = `${Math.round(percent)}%`;\n\tconst labelText = `${label} `;\n\tconst innerWidth = Math.max(0, width - 4);\n\tconst cells = Math.max(4, Math.min(METER_MAX_CELLS, innerWidth - labelText.length - percentText.length - 1));\n\tconst filled = Math.round((percent / 100) * cells);\n\tconst color = usageColor(percent);\n\treturn `${theme.fg(\"muted\", labelText)}${theme.fg(color, \"█\".repeat(filled))}${theme.fg(\"borderMuted\", \"░\".repeat(cells - filled))} ${theme.fg(color, percentText)}`;\n}\n\nfunction usageColor(percent: number): ThemeColor {\n\tif (percent >= 90) return \"error\";\n\tif (percent >= 75) return \"warning\";\n\treturn \"success\";\n}\n\nfunction codexSubscriptionSnapshot(snapshot: CodexUsageSnapshot | undefined): SubscriptionUsageSnapshot | undefined {\n\tif (!snapshot) return undefined;\n\treturn {\n\t\tlabel: \"CODEX\",\n\t\twindows: [\n\t\t\tsnapshot.fiveHour ? { label: \"5H\", ...snapshot.fiveHour } : undefined,\n\t\t\tsnapshot.sevenDay ? { label: \"7D\", ...snapshot.sevenDay } : undefined,\n\t\t].filter((window): window is SubscriptionUsageWindow => window !== undefined),\n\t};\n}\n\nfunction formatReset(resetsAt: number): string {\n\tconst seconds = Math.max(0, Math.ceil(resetsAt - Date.now() / 1000));\n\tif (seconds < 60) return \"now\";\n\tconst totalMinutes = Math.ceil(seconds / 60);\n\tif (totalMinutes < 60) return `${totalMinutes}m`;\n\tif (totalMinutes < 24 * 60) {\n\t\tconst hours = Math.floor(totalMinutes / 60);\n\t\tconst minutes = totalMinutes % 60;\n\t\treturn `${hours}h${minutes > 0 ? `${minutes}m` : \"\"}`;\n\t}\n\tconst totalHours = Math.ceil(totalMinutes / 60);\n\tconst days = Math.floor(totalHours / 24);\n\tconst hours = totalHours % 24;\n\treturn `${days}d${hours > 0 ? `${hours}h` : \"\"}`;\n}\n\nfunction meter(percent: number | null, width: number): string {\n\t// Fill the rail: frame (4) + space + up to \"100%\" (4) stay reserved.\n\tconst cells = Math.max(METER_CELLS, Math.min(METER_MAX_CELLS, width - 9));\n\tif (percent === null) {\n\t\treturn `${theme.fg(\"borderMuted\", \"░\".repeat(cells))} ${theme.fg(\"muted\", \"??%\")}`;\n\t}\n\tconst clamped = Math.max(0, Math.min(100, percent));\n\tconst filled = Math.round((clamped / 100) * cells);\n\tconst color: ThemeColor = clamped >= 85 ? \"warning\" : clamped >= 65 ? \"mdCode\" : \"success\";\n\treturn `${theme.fg(color, \"█\".repeat(filled))}${theme.fg(\"borderMuted\", \"░\".repeat(cells - filled))} ${theme.fg(color, `${Math.round(clamped)}%`)}`;\n}\n"]}
@@ -49,6 +49,9 @@ export declare class InteractiveMode {
49
49
  private onInputCallback?;
50
50
  private pendingUserInputs;
51
51
  private loadingAnimation;
52
+ private workingStartedAt;
53
+ private noticeContainer;
54
+ private noticeTimer;
52
55
  private workingMessage;
53
56
  private workingVisible;
54
57
  private workingIndicatorOptions;
@@ -276,6 +279,7 @@ export declare class InteractiveMode {
276
279
  renderInitialMessages(): void;
277
280
  getUserInput(): Promise<string>;
278
281
  private rebuildChatFromMessages;
282
+ private buildFinalSessionLog;
279
283
  private handleCtrlC;
280
284
  private handleCtrlD;
281
285
  /**
@@ -314,6 +318,9 @@ export declare class InteractiveMode {
314
318
  clearEditor(): void;
315
319
  showError(errorMessage: string): void;
316
320
  showWarning(warningMessage: string): void;
321
+ /** Show an auto-dismissing notice below the editor (single slot, replaces previous). */
322
+ private showTransientNotice;
323
+ private clearTransientNotice;
317
324
  showNewVersionNotification(release: LatestOmkRelease): void;
318
325
  showPackageUpdateNotification(packages: string[]): void;
319
326
  /**
@@ -396,6 +403,8 @@ export declare class InteractiveMode {
396
403
  private checkDaxnutsEasterEgg;
397
404
  private handleBashCommand;
398
405
  private handleCompactCommand;
399
- stop(): void;
406
+ stop(options?: {
407
+ finalSessionLog?: boolean;
408
+ }): void;
400
409
  }
401
410
  //# sourceMappingURL=interactive-mode.d.ts.map