open-multi-agent-kit 0.80.8 → 0.90.3

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 (208) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +21 -31
  3. package/dist/cli/args.d.ts +0 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +2 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session.d.ts +2 -0
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +41 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/automation/index.d.ts +359 -0
  12. package/dist/core/automation/index.d.ts.map +1 -0
  13. package/dist/core/automation/index.js +665 -0
  14. package/dist/core/automation/index.js.map +1 -0
  15. package/dist/core/bang-skill-invocation.d.ts +26 -0
  16. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  17. package/dist/core/bang-skill-invocation.js +59 -0
  18. package/dist/core/bang-skill-invocation.js.map +1 -0
  19. package/dist/core/browser-use.d.ts +8 -0
  20. package/dist/core/browser-use.d.ts.map +1 -1
  21. package/dist/core/browser-use.js +61 -23
  22. package/dist/core/browser-use.js.map +1 -1
  23. package/dist/core/compactor.d.ts.map +1 -1
  24. package/dist/core/compactor.js +0 -3
  25. package/dist/core/compactor.js.map +1 -1
  26. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  27. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  28. package/dist/core/context-budget-governor-v2.js +1 -0
  29. package/dist/core/context-budget-governor-v2.js.map +1 -1
  30. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  31. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  32. package/dist/core/context-budget-headroom-types.js.map +1 -1
  33. package/dist/core/context-budget-headroom.d.ts +1 -1
  34. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom.js +17 -4
  36. package/dist/core/context-budget-headroom.js.map +1 -1
  37. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  38. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  39. package/dist/core/context-budget-system-prompt.js +6 -1
  40. package/dist/core/context-budget-system-prompt.js.map +1 -1
  41. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  42. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  43. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  44. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  45. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  46. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  47. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  48. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  49. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  50. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  51. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  52. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  53. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  54. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  55. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  57. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  58. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  59. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  60. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  61. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  62. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  63. package/dist/core/context-budget-v2-cache.js +50 -0
  64. package/dist/core/context-budget-v2-cache.js.map +1 -0
  65. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  66. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  67. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  69. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  70. package/dist/core/context-budget-v2-planner.js +55 -2
  71. package/dist/core/context-budget-v2-planner.js.map +1 -1
  72. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  73. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  74. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  75. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  76. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  77. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  78. package/dist/core/context-budget-v2-selection.js +12 -2
  79. package/dist/core/context-budget-v2-selection.js.map +1 -1
  80. package/dist/core/context-budget-v2-types.d.ts +107 -1
  81. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  82. package/dist/core/context-budget-v2-types.js.map +1 -1
  83. package/dist/core/diagnostics.d.ts +2 -0
  84. package/dist/core/diagnostics.d.ts.map +1 -1
  85. package/dist/core/diagnostics.js.map +1 -1
  86. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/todo-checklist.js +3 -0
  88. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -1
  89. package/dist/core/footer-data-provider.d.ts +3 -1
  90. package/dist/core/footer-data-provider.d.ts.map +1 -1
  91. package/dist/core/footer-data-provider.js +4 -0
  92. package/dist/core/footer-data-provider.js.map +1 -1
  93. package/dist/core/headroom.d.ts.map +1 -1
  94. package/dist/core/headroom.js +0 -4
  95. package/dist/core/headroom.js.map +1 -1
  96. package/dist/core/hook-inventory.d.ts.map +1 -1
  97. package/dist/core/hook-inventory.js +6 -0
  98. package/dist/core/hook-inventory.js.map +1 -1
  99. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  100. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-computer-use-presets.js +158 -0
  102. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  103. package/dist/core/mcp-public-presets.d.ts +578 -0
  104. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  105. package/dist/core/mcp-public-presets.js +647 -0
  106. package/dist/core/mcp-public-presets.js.map +1 -0
  107. package/dist/core/model-registry.d.ts.map +1 -1
  108. package/dist/core/model-registry.js +1 -0
  109. package/dist/core/model-registry.js.map +1 -1
  110. package/dist/core/model-resolver.d.ts.map +1 -1
  111. package/dist/core/model-resolver.js +1 -0
  112. package/dist/core/model-resolver.js.map +1 -1
  113. package/dist/core/pi-package-intake-candidates.d.ts +34 -0
  114. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
  115. package/dist/core/pi-package-intake-candidates.js +291 -0
  116. package/dist/core/pi-package-intake-candidates.js.map +1 -0
  117. package/dist/core/pi-package-intake.d.ts +50 -0
  118. package/dist/core/pi-package-intake.d.ts.map +1 -0
  119. package/dist/core/pi-package-intake.js +132 -0
  120. package/dist/core/pi-package-intake.js.map +1 -0
  121. package/dist/core/provider-display-names.d.ts.map +1 -1
  122. package/dist/core/provider-display-names.js +1 -0
  123. package/dist/core/provider-display-names.js.map +1 -1
  124. package/dist/core/resource-loader.d.ts.map +1 -1
  125. package/dist/core/resource-loader.js +1 -0
  126. package/dist/core/resource-loader.js.map +1 -1
  127. package/dist/core/reverse-skill.d.ts +2 -0
  128. package/dist/core/reverse-skill.d.ts.map +1 -0
  129. package/dist/core/reverse-skill.js +7 -0
  130. package/dist/core/reverse-skill.js.map +1 -0
  131. package/dist/core/settings-manager.d.ts +3 -3
  132. package/dist/core/settings-manager.d.ts.map +1 -1
  133. package/dist/core/settings-manager.js.map +1 -1
  134. package/dist/core/skills.d.ts +4 -0
  135. package/dist/core/skills.d.ts.map +1 -1
  136. package/dist/core/skills.js +115 -43
  137. package/dist/core/skills.js.map +1 -1
  138. package/dist/core/system-prompt.d.ts +2 -0
  139. package/dist/core/system-prompt.d.ts.map +1 -1
  140. package/dist/core/system-prompt.js +58 -5
  141. package/dist/core/system-prompt.js.map +1 -1
  142. package/dist/core/todo-runtime-state.d.ts +5 -0
  143. package/dist/core/todo-runtime-state.d.ts.map +1 -0
  144. package/dist/core/todo-runtime-state.js +12 -0
  145. package/dist/core/todo-runtime-state.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +2 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/migrations.d.ts +19 -0
  151. package/dist/migrations.d.ts.map +1 -1
  152. package/dist/migrations.js +39 -15
  153. package/dist/migrations.js.map +1 -1
  154. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  155. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  157. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  158. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  159. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  160. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  161. package/dist/modes/interactive/components/control-panel-layout.d.ts +22 -1
  162. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/control-panel-layout.js +244 -68
  164. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  165. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +2 -1
  166. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  167. package/dist/modes/interactive/components/control-panel-runtime-status.js +20 -1
  168. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  170. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  171. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  172. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  173. package/dist/modes/interactive/components/control-panel.d.ts +9 -0
  174. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/control-panel.js +50 -6
  176. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  177. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/footer.js +6 -0
  179. package/dist/modes/interactive/components/footer.js.map +1 -1
  180. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/settings-selector.js +2 -1
  182. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  183. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  185. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  186. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  187. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  188. package/dist/modes/interactive/interactive-mode.js +70 -15
  189. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  190. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  191. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  192. package/dist/modes/interactive/theme/theme.js +5 -0
  193. package/dist/modes/interactive/theme/theme.js.map +1 -1
  194. package/docs/providers.md +12 -0
  195. package/docs/skills.md +8 -4
  196. package/docs/usage.md +4 -3
  197. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  198. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  199. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  200. package/examples/extensions/gondolin/package-lock.json +2 -2
  201. package/examples/extensions/gondolin/package.json +1 -1
  202. package/examples/extensions/preset.ts +2 -2
  203. package/examples/extensions/sandbox/package-lock.json +2 -2
  204. package/examples/extensions/sandbox/package.json +1 -1
  205. package/examples/extensions/with-deps/package-lock.json +2 -2
  206. package/examples/extensions/with-deps/package.json +1 -1
  207. package/npm-shrinkwrap.json +27 -34
  208. package/package.json +5 -5
@@ -1,26 +1,40 @@
1
- import { visibleWidth } from "omk-tui";
2
- import { getHeadroomRuntimeStatus } from "../../../core/context-budget-headroom.js";
3
- import { loadMcpInventory } from "../../../core/mcp-inventory.js";
1
+ import { truncateToWidth, visibleWidth } from "omk-tui";
2
+ import { nextActiveTodo, summary as todoSummary } from "../../../core/todo-state.js";
4
3
  import { theme } from "../theme/theme.js";
