open-multi-agent-kit 0.90.0 → 0.90.4

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 (307) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +22 -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 +1 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/config.d.ts +3 -6
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +27 -19
  10. package/dist/config.js.map +1 -1
  11. package/dist/core/adaptorch-bridge.d.ts +257 -0
  12. package/dist/core/adaptorch-bridge.d.ts.map +1 -0
  13. package/dist/core/adaptorch-bridge.js +473 -0
  14. package/dist/core/adaptorch-bridge.js.map +1 -0
  15. package/dist/core/agent-session.d.ts +132 -0
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +327 -5
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/bang-skill-invocation.d.ts +26 -0
  20. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  21. package/dist/core/bang-skill-invocation.js +208 -0
  22. package/dist/core/bang-skill-invocation.js.map +1 -0
  23. package/dist/core/compaction/utils.d.ts.map +1 -1
  24. package/dist/core/compaction/utils.js +15 -2
  25. package/dist/core/compaction/utils.js.map +1 -1
  26. package/dist/core/compactor.d.ts.map +1 -1
  27. package/dist/core/compactor.js +0 -3
  28. package/dist/core/compactor.js.map +1 -1
  29. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  30. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  31. package/dist/core/context-budget-governor-v2.js +1 -0
  32. package/dist/core/context-budget-governor-v2.js.map +1 -1
  33. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  34. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom-types.js.map +1 -1
  36. package/dist/core/context-budget-headroom.d.ts +1 -1
  37. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  38. package/dist/core/context-budget-headroom.js +17 -4
  39. package/dist/core/context-budget-headroom.js.map +1 -1
  40. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  41. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  42. package/dist/core/context-budget-system-prompt.js +6 -1
  43. package/dist/core/context-budget-system-prompt.js.map +1 -1
  44. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  45. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  46. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  47. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  48. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  49. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  50. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  51. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  52. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  53. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  54. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  55. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  57. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  58. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  59. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  60. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  61. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  62. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  63. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  64. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  65. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  66. package/dist/core/context-budget-v2-cache.js +50 -0
  67. package/dist/core/context-budget-v2-cache.js.map +1 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  69. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  70. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  71. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  72. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  73. package/dist/core/context-budget-v2-planner.js +55 -2
  74. package/dist/core/context-budget-v2-planner.js.map +1 -1
  75. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  76. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  77. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  78. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  79. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  80. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  81. package/dist/core/context-budget-v2-selection.js +12 -2
  82. package/dist/core/context-budget-v2-selection.js.map +1 -1
  83. package/dist/core/context-budget-v2-types.d.ts +107 -1
  84. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  85. package/dist/core/context-budget-v2-types.js.map +1 -1
  86. package/dist/core/domain-loadouts.d.ts.map +1 -1
  87. package/dist/core/domain-loadouts.js +1 -1
  88. package/dist/core/domain-loadouts.js.map +1 -1
  89. package/dist/core/headroom.d.ts.map +1 -1
  90. package/dist/core/headroom.js +0 -4
  91. package/dist/core/headroom.js.map +1 -1
  92. package/dist/core/hook-inventory.d.ts.map +1 -1
  93. package/dist/core/hook-inventory.js +6 -0
  94. package/dist/core/hook-inventory.js.map +1 -1
  95. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  96. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  97. package/dist/core/mcp-computer-use-presets.js +158 -0
  98. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  99. package/dist/core/mcp-public-presets.d.ts +578 -0
  100. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-public-presets.js +647 -0
  102. package/dist/core/mcp-public-presets.js.map +1 -0
  103. package/dist/core/model-registry.d.ts.map +1 -1
  104. package/dist/core/model-registry.js +1 -0
  105. package/dist/core/model-registry.js.map +1 -1
  106. package/dist/core/pi-package-intake-candidates.d.ts +14 -1
  107. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
  108. package/dist/core/pi-package-intake-candidates.js +182 -0
  109. package/dist/core/pi-package-intake-candidates.js.map +1 -1
  110. package/dist/core/pi-package-intake.d.ts +8 -1
  111. package/dist/core/pi-package-intake.d.ts.map +1 -1
  112. package/dist/core/pi-package-intake.js +14 -4
  113. package/dist/core/pi-package-intake.js.map +1 -1
  114. package/dist/core/reasoning-router-bias.d.ts +119 -0
  115. package/dist/core/reasoning-router-bias.d.ts.map +1 -0
  116. package/dist/core/reasoning-router-bias.js +287 -0
  117. package/dist/core/reasoning-router-bias.js.map +1 -0
  118. package/dist/core/reasoning-router-v2.d.ts +94 -0
  119. package/dist/core/reasoning-router-v2.d.ts.map +1 -0
  120. package/dist/core/reasoning-router-v2.js +288 -0
  121. package/dist/core/reasoning-router-v2.js.map +1 -0
  122. package/dist/core/reasoning-router-v3.d.ts +15 -0
  123. package/dist/core/reasoning-router-v3.d.ts.map +1 -0
  124. package/dist/core/reasoning-router-v3.js +193 -0
  125. package/dist/core/reasoning-router-v3.js.map +1 -0
  126. package/dist/core/reasoning-router-v4-weights.d.ts +124 -0
  127. package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -0
  128. package/dist/core/reasoning-router-v4-weights.js +112 -0
  129. package/dist/core/reasoning-router-v4-weights.js.map +1 -0
  130. package/dist/core/reasoning-router-v4.d.ts +163 -0
  131. package/dist/core/reasoning-router-v4.d.ts.map +1 -0
  132. package/dist/core/reasoning-router-v4.js +683 -0
  133. package/dist/core/reasoning-router-v4.js.map +1 -0
  134. package/dist/core/reasoning-router-weights.d.ts +155 -0
  135. package/dist/core/reasoning-router-weights.d.ts.map +1 -0
  136. package/dist/core/reasoning-router-weights.js +204 -0
  137. package/dist/core/reasoning-router-weights.js.map +1 -0
  138. package/dist/core/reasoning-router.d.ts +44 -0
  139. package/dist/core/reasoning-router.d.ts.map +1 -0
  140. package/dist/core/reasoning-router.js +138 -0
  141. package/dist/core/reasoning-router.js.map +1 -0
  142. package/dist/core/reverse-skill.d.ts +2 -0
  143. package/dist/core/reverse-skill.d.ts.map +1 -0
  144. package/dist/core/reverse-skill.js +7 -0
  145. package/dist/core/reverse-skill.js.map +1 -0
  146. package/dist/core/router-feedback-collector.d.ts +101 -0
  147. package/dist/core/router-feedback-collector.d.ts.map +1 -0
  148. package/dist/core/router-feedback-collector.js +239 -0
  149. package/dist/core/router-feedback-collector.js.map +1 -0
  150. package/dist/core/settings-manager.d.ts +31 -3
  151. package/dist/core/settings-manager.d.ts.map +1 -1
  152. package/dist/core/settings-manager.js +16 -0
  153. package/dist/core/settings-manager.js.map +1 -1
  154. package/dist/core/slash-commands.d.ts.map +1 -1
  155. package/dist/core/slash-commands.js +4 -1
  156. package/dist/core/slash-commands.js.map +1 -1
  157. package/dist/core/system-prompt.d.ts +2 -0
  158. package/dist/core/system-prompt.d.ts.map +1 -1
  159. package/dist/core/system-prompt.js +58 -5
  160. package/dist/core/system-prompt.js.map +1 -1
  161. package/dist/index.d.ts +1 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +1 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/migrations.d.ts +19 -0
  166. package/dist/migrations.d.ts.map +1 -1
  167. package/dist/migrations.js +39 -15
  168. package/dist/migrations.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  170. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  171. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  172. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  173. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  175. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  176. package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
  177. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/control-panel-layout.js +212 -68
  179. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  180. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +15 -0
  181. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/control-panel-runtime-status.js +105 -5
  183. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  184. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  185. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  186. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  187. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  188. package/dist/modes/interactive/components/control-panel.d.ts +8 -0
  189. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/control-panel.js +40 -8
  191. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  192. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  193. package/dist/modes/interactive/components/settings-selector.js +2 -1
  194. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  195. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  196. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  197. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  198. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  199. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  200. package/dist/modes/interactive/interactive-mode.js +206 -32
  201. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  202. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  203. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  204. package/dist/modes/interactive/theme/theme.js +2 -0
  205. package/dist/modes/interactive/theme/theme.js.map +1 -1
  206. package/docs/loadout-domains/README.md +8 -6
  207. package/docs/loadout-domains/ai-agent-ops.md +3 -2
  208. package/docs/loadout-domains/backend-api.md +3 -2
  209. package/docs/loadout-domains/data-science.md +3 -2
  210. package/docs/loadout-domains/devops-infra.md +2 -1
  211. package/docs/loadout-domains/docs-writing.md +7 -2
  212. package/docs/loadout-domains/frontend-ui.md +42 -11
  213. package/docs/loadout-domains/korean-document.md +83 -0
  214. package/docs/loadout-domains/mobile.md +1 -1
  215. package/docs/loadout-domains/qa-testing.md +4 -2
  216. package/docs/loadout-domains/security-audit.md +2 -1
  217. package/docs/loadout-domains/visual-qa.md +94 -0
  218. package/docs/skills.md +11 -4
  219. package/docs/usage.md +39 -4
  220. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  221. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  222. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  223. package/examples/extensions/gondolin/package-lock.json +2 -2
  224. package/examples/extensions/gondolin/package.json +1 -1
  225. package/examples/extensions/preset.ts +2 -2
  226. package/examples/extensions/sandbox/package-lock.json +2 -2
  227. package/examples/extensions/sandbox/package.json +1 -1
  228. package/examples/extensions/with-deps/package-lock.json +2 -2
  229. package/examples/extensions/with-deps/package.json +1 -1
  230. package/npm-shrinkwrap.json +27 -34
  231. package/package.json +5 -5
  232. package/dist/agents/jailbreak/index.d.ts +0 -7
  233. package/dist/agents/jailbreak/index.d.ts.map +0 -1
  234. package/dist/agents/jailbreak/index.js +0 -7
  235. package/dist/agents/jailbreak/index.js.map +0 -1
  236. package/dist/agents/jailbreak/subagent-f.d.ts +0 -44
  237. package/dist/agents/jailbreak/subagent-f.d.ts.map +0 -1
  238. package/dist/agents/jailbreak/subagent-f.js +0 -60
  239. package/dist/agents/jailbreak/subagent-f.js.map +0 -1
  240. package/dist/cli/jailbreak-args.d.ts +0 -26
  241. package/dist/cli/jailbreak-args.d.ts.map +0 -1
  242. package/dist/cli/jailbreak-args.js +0 -86
  243. package/dist/cli/jailbreak-args.js.map +0 -1
  244. package/dist/commands/jailbreak.d.ts +0 -49
  245. package/dist/commands/jailbreak.d.ts.map +0 -1
  246. package/dist/commands/jailbreak.js +0 -201
  247. package/dist/commands/jailbreak.js.map +0 -1
  248. package/dist/encoding/index.d.ts +0 -6
  249. package/dist/encoding/index.d.ts.map +0 -1
  250. package/dist/encoding/index.js +0 -6
  251. package/dist/encoding/index.js.map +0 -1
  252. package/dist/encoding/l4-encoder.d.ts +0 -96
  253. package/dist/encoding/l4-encoder.d.ts.map +0 -1
  254. package/dist/encoding/l4-encoder.js +0 -474
  255. package/dist/encoding/l4-encoder.js.map +0 -1
  256. package/dist/fuzzing/index.d.ts +0 -6
  257. package/dist/fuzzing/index.d.ts.map +0 -1
  258. package/dist/fuzzing/index.js +0 -6
  259. package/dist/fuzzing/index.js.map +0 -1
  260. package/dist/fuzzing/mutation-engine.d.ts +0 -93
  261. package/dist/fuzzing/mutation-engine.d.ts.map +0 -1
  262. package/dist/fuzzing/mutation-engine.js +0 -244
  263. package/dist/fuzzing/mutation-engine.js.map +0 -1
  264. package/dist/jailbreak-extension.d.ts +0 -48
  265. package/dist/jailbreak-extension.d.ts.map +0 -1
  266. package/dist/jailbreak-extension.js +0 -47
  267. package/dist/jailbreak-extension.js.map +0 -1
  268. package/dist/modules/index.d.ts +0 -8
  269. package/dist/modules/index.d.ts.map +0 -1
  270. package/dist/modules/index.js +0 -7
  271. package/dist/modules/index.js.map +0 -1
  272. package/dist/modules/lrl-bypass.d.ts +0 -40
  273. package/dist/modules/lrl-bypass.d.ts.map +0 -1
  274. package/dist/modules/lrl-bypass.js +0 -84
  275. package/dist/modules/lrl-bypass.js.map +0 -1
  276. package/dist/modules/lrl-deps.d.ts +0 -38
  277. package/dist/modules/lrl-deps.d.ts.map +0 -1
  278. package/dist/modules/lrl-deps.js +0 -128
  279. package/dist/modules/lrl-deps.js.map +0 -1
  280. package/dist/multiturn/easl-chain.d.ts +0 -113
  281. package/dist/multiturn/easl-chain.d.ts.map +0 -1
  282. package/dist/multiturn/easl-chain.js +0 -351
  283. package/dist/multiturn/easl-chain.js.map +0 -1
  284. package/dist/multiturn/index.d.ts +0 -6
  285. package/dist/multiturn/index.d.ts.map +0 -1
  286. package/dist/multiturn/index.js +0 -6
  287. package/dist/multiturn/index.js.map +0 -1
  288. package/dist/routing/fallback-router.d.ts +0 -123
  289. package/dist/routing/fallback-router.d.ts.map +0 -1
  290. package/dist/routing/fallback-router.js +0 -355
  291. package/dist/routing/fallback-router.js.map +0 -1
  292. package/dist/routing/index.d.ts +0 -6
  293. package/dist/routing/index.d.ts.map +0 -1
  294. package/dist/routing/index.js +0 -6
  295. package/dist/routing/index.js.map +0 -1
  296. package/dist/types/jailbreak.d.ts +0 -246
  297. package/dist/types/jailbreak.d.ts.map +0 -1
  298. package/dist/types/jailbreak.js +0 -8
  299. package/dist/types/jailbreak.js.map +0 -1
  300. package/dist/utils/jailbreak/common.d.ts +0 -63
  301. package/dist/utils/jailbreak/common.d.ts.map +0 -1
  302. package/dist/utils/jailbreak/common.js +0 -130
  303. package/dist/utils/jailbreak/common.js.map +0 -1
  304. package/dist/utils/jailbreak/index.d.ts +0 -7
  305. package/dist/utils/jailbreak/index.d.ts.map +0 -1
  306. package/dist/utils/jailbreak/index.js +0 -7
  307. package/dist/utils/jailbreak/index.js.map +0 -1