5
- import { boxBlankLine, boxBottom, boxCenteredLine, boxTextLine, boxTop, centerLine, composeColumns, divider, fitLine, sidebarRule, textLine, } from "./control-panel-box.js";
6
- const ASCII = [
7
- " ____ __ __ __ __",
8
- " / __ \\ / |/ / / //_/",
9
- " / /_/ // /|_/ / / ,< ",
10
- " \\____//_/ /_/ /_/|_| ",
4
+ import { boxBottom, boxCenteredLine, boxTextLine, boxTop, centerLine, composeColumns, divider, fitLine, sidebarRule, textLine, } from "./control-panel-box.js";
5
+ import { SPARKLE_ROW_BOTTOM, SPARKLE_ROW_TOP, sparkleRow } from "./control-panel-sparkles.js";
6
+ export const CONTROL_PANEL_ASCII_ART = [
7
+ " ███████ ██ ██ ██ ██",
8
+ "██ ██ ███ ███ ██ ██ ",
9
+ "██ ██ ████ ████ ██ ██ ",
10
+ "██ ██ ██ ██ ██ ██ █████ ",
11
+ "██ ██ ██ ███ ██ ██ ██ ",
12
+ "██ ██ ██ █ ██ ██ ██ ",
13
+ " ███████ ██ ██ ██ ██",
11
14
  ];
12
15
  const META_WIDTH = 31;
13
- const DECK_MIN_WIDTH = 112;
14
- const SIDEBAR_WIDTH = 38;
15
- const GAP_WIDTH = 2;
16
- export function renderControlPanelLayout(content, expanded, width) {
16
+ export const CONTROL_PANEL_OVERLAY_MIN_WIDTH = 112;
17
+ export const CONTROL_PANEL_DECK_MIN_WIDTH = CONTROL_PANEL_OVERLAY_MIN_WIDTH + 1;
18
+ export const CONTROL_PANEL_SIDEBAR_WIDTH = 38;
19
+ export const CONTROL_PANEL_GAP_WIDTH = 2;
20
+ const CONTEXT_METER_CELLS = 12;
21
+ const SPARKLINE_WIDTH = 16;
22
+ const SPARKLINE_GLYPHS = "▁▂▃▄▅▆▇█";
23
+ export function renderControlPanelLayout(content, expanded, width, bannerFrame, sparkleMs = 0) {
17
24
  if (width <= 0)
18
25
  return [];
19
- return expanded ? renderExpanded(content, width) : renderCompact(content, width);
26
+ return expanded
27
+ ? renderExpanded(content, width, bannerFrame, sparkleMs)
28
+ : renderCompact(content, width, bannerFrame, sparkleMs);
20
29
  }
21
- function renderCompact(content, width) {
22
- if (width >= DECK_MIN_WIDTH) {
23
- const deck = renderDeck(content, width);
30
+ export function renderControlPanelRightPane(content, width) {
31
+ if (width <= 0)
32
+ return [];
33
+ return sidebarPanel(content, width);
34
+ }
35
+ function renderCompact(content, width, bannerFrame, sparkleMs = 0) {
36
+ if (width >= CONTROL_PANEL_DECK_MIN_WIDTH) {
37
+ const deck = renderDeck(content, width, bannerFrame, sparkleMs);
24
38
  if (deck.length > 0)
25
39
  return deck;
26
40
  }
@@ -31,69 +45,176 @@ function renderCompact(content, width) {
31
45
  textLine(width, content.compactOnboarding(), "dim"),
32
46
  ];
33
47
  }
34
- function renderDeck(content, width) {
35
- const sidebarWidth = Math.min(SIDEBAR_WIDTH, Math.max(34, Math.floor(width * 0.28)));
36
- const leftWidth = width - GAP_WIDTH - sidebarWidth;
48
+ function renderDeck(content, width, bannerFrame, sparkleMs = 0) {
49
+ const { leftWidth, sidebarWidth } = deckWidths(width);
37
50
  if (leftWidth < 72)
38
51
  return [];
39
- const lines = composeColumns(heroPanel(content, leftWidth), leftWidth, sidebarPanel(content, sidebarWidth), sidebarWidth, GAP_WIDTH, width);
52
+ const lines = composeColumns(heroPanel(content, leftWidth, bannerFrame, sparkleMs), leftWidth, sidebarPanel(content, sidebarWidth), sidebarWidth, CONTROL_PANEL_GAP_WIDTH, width);
40
53
  lines.push(controlStripLine(content, width));
41
54
  lines.push(centerLine(width, content.compactOnboarding(), "dim"));
42
55
  return lines;
43
56
  }
44
- function heroPanel(content, width) {
45
- const rawThemeName = theme.name ?? "live";
46
- const themeName = (rawThemeName.startsWith("omk-") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();
47
- const modelLabel = modelStatusLabel(statusSnapshot(content));
57
+ function deckWidths(width) {
58
+ const sidebarWidth = Math.min(CONTROL_PANEL_SIDEBAR_WIDTH, Math.max(34, Math.floor(width * 0.28)));
59
+ return { leftWidth: width - CONTROL_PANEL_GAP_WIDTH - sidebarWidth, sidebarWidth };
60
+ }
61
+ function heroPanel(content, width, bannerFrame, sparkleMs = 0) {
62
+ const snapshot = statusSnapshot(content);
63
+ const innerWidth = Math.max(0, width - 4);
48
64
  return [
49
- boxTop(width, `omk v${content.version} · OMK//CONTROL`),
65
+ boxTop(width, `omk v${content.version} · OMK://CONTROL`),
50
66
  boxCenteredLine(width, theme.bold(theme.fg("accent", "OMK"))),
51
67
  boxCenteredLine(width, theme.fg("muted", "route · verify · loop · control")),
52
- boxBlankLine(width),
53
- ...ASCII.map((line, index) => {
54
- const color = index === 0 ? "accent" : index === 1 ? "warning" : index === 2 ? "success" : "mdCode";
68
+ boxTextLine(width, sparkleRow(innerWidth, SPARKLE_ROW_TOP, sparkleMs)),
69
+ ...(bannerFrame ?? CONTROL_PANEL_ASCII_ART).map((line, index) => {
70
+ if (bannerFrame)
71
+ return boxCenteredLine(width, line);
72
+ const color = index < 2 ? "mdCode" : index < 4 ? "accent" : index < 6 ? "success" : "warning";
55
73
  return boxCenteredLine(width, theme.fg(color, line));
56
74
  }),
57
- boxBlankLine(width),
58
- boxCenteredLine(width, `${theme.fg("warning", "*")} ${theme.bold("OMK")} / ${theme.fg("success", modelLabel)}`),
59
- boxCenteredLine(width, `${theme.fg("mdCode", "<>")} omk-control · ${theme.fg("accent", "route")} · ${theme.fg("warning", "verify")} · ${theme.fg("success", "loop")} · ${theme.fg("mdCode", themeName)}`),
75
+ boxTextLine(width, sparkleRow(innerWidth, SPARKLE_ROW_BOTTOM, sparkleMs)),
76
+ boxCenteredLine(width, `${theme.fg("warning", "")} ${theme.bold("OMK")} / ${theme.fg("success", heroModelLabel(snapshot))}`),
77
+ boxCenteredLine(width, `${theme.fg("mdCode", "")} omk-control · ${theme.fg("accent", "route")} · ${theme.fg("warning", "verify")} · ${theme.fg("success", "loop")} · ${theme.fg("mdCode", "control")}`),
60
78
  boxBottom(width),
61
79
  ];
62
80
  }
81
+ function heroModelLabel(snapshot) {
82
+ if (!snapshot.modelId)
83
+ return "no-model";
84
+ const think = snapshot.thinkingLevel;
85
+ return think && think !== "off" ? `${snapshot.modelId}:${think}` : snapshot.modelId;
86
+ }
63
87
  function sidebarPanel(content, width) {
64
88
  const snapshot = statusSnapshot(content);
65
- const headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? getHeadroomRuntimeStatus().policyId;
66
- const mcpCount = snapshot.mcpCount ?? loadMcpInventory().entries.length;
67
- const skillCount = snapshot.skillCount ?? 0;
89
+ const headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? "unknown";
90
+ const mcpCount = snapshot.mcpCount;
91
+ const skillCount = snapshot.skillCount;
92
+ const packageIntakeLabel = packageIntakeStatusLabel(snapshot.packageIntake);
93
+ const contextMeter = contextMeterLabel(snapshot);
94
+ const activitySparkline = activitySparklineLabel(snapshot);
68
95
  return [
69
96
  sidebarTabs(width),
70
97
  boxCenteredLine(width, theme.bold(theme.fg("accent", "OMK://CONTROL"))),
71
98
  boxCenteredLine(width, theme.bold(theme.fg("warning", "CYBERPUNK OPS CORE"))),
72
- boxCenteredLine(width, `${theme.fg("accent", "MATRIX RAIN")} // ${theme.fg("success", "NEON GRID ONLINE")}`),
73
- boxCenteredLine(width, theme.fg("mdCode", "NIGHT-CITY-MATRIX-V3")),
74
- sidebarRule(width, "STATUS"),
75
- boxTextLine(width, `${theme.fg("muted", "state:")} ${theme.fg("success", "* ready")}`),
76
- boxTextLine(width, `${theme.fg("muted", "route:")} route · evidence · loop · control`),
77
- sidebarRule(width, "TODO"),
78
- boxTextLine(width, `${theme.fg("muted", "next:")} add branch TODOs with /todos`),
79
- sidebarRule(width, "MODEL / CTX"),
80
- boxTextLine(width, `${theme.fg("muted", "model:")} ${modelStatusLabel(snapshot)}`),
81
- boxTextLine(width, `${theme.fg("muted", "think:")} ${snapshot.thinkingLevel ?? "off"}`),
82
- boxTextLine(width, `${theme.fg("muted", "ctx:")} ${theme.fg("success", contextStatusLabel(snapshot))}`),
83
- sidebarRule(width, "RUNTIME / MCP / SKILLS"),
84
- boxTextLine(width, `${theme.fg("muted", "headroom:")} ${headroomLabel}`),
85
- boxTextLine(width, `${theme.fg("muted", "omk:")} DAG:omk-parallel-orchestrator`),
86
- boxTextLine(width, `${theme.fg("muted", "res:")} MCP:${mcpCount} skills:${skillCount}`),
87
- sidebarRule(width, "CONTROL"),
88
- boxTextLine(width, `${theme.fg("muted", "route:")} ${theme.fg("success", "armed")}`),
89
- boxTextLine(width, `${theme.fg("muted", "verify:")} ${theme.fg("success", "evidence gated")}`),
90
- boxBottom(width),
99
+ boxCenteredLine(width, `${theme.fg("mdCode", "MATRIX RAIN")} // ${theme.fg("success", "NEON GRID ONLINE")}`),
100
+ boxCenteredLine(width, theme.fg("text", "NIGHT-CITY-MATRIX-V3")),
101
+ sidebarRule(width, "STATUS", "accent"),
102
+ boxTextLine(width, `${theme.fg("muted", "state:")} ${coloredStatus(snapshot.runtimeState ?? "unknown")}`),
103
+ boxTextLine(width, `${theme.fg("muted", "route:")} ${coloredStatus(snapshot.routeState ?? "unknown")}`),
104
+ boxTextLine(width, `${theme.fg("muted", "evidence:")} ${coloredStatus(snapshot.evidenceState ?? "unknown")}`),
105
+ sidebarRule(width, "TODO", "accent"),
106
+ ...todoSidebarLines(snapshot.todoState, width),
107
+ sidebarRule(width, "SESSION", "accent"),
108
+ semanticBoxTextLine(width, "cwd", snapshot.cwdLabel ?? "?", "end"),
109
+ semanticBoxTextLine(width, "git", snapshot.gitBranch ?? "?", "start"),
110
+ sidebarRule(width, "MODEL / CTX", "accent"),
111
+ semanticBoxTextLine(width, "model", modelStatusLabel(snapshot), "end"),
112
+ semanticBoxTextLine(width, "think", snapshot.thinkingLevel ?? "off", "start"),
113
+ boxTextLine(width, `${theme.fg("muted", "ctx:")} ${theme.fg(statusColor(snapshot.contextPercent === undefined || snapshot.contextPercent === null ? "unknown" : "ready"), contextStatusLabel(snapshot))}`),
114
+ boxTextLine(width, `${theme.fg("muted", "meter:")} ${contextMeter}`),
115
+ boxTextLine(width, `${theme.fg("muted", "pulse:")} ${activitySparkline}`),
116
+ sidebarRule(width, "RUNTIME / MCP / SKILLS", "accent"),
117
+ semanticBoxTextLine(width, "headroom", headroomLabel, "end"),
118
+ semanticBoxTextLine(width, "omk", snapshot.dagOrchestrationState ?? "unknown", "end"),
119
+ semanticBoxTextLine(width, "sidebar", snapshot.sidebarState ?? "unknown", "start"),
120
+ boxTextLine(width, `${theme.fg("muted", "res:")} MCP:${mcpCount ?? "?"} skills:${skillCount ?? "?"}`),
121
+ semanticBoxTextLine(width, "pkg", packageIntakeLabel, "end"),
122
+ sidebarRule(width, "CONTROL", "accent"),
123
+ boxTextLine(width, `${theme.fg("muted", "route:")} ${coloredStatus(snapshot.routeState ?? "unknown")}`),
124
+ boxTextLine(width, `${theme.fg("muted", "verify:")} ${coloredStatus(snapshot.evidenceState ?? "unknown")}`),
125
+ boxTextLine(width, `${theme.fg("muted", "control:")} ${coloredStatus(snapshot.controlState ?? "unknown")}`),
126
+ boxBottom(width, "accent"),
91
127
  ];
92
128
  }
93
- function renderExpanded(content, width) {
129
+ function semanticBoxTextLine(width, label, value, preserve) {
130
+ const prefix = `${theme.fg("muted", `${label}:`)} `;
131
+ const availableWidth = Math.max(0, width - 4 - visibleWidth(prefix));
132
+ return boxTextLine(width, `${prefix}${semanticTruncate(value, availableWidth, preserve)}`);
133
+ }
134
+ function semanticTruncate(value, maxWidth, preserve) {
135
+ if (visibleWidth(value) <= maxWidth)
136
+ return value;
137
+ if (maxWidth <= 0)
138
+ return "";
139
+ if (preserve === "start")
140
+ return truncateToWidth(value, maxWidth, "…");
141
+ const ellipsis = "…";
142
+ const targetWidth = maxWidth - visibleWidth(ellipsis);
143
+ if (targetWidth <= 0)
144
+ return truncateToWidth(ellipsis, maxWidth, "");
145
+ if (preserve === "middle") {
146
+ const headWidth = Math.max(1, Math.floor(targetWidth / 2));
147
+ const tailWidth = Math.max(1, targetWidth - headWidth);
148
+ return `${takeStart(value, headWidth)}${ellipsis}${takeEnd(value, tailWidth)}`;
149
+ }
150
+ return `${ellipsis}${takeEnd(value, targetWidth)}`;
151
+ }
152
+ function takeStart(value, maxWidth) {
153
+ let prefix = "";
154
+ for (const char of Array.from(value)) {
155
+ if (visibleWidth(prefix + char) > maxWidth)
156
+ break;
157
+ prefix += char;
158
+ }
159
+ return prefix;
160
+ }
161
+ function takeEnd(value, maxWidth) {
162
+ let suffix = "";
163
+ for (const char of Array.from(value).reverse()) {
164
+ if (visibleWidth(char + suffix) > maxWidth)
165
+ break;
166
+ suffix = char + suffix;
167
+ }
168
+ return suffix;
169
+ }
170
+ function statusToken(label, value) {
171
+ const state = value ?? "unknown";
172
+ return theme.fg(statusColor(state), `${label}:${state.toUpperCase()}`);
173
+ }
174
+ function coloredStatus(value) {
175
+ return theme.fg(statusColor(value), value);
176
+ }
177
+ function statusColor(value) {
178
+ const normalized = value.toLowerCase();
179
+ if (["ready", "on", "active", "available", "linked", "tracking", "pinned"].includes(normalized))
180
+ return "success";
181
+ if (["degraded", "limited", "blocked", "off"].includes(normalized))
182
+ return "warning";
183
+ return "muted";
184
+ }
185
+ function todoSidebarLines(state, width) {
186
+ if (!state || state.items.length === 0) {
187
+ return [
188
+ boxTextLine(width, `${theme.fg("muted", "todo:")} empty`),
189
+ boxTextLine(width, `${theme.fg("muted", "next:")} no active todos`),
190
+ ];
191
+ }
192
+ const counts = todoSummary(state);
193
+ const next = nextActiveTodo(state);
194
+ return [
195
+ boxTextLine(width, `${theme.fg("muted", "todo:")} ${counts.done}/${counts.total} done`),
196
+ semanticBoxTextLine(width, "next", next?.label ?? "complete", "middle"),
197
+ ];
198
+ }
199
+ function packageIntakeStatusLabel(summary) {
200
+ if (!summary)
201
+ return "ports:pending";
202
+ const ready = summary.acceptedNative + summary.acceptedReference + summary.acceptedMeasurement;
203
+ const review = summary.deferred + summary.reject;
204
+ return `ports:${ready}/${summary.total} review:${review} block:${summary.hardForkBlocked}`;
205
+ }
206
+ function renderExpanded(content, width, bannerFrame, sparkleMs = 0) {
207
+ if (width >= CONTROL_PANEL_DECK_MIN_WIDTH) {
208
+ const { leftWidth, sidebarWidth } = deckWidths(width);
209
+ const resourceLines = ["", ...content.onboarding().split("\n")];
210
+ const rightRail = blankSidebarRail(sidebarWidth, resourceLines.length);
211
+ const lines = [...renderDeck(content, width, bannerFrame, sparkleMs)];
212
+ lines.push(...composeColumns(resourceLines, leftWidth, rightRail, sidebarWidth, CONTROL_PANEL_GAP_WIDTH, width));
213
+ return lines;
214
+ }
94
215
  const lines = [divider(width, "OMK//CONTROL PANEL", "accent"), statusLine(content, width)];
95
216
  if (width >= 32)
96
- lines.push(...brandLines(width));
217
+ lines.push(...brandLines(content, width, bannerFrame));
97
218
  lines.push(divider(width, "SYSTEM MAP", "mdHeading"));
98
219
  for (const instruction of content.expandedInstructions().split("\n"))
99
220
  lines.push(textLine(width, instruction));
@@ -103,6 +224,9 @@ function renderExpanded(content, width) {
103
224
  lines.push(divider(width, "END", "borderMuted"));
104
225
  return lines;
105
226
  }
227
+ function blankSidebarRail(width, lineCount) {
228
+ return Array.from({ length: lineCount }, () => boxTextLine(width, ""));
229
+ }
106
230
  function statusSnapshot(content) {
107
231
  return content.statusSnapshot?.() ?? {};
108
232
  }
@@ -118,6 +242,52 @@ function contextStatusLabel(snapshot) {
118
242
  ? `?/${windowLabel}`
119
243
  : `${snapshot.contextPercent.toFixed(1)}%/${windowLabel}`;
120
244
  }
245
+ function contextMeterLabel(snapshot) {
246
+ const percent = normalizePercent(snapshot.contextPercent);
247
+ if (percent === undefined) {
248
+ return `${theme.fg("borderMuted", "░".repeat(CONTEXT_METER_CELLS))} ${theme.fg("muted", "??%")}`;
249
+ }
250
+ const filled = Math.max(0, Math.min(CONTEXT_METER_CELLS, Math.round((percent / 100) * CONTEXT_METER_CELLS)));
251
+ const color = percent >= 85 ? "warning" : percent >= 65 ? "mdCode" : "success";
252
+ return `${theme.fg(color, "█".repeat(filled))}${theme.fg("borderMuted", "░".repeat(CONTEXT_METER_CELLS - filled))} ${theme.fg(color, `${Math.round(percent)}%`)}`;
253
+ }
254
+ function activitySparklineLabel(snapshot) {
255
+ const seed = hashSnapshot(snapshot);
256
+ const glyphs = Array.from(SPARKLINE_GLYPHS);
257
+ const parts = [];
258
+ for (let index = 0; index < SPARKLINE_WIDTH; index++) {
259
+ const glyph = glyphs[(seed + index * 5 + index * index) % glyphs.length] ?? "▁";
260
+ const color = index % 5 === 0 ? "accent" : index % 3 === 0 ? "warning" : "success";
261
+ parts.push(theme.fg(color, glyph));
262
+ }
263
+ return parts.join("");
264
+ }
265
+ function normalizePercent(value) {
266
+ if (value === null || value === undefined || !Number.isFinite(value))
267
+ return undefined;
268
+ if (value < 0)
269
+ return 0;
270
+ if (value > 100)
271
+ return 100;
272
+ return value;
273
+ }
274
+ function hashSnapshot(snapshot) {
275
+ const source = [
276
+ snapshot.modelProvider,
277
+ snapshot.modelId,
278
+ snapshot.contextPercent?.toFixed(1),
279
+ snapshot.contextTokens,
280
+ snapshot.contextWindowTokens,
281
+ snapshot.cwdLabel,
282
+ snapshot.gitBranch,
283
+ ].join("|");
284
+ let hash = 2166136261;
285
+ for (let index = 0; index < source.length; index++) {
286
+ hash ^= source.charCodeAt(index);
287
+ hash = Math.imul(hash, 16777619);
288
+ }
289
+ return hash >>> 0;
290
+ }
121
291
  function formatTokens(count) {
122
292
  if (count < 1000)
123
293
  return count.toString();
@@ -133,31 +303,37 @@ function sidebarTabs(width) {
133
303
  return boxTextLine(width, fitLine(`${theme.bold(theme.fg("accent", "1:CONTROL"))} ${theme.fg("muted", "2:HISTORY")}`, Math.max(0, width - 4)));
134
304
  }
135
305
  function controlStripLine(content, width) {
136
- return centerLine(width, `${theme.bold(theme.fg("accent", "OMK//CONTROL READ"))} ${theme.fg("accent", "route/verify/loop/control")} · ${content.compactInstructions()}`);
306
+ return centerLine(width, `${theme.bold(theme.fg("accent", "OMK://CONTROL READ"))} ${theme.fg("accent", "route/verify/loop/control")} · ${content.compactInstructions()}`);
137
307
  }
138
- function brandLines(width) {
139
- const leftWidth = Math.max(...ASCII.map((line) => visibleWidth(line)));
308
+ function brandLines(content, width, bannerFrame) {
309
+ const art = bannerFrame ?? CONTROL_PANEL_ASCII_ART;
310
+ if (bannerFrame)
311
+ return art.map((line) => textLine(width, line));
312
+ const leftWidth = Math.max(...art.map((line) => visibleWidth(line)));
140
313
  const minWideWidth = visibleWidth("| ") + leftWidth + visibleWidth(" | ") + META_WIDTH;
141
314
  if (width < minWideWidth)
142
- return ASCII.map((line) => textLine(width, theme.fg("accent", line)));
143
- return ASCII.map((line, index) => textLine(width, `${theme.fg("accent", line.padEnd(leftWidth))}${theme.fg("borderMuted", " | ")}${metadataLines()[index] ?? ""}`));
315
+ return art.map((line) => textLine(width, theme.fg("accent", line)));
316
+ const snapshot = statusSnapshot(content);
317
+ return art.map((line, index) => textLine(width, `${fitLine(theme.fg("accent", line), leftWidth)}${theme.fg("borderMuted", " | ")}${metadataLines(snapshot)[index] ?? ""}`));
144
318
  }
145
- function metadataLines() {
319
+ function metadataLines(snapshot) {
146
320
  const rawThemeName = theme.name ?? "live";
147
321
  const themeName = (rawThemeName.startsWith("omk-") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();
148
322
  return [
149
- `${theme.fg("mdCode", "PANEL")} ${theme.fg("success", "ONLINE")}`,
323
+ `${theme.fg("mdCode", "PANEL")} ${coloredStatus(snapshot.runtimeState ?? "unknown")}`,
150
324
  `${theme.fg("mdCode", "THEME")} ${theme.fg("accent", themeName)}`,
151
- `${theme.fg("mdCode", "STARTUP")} ${theme.fg("warning", "ARMED")}`,
152
- `${theme.fg("mdCode", "LINK")} ${theme.fg("success", "READY")}`,
325
+ `${theme.fg("mdCode", "STARTUP")} ${coloredStatus(snapshot.startupState ?? "unknown")}`,
326
+ `${theme.fg("mdCode", "LINK")} ${coloredStatus(snapshot.linkState ?? "unknown")}`,
153
327
  ];
154
328
  }
155
329
  function statusLine(content, width) {
330
+ const snapshot = statusSnapshot(content);
156
331
  const segments = [
157
332
  theme.bold(theme.fg("accent", `${content.appName.toUpperCase()} v${content.version}`)),
158
- theme.fg("success", "CORE:READY"),
159
- theme.fg("mdCode", "ANSI:ON"),
160
- theme.fg("warning", "ASCII:ARMED"),
333
+ statusToken("CORE", snapshot.runtimeState),
334
+ statusToken("ANSI", snapshot.ansiColorState),
335
+ statusToken("STARTUP", snapshot.startupState),
336
+ statusToken("LINK", snapshot.linkState),
161
337
  theme.fg("muted", "THEME:LIVE"),
162
338
  ];
163
339
  return textLine(width, segments.join(theme.fg("borderMuted", " | ")));
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel-layout.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-layout.ts"],"names":[],"mappings":"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","sourcesContent":["import { visibleWidth } from \"omk-tui\";\nimport { getHeadroomRuntimeStatus } from \"../../../core/context-budget-headroom.ts\";\nimport { loadMcpInventory } from \"../../../core/mcp-inventory.ts\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\nimport {\n\tboxBlankLine,\n\tboxBottom,\n\tboxCenteredLine,\n\tboxTextLine,\n\tboxTop,\n\tcenterLine,\n\tcomposeColumns,\n\tdivider,\n\tfitLine,\n\tsidebarRule,\n\ttextLine,\n} from \"./control-panel-box.ts\";\n\nconst ASCII = [\n\t\" ____ __ __ __ __\",\n\t\" / __ \\\\ / |/ / / //_/\",\n\t\" / /_/ // /|_/ / / ,< \",\n\t\" \\\\____//_/ /_/ /_/|_| \",\n];\nconst META_WIDTH = 31;\nconst DECK_MIN_WIDTH = 112;\nconst SIDEBAR_WIDTH = 38;\nconst GAP_WIDTH = 2;\n\nexport interface ControlPanelContent {\n\tappName: string;\n\tversion: string;\n\tcompactInstructions: () => string;\n\texpandedInstructions: () => string;\n\tcompactOnboarding: () => string;\n\tonboarding: () => string;\n\tstatusSnapshot?: () => ControlPanelStatusSnapshot;\n}\n\nexport interface ControlPanelStatusSnapshot {\n\treadonly modelId?: string;\n\treadonly modelProvider?: string;\n\treadonly thinkingLevel?: string;\n\treadonly contextPercent?: number | null;\n\treadonly contextWindowTokens?: number;\n\treadonly contextTokens?: number | null;\n\treadonly headroomStatus?: string;\n\treadonly optimizerPolicy?: string;\n\treadonly skillCount?: number;\n\treadonly mcpCount?: number;\n}\n\nexport function renderControlPanelLayout(content: ControlPanelContent, expanded: boolean, width: number): string[] {\n\tif (width <= 0) return [];\n\treturn expanded ? renderExpanded(content, width) : renderCompact(content, width);\n}\n\nfunction renderCompact(content: ControlPanelContent, width: number): string[] {\n\tif (width >= DECK_MIN_WIDTH) {\n\t\tconst deck = renderDeck(content, width);\n\t\tif (deck.length > 0) return deck;\n\t}\n\treturn [\n\t\tdivider(width, \"OMK//CONTROL PANEL\", \"accent\"),\n\t\tstatusLine(content, width),\n\t\ttextLine(width, content.compactInstructions()),\n\t\ttextLine(width, content.compactOnboarding(), \"dim\"),\n\t];\n}\n\nfunction renderDeck(content: ControlPanelContent, width: number): string[] {\n\tconst sidebarWidth = Math.min(SIDEBAR_WIDTH, Math.max(34, Math.floor(width * 0.28)));\n\tconst leftWidth = width - GAP_WIDTH - sidebarWidth;\n\tif (leftWidth < 72) return [];\n\tconst lines = composeColumns(\n\t\theroPanel(content, leftWidth),\n\t\tleftWidth,\n\t\tsidebarPanel(content, sidebarWidth),\n\t\tsidebarWidth,\n\t\tGAP_WIDTH,\n\t\twidth,\n\t);\n\tlines.push(controlStripLine(content, width));\n\tlines.push(centerLine(width, content.compactOnboarding(), \"dim\"));\n\treturn lines;\n}\n\nfunction heroPanel(content: ControlPanelContent, width: number): string[] {\n\tconst rawThemeName = theme.name ?? \"live\";\n\tconst themeName = (rawThemeName.startsWith(\"omk-\") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();\n\tconst modelLabel = modelStatusLabel(statusSnapshot(content));\n\treturn [\n\t\tboxTop(width, `omk v${content.version} · OMK//CONTROL`),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"accent\", \"OMK\"))),\n\t\tboxCenteredLine(width, theme.fg(\"muted\", \"route · verify · loop · control\")),\n\t\tboxBlankLine(width),\n\t\t...ASCII.map((line, index) => {\n\t\t\tconst color: ThemeColor =\n\t\t\t\tindex === 0 ? \"accent\" : index === 1 ? \"warning\" : index === 2 ? \"success\" : \"mdCode\";\n\t\t\treturn boxCenteredLine(width, theme.fg(color, line));\n\t\t}),\n\t\tboxBlankLine(width),\n\t\tboxCenteredLine(width, `${theme.fg(\"warning\", \"*\")} ${theme.bold(\"OMK\")} / ${theme.fg(\"success\", modelLabel)}`),\n\t\tboxCenteredLine(\n\t\t\twidth,\n\t\t\t`${theme.fg(\"mdCode\", \"<>\")} omk-control · ${theme.fg(\"accent\", \"route\")} · ${theme.fg(\"warning\", \"verify\")} · ${theme.fg(\"success\", \"loop\")} · ${theme.fg(\"mdCode\", themeName)}`,\n\t\t),\n\t\tboxBottom(width),\n\t];\n}\n\nfunction sidebarPanel(content: ControlPanelContent, width: number): string[] {\n\tconst snapshot = statusSnapshot(content);\n\tconst headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? getHeadroomRuntimeStatus().policyId;\n\tconst mcpCount = snapshot.mcpCount ?? loadMcpInventory().entries.length;\n\tconst skillCount = snapshot.skillCount ?? 0;\n\treturn [\n\t\tsidebarTabs(width),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"accent\", \"OMK://CONTROL\"))),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"warning\", \"CYBERPUNK OPS CORE\"))),\n\t\tboxCenteredLine(width, `${theme.fg(\"accent\", \"MATRIX RAIN\")} // ${theme.fg(\"success\", \"NEON GRID ONLINE\")}`),\n\t\tboxCenteredLine(width, theme.fg(\"mdCode\", \"NIGHT-CITY-MATRIX-V3\")),\n\t\tsidebarRule(width, \"STATUS\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"state:\")} ${theme.fg(\"success\", \"* ready\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"route:\")} route · evidence · loop · control`),\n\t\tsidebarRule(width, \"TODO\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"next:\")} add branch TODOs with /todos`),\n\t\tsidebarRule(width, \"MODEL / CTX\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"model:\")} ${modelStatusLabel(snapshot)}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"think:\")} ${snapshot.thinkingLevel ?? \"off\"}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"ctx:\")} ${theme.fg(\"success\", contextStatusLabel(snapshot))}`),\n\t\tsidebarRule(width, \"RUNTIME / MCP / SKILLS\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"headroom:\")} ${headroomLabel}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"omk:\")} DAG:omk-parallel-orchestrator`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"res:\")} MCP:${mcpCount} skills:${skillCount}`),\n\t\tsidebarRule(width, \"CONTROL\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"route:\")} ${theme.fg(\"success\", \"armed\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"verify:\")} ${theme.fg(\"success\", \"evidence gated\")}`),\n\t\tboxBottom(width),\n\t];\n}\n\nfunction renderExpanded(content: ControlPanelContent, width: number): string[] {\n\tconst lines = [divider(width, \"OMK//CONTROL PANEL\", \"accent\"), statusLine(content, width)];\n\tif (width >= 32) lines.push(...brandLines(width));\n\tlines.push(divider(width, \"SYSTEM MAP\", \"mdHeading\"));\n\tfor (const instruction of content.expandedInstructions().split(\"\\n\")) lines.push(textLine(width, instruction));\n\tlines.push(divider(width, \"STARTUP LINK\", \"success\"));\n\tfor (const onboardingLine of content.onboarding().split(\"\\n\")) lines.push(textLine(width, onboardingLine, \"dim\"));\n\tlines.push(divider(width, \"END\", \"borderMuted\"));\n\treturn lines;\n}\n\nfunction statusSnapshot(content: ControlPanelContent): ControlPanelStatusSnapshot {\n\treturn content.statusSnapshot?.() ?? {};\n}\n\nfunction modelStatusLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tif (!snapshot.modelId) return \"no-model\";\n\treturn snapshot.modelProvider ? `${snapshot.modelProvider}/${snapshot.modelId}` : snapshot.modelId;\n}\n\nfunction contextStatusLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tconst windowTokens = snapshot.contextWindowTokens ?? 0;\n\tconst windowLabel = windowTokens > 0 ? formatTokens(windowTokens) : \"?\";\n\treturn snapshot.contextPercent === null || snapshot.contextPercent === undefined\n\t\t? `?/${windowLabel}`\n\t\t: `${snapshot.contextPercent.toFixed(1)}%/${windowLabel}`;\n}\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction sidebarTabs(width: number): string {\n\treturn boxTextLine(\n\t\twidth,\n\t\tfitLine(\n\t\t\t`${theme.bold(theme.fg(\"accent\", \"1:CONTROL\"))} ${theme.fg(\"muted\", \"2:HISTORY\")}`,\n\t\t\tMath.max(0, width - 4),\n\t\t),\n\t);\n}\n\nfunction controlStripLine(content: ControlPanelContent, width: number): string {\n\treturn centerLine(\n\t\twidth,\n\t\t`${theme.bold(theme.fg(\"accent\", \"OMK//CONTROL READ\"))} ${theme.fg(\"accent\", \"route/verify/loop/control\")} · ${content.compactInstructions()}`,\n\t);\n}\n\nfunction brandLines(width: number): string[] {\n\tconst leftWidth = Math.max(...ASCII.map((line) => visibleWidth(line)));\n\tconst minWideWidth = visibleWidth(\"| \") + leftWidth + visibleWidth(\" | \") + META_WIDTH;\n\tif (width < minWideWidth) return ASCII.map((line) => textLine(width, theme.fg(\"accent\", line)));\n\treturn ASCII.map((line, index) =>\n\t\ttextLine(\n\t\t\twidth,\n\t\t\t`${theme.fg(\"accent\", line.padEnd(leftWidth))}${theme.fg(\"borderMuted\", \" | \")}${metadataLines()[index] ?? \"\"}`,\n\t\t),\n\t);\n}\n\nfunction metadataLines(): string[] {\n\tconst rawThemeName = theme.name ?? \"live\";\n\tconst themeName = (rawThemeName.startsWith(\"omk-\") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();\n\treturn [\n\t\t`${theme.fg(\"mdCode\", \"PANEL\")} ${theme.fg(\"success\", \"ONLINE\")}`,\n\t\t`${theme.fg(\"mdCode\", \"THEME\")} ${theme.fg(\"accent\", themeName)}`,\n\t\t`${theme.fg(\"mdCode\", \"STARTUP\")} ${theme.fg(\"warning\", \"ARMED\")}`,\n\t\t`${theme.fg(\"mdCode\", \"LINK\")} ${theme.fg(\"success\", \"READY\")}`,\n\t];\n}\n\nfunction statusLine(content: ControlPanelContent, width: number): string {\n\tconst segments = [\n\t\ttheme.bold(theme.fg(\"accent\", `${content.appName.toUpperCase()} v${content.version}`)),\n\t\ttheme.fg(\"success\", \"CORE:READY\"),\n\t\ttheme.fg(\"mdCode\", \"ANSI:ON\"),\n\t\ttheme.fg(\"warning\", \"ASCII:ARMED\"),\n\t\ttheme.fg(\"muted\", \"THEME:LIVE\"),\n\t];\n\treturn textLine(width, segments.join(theme.fg(\"borderMuted\", \" | \")));\n}\n"]}
1
+ {"version":3,"file":"control-panel-layout.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-layout.ts"],"names":[],"mappings":"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","sourcesContent":["import { truncateToWidth, visibleWidth } from \"omk-tui\";\nimport type { PiPackageIntakeSummary } from \"../../../core/pi-package-intake.ts\";\nimport { nextActiveTodo, type TodoState, summary as todoSummary } from \"../../../core/todo-state.ts\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\nimport {\n\tboxBottom,\n\tboxCenteredLine,\n\tboxTextLine,\n\tboxTop,\n\tcenterLine,\n\tcomposeColumns,\n\tdivider,\n\tfitLine,\n\tsidebarRule,\n\ttextLine,\n} from \"./control-panel-box.ts\";\nimport { SPARKLE_ROW_BOTTOM, SPARKLE_ROW_TOP, sparkleRow } from \"./control-panel-sparkles.ts\";\n\nexport const CONTROL_PANEL_ASCII_ART = [\n\t\" ███████ ██ ██ ██ ██\",\n\t\"██ ██ ███ ███ ██ ██ \",\n\t\"██ ██ ████ ████ ██ ██ \",\n\t\"██ ██ ██ ██ ██ ██ █████ \",\n\t\"██ ██ ██ ███ ██ ██ ██ \",\n\t\"██ ██ ██ █ ██ ██ ██ \",\n\t\" ███████ ██ ██ ██ ██\",\n];\nconst META_WIDTH = 31;\nexport const CONTROL_PANEL_OVERLAY_MIN_WIDTH = 112;\nexport const CONTROL_PANEL_DECK_MIN_WIDTH = CONTROL_PANEL_OVERLAY_MIN_WIDTH + 1;\nexport const CONTROL_PANEL_SIDEBAR_WIDTH = 38;\nexport const CONTROL_PANEL_GAP_WIDTH = 2;\nconst CONTEXT_METER_CELLS = 12;\nconst SPARKLINE_WIDTH = 16;\nconst SPARKLINE_GLYPHS = \"▁▂▃▄▅▆▇█\";\n\nexport interface ControlPanelContent {\n\tappName: string;\n\tversion: string;\n\tcompactInstructions: () => string;\n\texpandedInstructions: () => string;\n\tcompactOnboarding: () => string;\n\tonboarding: () => string;\n\tstatusSnapshot?: () => ControlPanelStatusSnapshot;\n}\n\nexport interface ControlPanelStatusSnapshot {\n\treadonly modelId?: string;\n\treadonly modelProvider?: string;\n\treadonly thinkingLevel?: string;\n\treadonly contextPercent?: number | null;\n\treadonly contextWindowTokens?: number;\n\treadonly contextTokens?: number | null;\n\treadonly headroomStatus?: string;\n\treadonly optimizerPolicy?: string;\n\treadonly skillCount?: number;\n\treadonly mcpCount?: number;\n\treadonly packageIntake?: PiPackageIntakeSummary;\n\treadonly cwdLabel?: string;\n\treadonly gitBranch?: string | null;\n\treadonly todoState?: TodoState;\n\treadonly runtimeState?: string;\n\treadonly routeState?: string;\n\treadonly evidenceState?: string;\n\treadonly controlState?: string;\n\treadonly dagOrchestrationState?: string;\n\treadonly ansiColorState?: string;\n\treadonly startupState?: string;\n\treadonly linkState?: string;\n\treadonly sidebarState?: string;\n}\n\nexport function renderControlPanelLayout(\n\tcontent: ControlPanelContent,\n\texpanded: boolean,\n\twidth: number,\n\tbannerFrame?: string[],\n\tsparkleMs = 0,\n): string[] {\n\tif (width <= 0) return [];\n\treturn expanded\n\t\t? renderExpanded(content, width, bannerFrame, sparkleMs)\n\t\t: renderCompact(content, width, bannerFrame, sparkleMs);\n}\n\nexport function renderControlPanelRightPane(content: ControlPanelContent, width: number): string[] {\n\tif (width <= 0) return [];\n\treturn sidebarPanel(content, width);\n}\n\nfunction renderCompact(content: ControlPanelContent, width: number, bannerFrame?: string[], sparkleMs = 0): string[] {\n\tif (width >= CONTROL_PANEL_DECK_MIN_WIDTH) {\n\t\tconst deck = renderDeck(content, width, bannerFrame, sparkleMs);\n\t\tif (deck.length > 0) return deck;\n\t}\n\treturn [\n\t\tdivider(width, \"OMK//CONTROL PANEL\", \"accent\"),\n\t\tstatusLine(content, width),\n\t\ttextLine(width, content.compactInstructions()),\n\t\ttextLine(width, content.compactOnboarding(), \"dim\"),\n\t];\n}\n\nfunction renderDeck(content: ControlPanelContent, width: number, bannerFrame?: string[], sparkleMs = 0): string[] {\n\tconst { leftWidth, sidebarWidth } = deckWidths(width);\n\tif (leftWidth < 72) return [];\n\tconst lines = composeColumns(\n\t\theroPanel(content, leftWidth, bannerFrame, sparkleMs),\n\t\tleftWidth,\n\t\tsidebarPanel(content, sidebarWidth),\n\t\tsidebarWidth,\n\t\tCONTROL_PANEL_GAP_WIDTH,\n\t\twidth,\n\t);\n\tlines.push(controlStripLine(content, width));\n\tlines.push(centerLine(width, content.compactOnboarding(), \"dim\"));\n\treturn lines;\n}\n\nfunction deckWidths(width: number): { leftWidth: number; sidebarWidth: number } {\n\tconst sidebarWidth = Math.min(CONTROL_PANEL_SIDEBAR_WIDTH, Math.max(34, Math.floor(width * 0.28)));\n\treturn { leftWidth: width - CONTROL_PANEL_GAP_WIDTH - sidebarWidth, sidebarWidth };\n}\n\nfunction heroPanel(content: ControlPanelContent, width: number, bannerFrame?: string[], sparkleMs = 0): string[] {\n\tconst snapshot = statusSnapshot(content);\n\tconst innerWidth = Math.max(0, width - 4);\n\treturn [\n\t\tboxTop(width, `omk v${content.version} · OMK://CONTROL`),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"accent\", \"OMK\"))),\n\t\tboxCenteredLine(width, theme.fg(\"muted\", \"route · verify · loop · control\")),\n\t\tboxTextLine(width, sparkleRow(innerWidth, SPARKLE_ROW_TOP, sparkleMs)),\n\t\t...(bannerFrame ?? CONTROL_PANEL_ASCII_ART).map((line, index) => {\n\t\t\tif (bannerFrame) return boxCenteredLine(width, line);\n\t\t\tconst color: ThemeColor = index < 2 ? \"mdCode\" : index < 4 ? \"accent\" : index < 6 ? \"success\" : \"warning\";\n\t\t\treturn boxCenteredLine(width, theme.fg(color, line));\n\t\t}),\n\t\tboxTextLine(width, sparkleRow(innerWidth, SPARKLE_ROW_BOTTOM, sparkleMs)),\n\t\tboxCenteredLine(\n\t\t\twidth,\n\t\t\t`${theme.fg(\"warning\", \"●\")} ${theme.bold(\"OMK\")} / ${theme.fg(\"success\", heroModelLabel(snapshot))}`,\n\t\t),\n\t\tboxCenteredLine(\n\t\t\twidth,\n\t\t\t`${theme.fg(\"mdCode\", \"◇\")} omk-control · ${theme.fg(\"accent\", \"route\")} · ${theme.fg(\"warning\", \"verify\")} · ${theme.fg(\"success\", \"loop\")} · ${theme.fg(\"mdCode\", \"control\")}`,\n\t\t),\n\t\tboxBottom(width),\n\t];\n}\n\nfunction heroModelLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tif (!snapshot.modelId) return \"no-model\";\n\tconst think = snapshot.thinkingLevel;\n\treturn think && think !== \"off\" ? `${snapshot.modelId}:${think}` : snapshot.modelId;\n}\n\nfunction sidebarPanel(content: ControlPanelContent, width: number): string[] {\n\tconst snapshot = statusSnapshot(content);\n\tconst headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? \"unknown\";\n\tconst mcpCount = snapshot.mcpCount;\n\tconst skillCount = snapshot.skillCount;\n\tconst packageIntakeLabel = packageIntakeStatusLabel(snapshot.packageIntake);\n\tconst contextMeter = contextMeterLabel(snapshot);\n\tconst activitySparkline = activitySparklineLabel(snapshot);\n\treturn [\n\t\tsidebarTabs(width),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"accent\", \"OMK://CONTROL\"))),\n\t\tboxCenteredLine(width, theme.bold(theme.fg(\"warning\", \"CYBERPUNK OPS CORE\"))),\n\t\tboxCenteredLine(width, `${theme.fg(\"mdCode\", \"MATRIX RAIN\")} // ${theme.fg(\"success\", \"NEON GRID ONLINE\")}`),\n\t\tboxCenteredLine(width, theme.fg(\"text\", \"NIGHT-CITY-MATRIX-V3\")),\n\t\tsidebarRule(width, \"STATUS\", \"accent\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"state:\")} ${coloredStatus(snapshot.runtimeState ?? \"unknown\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"route:\")} ${coloredStatus(snapshot.routeState ?? \"unknown\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"evidence:\")} ${coloredStatus(snapshot.evidenceState ?? \"unknown\")}`),\n\t\tsidebarRule(width, \"TODO\", \"accent\"),\n\t\t...todoSidebarLines(snapshot.todoState, width),\n\t\tsidebarRule(width, \"SESSION\", \"accent\"),\n\t\tsemanticBoxTextLine(width, \"cwd\", snapshot.cwdLabel ?? \"?\", \"end\"),\n\t\tsemanticBoxTextLine(width, \"git\", snapshot.gitBranch ?? \"?\", \"start\"),\n\t\tsidebarRule(width, \"MODEL / CTX\", \"accent\"),\n\t\tsemanticBoxTextLine(width, \"model\", modelStatusLabel(snapshot), \"end\"),\n\t\tsemanticBoxTextLine(width, \"think\", snapshot.thinkingLevel ?? \"off\", \"start\"),\n\t\tboxTextLine(\n\t\t\twidth,\n\t\t\t`${theme.fg(\"muted\", \"ctx:\")} ${theme.fg(statusColor(snapshot.contextPercent === undefined || snapshot.contextPercent === null ? \"unknown\" : \"ready\"), contextStatusLabel(snapshot))}`,\n\t\t),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"meter:\")} ${contextMeter}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"pulse:\")} ${activitySparkline}`),\n\t\tsidebarRule(width, \"RUNTIME / MCP / SKILLS\", \"accent\"),\n\t\tsemanticBoxTextLine(width, \"headroom\", headroomLabel, \"end\"),\n\t\tsemanticBoxTextLine(width, \"omk\", snapshot.dagOrchestrationState ?? \"unknown\", \"end\"),\n\t\tsemanticBoxTextLine(width, \"sidebar\", snapshot.sidebarState ?? \"unknown\", \"start\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"res:\")} MCP:${mcpCount ?? \"?\"} skills:${skillCount ?? \"?\"}`),\n\t\tsemanticBoxTextLine(width, \"pkg\", packageIntakeLabel, \"end\"),\n\t\tsidebarRule(width, \"CONTROL\", \"accent\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"route:\")} ${coloredStatus(snapshot.routeState ?? \"unknown\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"verify:\")} ${coloredStatus(snapshot.evidenceState ?? \"unknown\")}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"control:\")} ${coloredStatus(snapshot.controlState ?? \"unknown\")}`),\n\t\tboxBottom(width, \"accent\"),\n\t];\n}\n\nfunction semanticBoxTextLine(\n\twidth: number,\n\tlabel: string,\n\tvalue: string,\n\tpreserve: \"start\" | \"middle\" | \"end\",\n): string {\n\tconst prefix = `${theme.fg(\"muted\", `${label}:`)} `;\n\tconst availableWidth = Math.max(0, width - 4 - visibleWidth(prefix));\n\treturn boxTextLine(width, `${prefix}${semanticTruncate(value, availableWidth, preserve)}`);\n}\n\nfunction semanticTruncate(value: string, maxWidth: number, preserve: \"start\" | \"middle\" | \"end\"): string {\n\tif (visibleWidth(value) <= maxWidth) return value;\n\tif (maxWidth <= 0) return \"\";\n\tif (preserve === \"start\") return truncateToWidth(value, maxWidth, \"…\");\n\tconst ellipsis = \"…\";\n\tconst targetWidth = maxWidth - visibleWidth(ellipsis);\n\tif (targetWidth <= 0) return truncateToWidth(ellipsis, maxWidth, \"\");\n\tif (preserve === \"middle\") {\n\t\tconst headWidth = Math.max(1, Math.floor(targetWidth / 2));\n\t\tconst tailWidth = Math.max(1, targetWidth - headWidth);\n\t\treturn `${takeStart(value, headWidth)}${ellipsis}${takeEnd(value, tailWidth)}`;\n\t}\n\treturn `${ellipsis}${takeEnd(value, targetWidth)}`;\n}\n\nfunction takeStart(value: string, maxWidth: number): string {\n\tlet prefix = \"\";\n\tfor (const char of Array.from(value)) {\n\t\tif (visibleWidth(prefix + char) > maxWidth) break;\n\t\tprefix += char;\n\t}\n\treturn prefix;\n}\n\nfunction takeEnd(value: string, maxWidth: number): string {\n\tlet suffix = \"\";\n\tfor (const char of Array.from(value).reverse()) {\n\t\tif (visibleWidth(char + suffix) > maxWidth) break;\n\t\tsuffix = char + suffix;\n\t}\n\treturn suffix;\n}\n\nfunction statusToken(label: string, value: string | undefined): string {\n\tconst state = value ?? \"unknown\";\n\treturn theme.fg(statusColor(state), `${label}:${state.toUpperCase()}`);\n}\n\nfunction coloredStatus(value: string): string {\n\treturn theme.fg(statusColor(value), value);\n}\n\nfunction statusColor(value: string): ThemeColor {\n\tconst normalized = value.toLowerCase();\n\tif ([\"ready\", \"on\", \"active\", \"available\", \"linked\", \"tracking\", \"pinned\"].includes(normalized)) return \"success\";\n\tif ([\"degraded\", \"limited\", \"blocked\", \"off\"].includes(normalized)) return \"warning\";\n\treturn \"muted\";\n}\n\nfunction todoSidebarLines(state: TodoState | undefined, width: number): string[] {\n\tif (!state || state.items.length === 0) {\n\t\treturn [\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"todo:\")} empty`),\n\t\t\tboxTextLine(width, `${theme.fg(\"muted\", \"next:\")} no active todos`),\n\t\t];\n\t}\n\tconst counts = todoSummary(state);\n\tconst next = nextActiveTodo(state);\n\treturn [\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"todo:\")} ${counts.done}/${counts.total} done`),\n\t\tsemanticBoxTextLine(width, \"next\", next?.label ?? \"complete\", \"middle\"),\n\t];\n}\n\nfunction packageIntakeStatusLabel(summary: PiPackageIntakeSummary | undefined): string {\n\tif (!summary) return \"ports:pending\";\n\tconst ready = summary.acceptedNative + summary.acceptedReference + summary.acceptedMeasurement;\n\tconst review = summary.deferred + summary.reject;\n\treturn `ports:${ready}/${summary.total} review:${review} block:${summary.hardForkBlocked}`;\n}\n\nfunction renderExpanded(content: ControlPanelContent, width: number, bannerFrame?: string[], sparkleMs = 0): string[] {\n\tif (width >= CONTROL_PANEL_DECK_MIN_WIDTH) {\n\t\tconst { leftWidth, sidebarWidth } = deckWidths(width);\n\t\tconst resourceLines = [\"\", ...content.onboarding().split(\"\\n\")];\n\t\tconst rightRail = blankSidebarRail(sidebarWidth, resourceLines.length);\n\t\tconst lines = [...renderDeck(content, width, bannerFrame, sparkleMs)];\n\t\tlines.push(...composeColumns(resourceLines, leftWidth, rightRail, sidebarWidth, CONTROL_PANEL_GAP_WIDTH, width));\n\t\treturn lines;\n\t}\n\n\tconst lines = [divider(width, \"OMK//CONTROL PANEL\", \"accent\"), statusLine(content, width)];\n\tif (width >= 32) lines.push(...brandLines(content, width, bannerFrame));\n\tlines.push(divider(width, \"SYSTEM MAP\", \"mdHeading\"));\n\tfor (const instruction of content.expandedInstructions().split(\"\\n\")) lines.push(textLine(width, instruction));\n\tlines.push(divider(width, \"STARTUP LINK\", \"success\"));\n\tfor (const onboardingLine of content.onboarding().split(\"\\n\")) lines.push(textLine(width, onboardingLine, \"dim\"));\n\tlines.push(divider(width, \"END\", \"borderMuted\"));\n\treturn lines;\n}\n\nfunction blankSidebarRail(width: number, lineCount: number): string[] {\n\treturn Array.from({ length: lineCount }, () => boxTextLine(width, \"\"));\n}\n\nfunction statusSnapshot(content: ControlPanelContent): ControlPanelStatusSnapshot {\n\treturn content.statusSnapshot?.() ?? {};\n}\n\nfunction modelStatusLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tif (!snapshot.modelId) return \"no-model\";\n\treturn snapshot.modelProvider ? `${snapshot.modelProvider}/${snapshot.modelId}` : snapshot.modelId;\n}\n\nfunction contextStatusLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tconst windowTokens = snapshot.contextWindowTokens ?? 0;\n\tconst windowLabel = windowTokens > 0 ? formatTokens(windowTokens) : \"?\";\n\treturn snapshot.contextPercent === null || snapshot.contextPercent === undefined\n\t\t? `?/${windowLabel}`\n\t\t: `${snapshot.contextPercent.toFixed(1)}%/${windowLabel}`;\n}\n\nfunction contextMeterLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tconst percent = normalizePercent(snapshot.contextPercent);\n\tif (percent === undefined) {\n\t\treturn `${theme.fg(\"borderMuted\", \"░\".repeat(CONTEXT_METER_CELLS))} ${theme.fg(\"muted\", \"??%\")}`;\n\t}\n\tconst filled = Math.max(0, Math.min(CONTEXT_METER_CELLS, Math.round((percent / 100) * CONTEXT_METER_CELLS)));\n\tconst color: ThemeColor = percent >= 85 ? \"warning\" : percent >= 65 ? \"mdCode\" : \"success\";\n\treturn `${theme.fg(color, \"█\".repeat(filled))}${theme.fg(\"borderMuted\", \"░\".repeat(CONTEXT_METER_CELLS - filled))} ${theme.fg(color, `${Math.round(percent)}%`)}`;\n}\n\nfunction activitySparklineLabel(snapshot: ControlPanelStatusSnapshot): string {\n\tconst seed = hashSnapshot(snapshot);\n\tconst glyphs = Array.from(SPARKLINE_GLYPHS);\n\tconst parts: string[] = [];\n\tfor (let index = 0; index < SPARKLINE_WIDTH; index++) {\n\t\tconst glyph = glyphs[(seed + index * 5 + index * index) % glyphs.length] ?? \"▁\";\n\t\tconst color: ThemeColor = index % 5 === 0 ? \"accent\" : index % 3 === 0 ? \"warning\" : \"success\";\n\t\tparts.push(theme.fg(color, glyph));\n\t}\n\treturn parts.join(\"\");\n}\n\nfunction normalizePercent(value: number | null | undefined): number | undefined {\n\tif (value === null || value === undefined || !Number.isFinite(value)) return undefined;\n\tif (value < 0) return 0;\n\tif (value > 100) return 100;\n\treturn value;\n}\n\nfunction hashSnapshot(snapshot: ControlPanelStatusSnapshot): number {\n\tconst source = [\n\t\tsnapshot.modelProvider,\n\t\tsnapshot.modelId,\n\t\tsnapshot.contextPercent?.toFixed(1),\n\t\tsnapshot.contextTokens,\n\t\tsnapshot.contextWindowTokens,\n\t\tsnapshot.cwdLabel,\n\t\tsnapshot.gitBranch,\n\t].join(\"|\");\n\tlet hash = 2166136261;\n\tfor (let index = 0; index < source.length; index++) {\n\t\thash ^= source.charCodeAt(index);\n\t\thash = Math.imul(hash, 16777619);\n\t}\n\treturn hash >>> 0;\n}\n\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\nfunction sidebarTabs(width: number): string {\n\treturn boxTextLine(\n\t\twidth,\n\t\tfitLine(\n\t\t\t`${theme.bold(theme.fg(\"accent\", \"1:CONTROL\"))} ${theme.fg(\"muted\", \"2:HISTORY\")}`,\n\t\t\tMath.max(0, width - 4),\n\t\t),\n\t);\n}\n\nfunction controlStripLine(content: ControlPanelContent, width: number): string {\n\treturn centerLine(\n\t\twidth,\n\t\t`${theme.bold(theme.fg(\"accent\", \"OMK://CONTROL READ\"))} ${theme.fg(\"accent\", \"route/verify/loop/control\")} · ${content.compactInstructions()}`,\n\t);\n}\n\nfunction brandLines(content: ControlPanelContent, width: number, bannerFrame?: string[]): string[] {\n\tconst art = bannerFrame ?? CONTROL_PANEL_ASCII_ART;\n\tif (bannerFrame) return art.map((line) => textLine(width, line));\n\tconst leftWidth = Math.max(...art.map((line) => visibleWidth(line)));\n\tconst minWideWidth = visibleWidth(\"| \") + leftWidth + visibleWidth(\" | \") + META_WIDTH;\n\tif (width < minWideWidth) return art.map((line) => textLine(width, theme.fg(\"accent\", line)));\n\tconst snapshot = statusSnapshot(content);\n\treturn art.map((line, index) =>\n\t\ttextLine(\n\t\t\twidth,\n\t\t\t`${fitLine(theme.fg(\"accent\", line), leftWidth)}${theme.fg(\"borderMuted\", \" | \")}${metadataLines(snapshot)[index] ?? \"\"}`,\n\t\t),\n\t);\n}\n\nfunction metadataLines(snapshot: ControlPanelStatusSnapshot): string[] {\n\tconst rawThemeName = theme.name ?? \"live\";\n\tconst themeName = (rawThemeName.startsWith(\"omk-\") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();\n\treturn [\n\t\t`${theme.fg(\"mdCode\", \"PANEL\")} ${coloredStatus(snapshot.runtimeState ?? \"unknown\")}`,\n\t\t`${theme.fg(\"mdCode\", \"THEME\")} ${theme.fg(\"accent\", themeName)}`,\n\t\t`${theme.fg(\"mdCode\", \"STARTUP\")} ${coloredStatus(snapshot.startupState ?? \"unknown\")}`,\n\t\t`${theme.fg(\"mdCode\", \"LINK\")} ${coloredStatus(snapshot.linkState ?? \"unknown\")}`,\n\t];\n}\n\nfunction statusLine(content: ControlPanelContent, width: number): string {\n\tconst snapshot = statusSnapshot(content);\n\tconst segments = [\n\t\ttheme.bold(theme.fg(\"accent\", `${content.appName.toUpperCase()} v${content.version}`)),\n\t\tstatusToken(\"CORE\", snapshot.runtimeState),\n\t\tstatusToken(\"ANSI\", snapshot.ansiColorState),\n\t\tstatusToken(\"STARTUP\", snapshot.startupState),\n\t\tstatusToken(\"LINK\", snapshot.linkState),\n\t\ttheme.fg(\"muted\", \"THEME:LIVE\"),\n\t];\n\treturn textLine(width, segments.join(theme.fg(\"borderMuted\", \" | \")));\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { AgentSession } from "../../../core/agent-session.ts";
2
+ import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.ts";
2
3
  import type { SessionManager } from "../../../core/session-manager.ts";
3
4
  import type { ControlPanelStatusSnapshot } from "./control-panel-layout.ts";
4
- export declare function createControlPanelStatusSnapshot(session: AgentSession, sessionManager: SessionManager): ControlPanelStatusSnapshot;
5
+ export declare function createControlPanelStatusSnapshot(session: AgentSession, sessionManager: SessionManager, footerData?: ReadonlyFooterDataProvider): ControlPanelStatusSnapshot;
5
6
  //# sourceMappingURL=control-panel-runtime-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel-runtime-status.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-runtime-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAE5E,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,cAAc,GAC5B,0BAA0B,CAgB5B","sourcesContent":["import type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { getHeadroomRuntimeStatus } from \"../../../core/context-budget-headroom.ts\";\nimport { loadMcpInventory } from \"../../../core/mcp-inventory.ts\";\nimport type { SessionManager } from \"../../../core/session-manager.ts\";\nimport type { ControlPanelStatusSnapshot } from \"./control-panel-layout.ts\";\n\nexport function createControlPanelStatusSnapshot(\n\tsession: AgentSession,\n\tsessionManager: SessionManager,\n): ControlPanelStatusSnapshot {\n\tconst contextUsage = session.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? session.state.model?.contextWindow ?? 0;\n\tconst headroom = getHeadroomRuntimeStatus();\n\treturn {\n\t\tmodelId: session.state.model?.id,\n\t\tmodelProvider: session.state.model?.provider,\n\t\tthinkingLevel: session.state.thinkingLevel ?? \"off\",\n\t\tcontextPercent: contextUsage?.percent ?? null,\n\t\tcontextWindowTokens: contextWindow,\n\t\tcontextTokens: contextUsage?.tokens ?? null,\n\t\theadroomStatus: headroom.policyId,\n\t\toptimizerPolicy: headroom.selector,\n\t\tmcpCount: loadMcpInventory(sessionManager.getCwd()).entries.length,\n\t\tskillCount: session.resourceLoader.getSkills().skills.length,\n\t};\n}\n"]}
1
+ {"version":3,"file":"control-panel-runtime-status.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-runtime-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAGxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAG5E,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,cAAc,EAC9B,UAAU,CAAC,EAAE,0BAA0B,GACrC,0BAA0B,CAgC5B","sourcesContent":["import type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { getHeadroomRuntimeStatus } from \"../../../core/context-budget-headroom.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { loadMcpInventory } from \"../../../core/mcp-inventory.ts\";\nimport { evaluatePiPackageIntake } from \"../../../core/pi-package-intake.ts\";\nimport type { SessionManager } from \"../../../core/session-manager.ts\";\nimport { getCurrentTodoState } from \"../../../core/todo-runtime-state.ts\";\nimport type { ControlPanelStatusSnapshot } from \"./control-panel-layout.ts\";\nimport { formatCwdForFooter } from \"./footer.ts\";\n\nexport function createControlPanelStatusSnapshot(\n\tsession: AgentSession,\n\tsessionManager: SessionManager,\n\tfooterData?: ReadonlyFooterDataProvider,\n): ControlPanelStatusSnapshot {\n\tconst contextUsage = session.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? session.state.model?.contextWindow ?? 0;\n\tconst headroom = getHeadroomRuntimeStatus();\n\tconst packageIntake = evaluatePiPackageIntake().summary;\n\tconst ansiColorState = process.env.NO_COLOR ? \"off\" : \"on\";\n\tconst cwdLabel = formatCwdForFooter(sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\treturn {\n\t\tmodelId: session.state.model?.id,\n\t\tmodelProvider: session.state.model?.provider,\n\t\tthinkingLevel: session.state.thinkingLevel ?? \"off\",\n\t\tcontextPercent: contextUsage?.percent ?? null,\n\t\tcontextWindowTokens: contextWindow,\n\t\tcontextTokens: contextUsage?.tokens ?? null,\n\t\theadroomStatus: headroom.policyId,\n\t\toptimizerPolicy: headroom.selector,\n\t\tmcpCount: loadMcpInventory(sessionManager.getCwd()).entries.length,\n\t\tskillCount: session.resourceLoader.getSkills().skills.length,\n\t\tpackageIntake,\n\t\tcwdLabel,\n\t\tgitBranch: footerData?.getGitBranch(),\n\t\ttodoState: getCurrentTodoState(),\n\t\truntimeState: \"ready\",\n\t\trouteState: \"active\",\n\t\tevidenceState: \"tracking\",\n\t\tcontrolState: \"ready\",\n\t\tdagOrchestrationState: \"DAG:omk-parallel-orchestrator\",\n\t\tansiColorState,\n\t\tstartupState: \"linked\",\n\t\tlinkState: \"ready\",\n\t\tsidebarState: \"pinned\",\n\t};\n}\n"]}
@@ -1,9 +1,15 @@
1
1
  import { getHeadroomRuntimeStatus } from "../../../core/context-budget-headroom.js";
2
2
  import { loadMcpInventory } from "../../../core/mcp-inventory.js";
3
- export function createControlPanelStatusSnapshot(session, sessionManager) {
3
+ import { evaluatePiPackageIntake } from "../../../core/pi-package-intake.js";
4
+ import { getCurrentTodoState } from "../../../core/todo-runtime-state.js";
5
+ import { formatCwdForFooter } from "./footer.js";
6
+ export function createControlPanelStatusSnapshot(session, sessionManager, footerData) {
4
7
  const contextUsage = session.getContextUsage();
5
8
  const contextWindow = contextUsage?.contextWindow ?? session.state.model?.contextWindow ?? 0;
6
9
  const headroom = getHeadroomRuntimeStatus();
10
+ const packageIntake = evaluatePiPackageIntake().summary;
11
+ const ansiColorState = process.env.NO_COLOR ? "off" : "on";
12
+ const cwdLabel = formatCwdForFooter(sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);
7
13
  return {
8
14
  modelId: session.state.model?.id,
9
15
  modelProvider: session.state.model?.provider,
@@ -15,6 +21,19 @@ export function createControlPanelStatusSnapshot(session, sessionManager) {
15
21
  optimizerPolicy: headroom.selector,
16
22
  mcpCount: loadMcpInventory(sessionManager.getCwd()).entries.length,
17
23
  skillCount: session.resourceLoader.getSkills().skills.length,
24
+ packageIntake,
25
+ cwdLabel,
26
+ gitBranch: footerData?.getGitBranch(),
27
+ todoState: getCurrentTodoState(),
28
+ runtimeState: "ready",
29
+ routeState: "active",
30
+ evidenceState: "tracking",
31
+ controlState: "ready",
32
+ dagOrchestrationState: "DAG:omk-parallel-orchestrator",
33
+ ansiColorState,
34
+ startupState: "linked",
35
+ linkState: "ready",
36
+ sidebarState: "pinned",
18
37
  };
19
38
  }
20
39
  //# sourceMappingURL=control-panel-runtime-status.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel-runtime-status.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-runtime-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAIlE,MAAM,UAAU,gCAAgC,CAC/C,OAAqB,EACrB,cAA8B,EACD;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;QAChC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ;QAC5C,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK;QACnD,cAAc,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;QAC7C,mBAAmB,EAAE,aAAa;QAClC,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;QAC3C,cAAc,EAAE,QAAQ,CAAC,QAAQ;QACjC,eAAe,EAAE,QAAQ,CAAC,QAAQ;QAClC,QAAQ,EAAE,gBAAgB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;QAClE,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM;KAC5D,CAAC;AAAA,CACF","sourcesContent":["import type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { getHeadroomRuntimeStatus } from \"../../../core/context-budget-headroom.ts\";\nimport { loadMcpInventory } from \"../../../core/mcp-inventory.ts\";\nimport type { SessionManager } from \"../../../core/session-manager.ts\";\nimport type { ControlPanelStatusSnapshot } from \"./control-panel-layout.ts\";\n\nexport function createControlPanelStatusSnapshot(\n\tsession: AgentSession,\n\tsessionManager: SessionManager,\n): ControlPanelStatusSnapshot {\n\tconst contextUsage = session.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? session.state.model?.contextWindow ?? 0;\n\tconst headroom = getHeadroomRuntimeStatus();\n\treturn {\n\t\tmodelId: session.state.model?.id,\n\t\tmodelProvider: session.state.model?.provider,\n\t\tthinkingLevel: session.state.thinkingLevel ?? \"off\",\n\t\tcontextPercent: contextUsage?.percent ?? null,\n\t\tcontextWindowTokens: contextWindow,\n\t\tcontextTokens: contextUsage?.tokens ?? null,\n\t\theadroomStatus: headroom.policyId,\n\t\toptimizerPolicy: headroom.selector,\n\t\tmcpCount: loadMcpInventory(sessionManager.getCwd()).entries.length,\n\t\tskillCount: session.resourceLoader.getSkills().skills.length,\n\t};\n}\n"]}
1
+ {"version":3,"file":"control-panel-runtime-status.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-runtime-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,gCAAgC,CAC/C,OAAqB,EACrB,cAA8B,EAC9B,UAAuC,EACV;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;IAC7F,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAC5C,MAAM,aAAa,GAAG,uBAAuB,EAAE,CAAC,OAAO,CAAC;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1G,OAAO;QACN,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;QAChC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ;QAC5C,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK;QACnD,cAAc,EAAE,YAAY,EAAE,OAAO,IAAI,IAAI;QAC7C,mBAAmB,EAAE,aAAa;QAClC,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI;QAC3C,cAAc,EAAE,QAAQ,CAAC,QAAQ;QACjC,eAAe,EAAE,QAAQ,CAAC,QAAQ;QAClC,QAAQ,EAAE,gBAAgB,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;QAClE,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM;QAC5D,aAAa;QACb,QAAQ;QACR,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE;QACrC,SAAS,EAAE,mBAAmB,EAAE;QAChC,YAAY,EAAE,OAAO;QACrB,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,UAAU;QACzB,YAAY,EAAE,OAAO;QACrB,qBAAqB,EAAE,+BAA+B;QACtD,cAAc;QACd,YAAY,EAAE,QAAQ;QACtB,SAAS,EAAE,OAAO;QAClB,YAAY,EAAE,QAAQ;KACtB,CAAC;AAAA,CACF","sourcesContent":["import type { AgentSession } from \"../../../core/agent-session.ts\";\nimport { getHeadroomRuntimeStatus } from \"../../../core/context-budget-headroom.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport { loadMcpInventory } from \"../../../core/mcp-inventory.ts\";\nimport { evaluatePiPackageIntake } from \"../../../core/pi-package-intake.ts\";\nimport type { SessionManager } from \"../../../core/session-manager.ts\";\nimport { getCurrentTodoState } from \"../../../core/todo-runtime-state.ts\";\nimport type { ControlPanelStatusSnapshot } from \"./control-panel-layout.ts\";\nimport { formatCwdForFooter } from \"./footer.ts\";\n\nexport function createControlPanelStatusSnapshot(\n\tsession: AgentSession,\n\tsessionManager: SessionManager,\n\tfooterData?: ReadonlyFooterDataProvider,\n): ControlPanelStatusSnapshot {\n\tconst contextUsage = session.getContextUsage();\n\tconst contextWindow = contextUsage?.contextWindow ?? session.state.model?.contextWindow ?? 0;\n\tconst headroom = getHeadroomRuntimeStatus();\n\tconst packageIntake = evaluatePiPackageIntake().summary;\n\tconst ansiColorState = process.env.NO_COLOR ? \"off\" : \"on\";\n\tconst cwdLabel = formatCwdForFooter(sessionManager.getCwd(), process.env.HOME || process.env.USERPROFILE);\n\treturn {\n\t\tmodelId: session.state.model?.id,\n\t\tmodelProvider: session.state.model?.provider,\n\t\tthinkingLevel: session.state.thinkingLevel ?? \"off\",\n\t\tcontextPercent: contextUsage?.percent ?? null,\n\t\tcontextWindowTokens: contextWindow,\n\t\tcontextTokens: contextUsage?.tokens ?? null,\n\t\theadroomStatus: headroom.policyId,\n\t\toptimizerPolicy: headroom.selector,\n\t\tmcpCount: loadMcpInventory(sessionManager.getCwd()).entries.length,\n\t\tskillCount: session.resourceLoader.getSkills().skills.length,\n\t\tpackageIntake,\n\t\tcwdLabel,\n\t\tgitBranch: footerData?.getGitBranch(),\n\t\ttodoState: getCurrentTodoState(),\n\t\truntimeState: \"ready\",\n\t\trouteState: \"active\",\n\t\tevidenceState: \"tracking\",\n\t\tcontrolState: \"ready\",\n\t\tdagOrchestrationState: \"DAG:omk-parallel-orchestrator\",\n\t\tansiColorState,\n\t\tstartupState: \"linked\",\n\t\tlinkState: \"ready\",\n\t\tsidebarState: \"pinned\",\n\t};\n}\n"]}