@@ -1,27 +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";
4
2
  import { nextActiveTodo, summary as todoSummary } from "../../../core/todo-state.js";
5
3
  import { theme } from "../theme/theme.js";
6
- import { boxBlankLine, boxBottom, boxCenteredLine, boxTextLine, boxTop, centerLine, composeColumns, divider, fitLine, sidebarRule, textLine, } from "./control-panel-box.js";
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";
7
6
  export const CONTROL_PANEL_ASCII_ART = [
8
- " ____ __ __ __ __",
9
- " / __ \\ / |/ / / //_/",
10
- " / /_/ // /|_/ / / ,< ",
11
- " \\____//_/ /_/ /_/|_| ",
7
+ " ███████ ██ ██ ██ ██",
8
+ "██ ██ ███ ███ ██ ██ ",
9
+ "██ ██ ████ ████ ██ ██ ",
10
+ "██ ██ ██ ██ ██ ██ █████ ",
11
+ "██ ██ ██ ███ ██ ██ ██ ",
12
+ "██ ██ ██ █ ██ ██ ██ ",
13
+ " ███████ ██ ██ ██ ██",
12
14
  ];
13
15
  const META_WIDTH = 31;
14
- const DECK_MIN_WIDTH = 112;
15
- const SIDEBAR_WIDTH = 38;
16
- const GAP_WIDTH = 2;
17
- export function renderControlPanelLayout(content, expanded, width, bannerFrame) {
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) {
18
24
  if (width <= 0)
19
25
  return [];
20
- return expanded ? renderExpanded(content, width, bannerFrame) : renderCompact(content, width, bannerFrame);
26
+ return expanded
27
+ ? renderExpanded(content, width, bannerFrame, sparkleMs)
28
+ : renderCompact(content, width, bannerFrame, sparkleMs);
21
29
  }
22
- function renderCompact(content, width, bannerFrame) {
23
- if (width >= DECK_MIN_WIDTH) {
24
- const deck = renderDeck(content, width, bannerFrame);
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);
25
38
  if (deck.length > 0)
26
39
  return deck;
27
40
  }
@@ -32,72 +45,143 @@ function renderCompact(content, width, bannerFrame) {
32
45
  textLine(width, content.compactOnboarding(), "dim"),
33
46
  ];
34
47
  }
35
- function renderDeck(content, width, bannerFrame) {
36
- const sidebarWidth = Math.min(SIDEBAR_WIDTH, Math.max(34, Math.floor(width * 0.28)));
37
- const leftWidth = width - GAP_WIDTH - sidebarWidth;
48
+ function renderDeck(content, width, bannerFrame, sparkleMs = 0) {
49
+ const { leftWidth, sidebarWidth } = deckWidths(width);
38
50
  if (leftWidth < 72)
39
51
  return [];
40
- const lines = composeColumns(heroPanel(content, leftWidth, bannerFrame), 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);
41
53
  lines.push(controlStripLine(content, width));
42
54
  lines.push(centerLine(width, content.compactOnboarding(), "dim"));
43
55
  return lines;
44
56
  }
45
- function heroPanel(content, width, bannerFrame) {
46
- const rawThemeName = theme.name ?? "live";
47
- const themeName = (rawThemeName.startsWith("omk-") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();
48
- 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);
49
64
  return [
50
- boxTop(width, `omk v${content.version} · OMK//CONTROL`),
65
+ boxTop(width, `omk v${content.version} · OMK://CONTROL`),
51
66
  boxCenteredLine(width, theme.bold(theme.fg("accent", "OMK"))),
52
67
  boxCenteredLine(width, theme.fg("muted", "route · verify · loop · control")),
53
- boxBlankLine(width),
68
+ boxTextLine(width, sparkleRow(innerWidth, SPARKLE_ROW_TOP, sparkleMs)),
54
69
  ...(bannerFrame ?? CONTROL_PANEL_ASCII_ART).map((line, index) => {
55
70
  if (bannerFrame)
56
71
  return boxCenteredLine(width, line);
57
- const color = index === 0 ? "accent" : index === 1 ? "warning" : index === 2 ? "success" : "mdCode";
72
+ const color = index < 2 ? "mdCode" : index < 4 ? "accent" : index < 6 ? "success" : "warning";
58
73
  return boxCenteredLine(width, theme.fg(color, line));
59
74
  }),
60
- boxBlankLine(width),
61
- boxCenteredLine(width, `${theme.fg("warning", "*")} ${theme.bold("OMK")} / ${theme.fg("success", modelLabel)}`),
62
- 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")}`),
63
78
  boxBottom(width),
64
79
  ];
65
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
+ }
66
87
  function sidebarPanel(content, width) {
67
88
  const snapshot = statusSnapshot(content);
68
- const headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? getHeadroomRuntimeStatus().policyId;
69
- const mcpCount = snapshot.mcpCount ?? loadMcpInventory().entries.length;
70
- const skillCount = snapshot.skillCount ?? 0;
89
+ const headroomLabel = snapshot.headroomStatus ?? snapshot.optimizerPolicy ?? "unknown";
90
+ const mcpCount = snapshot.mcpCount;
91
+ const skillCount = snapshot.skillCount;
71
92
  const packageIntakeLabel = packageIntakeStatusLabel(snapshot.packageIntake);
93
+ const contextMeter = contextMeterLabel(snapshot);
94
+ const activitySparkline = activitySparklineLabel(snapshot);
72
95
  return [
73
96
  sidebarTabs(width),
74
97
  boxCenteredLine(width, theme.bold(theme.fg("accent", "OMK://CONTROL"))),
75
98
  boxCenteredLine(width, theme.bold(theme.fg("warning", "CYBERPUNK OPS CORE"))),
76
- boxCenteredLine(width, `${theme.fg("accent", "MATRIX RAIN")} // ${theme.fg("success", "NEON GRID ONLINE")}`),
77
- boxCenteredLine(width, theme.fg("mdCode", "NIGHT-CITY-MATRIX-V3")),
78
- sidebarRule(width, "STATUS"),
79
- boxTextLine(width, `${theme.fg("muted", "state:")} ${theme.fg("success", "* ready")}`),
80
- boxTextLine(width, `${theme.fg("muted", "route:")} route · evidence · loop · control`),
81
- sidebarRule(width, "TODO"),
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"),
82
106
  ...todoSidebarLines(snapshot.todoState, width),
83
- sidebarRule(width, "SESSION"),
84
- boxTextLine(width, `${theme.fg("muted", "cwd:")} ${snapshot.cwdLabel ?? "?"}`),
85
- boxTextLine(width, `${theme.fg("muted", "git:")} ${snapshot.gitBranch ?? "?"}`),
86
- sidebarRule(width, "MODEL / CTX"),
87
- boxTextLine(width, `${theme.fg("muted", "model:")} ${modelStatusLabel(snapshot)}`),
88
- boxTextLine(width, `${theme.fg("muted", "think:")} ${snapshot.thinkingLevel ?? "off"}`),
89
- boxTextLine(width, `${theme.fg("muted", "ctx:")} ${theme.fg("success", contextStatusLabel(snapshot))}`),
90
- sidebarRule(width, "RUNTIME / MCP / SKILLS"),
91
- boxTextLine(width, `${theme.fg("muted", "headroom:")} ${headroomLabel}`),
92
- boxTextLine(width, `${theme.fg("muted", "omk:")} DAG:omk-parallel-orchestrator`),
93
- boxTextLine(width, `${theme.fg("muted", "res:")} MCP:${mcpCount} skills:${skillCount}`),
94
- boxTextLine(width, `${theme.fg("muted", "pkg:")} ${packageIntakeLabel}`),
95
- sidebarRule(width, "CONTROL"),
96
- boxTextLine(width, `${theme.fg("muted", "route:")} ${theme.fg("success", "armed")}`),
97
- boxTextLine(width, `${theme.fg("muted", "verify:")} ${theme.fg("success", "evidence gated")}`),
98
- boxBottom(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"),
99
127
  ];
100
128
  }
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
+ }
101
185
  function todoSidebarLines(state, width) {
102
186
  if (!state || state.items.length === 0) {
103
187
  return [
@@ -109,7 +193,7 @@ function todoSidebarLines(state, width) {
109
193
  const next = nextActiveTodo(state);
110
194
  return [
111
195
  boxTextLine(width, `${theme.fg("muted", "todo:")} ${counts.done}/${counts.total} done`),
112
- boxTextLine(width, `${theme.fg("muted", "next:")} ${next?.label ?? "complete"}`),
196
+ semanticBoxTextLine(width, "next", next?.label ?? "complete", "middle"),
113
197
  ];
114
198
  }
115
199
  function packageIntakeStatusLabel(summary) {
@@ -119,10 +203,18 @@ function packageIntakeStatusLabel(summary) {
119
203
  const review = summary.deferred + summary.reject;
120
204
  return `ports:${ready}/${summary.total} review:${review} block:${summary.hardForkBlocked}`;
121
205
  }
122
- function renderExpanded(content, width, bannerFrame) {
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
+ }
123
215
  const lines = [divider(width, "OMK//CONTROL PANEL", "accent"), statusLine(content, width)];
124
216
  if (width >= 32)
125
- lines.push(...brandLines(width, bannerFrame));
217
+ lines.push(...brandLines(content, width, bannerFrame));
126
218
  lines.push(divider(width, "SYSTEM MAP", "mdHeading"));
127
219
  for (const instruction of content.expandedInstructions().split("\n"))
128
220
  lines.push(textLine(width, instruction));
@@ -132,6 +224,9 @@ function renderExpanded(content, width, bannerFrame) {
132
224
  lines.push(divider(width, "END", "borderMuted"));
133
225
  return lines;
134
226
  }
227
+ function blankSidebarRail(width, lineCount) {
228
+ return Array.from({ length: lineCount }, () => boxTextLine(width, ""));
229
+ }
135
230
  function statusSnapshot(content) {
136
231
  return content.statusSnapshot?.() ?? {};
137
232
  }
@@ -147,6 +242,52 @@ function contextStatusLabel(snapshot) {
147
242
  ? `?/${windowLabel}`
148
243
  : `${snapshot.contextPercent.toFixed(1)}%/${windowLabel}`;
149
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
+ }
150
291
  function formatTokens(count) {
151
292
  if (count < 1000)
152
293
  return count.toString();
@@ -162,9 +303,9 @@ function sidebarTabs(width) {
162
303
  return boxTextLine(width, fitLine(`${theme.bold(theme.fg("accent", "1:CONTROL"))} ${theme.fg("muted", "2:HISTORY")}`, Math.max(0, width - 4)));
163
304
  }
164
305
  function controlStripLine(content, width) {
165
- 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()}`);
166
307
  }
167
- function brandLines(width, bannerFrame) {
308
+ function brandLines(content, width, bannerFrame) {
168
309
  const art = bannerFrame ?? CONTROL_PANEL_ASCII_ART;
169
310
  if (bannerFrame)
170
311
  return art.map((line) => textLine(width, line));
@@ -172,24 +313,27 @@ function brandLines(width, bannerFrame) {
172
313
  const minWideWidth = visibleWidth("| ") + leftWidth + visibleWidth(" | ") + META_WIDTH;
173
314
  if (width < minWideWidth)
174
315
  return art.map((line) => textLine(width, theme.fg("accent", line)));
175
- return art.map((line, index) => textLine(width, `${theme.fg("accent", line.padEnd(leftWidth))}${theme.fg("borderMuted", " | ")}${metadataLines()[index] ?? ""}`));
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] ?? ""}`));
176
318
  }
177
- function metadataLines() {
319
+ function metadataLines(snapshot) {
178
320
  const rawThemeName = theme.name ?? "live";
179
321
  const themeName = (rawThemeName.startsWith("omk-") ? rawThemeName.slice(4) : rawThemeName).toUpperCase();
180
322
  return [
181
- `${theme.fg("mdCode", "PANEL")} ${theme.fg("success", "ONLINE")}`,
323
+ `${theme.fg("mdCode", "PANEL")} ${coloredStatus(snapshot.runtimeState ?? "unknown")}`,
182
324
  `${theme.fg("mdCode", "THEME")} ${theme.fg("accent", themeName)}`,
183
- `${theme.fg("mdCode", "STARTUP")} ${theme.fg("warning", "ARMED")}`,
184
- `${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")}`,
185
327
  ];
186
328
  }
187
329
  function statusLine(content, width) {
330
+ const snapshot = statusSnapshot(content);
188
331
  const segments = [
189
332
  theme.bold(theme.fg("accent", `${content.appName.toUpperCase()} v${content.version}`)),
190
- theme.fg("success", "CORE:READY"),
191
- theme.fg("mdCode", "ANSI:ON"),
192
- 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),
193
337
  theme.fg("muted", "THEME:LIVE"),
194
338
  ];
195
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 { 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\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\nexport const CONTROL_PANEL_ASCII_ART = [\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\treadonly packageIntake?: PiPackageIntakeSummary;\n\treadonly cwdLabel?: string;\n\treadonly gitBranch?: string | null;\n\treadonly todoState?: TodoState;\n}\n\nexport function renderControlPanelLayout(\n\tcontent: ControlPanelContent,\n\texpanded: boolean,\n\twidth: number,\n\tbannerFrame?: string[],\n): string[] {\n\tif (width <= 0) return [];\n\treturn expanded ? renderExpanded(content, width, bannerFrame) : renderCompact(content, width, bannerFrame);\n}\n\nfunction renderCompact(content: ControlPanelContent, width: number, bannerFrame?: string[]): string[] {\n\tif (width >= DECK_MIN_WIDTH) {\n\t\tconst deck = renderDeck(content, width, bannerFrame);\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[]): 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, bannerFrame),\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, bannerFrame?: string[]): 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...(bannerFrame ?? CONTROL_PANEL_ASCII_ART).map((line, index) => {\n\t\t\tif (bannerFrame) return boxCenteredLine(width, line);\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\tconst packageIntakeLabel = packageIntakeStatusLabel(snapshot.packageIntake);\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\t...todoSidebarLines(snapshot.todoState, width),\n\t\tsidebarRule(width, \"SESSION\"),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"cwd:\")} ${snapshot.cwdLabel ?? \"?\"}`),\n\t\tboxTextLine(width, `${theme.fg(\"muted\", \"git:\")} ${snapshot.gitBranch ?? \"?\"}`),\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\tboxTextLine(width, `${theme.fg(\"muted\", \"pkg:\")} ${packageIntakeLabel}`),\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 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\tboxTextLine(width, `${theme.fg(\"muted\", \"next:\")} ${next?.label ?? \"complete\"}`),\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[]): string[] {\n\tconst lines = [divider(width, \"OMK//CONTROL PANEL\", \"accent\"), statusLine(content, width)];\n\tif (width >= 32) lines.push(...brandLines(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 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, 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\treturn art.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":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAExD,OAAO,EAAE,cAAc,EAAkB,OAAO,IAAI,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAmB,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EACN,SAAS,EACT,eAAe,EACf,WAAW,EACX,MAAM,EACN,UAAU,EACV,cAAc,EACd,OAAO,EACP,OAAO,EACP,WAAW,EACX,QAAQ,GACR,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9F,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,gEAAkC;IAClC,8DAAkC;IAClC,kEAAkC;IAClC,oEAAkC;IAClC,gEAAkC;IAClC,4DAAkC;IAClC,gEAAkC;CAClC,CAAC;AACF,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,CAAC;AACnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,+BAA+B,GAAG,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,gBAAgB,GAAG,0BAAU,CAAC;AAsCpC,MAAM,UAAU,wBAAwB,CACvC,OAA4B,EAC5B,QAAiB,EACjB,KAAa,EACb,WAAsB,EACtB,SAAS,GAAG,CAAC,EACF;IACX,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,QAAQ;QACd,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC;QACxD,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAAA,CACzD;AAED,MAAM,UAAU,2BAA2B,CAAC,OAA4B,EAAE,KAAa,EAAY;IAClG,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC1B,OAAO,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAAA,CACpC;AAED,SAAS,aAAa,CAAC,OAA4B,EAAE,KAAa,EAAE,WAAsB,EAAE,SAAS,GAAG,CAAC,EAAY;IACpH,IAAI,KAAK,IAAI,4BAA4B,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;IAClC,CAAC;IACD,OAAO;QACN,OAAO,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,CAAC;QAC9C,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC9C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC;KACnD,CAAC;AAAA,CACF;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,KAAa,EAAE,WAAsB,EAAE,SAAS,GAAG,CAAC,EAAY;IACjH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,SAAS,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,cAAc,CAC3B,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EACrD,SAAS,EACT,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,EACnC,YAAY,EACZ,uBAAuB,EACvB,KAAK,CACL,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,UAAU,CAAC,KAAa,EAA+C;IAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACnG,OAAO,EAAE,SAAS,EAAE,KAAK,GAAG,uBAAuB,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC;AAAA,CACnF;AAED,SAAS,SAAS,CAAC,OAA4B,EAAE,KAAa,EAAE,WAAsB,EAAE,SAAS,GAAG,CAAC,EAAY;IAChH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO;QACN,MAAM,CAAC,KAAK,EAAE,QAAQ,OAAO,CAAC,OAAO,mBAAkB,CAAC;QACxD,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,oCAAiC,CAAC,CAAC;QAC5E,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;QACtE,GAAG,CAAC,WAAW,IAAI,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChE,IAAI,WAAW;gBAAE,OAAO,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,KAAK,GAAe,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1G,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAAA,CACrD,CAAC;QACF,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;QACzE,eAAe,CACd,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,CACtG;QACD,eAAe,CACd,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAG,CAAC,mBAAkB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAM,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAM,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,OAAM,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAChL;QACD,SAAS,CAAC,KAAK,CAAC;KAChB,CAAC;AAAA,CACF;AAED,SAAS,cAAc,CAAC,QAAoC,EAAU;IACrE,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC;IACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC;IACrC,OAAO,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AAAA,CACpF;AAED,SAAS,YAAY,CAAC,OAA4B,EAAE,KAAa,EAAY;IAC5E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,cAAc,IAAI,QAAQ,CAAC,eAAe,IAAI,SAAS,CAAC;IACvF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvC,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC3D,OAAO;QACN,WAAW,CAAC,KAAK,CAAC;QAClB,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QACvE,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC7E,eAAe,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC5G,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAChE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACtC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;QACzG,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS,CAAC,EAAE,CAAC;QACvG,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE,CAAC;QAC7G,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;QACpC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;QAC9C,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;QACvC,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE,KAAK,CAAC;QAClE,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,SAAS,IAAI,GAAG,EAAE,OAAO,CAAC;QACrE,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC;QAC3C,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QACtE,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,IAAI,KAAK,EAAE,OAAO,CAAC;QAC7E,WAAW,CACV,KAAK,EACL,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,EAAE,CACtL;QACD,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,YAAY,EAAE,CAAC;QACpE,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,iBAAiB,EAAE,CAAC;QACzE,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,CAAC;QACtD,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC;QAC5D,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,qBAAqB,IAAI,SAAS,EAAE,KAAK,CAAC;QACrF,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS,EAAE,OAAO,CAAC;QAClF,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,QAAQ,IAAI,GAAG,WAAW,UAAU,IAAI,GAAG,EAAE,CAAC;QACrG,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC;QAC5D,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;QACvC,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS,CAAC,EAAE,CAAC;QACvG,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,aAAa,IAAI,SAAS,CAAC,EAAE,CAAC;QAC3G,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;QAC3G,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC;KAC1B,CAAC;AAAA,CACF;AAED,SAAS,mBAAmB,CAC3B,KAAa,EACb,KAAa,EACb,KAAa,EACb,QAAoC,EAC3B;IACT,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;IACpD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,OAAO,WAAW,CAAC,KAAK,EAAE,GAAG,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;AAAA,CAC3F;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,QAAgB,EAAE,QAAoC,EAAU;IACxG,IAAI,YAAY,CAAC,KAAK,CAAC,IAAI,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAG,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,KAAG,CAAC;IACrB,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtD,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;QACvD,OAAO,GAAG,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAChF,CAAC;IACD,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,CACnD;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,QAAgB,EAAU;IAC3D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,QAAQ;YAAE,MAAM;QAClD,MAAM,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,QAAgB,EAAU;IACzD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,IAAI,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,QAAQ;YAAE,MAAM;QAClD,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,KAAyB,EAAU;IACtE,MAAM,KAAK,GAAG,KAAK,IAAI,SAAS,CAAC;IACjC,OAAO,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAAA,CACvE;AAED,SAAS,aAAa,CAAC,KAAa,EAAU;IAC7C,OAAO,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAAA,CAC3C;AAED,SAAS,WAAW,CAAC,KAAa,EAAc;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAClH,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACrF,OAAO,OAAO,CAAC;AAAA,CACf;AAED,SAAS,gBAAgB,CAAC,KAA4B,EAAE,KAAa,EAAY;IAChF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO;YACN,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC;YACzD,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC;SACnE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO;QACN,WAAW,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC;QACvF,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,UAAU,EAAE,QAAQ,CAAC;KACvE,CAAC;AAAA,CACF;AAED,SAAS,wBAAwB,CAAC,OAA2C,EAAU;IACtF,IAAI,CAAC,OAAO;QAAE,OAAO,eAAe,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,OAAO,SAAS,KAAK,IAAI,OAAO,CAAC,KAAK,WAAW,MAAM,UAAU,OAAO,CAAC,eAAe,EAAE,CAAC;AAAA,CAC3F;AAED,SAAS,cAAc,CAAC,OAA4B,EAAE,KAAa,EAAE,WAAsB,EAAE,SAAS,GAAG,CAAC,EAAY;IACrH,IAAI,KAAK,IAAI,4BAA4B,EAAE,CAAC;QAC3C,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC,CAAC;QACjH,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,oBAAoB,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3F,IAAI,KAAK,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/G,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAClH,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAiB,EAAY;IACrE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;AAAA,CACvE;AAED,SAAS,cAAc,CAAC,OAA4B,EAA8B;IACjF,OAAO,OAAO,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC;AAAA,CACxC;AAED,SAAS,gBAAgB,CAAC,QAAoC,EAAU;IACvE,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,UAAU,CAAC;IACzC,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,aAAa,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;AAAA,CACnG;AAED,SAAS,kBAAkB,CAAC,QAAoC,EAAU;IACzE,MAAM,YAAY,GAAG,QAAQ,CAAC,mBAAmB,IAAI,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,OAAO,QAAQ,CAAC,cAAc,KAAK,IAAI,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS;QAC/E,CAAC,CAAC,KAAK,WAAW,EAAE;QACpB,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;AAAA,CAC3D;AAED,SAAS,iBAAiB,CAAC,QAAoC,EAAU;IACxE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;IAClG,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC7G,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,mBAAmB,GAAG,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAAA,CAClK;AAED,SAAS,sBAAsB,CAAC,QAAoC,EAAU;IAC7E,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAG,CAAC;QAChF,MAAM,KAAK,GAAe,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/F,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACtB;AAED,SAAS,gBAAgB,CAAC,KAAgC,EAAsB;IAC/E,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvF,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxB,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,KAAK,CAAC;AAAA,CACb;AAED,SAAS,YAAY,CAAC,QAAoC,EAAU;IACnE,MAAM,MAAM,GAAG;QACd,QAAQ,CAAC,aAAa;QACtB,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;QACnC,QAAQ,CAAC,aAAa;QACtB,QAAQ,CAAC,mBAAmB;QAC5B,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,SAAS;KAClB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,UAAU,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,CAAC;AAAA,CAClB;AAED,SAAS,YAAY,CAAC,KAAa,EAAU;IAC5C,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAAA,CACzC;AAED,SAAS,WAAW,CAAC,KAAa,EAAU;IAC3C,OAAO,WAAW,CACjB,KAAK,EACL,OAAO,CACN,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EACrF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CACtB,CACD,CAAC;AAAA,CACF;AAED,SAAS,gBAAgB,CAAC,OAA4B,EAAE,KAAa,EAAU;IAC9E,OAAO,UAAU,CAChB,KAAK,EACL,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,2BAA2B,CAAC,OAAM,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAC/I,CAAC;AAAA,CACF;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,KAAa,EAAE,WAAsB,EAAY;IAClG,MAAM,GAAG,GAAG,WAAW,IAAI,uBAAuB,CAAC;IACnD,IAAI,WAAW;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;IACvF,IAAI,KAAK,GAAG,YAAY;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC9B,QAAQ,CACP,KAAK,EACL,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CACzH,CACD,CAAC;AAAA,CACF;AAED,SAAS,aAAa,CAAC,QAAoC,EAAY;IACtE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC;IAC1C,MAAM,SAAS,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IACzG,OAAO;QACN,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE;QACrF,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE;QACjE,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,YAAY,IAAI,SAAS,CAAC,EAAE;QACvF,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;KACjF,CAAC;AAAA,CACF;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,KAAa,EAAU;IACxE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG;QAChB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtF,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC1C,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC;QAC5C,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC7C,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC;QACvC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;KAC/B,CAAC;IACF,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAAA,CACtE","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,6 +1,21 @@
1
1
  import type { AgentSession } from "../../../core/agent-session.ts";
2
2
  import type { ReadonlyFooterDataProvider } from "../../../core/footer-data-provider.ts";
3
+ import { type McpServerEntry } from "../../../core/mcp-inventory.ts";
3
4
  import type { SessionManager } from "../../../core/session-manager.ts";
4
5
  import type { ControlPanelStatusSnapshot } from "./control-panel-layout.ts";
6
+ interface McpStabilityInput {
7
+ readonly commandSummary: string;
8
+ readonly overriddenBy?: string;
9
+ readonly networkDecision: Pick<McpServerEntry["networkDecision"], "rule">;
10
+ readonly capabilityDecision: Pick<McpServerEntry["capabilityDecision"], "malformed" | "unknownCapabilities">;
11
+ readonly authDecision: Pick<McpServerEntry["authDecision"], "rule">;
12
+ }
13
+ export declare function formatHeadroomStatusLabel(): string;
14
+ export declare function countRoutableNonHubSkills(skills: readonly {
15
+ readonly name: string;
16
+ }[]): number;
17
+ export declare function countStableMcpServers(entries: readonly McpStabilityInput[]): number;
18
+ export declare function parseHeadroomVersionOutput(output: string): string | null;
5
19
  export declare function createControlPanelStatusSnapshot(session: AgentSession, sessionManager: SessionManager, footerData?: ReadonlyFooterDataProvider): ControlPanelStatusSnapshot;
20
+ export {};
6
21
  //# 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;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,CAsB5B","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 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};\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":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AA0B5E,UAAU,iBAAiB;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,EAAE,WAAW,GAAG,qBAAqB,CAAC,CAAC;IAC7G,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;CACpE;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAGlD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAE9F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,iBAAiB,EAAE,GAAG,MAAM,CAEnF;AAiDD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxE;AAED,wBAAgB,gCAAgC,CAC/C,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,cAAc,EAC9B,UAAU,CAAC,EAAE,0BAA0B,GACrC,0BAA0B,CAiC5B","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport 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, type McpServerEntry } 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\nconst OMK_HUB_SKILL_NAMES = new Set([\n\t\"omk-skills\",\n\t\"omk-engineering\",\n\t\"omk-backend-data\",\n\t\"omk-security\",\n\t\"omk-devops-release\",\n\t\"omk-research-docs\",\n\t\"omk-design-media\",\n\t\"omk-agent-ops\",\n\t\"omk-product-ops\",\n\t\"omk-workspace-ops\",\n\t\"omk-frontend\",\n\t\"omk-loop\",\n\t\"omk-plan\",\n]);\n\nconst INVALID_MCP_NETWORK_RULES = new Set([\"mcp.network.invalid_mode\", \"mcp.network.empty_allowlist\"]);\nconst PRIVILEGED_MCP_COMMANDS = new Set([\"sudo\", \"su\"]);\nconst VERSION_COMMAND_TIMEOUT_MS = 750;\nconst HEADROOM_PYTHON_DISTRIBUTIONS = [\"headroom\", \"headroom-ai\"] as const;\n\nlet cachedHeadroomVersion: string | null | undefined;\n\ninterface McpStabilityInput {\n\treadonly commandSummary: string;\n\treadonly overriddenBy?: string;\n\treadonly networkDecision: Pick<McpServerEntry[\"networkDecision\"], \"rule\">;\n\treadonly capabilityDecision: Pick<McpServerEntry[\"capabilityDecision\"], \"malformed\" | \"unknownCapabilities\">;\n\treadonly authDecision: Pick<McpServerEntry[\"authDecision\"], \"rule\">;\n}\n\nexport function formatHeadroomStatusLabel(): string {\n\tconst version = getInstalledHeadroomVersion();\n\treturn version ? `headroom:${version}` : getHeadroomRuntimeStatus().policyId;\n}\n\nexport function countRoutableNonHubSkills(skills: readonly { readonly name: string }[]): number {\n\treturn skills.filter((skill) => !OMK_HUB_SKILL_NAMES.has(skill.name)).length;\n}\n\nexport function countStableMcpServers(entries: readonly McpStabilityInput[]): number {\n\treturn entries.filter(isStableMcpEntry).length;\n}\n\nfunction isStableMcpEntry(entry: McpStabilityInput): boolean {\n\tif (entry.overriddenBy) return false;\n\tif (entry.commandSummary === \"<unknown>\") return false;\n\tif (entry.authDecision.rule === \"mcp.auth.invalid\") return false;\n\tif (INVALID_MCP_NETWORK_RULES.has(entry.networkDecision.rule)) return false;\n\tif (entry.capabilityDecision.malformed || entry.capabilityDecision.unknownCapabilities.length > 0) return false;\n\tconst command = entry.commandSummary.split(/\\s+/, 1)[0] ?? \"\";\n\treturn !PRIVILEGED_MCP_COMMANDS.has(command);\n}\n\nfunction getInstalledHeadroomVersion(): string | null {\n\tif (cachedHeadroomVersion !== undefined) return cachedHeadroomVersion;\n\tcachedHeadroomVersion = readVersionFromCommand(\"headroom\", [\"--version\"]);\n\tif (cachedHeadroomVersion) return cachedHeadroomVersion;\n\tcachedHeadroomVersion = readVersionFromCommand(\"headroom\", [\"version\"]);\n\tif (cachedHeadroomVersion) return cachedHeadroomVersion;\n\tfor (const distribution of HEADROOM_PYTHON_DISTRIBUTIONS) {\n\t\tcachedHeadroomVersion = readPythonDistributionVersion(distribution);\n\t\tif (cachedHeadroomVersion) return cachedHeadroomVersion;\n\t}\n\tcachedHeadroomVersion = null;\n\treturn cachedHeadroomVersion;\n}\n\nfunction readPythonDistributionVersion(distribution: (typeof HEADROOM_PYTHON_DISTRIBUTIONS)[number]): string | null {\n\treturn readVersionFromCommand(\"python3\", [\n\t\t\"-c\",\n\t\t`import importlib.metadata as m; print(m.version('${distribution}'))`,\n\t]);\n}\n\nfunction readVersionFromCommand(command: string, args: readonly string[]): string | null {\n\ttry {\n\t\tconst result = spawnSync(command, [...args], {\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: VERSION_COMMAND_TIMEOUT_MS,\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t\tenv: { PATH: process.env.PATH ?? \"\" },\n\t\t});\n\t\tif (result.error || result.status !== 0) return null;\n\t\treturn parseHeadroomVersionOutput(`${result.stdout}\\n${result.stderr}`);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function parseHeadroomVersionOutput(output: string): string | null {\n\tconst match = /\\bv?(\\d+\\.\\d+(?:\\.\\d+)?(?:[-+][0-9A-Za-z.-]+)?)\\b/.exec(output);\n\treturn match?.[1] ?? null;\n}\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 mcpInventory = loadMcpInventory(sessionManager.getCwd());\n\tconst loadedSkills = session.resourceLoader.getSkills().skills;\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: formatHeadroomStatusLabel(),\n\t\toptimizerPolicy: getHeadroomRuntimeStatus().selector,\n\t\tmcpCount: countStableMcpServers(mcpInventory.entries),\n\t\tskillCount: countRoutableNonHubSkills(loadedSkills),\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"]}