open-multi-agent-kit 0.80.6 → 0.80.8

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 (949) hide show
  1. package/CHANGELOG.md +4 -20
  2. package/README.md +66 -16
  3. package/dist/agents/jailbreak/index.d.ts +7 -0
  4. package/dist/agents/jailbreak/index.d.ts.map +1 -0
  5. package/dist/agents/jailbreak/index.js +7 -0
  6. package/dist/agents/jailbreak/index.js.map +1 -0
  7. package/dist/agents/jailbreak/subagent-f.d.ts +44 -0
  8. package/dist/agents/jailbreak/subagent-f.d.ts.map +1 -0
  9. package/dist/agents/jailbreak/subagent-f.js +60 -0
  10. package/dist/agents/jailbreak/subagent-f.js.map +1 -0
  11. package/dist/bun/register-bedrock.d.ts.map +1 -1
  12. package/dist/bun/register-bedrock.js +2 -2
  13. package/dist/bun/register-bedrock.js.map +1 -1
  14. package/dist/ci/verify-reporter.d.ts +22 -0
  15. package/dist/ci/verify-reporter.d.ts.map +1 -0
  16. package/dist/ci/verify-reporter.js +50 -0
  17. package/dist/ci/verify-reporter.js.map +1 -0
  18. package/dist/cli/args.d.ts +4 -1
  19. package/dist/cli/args.d.ts.map +1 -1
  20. package/dist/cli/args.js +7 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/cli/config-selector.d.ts +1 -1
  23. package/dist/cli/config-selector.d.ts.map +1 -1
  24. package/dist/cli/config-selector.js +2 -2
  25. package/dist/cli/config-selector.js.map +1 -1
  26. package/dist/cli/file-processor.d.ts +1 -1
  27. package/dist/cli/file-processor.d.ts.map +1 -1
  28. package/dist/cli/file-processor.js.map +1 -1
  29. package/dist/cli/initial-message.d.ts +1 -1
  30. package/dist/cli/initial-message.d.ts.map +1 -1
  31. package/dist/cli/initial-message.js.map +1 -1
  32. package/dist/cli/jailbreak-args.d.ts +26 -0
  33. package/dist/cli/jailbreak-args.d.ts.map +1 -0
  34. package/dist/cli/jailbreak-args.js +86 -0
  35. package/dist/cli/jailbreak-args.js.map +1 -0
  36. package/dist/cli/list-models.d.ts.map +1 -1
  37. package/dist/cli/list-models.js +1 -1
  38. package/dist/cli/list-models.js.map +1 -1
  39. package/dist/cli/session-picker.d.ts.map +1 -1
  40. package/dist/cli/session-picker.js +1 -1
  41. package/dist/cli/session-picker.js.map +1 -1
  42. package/dist/commands/doctor-provider.d.ts +19 -0
  43. package/dist/commands/doctor-provider.d.ts.map +1 -0
  44. package/dist/commands/doctor-provider.js +123 -0
  45. package/dist/commands/doctor-provider.js.map +1 -0
  46. package/dist/commands/jailbreak.d.ts +49 -0
  47. package/dist/commands/jailbreak.d.ts.map +1 -0
  48. package/dist/commands/jailbreak.js +201 -0
  49. package/dist/commands/jailbreak.js.map +1 -0
  50. package/dist/config.d.ts +9 -4
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +34 -52
  53. package/dist/config.js.map +1 -1
  54. package/dist/core/agent-session-services.d.ts +2 -2
  55. package/dist/core/agent-session-services.d.ts.map +1 -1
  56. package/dist/core/agent-session-services.js.map +1 -1
  57. package/dist/core/agent-session.d.ts +36 -8
  58. package/dist/core/agent-session.d.ts.map +1 -1
  59. package/dist/core/agent-session.js +294 -14
  60. package/dist/core/agent-session.js.map +1 -1
  61. package/dist/core/auth-storage.d.ts +3 -3
  62. package/dist/core/auth-storage.d.ts.map +1 -1
  63. package/dist/core/auth-storage.js +4 -4
  64. package/dist/core/auth-storage.js.map +1 -1
  65. package/dist/core/bash-executor.d.ts +1 -0
  66. package/dist/core/bash-executor.d.ts.map +1 -1
  67. package/dist/core/bash-executor.js +2 -1
  68. package/dist/core/bash-executor.js.map +1 -1
  69. package/dist/core/browser-use.d.ts +45 -0
  70. package/dist/core/browser-use.d.ts.map +1 -0
  71. package/dist/core/browser-use.js +70 -0
  72. package/dist/core/browser-use.js.map +1 -0
  73. package/dist/core/command-safety-parser.d.ts +77 -0
  74. package/dist/core/command-safety-parser.d.ts.map +1 -0
  75. package/dist/core/command-safety-parser.js +763 -0
  76. package/dist/core/command-safety-parser.js.map +1 -0
  77. package/dist/core/command-safety.d.ts +11 -0
  78. package/dist/core/command-safety.d.ts.map +1 -0
  79. package/dist/core/command-safety.js +631 -0
  80. package/dist/core/command-safety.js.map +1 -0
  81. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  82. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  83. package/dist/core/compaction/branch-summarization.js +2 -8
  84. package/dist/core/compaction/branch-summarization.js.map +1 -1
  85. package/dist/core/compaction/compaction.d.ts +3 -84
  86. package/dist/core/compaction/compaction.d.ts.map +1 -1
  87. package/dist/core/compaction/compaction.js +11 -608
  88. package/dist/core/compaction/compaction.js.map +1 -1
  89. package/dist/core/compaction/utils.d.ts +2 -2
  90. package/dist/core/compaction/utils.d.ts.map +1 -1
  91. package/dist/core/compaction/utils.js.map +1 -1
  92. package/dist/core/compactor.d.ts +42 -0
  93. package/dist/core/compactor.d.ts.map +1 -0
  94. package/dist/core/compactor.js +131 -0
  95. package/dist/core/compactor.js.map +1 -0
  96. package/dist/core/context-budget-compressors.d.ts +50 -0
  97. package/dist/core/context-budget-compressors.d.ts.map +1 -0
  98. package/dist/core/context-budget-compressors.js +166 -0
  99. package/dist/core/context-budget-compressors.js.map +1 -0
  100. package/dist/core/context-budget-governor-v2.d.ts +7 -0
  101. package/dist/core/context-budget-governor-v2.d.ts.map +1 -0
  102. package/dist/core/context-budget-governor-v2.js +7 -0
  103. package/dist/core/context-budget-governor-v2.js.map +1 -0
  104. package/dist/core/context-budget-governor.d.ts +67 -0
  105. package/dist/core/context-budget-governor.d.ts.map +1 -0
  106. package/dist/core/context-budget-governor.js +224 -0
  107. package/dist/core/context-budget-governor.js.map +1 -0
  108. package/dist/core/context-budget-headroom-candidates.d.ts +3 -0
  109. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -0
  110. package/dist/core/context-budget-headroom-candidates.js +85 -0
  111. package/dist/core/context-budget-headroom-candidates.js.map +1 -0
  112. package/dist/core/context-budget-headroom-types.d.ts +67 -0
  113. package/dist/core/context-budget-headroom-types.d.ts.map +1 -0
  114. package/dist/core/context-budget-headroom-types.js +46 -0
  115. package/dist/core/context-budget-headroom-types.js.map +1 -0
  116. package/dist/core/context-budget-headroom.d.ts +5 -0
  117. package/dist/core/context-budget-headroom.d.ts.map +1 -0
  118. package/dist/core/context-budget-headroom.js +123 -0
  119. package/dist/core/context-budget-headroom.js.map +1 -0
  120. package/dist/core/context-budget-relevance.d.ts +46 -0
  121. package/dist/core/context-budget-relevance.d.ts.map +1 -0
  122. package/dist/core/context-budget-relevance.js +329 -0
  123. package/dist/core/context-budget-relevance.js.map +1 -0
  124. package/dist/core/context-budget-system-prompt-items.d.ts +19 -0
  125. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -0
  126. package/dist/core/context-budget-system-prompt-items.js +143 -0
  127. package/dist/core/context-budget-system-prompt-items.js.map +1 -0
  128. package/dist/core/context-budget-system-prompt.d.ts +31 -0
  129. package/dist/core/context-budget-system-prompt.d.ts.map +1 -0
  130. package/dist/core/context-budget-system-prompt.js +87 -0
  131. package/dist/core/context-budget-system-prompt.js.map +1 -0
  132. package/dist/core/context-budget-token-counter.d.ts +34 -0
  133. package/dist/core/context-budget-token-counter.d.ts.map +1 -0
  134. package/dist/core/context-budget-token-counter.js +315 -0
  135. package/dist/core/context-budget-token-counter.js.map +1 -0
  136. package/dist/core/context-budget-v2-coverage.d.ts +5 -0
  137. package/dist/core/context-budget-v2-coverage.d.ts.map +1 -0
  138. package/dist/core/context-budget-v2-coverage.js +58 -0
  139. package/dist/core/context-budget-v2-coverage.js.map +1 -0
  140. package/dist/core/context-budget-v2-plan-hash.d.ts +12 -0
  141. package/dist/core/context-budget-v2-plan-hash.d.ts.map +1 -0
  142. package/dist/core/context-budget-v2-plan-hash.js +38 -0
  143. package/dist/core/context-budget-v2-plan-hash.js.map +1 -0
  144. package/dist/core/context-budget-v2-planner.d.ts +3 -0
  145. package/dist/core/context-budget-v2-planner.d.ts.map +1 -0
  146. package/dist/core/context-budget-v2-planner.js +143 -0
  147. package/dist/core/context-budget-v2-planner.js.map +1 -0
  148. package/dist/core/context-budget-v2-scoring.d.ts +14 -0
  149. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -0
  150. package/dist/core/context-budget-v2-scoring.js +114 -0
  151. package/dist/core/context-budget-v2-scoring.js.map +1 -0
  152. package/dist/core/context-budget-v2-selection.d.ts +32 -0
  153. package/dist/core/context-budget-v2-selection.d.ts.map +1 -0
  154. package/dist/core/context-budget-v2-selection.js +158 -0
  155. package/dist/core/context-budget-v2-selection.js.map +1 -0
  156. package/dist/core/context-budget-v2-tiers.d.ts +15 -0
  157. package/dist/core/context-budget-v2-tiers.d.ts.map +1 -0
  158. package/dist/core/context-budget-v2-tiers.js +68 -0
  159. package/dist/core/context-budget-v2-tiers.js.map +1 -0
  160. package/dist/core/context-budget-v2-types.d.ts +92 -0
  161. package/dist/core/context-budget-v2-types.d.ts.map +1 -0
  162. package/dist/core/context-budget-v2-types.js +24 -0
  163. package/dist/core/context-budget-v2-types.js.map +1 -0
  164. package/dist/core/defaults.d.ts +1 -1
  165. package/dist/core/defaults.d.ts.map +1 -1
  166. package/dist/core/defaults.js.map +1 -1
  167. package/dist/core/diagnostics.d.ts +4 -0
  168. package/dist/core/diagnostics.d.ts.map +1 -1
  169. package/dist/core/diagnostics.js.map +1 -1
  170. package/dist/core/domain-confidence.d.ts +9 -0
  171. package/dist/core/domain-confidence.d.ts.map +1 -0
  172. package/dist/core/domain-confidence.js +39 -0
  173. package/dist/core/domain-confidence.js.map +1 -0
  174. package/dist/core/domain-dispatch.d.ts +44 -0
  175. package/dist/core/domain-dispatch.d.ts.map +1 -0
  176. package/dist/core/domain-dispatch.js +118 -0
  177. package/dist/core/domain-dispatch.js.map +1 -0
  178. package/dist/core/domain-loadouts.d.ts +76 -0
  179. package/dist/core/domain-loadouts.d.ts.map +1 -0
  180. package/dist/core/domain-loadouts.js +981 -0
  181. package/dist/core/domain-loadouts.js.map +1 -0
  182. package/dist/core/domain-registry.d.ts +7 -0
  183. package/dist/core/domain-registry.d.ts.map +1 -0
  184. package/dist/core/domain-registry.js +11 -0
  185. package/dist/core/domain-registry.js.map +1 -0
  186. package/dist/core/domain-router.d.ts +16 -0
  187. package/dist/core/domain-router.d.ts.map +1 -0
  188. package/dist/core/domain-router.js +24 -0
  189. package/dist/core/domain-router.js.map +1 -0
  190. package/dist/core/domain-score.d.ts +13 -0
  191. package/dist/core/domain-score.d.ts.map +1 -0
  192. package/dist/core/domain-score.js +48 -0
  193. package/dist/core/domain-score.js.map +1 -0
  194. package/dist/core/domain-trigger-match.d.ts +14 -0
  195. package/dist/core/domain-trigger-match.d.ts.map +1 -0
  196. package/dist/core/domain-trigger-match.js +51 -0
  197. package/dist/core/domain-trigger-match.js.map +1 -0
  198. package/dist/core/domain-types.d.ts +30 -0
  199. package/dist/core/domain-types.d.ts.map +1 -0
  200. package/dist/core/domain-types.js +2 -0
  201. package/dist/core/domain-types.js.map +1 -0
  202. package/dist/core/exact-cache-policy.d.ts +108 -0
  203. package/dist/core/exact-cache-policy.d.ts.map +1 -0
  204. package/dist/core/exact-cache-policy.js +184 -0
  205. package/dist/core/exact-cache-policy.js.map +1 -0
  206. package/dist/core/export-html/index.d.ts +1 -1
  207. package/dist/core/export-html/index.d.ts.map +1 -1
  208. package/dist/core/export-html/index.js.map +1 -1
  209. package/dist/core/export-html/template.js +2 -4
  210. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  211. package/dist/core/export-html/tool-renderer.js.map +1 -1
  212. package/dist/core/extensions/builtin/command-safety-gate.d.ts +80 -0
  213. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -0
  214. package/dist/core/extensions/builtin/command-safety-gate.js +159 -0
  215. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -0
  216. package/dist/core/extensions/builtin/todo-checklist.d.ts +20 -0
  217. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -0
  218. package/dist/core/extensions/builtin/todo-checklist.js +70 -0
  219. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
  220. package/dist/core/extensions/loader.d.ts.map +1 -1
  221. package/dist/core/extensions/loader.js +50 -47
  222. package/dist/core/extensions/loader.js.map +1 -1
  223. package/dist/core/extensions/runner.d.ts +3 -3
  224. package/dist/core/extensions/runner.d.ts.map +1 -1
  225. package/dist/core/extensions/runner.js +1 -1
  226. package/dist/core/extensions/runner.js.map +1 -1
  227. package/dist/core/extensions/types.d.ts +13 -13
  228. package/dist/core/extensions/types.d.ts.map +1 -1
  229. package/dist/core/extensions/types.js.map +1 -1
  230. package/dist/core/extensions/wrapper.d.ts +1 -1
  231. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  232. package/dist/core/extensions/wrapper.js.map +1 -1
  233. package/dist/core/headroom.d.ts +45 -0
  234. package/dist/core/headroom.d.ts.map +1 -0
  235. package/dist/core/headroom.js +171 -0
  236. package/dist/core/headroom.js.map +1 -0
  237. package/dist/core/hook-inventory.d.ts +25 -0
  238. package/dist/core/hook-inventory.d.ts.map +1 -0
  239. package/dist/core/hook-inventory.js +119 -0
  240. package/dist/core/hook-inventory.js.map +1 -0
  241. package/dist/core/hooks/fail-closed.d.ts +4 -1
  242. package/dist/core/hooks/fail-closed.d.ts.map +1 -1
  243. package/dist/core/hooks/fail-closed.js +79 -5
  244. package/dist/core/hooks/fail-closed.js.map +1 -1
  245. package/dist/core/hooks/index.d.ts +2 -2
  246. package/dist/core/hooks/index.d.ts.map +1 -1
  247. package/dist/core/hooks/index.js +1 -1
  248. package/dist/core/hooks/index.js.map +1 -1
  249. package/dist/core/hooks/types.d.ts +9 -0
  250. package/dist/core/hooks/types.d.ts.map +1 -1
  251. package/dist/core/hooks/types.js.map +1 -1
  252. package/dist/core/keybindings.d.ts +2 -14
  253. package/dist/core/keybindings.d.ts.map +1 -1
  254. package/dist/core/keybindings.js +1 -31
  255. package/dist/core/keybindings.js.map +1 -1
  256. package/dist/core/lean-ctx.d.ts +99 -0
  257. package/dist/core/lean-ctx.d.ts.map +1 -0
  258. package/dist/core/lean-ctx.js +225 -0
  259. package/dist/core/lean-ctx.js.map +1 -0
  260. package/dist/core/loadout-access-policy.d.ts +41 -0
  261. package/dist/core/loadout-access-policy.d.ts.map +1 -0
  262. package/dist/core/loadout-access-policy.js +182 -0
  263. package/dist/core/loadout-access-policy.js.map +1 -0
  264. package/dist/core/loadout-compose.d.ts +53 -0
  265. package/dist/core/loadout-compose.d.ts.map +1 -0
  266. package/dist/core/loadout-compose.js +172 -0
  267. package/dist/core/loadout-compose.js.map +1 -0
  268. package/dist/core/loadout-policy-bridge.d.ts +22 -0
  269. package/dist/core/loadout-policy-bridge.d.ts.map +1 -0
  270. package/dist/core/loadout-policy-bridge.js +52 -0
  271. package/dist/core/loadout-policy-bridge.js.map +1 -0
  272. package/dist/core/loadout-runtime.d.ts +106 -0
  273. package/dist/core/loadout-runtime.d.ts.map +1 -0
  274. package/dist/core/loadout-runtime.js +193 -0
  275. package/dist/core/loadout-runtime.js.map +1 -0
  276. package/dist/core/loadout-safety.d.ts +55 -0
  277. package/dist/core/loadout-safety.d.ts.map +1 -0
  278. package/dist/core/loadout-safety.js +213 -0
  279. package/dist/core/loadout-safety.js.map +1 -0
  280. package/dist/core/loadouts.d.ts +149 -0
  281. package/dist/core/loadouts.d.ts.map +1 -0
  282. package/dist/core/loadouts.js +553 -0
  283. package/dist/core/loadouts.js.map +1 -0
  284. package/dist/core/loop-gates.d.ts +48 -0
  285. package/dist/core/loop-gates.d.ts.map +1 -0
  286. package/dist/core/loop-gates.js +352 -0
  287. package/dist/core/loop-gates.js.map +1 -0
  288. package/dist/core/loop-registry.d.ts +77 -0
  289. package/dist/core/loop-registry.d.ts.map +1 -0
  290. package/dist/core/loop-registry.js +831 -0
  291. package/dist/core/loop-registry.js.map +1 -0
  292. package/dist/core/loop-types.d.ts +194 -0
  293. package/dist/core/loop-types.d.ts.map +1 -0
  294. package/dist/core/loop-types.js +2 -0
  295. package/dist/core/loop-types.js.map +1 -0
  296. package/dist/core/mcp-inventory.d.ts +41 -0
  297. package/dist/core/mcp-inventory.d.ts.map +1 -1
  298. package/dist/core/mcp-inventory.js +57 -1
  299. package/dist/core/mcp-inventory.js.map +1 -1
  300. package/dist/core/mcp-presets.d.ts +98 -0
  301. package/dist/core/mcp-presets.d.ts.map +1 -0
  302. package/dist/core/mcp-presets.js +377 -0
  303. package/dist/core/mcp-presets.js.map +1 -0
  304. package/dist/core/messages.d.ts +3 -3
  305. package/dist/core/messages.d.ts.map +1 -1
  306. package/dist/core/messages.js.map +1 -1
  307. package/dist/core/metrics-sampler.d.ts +11 -0
  308. package/dist/core/metrics-sampler.d.ts.map +1 -1
  309. package/dist/core/metrics-sampler.js +52 -13
  310. package/dist/core/metrics-sampler.js.map +1 -1
  311. package/dist/core/model-registry.d.ts +1 -1
  312. package/dist/core/model-registry.d.ts.map +1 -1
  313. package/dist/core/model-registry.js +2 -2
  314. package/dist/core/model-registry.js.map +1 -1
  315. package/dist/core/model-resolver.d.ts +2 -2
  316. package/dist/core/model-resolver.d.ts.map +1 -1
  317. package/dist/core/model-resolver.js +1 -1
  318. package/dist/core/model-resolver.js.map +1 -1
  319. package/dist/core/package-gallery-identity.d.ts +7 -0
  320. package/dist/core/package-gallery-identity.d.ts.map +1 -0
  321. package/dist/core/package-gallery-identity.js +31 -0
  322. package/dist/core/package-gallery-identity.js.map +1 -0
  323. package/dist/core/package-gallery-install.d.ts +6 -0
  324. package/dist/core/package-gallery-install.d.ts.map +1 -0
  325. package/dist/core/package-gallery-install.js +59 -0
  326. package/dist/core/package-gallery-install.js.map +1 -0
  327. package/dist/core/package-gallery-manifest.d.ts +13 -0
  328. package/dist/core/package-gallery-manifest.d.ts.map +1 -0
  329. package/dist/core/package-gallery-manifest.js +183 -0
  330. package/dist/core/package-gallery-manifest.js.map +1 -0
  331. package/dist/core/package-gallery-trial.d.ts +4 -0
  332. package/dist/core/package-gallery-trial.d.ts.map +1 -0
  333. package/dist/core/package-gallery-trial.js +55 -0
  334. package/dist/core/package-gallery-trial.js.map +1 -0
  335. package/dist/core/package-gallery-types.d.ts +71 -0
  336. package/dist/core/package-gallery-types.d.ts.map +1 -0
  337. package/dist/core/package-gallery-types.js +2 -0
  338. package/dist/core/package-gallery-types.js.map +1 -0
  339. package/dist/core/package-gallery.d.ts +6 -0
  340. package/dist/core/package-gallery.d.ts.map +1 -0
  341. package/dist/core/package-gallery.js +6 -0
  342. package/dist/core/package-gallery.js.map +1 -0
  343. package/dist/core/package-manager.d.ts.map +1 -1
  344. package/dist/core/package-manager.js +10 -10
  345. package/dist/core/package-manager.js.map +1 -1
  346. package/dist/core/package-procurement.d.ts +268 -0
  347. package/dist/core/package-procurement.d.ts.map +1 -0
  348. package/dist/core/package-procurement.js +709 -0
  349. package/dist/core/package-procurement.js.map +1 -0
  350. package/dist/core/provider-attribution.d.ts +1 -1
  351. package/dist/core/provider-attribution.d.ts.map +1 -1
  352. package/dist/core/provider-attribution.js.map +1 -1
  353. package/dist/core/read-anchors.d.ts +110 -0
  354. package/dist/core/read-anchors.d.ts.map +1 -0
  355. package/dist/core/read-anchors.js +193 -0
  356. package/dist/core/read-anchors.js.map +1 -0
  357. package/dist/core/recovery-checkpoint.d.ts +196 -0
  358. package/dist/core/recovery-checkpoint.d.ts.map +1 -0
  359. package/dist/core/recovery-checkpoint.js +382 -0
  360. package/dist/core/recovery-checkpoint.js.map +1 -0
  361. package/dist/core/resource-loader.d.ts +15 -21
  362. package/dist/core/resource-loader.d.ts.map +1 -1
  363. package/dist/core/resource-loader.js +62 -8
  364. package/dist/core/resource-loader.js.map +1 -1
  365. package/dist/core/sandbox/backend.d.ts +25 -0
  366. package/dist/core/sandbox/backend.d.ts.map +1 -0
  367. package/dist/core/sandbox/backend.js +150 -0
  368. package/dist/core/sandbox/backend.js.map +1 -0
  369. package/dist/core/sandbox/env.d.ts +6 -0
  370. package/dist/core/sandbox/env.d.ts.map +1 -0
  371. package/dist/core/sandbox/env.js +46 -0
  372. package/dist/core/sandbox/env.js.map +1 -0
  373. package/dist/core/sandbox/path-resolver.d.ts +4 -0
  374. package/dist/core/sandbox/path-resolver.d.ts.map +1 -0
  375. package/dist/core/sandbox/path-resolver.js +44 -0
  376. package/dist/core/sandbox/path-resolver.js.map +1 -0
  377. package/dist/core/sandbox/policy.d.ts +87 -0
  378. package/dist/core/sandbox/policy.d.ts.map +1 -0
  379. package/dist/core/sandbox/policy.js +280 -0
  380. package/dist/core/sandbox/policy.js.map +1 -0
  381. package/dist/core/sandbox/spawn.d.ts +20 -0
  382. package/dist/core/sandbox/spawn.d.ts.map +1 -0
  383. package/dist/core/sandbox/spawn.js +80 -0
  384. package/dist/core/sandbox/spawn.js.map +1 -0
  385. package/dist/core/sandbox-policy-v2.d.ts +49 -0
  386. package/dist/core/sandbox-policy-v2.d.ts.map +1 -0
  387. package/dist/core/sandbox-policy-v2.js +368 -0
  388. package/dist/core/sandbox-policy-v2.js.map +1 -0
  389. package/dist/core/sdk.d.ts +15 -4
  390. package/dist/core/sdk.d.ts.map +1 -1
  391. package/dist/core/sdk.js +50 -4
  392. package/dist/core/sdk.js.map +1 -1
  393. package/dist/core/semantic-cache-policy.d.ts +51 -0
  394. package/dist/core/semantic-cache-policy.d.ts.map +1 -0
  395. package/dist/core/semantic-cache-policy.js +228 -0
  396. package/dist/core/semantic-cache-policy.js.map +1 -0
  397. package/dist/core/session-manager.d.ts +2 -4
  398. package/dist/core/session-manager.d.ts.map +1 -1
  399. package/dist/core/session-manager.js +1 -1
  400. package/dist/core/session-manager.js.map +1 -1
  401. package/dist/core/settings-manager.d.ts +1 -4
  402. package/dist/core/settings-manager.d.ts.map +1 -1
  403. package/dist/core/settings-manager.js +2 -7
  404. package/dist/core/settings-manager.js.map +1 -1
  405. package/dist/core/skills.d.ts +1 -0
  406. package/dist/core/skills.d.ts.map +1 -1
  407. package/dist/core/skills.js +46 -5
  408. package/dist/core/skills.js.map +1 -1
  409. package/dist/core/slash-commands.d.ts.map +1 -1
  410. package/dist/core/slash-commands.js +0 -2
  411. package/dist/core/slash-commands.js.map +1 -1
  412. package/dist/core/subagent-orchestration.d.ts +73 -0
  413. package/dist/core/subagent-orchestration.d.ts.map +1 -0
  414. package/dist/core/subagent-orchestration.js +408 -0
  415. package/dist/core/subagent-orchestration.js.map +1 -0
  416. package/dist/core/system-prompt.d.ts +5 -4
  417. package/dist/core/system-prompt.d.ts.map +1 -1
  418. package/dist/core/system-prompt.js +63 -24
  419. package/dist/core/system-prompt.js.map +1 -1
  420. package/dist/core/telemetry.d.ts.map +1 -1
  421. package/dist/core/telemetry.js +1 -1
  422. package/dist/core/telemetry.js.map +1 -1
  423. package/dist/core/timings.d.ts +0 -4
  424. package/dist/core/timings.d.ts.map +1 -1
  425. package/dist/core/timings.js +1 -5
  426. package/dist/core/timings.js.map +1 -1
  427. package/dist/core/todo-state.d.ts +53 -0
  428. package/dist/core/todo-state.d.ts.map +1 -0
  429. package/dist/core/todo-state.js +87 -0
  430. package/dist/core/todo-state.js.map +1 -0
  431. package/dist/core/token-optimizer.d.ts +58 -0
  432. package/dist/core/token-optimizer.d.ts.map +1 -0
  433. package/dist/core/token-optimizer.js +179 -0
  434. package/dist/core/token-optimizer.js.map +1 -0
  435. package/dist/core/tools/bash.d.ts +28 -4
  436. package/dist/core/tools/bash.d.ts.map +1 -1
  437. package/dist/core/tools/bash.js +55 -11
  438. package/dist/core/tools/bash.js.map +1 -1
  439. package/dist/core/tools/edit.d.ts +3 -2
  440. package/dist/core/tools/edit.d.ts.map +1 -1
  441. package/dist/core/tools/edit.js +4 -1
  442. package/dist/core/tools/edit.js.map +1 -1
  443. package/dist/core/tools/find.d.ts +1 -1
  444. package/dist/core/tools/find.d.ts.map +1 -1
  445. package/dist/core/tools/find.js +1 -1
  446. package/dist/core/tools/find.js.map +1 -1
  447. package/dist/core/tools/grep.d.ts +1 -1
  448. package/dist/core/tools/grep.d.ts.map +1 -1
  449. package/dist/core/tools/grep.js +1 -1
  450. package/dist/core/tools/grep.js.map +1 -1
  451. package/dist/core/tools/index.d.ts +1 -1
  452. package/dist/core/tools/index.d.ts.map +1 -1
  453. package/dist/core/tools/index.js.map +1 -1
  454. package/dist/core/tools/ls.d.ts +1 -1
  455. package/dist/core/tools/ls.d.ts.map +1 -1
  456. package/dist/core/tools/ls.js +1 -1
  457. package/dist/core/tools/ls.js.map +1 -1
  458. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  459. package/dist/core/tools/output-accumulator.js +1 -1
  460. package/dist/core/tools/output-accumulator.js.map +1 -1
  461. package/dist/core/tools/read.d.ts +2 -1
  462. package/dist/core/tools/read.d.ts.map +1 -1
  463. package/dist/core/tools/read.js +6 -3
  464. package/dist/core/tools/read.js.map +1 -1
  465. package/dist/core/tools/render-utils.d.ts +1 -1
  466. package/dist/core/tools/render-utils.d.ts.map +1 -1
  467. package/dist/core/tools/render-utils.js +1 -1
  468. package/dist/core/tools/render-utils.js.map +1 -1
  469. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  470. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  471. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  472. package/dist/core/tools/write.d.ts +2 -1
  473. package/dist/core/tools/write.d.ts.map +1 -1
  474. package/dist/core/tools/write.js +4 -1
  475. package/dist/core/tools/write.js.map +1 -1
  476. package/dist/encoding/index.d.ts +6 -0
  477. package/dist/encoding/index.d.ts.map +1 -0
  478. package/dist/encoding/index.js +6 -0
  479. package/dist/encoding/index.js.map +1 -0
  480. package/dist/encoding/l4-encoder.d.ts +96 -0
  481. package/dist/encoding/l4-encoder.d.ts.map +1 -0
  482. package/dist/encoding/l4-encoder.js +474 -0
  483. package/dist/encoding/l4-encoder.js.map +1 -0
  484. package/dist/fuzzing/index.d.ts +6 -0
  485. package/dist/fuzzing/index.d.ts.map +1 -0
  486. package/dist/fuzzing/index.js +6 -0
  487. package/dist/fuzzing/index.js.map +1 -0
  488. package/dist/fuzzing/mutation-engine.d.ts +93 -0
  489. package/dist/fuzzing/mutation-engine.d.ts.map +1 -0
  490. package/dist/fuzzing/mutation-engine.js +244 -0
  491. package/dist/fuzzing/mutation-engine.js.map +1 -0
  492. package/dist/guardrails/audit-logger.d.ts +4 -0
  493. package/dist/guardrails/audit-logger.d.ts.map +1 -0
  494. package/dist/guardrails/audit-logger.js +28 -0
  495. package/dist/guardrails/audit-logger.js.map +1 -0
  496. package/dist/guardrails/evidence-system.d.ts +61 -0
  497. package/dist/guardrails/evidence-system.d.ts.map +1 -0
  498. package/dist/guardrails/evidence-system.js +302 -0
  499. package/dist/guardrails/evidence-system.js.map +1 -0
  500. package/dist/guardrails/freedomd-adapter.d.ts +16 -0
  501. package/dist/guardrails/freedomd-adapter.d.ts.map +1 -0
  502. package/dist/guardrails/freedomd-adapter.js +87 -0
  503. package/dist/guardrails/freedomd-adapter.js.map +1 -0
  504. package/dist/jailbreak-extension.d.ts +48 -0
  505. package/dist/jailbreak-extension.d.ts.map +1 -0
  506. package/dist/jailbreak-extension.js +47 -0
  507. package/dist/jailbreak-extension.js.map +1 -0
  508. package/dist/main.d.ts.map +1 -1
  509. package/dist/main.js +6 -8
  510. package/dist/main.js.map +1 -1
  511. package/dist/migrations.d.ts +0 -37
  512. package/dist/migrations.d.ts.map +1 -1
  513. package/dist/migrations.js +6 -414
  514. package/dist/migrations.js.map +1 -1
  515. package/dist/modes/interactive/components/armin.d.ts +1 -1
  516. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  517. package/dist/modes/interactive/components/armin.js.map +1 -1
  518. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  519. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/assistant-message.js +1 -1
  521. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  522. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  523. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  524. package/dist/modes/interactive/components/bash-execution.js +1 -1
  525. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  526. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  527. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  528. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  529. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  530. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  531. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  532. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  533. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  534. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  535. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  536. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  537. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  538. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  539. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  540. package/dist/modes/interactive/components/config-selector.js +1 -1
  541. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  542. package/dist/modes/interactive/components/control-panel-box.d.ts +15 -0
  543. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -0
  544. package/dist/modes/interactive/components/control-panel-box.js +55 -0
  545. package/dist/modes/interactive/components/control-panel-box.js.map +1 -0
  546. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts +28 -0
  547. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -0
  548. package/dist/modes/interactive/components/control-panel-gradient-motion.js +112 -0
  549. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -0
  550. package/dist/modes/interactive/components/control-panel-gradient.d.ts +28 -0
  551. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -0
  552. package/dist/modes/interactive/components/control-panel-gradient.js +128 -0
  553. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -0
  554. package/dist/modes/interactive/components/control-panel-layout.d.ts +23 -0
  555. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
  556. package/dist/modes/interactive/components/control-panel-layout.js +165 -0
  557. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
  558. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +5 -0
  559. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -0
  560. package/dist/modes/interactive/components/control-panel-runtime-status.js +20 -0
  561. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
  562. package/dist/modes/interactive/components/control-panel.d.ts +24 -20
  563. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  564. package/dist/modes/interactive/components/control-panel.js +88 -69
  565. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  566. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  567. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  569. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  570. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  571. package/dist/modes/interactive/components/custom-editor.js +14 -22
  572. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  573. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  574. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/custom-message.js +1 -1
  576. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  577. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  578. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  580. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  581. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  583. package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
  584. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  585. package/dist/modes/interactive/components/earendil-announcement.js +2 -2
  586. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  587. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  588. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  589. package/dist/modes/interactive/components/extension-editor.js +2 -2
  590. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  591. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  592. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  593. package/dist/modes/interactive/components/extension-input.js +1 -1
  594. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  595. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  596. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  597. package/dist/modes/interactive/components/extension-selector.js +1 -1
  598. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  599. package/dist/modes/interactive/components/footer.d.ts +1 -1
  600. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/footer.js +1 -1
  602. package/dist/modes/interactive/components/footer.js.map +1 -1
  603. package/dist/modes/interactive/components/index.d.ts +0 -2
  604. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/index.js +0 -2
  606. package/dist/modes/interactive/components/index.js.map +1 -1
  607. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  608. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  610. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  611. package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
  612. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/login-dialog.js +2 -2
  614. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  615. package/dist/modes/interactive/components/model-selector.d.ts +4 -4
  616. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/model-selector.js +20 -42
  618. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  619. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  620. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  622. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  623. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  624. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  626. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  627. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  628. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  629. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  630. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  631. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  632. package/dist/modes/interactive/components/session-selector.js +1 -1
  633. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  634. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  635. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/settings-selector.js +1 -1
  637. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  638. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  639. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  640. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  641. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  642. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  643. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  644. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  645. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  646. package/dist/modes/interactive/components/theme-selector.d.ts +1 -1
  647. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  648. package/dist/modes/interactive/components/theme-selector.js +1 -1
  649. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  650. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -7
  651. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  652. package/dist/modes/interactive/components/thinking-selector.js +48 -7
  653. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  654. package/dist/modes/interactive/components/todo-checklist.d.ts +31 -0
  655. package/dist/modes/interactive/components/todo-checklist.d.ts.map +1 -0
  656. package/dist/modes/interactive/components/todo-checklist.js +121 -0
  657. package/dist/modes/interactive/components/todo-checklist.js.map +1 -0
  658. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  659. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  660. package/dist/modes/interactive/components/tool-execution.js +1 -1
  661. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  662. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  663. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  664. package/dist/modes/interactive/components/tree-selector.js +1 -1
  665. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  666. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  667. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  668. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  669. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  670. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  671. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  672. package/dist/modes/interactive/components/user-message.js +1 -1
  673. package/dist/modes/interactive/components/user-message.js.map +1 -1
  674. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  675. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  676. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  677. package/dist/modes/interactive/interactive-mode.d.ts +5 -8
  678. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  679. package/dist/modes/interactive/interactive-mode.js +79 -189
  680. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  681. package/dist/modes/interactive/theme/omk-control-grid-dark.json +65 -77
  682. package/dist/modes/interactive/theme/omk-neon-control.json +90 -0
  683. package/dist/modes/interactive/theme/rust-forge.json +14 -24
  684. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  685. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  686. package/dist/modes/interactive/theme/theme.js +22 -31
  687. package/dist/modes/interactive/theme/theme.js.map +1 -1
  688. package/dist/modes/print-mode.d.ts +3 -3
  689. package/dist/modes/print-mode.d.ts.map +1 -1
  690. package/dist/modes/print-mode.js +2 -2
  691. package/dist/modes/print-mode.js.map +1 -1
  692. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  693. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  694. package/dist/modes/rpc/rpc-client.js.map +1 -1
  695. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  696. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  697. package/dist/modes/rpc/rpc-types.js.map +1 -1
  698. package/dist/modules/index.d.ts +8 -0
  699. package/dist/modules/index.d.ts.map +1 -0
  700. package/dist/modules/index.js +7 -0
  701. package/dist/modules/index.js.map +1 -0
  702. package/dist/modules/lrl-bypass.d.ts +40 -0
  703. package/dist/modules/lrl-bypass.d.ts.map +1 -0
  704. package/dist/modules/lrl-bypass.js +84 -0
  705. package/dist/modules/lrl-bypass.js.map +1 -0
  706. package/dist/modules/lrl-deps.d.ts +38 -0
  707. package/dist/modules/lrl-deps.d.ts.map +1 -0
  708. package/dist/modules/lrl-deps.js +128 -0
  709. package/dist/modules/lrl-deps.js.map +1 -0
  710. package/dist/multiturn/easl-chain.d.ts +113 -0
  711. package/dist/multiturn/easl-chain.d.ts.map +1 -0
  712. package/dist/multiturn/easl-chain.js +351 -0
  713. package/dist/multiturn/easl-chain.js.map +1 -0
  714. package/dist/multiturn/index.d.ts +6 -0
  715. package/dist/multiturn/index.d.ts.map +1 -0
  716. package/dist/multiturn/index.js +6 -0
  717. package/dist/multiturn/index.js.map +1 -0
  718. package/dist/orchestration/lane-grant-auditor.d.ts +4 -0
  719. package/dist/orchestration/lane-grant-auditor.d.ts.map +1 -0
  720. package/dist/orchestration/lane-grant-auditor.js +87 -0
  721. package/dist/orchestration/lane-grant-auditor.js.map +1 -0
  722. package/dist/package-manager-cli.d.ts.map +1 -1
  723. package/dist/package-manager-cli.js +3 -3
  724. package/dist/package-manager-cli.js.map +1 -1
  725. package/dist/routing/fallback-router.d.ts +123 -0
  726. package/dist/routing/fallback-router.d.ts.map +1 -0
  727. package/dist/routing/fallback-router.js +355 -0
  728. package/dist/routing/fallback-router.js.map +1 -0
  729. package/dist/routing/index.d.ts +6 -0
  730. package/dist/routing/index.d.ts.map +1 -0
  731. package/dist/routing/index.js +6 -0
  732. package/dist/routing/index.js.map +1 -0
  733. package/dist/types/evidence.d.ts +117 -0
  734. package/dist/types/evidence.d.ts.map +1 -0
  735. package/dist/types/evidence.js +8 -0
  736. package/dist/types/evidence.js.map +1 -0
  737. package/dist/types/guardrails.d.ts +61 -0
  738. package/dist/types/guardrails.d.ts.map +1 -0
  739. package/dist/types/guardrails.js +9 -0
  740. package/dist/types/guardrails.js.map +1 -0
  741. package/dist/types/jailbreak.d.ts +246 -0
  742. package/dist/types/jailbreak.d.ts.map +1 -0
  743. package/dist/types/jailbreak.js +8 -0
  744. package/dist/types/jailbreak.js.map +1 -0
  745. package/dist/types/lane-grant.d.ts +58 -0
  746. package/dist/types/lane-grant.d.ts.map +1 -0
  747. package/dist/types/lane-grant.js +9 -0
  748. package/dist/types/lane-grant.js.map +1 -0
  749. package/dist/utils/clipboard-image.d.ts.map +1 -1
  750. package/dist/utils/clipboard-image.js +1 -1
  751. package/dist/utils/clipboard-image.js.map +1 -1
  752. package/dist/utils/jailbreak/common.d.ts +63 -0
  753. package/dist/utils/jailbreak/common.d.ts.map +1 -0
  754. package/dist/utils/jailbreak/common.js +130 -0
  755. package/dist/utils/jailbreak/common.js.map +1 -0
  756. package/dist/utils/jailbreak/index.d.ts +7 -0
  757. package/dist/utils/jailbreak/index.d.ts.map +1 -0
  758. package/dist/utils/jailbreak/index.js +7 -0
  759. package/dist/utils/jailbreak/index.js.map +1 -0
  760. package/dist/utils/omk-user-agent.d.ts +2 -0
  761. package/dist/utils/omk-user-agent.d.ts.map +1 -0
  762. package/dist/utils/{pi-user-agent.js → omk-user-agent.js} +2 -2
  763. package/dist/utils/omk-user-agent.js.map +1 -0
  764. package/dist/utils/tools-manager.d.ts.map +1 -1
  765. package/dist/utils/tools-manager.js +1 -1
  766. package/dist/utils/tools-manager.js.map +1 -1
  767. package/dist/utils/version-check.d.ts +5 -5
  768. package/dist/utils/version-check.d.ts.map +1 -1
  769. package/dist/utils/version-check.js +8 -11
  770. package/dist/utils/version-check.js.map +1 -1
  771. package/dist/utils/windows-self-update.d.ts.map +1 -1
  772. package/dist/utils/windows-self-update.js +1 -1
  773. package/dist/utils/windows-self-update.js.map +1 -1
  774. package/docs/compaction.md +8 -21
  775. package/docs/custom-provider.md +2 -2
  776. package/docs/development.md +1 -1
  777. package/docs/extensions.md +11 -11
  778. package/docs/loadout-domains/README.md +70 -0
  779. package/docs/loadout-domains/ai-agent-ops.md +94 -0
  780. package/docs/loadout-domains/backend-api.md +116 -0
  781. package/docs/loadout-domains/data-science.md +100 -0
  782. package/docs/loadout-domains/devops-infra.md +85 -0
  783. package/docs/loadout-domains/docs-writing.md +92 -0
  784. package/docs/loadout-domains/frontend-ui.md +128 -0
  785. package/docs/loadout-domains/general.md +62 -0
  786. package/docs/loadout-domains/mobile.md +84 -0
  787. package/docs/loadout-domains/qa-testing.md +87 -0
  788. package/docs/loadout-domains/research.md +80 -0
  789. package/docs/loadout-domains/security-audit.md +97 -0
  790. package/docs/packages.md +1 -1
  791. package/docs/sdk.md +3 -3
  792. package/docs/security.md +145 -0
  793. package/docs/session-format.md +1 -1
  794. package/docs/themes.md +8 -7
  795. package/docs/tui.md +14 -14
  796. package/examples/README.md +1 -1
  797. package/examples/extensions/README.md +12 -12
  798. package/examples/extensions/aside-computer-use/README.md +114 -0
  799. package/examples/extensions/aside-computer-use/action-scoring.ts +122 -0
  800. package/examples/extensions/aside-computer-use/assertions.ts +380 -0
  801. package/examples/extensions/aside-computer-use/controller.ts +491 -0
  802. package/examples/extensions/aside-computer-use/evidence.ts +229 -0
  803. package/examples/extensions/aside-computer-use/golden-trace.ts +141 -0
  804. package/examples/extensions/aside-computer-use/index.ts +76 -0
  805. package/examples/extensions/aside-computer-use/mcp-client.ts +381 -0
  806. package/examples/extensions/aside-computer-use/observation-snapshot.ts +121 -0
  807. package/examples/extensions/aside-computer-use/package.json +16 -0
  808. package/examples/extensions/aside-computer-use/policy.ts +257 -0
  809. package/examples/extensions/aside-computer-use/risk-authorize.ts +200 -0
  810. package/examples/extensions/aside-computer-use/risk-classifier.ts +205 -0
  811. package/examples/extensions/aside-computer-use/schema-fingerprint.ts +80 -0
  812. package/examples/extensions/aside-computer-use/session-binding.ts +161 -0
  813. package/examples/extensions/aside-computer-use/tools.ts +449 -0
  814. package/examples/extensions/aside-computer-use/types.ts +217 -0
  815. package/examples/extensions/aside-computer-use/url-origin.ts +132 -0
  816. package/examples/extensions/auto-commit-on-exit.ts +6 -6
  817. package/examples/extensions/bash-spawn-hook.ts +3 -3
  818. package/examples/extensions/bookmark.ts +5 -5
  819. package/examples/extensions/border-status-editor.ts +9 -9
  820. package/examples/extensions/built-in-tool-renderer.ts +7 -7
  821. package/examples/extensions/claude-rules.ts +4 -4
  822. package/examples/extensions/commands.ts +5 -5
  823. package/examples/extensions/confirm-destructive.ts +3 -3
  824. package/examples/extensions/custom-compaction.ts +4 -4
  825. package/examples/extensions/custom-footer.ts +4 -4
  826. package/examples/extensions/custom-header.ts +11 -11
  827. package/examples/extensions/custom-provider-anthropic/index.ts +5 -5
  828. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  829. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  830. package/examples/extensions/custom-provider-gitlab-duo/index.ts +4 -4
  831. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  832. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  833. package/examples/extensions/dirty-repo-guard.ts +7 -7
  834. package/examples/extensions/doom-overlay/README.md +2 -3
  835. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  836. package/examples/extensions/doom-overlay/doom/build.sh +4 -4
  837. package/examples/extensions/doom-overlay/doom/{doomgeneric_pi.c → doomgeneric_omk.c} +1 -1
  838. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  839. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  840. package/examples/extensions/doom-overlay/index.ts +3 -3
  841. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  842. package/examples/extensions/dynamic-resources/index.ts +2 -2
  843. package/examples/extensions/dynamic-tools.ts +4 -4
  844. package/examples/extensions/event-bus.ts +8 -8
  845. package/examples/extensions/file-trigger.ts +3 -3
  846. package/examples/extensions/git-checkpoint.ts +7 -7
  847. package/examples/extensions/git-merge-and-resolve.ts +14 -14
  848. package/examples/extensions/github-issue-autocomplete.ts +7 -12
  849. package/examples/extensions/gondolin/index.ts +16 -16
  850. package/examples/extensions/gondolin/package-lock.json +2 -2
  851. package/examples/extensions/gondolin/package.json +1 -1
  852. package/examples/extensions/handoff.ts +4 -4
  853. package/examples/extensions/hello.ts +3 -3
  854. package/examples/extensions/hidden-thinking-label.ts +4 -4
  855. package/examples/extensions/inline-bash.ts +5 -5
  856. package/examples/extensions/input-transform-streaming.ts +5 -5
  857. package/examples/extensions/input-transform.ts +5 -5
  858. package/examples/extensions/interactive-shell.ts +3 -3
  859. package/examples/extensions/mac-system-theme.ts +5 -5
  860. package/examples/extensions/message-renderer.ts +5 -5
  861. package/examples/extensions/minimal-mode.ts +10 -10
  862. package/examples/extensions/modal-editor.ts +4 -4
  863. package/examples/extensions/model-status.ts +3 -3
  864. package/examples/extensions/notify.ts +5 -5
  865. package/examples/extensions/overlay-qa-tests.ts +22 -22
  866. package/examples/extensions/overlay-test.ts +4 -4
  867. package/examples/extensions/permission-gate.ts +2 -2
  868. package/examples/extensions/pirate.ts +4 -4
  869. package/examples/extensions/plan-mode/index.ts +25 -25
  870. package/examples/extensions/preset.ts +31 -31
  871. package/examples/extensions/prompt-customizer.ts +3 -3
  872. package/examples/extensions/protected-paths.ts +2 -2
  873. package/examples/extensions/provider-payload.ts +8 -5
  874. package/examples/extensions/qna.ts +3 -3
  875. package/examples/extensions/question.ts +3 -3
  876. package/examples/extensions/questionnaire.ts +3 -3
  877. package/examples/extensions/rainbow-editor.ts +3 -3
  878. package/examples/extensions/reload-runtime.ts +4 -4
  879. package/examples/extensions/rpc-demo.ts +10 -10
  880. package/examples/extensions/sandbox/index.ts +16 -16
  881. package/examples/extensions/sandbox/package-lock.json +2 -2
  882. package/examples/extensions/sandbox/package.json +1 -1
  883. package/examples/extensions/send-user-message.ts +13 -13
  884. package/examples/extensions/session-name.ts +4 -4
  885. package/examples/extensions/shutdown-command.ts +10 -10
  886. package/examples/extensions/snake.ts +4 -4
  887. package/examples/extensions/space-invaders.ts +4 -4
  888. package/examples/extensions/ssh.ts +12 -12
  889. package/examples/extensions/status-line.ts +4 -4
  890. package/examples/extensions/structured-output.ts +3 -3
  891. package/examples/extensions/subagent/README.md +13 -13
  892. package/examples/extensions/subagent/agents.ts +1 -1
  893. package/examples/extensions/subagent/index.ts +13 -13
  894. package/examples/extensions/summarize.ts +4 -4
  895. package/examples/extensions/system-prompt-header.ts +3 -3
  896. package/examples/extensions/tic-tac-toe.ts +17 -17
  897. package/examples/extensions/timed-confirm.ts +4 -4
  898. package/examples/extensions/titlebar-spinner.ts +9 -9
  899. package/examples/extensions/todo.ts +7 -7
  900. package/examples/extensions/tool-override.ts +6 -6
  901. package/examples/extensions/tools.ts +11 -11
  902. package/examples/extensions/trigger-compact.ts +3 -3
  903. package/examples/extensions/truncated-tool.ts +4 -4
  904. package/examples/extensions/widget-placement.ts +2 -2
  905. package/examples/extensions/with-deps/index.ts +2 -2
  906. package/examples/extensions/with-deps/package-lock.json +2 -2
  907. package/examples/extensions/with-deps/package.json +1 -1
  908. package/examples/extensions/working-indicator.ts +7 -7
  909. package/examples/extensions/working-message-test.ts +3 -3
  910. package/examples/rpc-extension-ui.ts +1 -9
  911. package/examples/sdk/01-minimal.ts +1 -1
  912. package/examples/sdk/02-custom-model.ts +1 -1
  913. package/examples/sdk/03-custom-prompt.ts +1 -1
  914. package/examples/sdk/04-skills.ts +1 -1
  915. package/examples/sdk/05-tools.ts +1 -1
  916. package/examples/sdk/06-extensions.ts +11 -11
  917. package/examples/sdk/08-prompt-templates.ts +1 -1
  918. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  919. package/examples/sdk/12-full-control.ts +1 -1
  920. package/examples/sdk/README.md +3 -3
  921. package/npm-shrinkwrap.json +1805 -0
  922. package/package.json +8 -14
  923. package/dist/core/harness-control-events.d.ts +0 -79
  924. package/dist/core/harness-control-events.d.ts.map +0 -1
  925. package/dist/core/harness-control-events.js +0 -339
  926. package/dist/core/harness-control-events.js.map +0 -1
  927. package/dist/core/harness-control-replay.d.ts +0 -26
  928. package/dist/core/harness-control-replay.d.ts.map +0 -1
  929. package/dist/core/harness-control-replay.js +0 -155
  930. package/dist/core/harness-control-replay.js.map +0 -1
  931. package/dist/core/spec-kit/compiler.d.ts +0 -67
  932. package/dist/core/spec-kit/compiler.d.ts.map +0 -1
  933. package/dist/core/spec-kit/compiler.js +0 -268
  934. package/dist/core/spec-kit/compiler.js.map +0 -1
  935. package/dist/core/transaction-coordinator.d.ts +0 -30
  936. package/dist/core/transaction-coordinator.d.ts.map +0 -1
  937. package/dist/core/transaction-coordinator.js +0 -173
  938. package/dist/core/transaction-coordinator.js.map +0 -1
  939. package/dist/modes/interactive/components/mcp-selector.d.ts +0 -28
  940. package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
  941. package/dist/modes/interactive/components/mcp-selector.js +0 -138
  942. package/dist/modes/interactive/components/mcp-selector.js.map +0 -1
  943. package/dist/modes/interactive/components/skills-selector.d.ts +0 -32
  944. package/dist/modes/interactive/components/skills-selector.d.ts.map +0 -1
  945. package/dist/modes/interactive/components/skills-selector.js +0 -130
  946. package/dist/modes/interactive/components/skills-selector.js.map +0 -1
  947. package/dist/utils/pi-user-agent.d.ts +0 -2
  948. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  949. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/config-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * TUI component for managing package resources (enable/disable)\n */\n\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tSpacer,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"@earendil-works/omk-tui\";\nimport { CONFIG_DIR_NAME } from \"../../../config.ts\";\nimport type { PathMetadata, ResolvedPaths, ResolvedResource } from \"../../../core/package-manager.ts\";\nimport type { PackageSource, SettingsManager } from \"../../../core/settings-manager.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { rawKeyHint } from \"./keybinding-hints.ts\";\n\ntype ResourceType = \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\nconst RESOURCE_TYPE_LABELS: Record<ResourceType, string> = {\n\textensions: \"Extensions\",\n\tskills: \"Skills\",\n\tprompts: \"Prompts\",\n\tthemes: \"Themes\",\n};\n\ninterface ResourceItem {\n\tpath: string;\n\tenabled: boolean;\n\tmetadata: PathMetadata;\n\tresourceType: ResourceType;\n\tdisplayName: string;\n\tgroupKey: string;\n\tsubgroupKey: string;\n}\n\ninterface ResourceSubgroup {\n\ttype: ResourceType;\n\tlabel: string;\n\titems: ResourceItem[];\n}\n\ninterface ResourceGroup {\n\tkey: string;\n\tlabel: string;\n\tscope: \"user\" | \"project\" | \"temporary\";\n\torigin: \"package\" | \"top-level\";\n\tsource: string;\n\tsubgroups: ResourceSubgroup[];\n}\n\nfunction formatBaseDir(baseDir: string): string {\n\tconst homeDir = homedir();\n\tlet displayPath: string;\n\n\tif (baseDir === homeDir) {\n\t\tdisplayPath = \"~\";\n\t} else if (baseDir.startsWith(homeDir)) {\n\t\t// Replace home prefix with ~, normalize separators for display\n\t\tconst rest = baseDir.slice(homeDir.length);\n\t\tdisplayPath = `~${rest.replace(/\\\\/g, \"/\")}`;\n\t} else {\n\t\tdisplayPath = baseDir.replace(/\\\\/g, \"/\");\n\t}\n\n\treturn displayPath.endsWith(\"/\") ? displayPath : `${displayPath}/`;\n}\n\nfunction getGroupLabel(metadata: PathMetadata): string {\n\tif (metadata.origin === \"package\") {\n\t\treturn `${metadata.source} (${metadata.scope})`;\n\t}\n\t// Top-level resources\n\tif (metadata.source === \"auto\") {\n\t\tif (metadata.baseDir) {\n\t\t\treturn metadata.scope === \"user\"\n\t\t\t\t? `User (${formatBaseDir(metadata.baseDir)})`\n\t\t\t\t: `Project (${formatBaseDir(metadata.baseDir)})`;\n\t\t}\n\t\treturn metadata.scope === \"user\" ? \"User (~/.omk/agent/)\" : \"Project (.omk/)\";\n\t}\n\treturn metadata.scope === \"user\" ? \"User settings\" : \"Project settings\";\n}\n\nfunction buildGroups(resolved: ResolvedPaths): ResourceGroup[] {\n\tconst groupMap = new Map<string, ResourceGroup>();\n\n\tconst addToGroup = (resources: ResolvedResource[], resourceType: ResourceType) => {\n\t\tfor (const res of resources) {\n\t\t\tconst { path, enabled, metadata } = res;\n\t\t\tconst groupKey = `${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir ?? \"\"}`;\n\n\t\t\tif (!groupMap.has(groupKey)) {\n\t\t\t\tgroupMap.set(groupKey, {\n\t\t\t\t\tkey: groupKey,\n\t\t\t\t\tlabel: getGroupLabel(metadata),\n\t\t\t\t\tscope: metadata.scope,\n\t\t\t\t\torigin: metadata.origin,\n\t\t\t\t\tsource: metadata.source,\n\t\t\t\t\tsubgroups: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst group = groupMap.get(groupKey)!;\n\t\t\tconst subgroupKey = `${groupKey}:${resourceType}`;\n\n\t\t\tlet subgroup = group.subgroups.find((sg) => sg.type === resourceType);\n\t\t\tif (!subgroup) {\n\t\t\t\tsubgroup = {\n\t\t\t\t\ttype: resourceType,\n\t\t\t\t\tlabel: RESOURCE_TYPE_LABELS[resourceType],\n\t\t\t\t\titems: [],\n\t\t\t\t};\n\t\t\t\tgroup.subgroups.push(subgroup);\n\t\t\t}\n\n\t\t\tconst fileName = basename(path);\n\t\t\tconst parentFolder = basename(dirname(path));\n\t\t\tlet displayName: string;\n\t\t\tif (resourceType === \"extensions\" && parentFolder !== \"extensions\") {\n\t\t\t\tdisplayName = `${parentFolder}/${fileName}`;\n\t\t\t} else if (resourceType === \"skills\" && fileName === \"SKILL.md\") {\n\t\t\t\tdisplayName = parentFolder;\n\t\t\t} else {\n\t\t\t\tdisplayName = fileName;\n\t\t\t}\n\t\t\tsubgroup.items.push({\n\t\t\t\tpath,\n\t\t\t\tenabled,\n\t\t\t\tmetadata,\n\t\t\t\tresourceType,\n\t\t\t\tdisplayName,\n\t\t\t\tgroupKey,\n\t\t\t\tsubgroupKey,\n\t\t\t});\n\t\t}\n\t};\n\n\taddToGroup(resolved.extensions, \"extensions\");\n\taddToGroup(resolved.skills, \"skills\");\n\taddToGroup(resolved.prompts, \"prompts\");\n\taddToGroup(resolved.themes, \"themes\");\n\n\t// Sort groups: packages first, then top-level; user before project\n\tconst groups = Array.from(groupMap.values());\n\tgroups.sort((a, b) => {\n\t\tif (a.origin !== b.origin) {\n\t\t\treturn a.origin === \"package\" ? -1 : 1;\n\t\t}\n\t\tif (a.scope !== b.scope) {\n\t\t\treturn a.scope === \"user\" ? -1 : 1;\n\t\t}\n\t\treturn a.source.localeCompare(b.source);\n\t});\n\n\t// Sort subgroups within each group by type order, and items by name\n\tconst typeOrder: Record<ResourceType, number> = { extensions: 0, skills: 1, prompts: 2, themes: 3 };\n\tfor (const group of groups) {\n\t\tgroup.subgroups.sort((a, b) => typeOrder[a.type] - typeOrder[b.type]);\n\t\tfor (const subgroup of group.subgroups) {\n\t\t\tsubgroup.items.sort((a, b) => a.displayName.localeCompare(b.displayName));\n\t\t}\n\t}\n\n\treturn groups;\n}\n\ntype FlatEntry =\n\t| { type: \"group\"; group: ResourceGroup }\n\t| { type: \"subgroup\"; subgroup: ResourceSubgroup; group: ResourceGroup }\n\t| { type: \"item\"; item: ResourceItem };\n\nclass ConfigSelectorHeader implements Component {\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst title = theme.bold(\"Resource Configuration\");\n\t\tconst sep = theme.fg(\"muted\", \" · \");\n\t\tconst hint = rawKeyHint(\"space\", \"toggle\") + sep + rawKeyHint(\"esc\", \"close\");\n\t\tconst hintWidth = visibleWidth(hint);\n\t\tconst titleWidth = visibleWidth(title);\n\t\tconst spacing = Math.max(1, width - titleWidth - hintWidth);\n\n\t\treturn [\n\t\t\ttruncateToWidth(`${title}${\" \".repeat(spacing)}${hint}`, width, \"\"),\n\t\t\ttheme.fg(\"muted\", \"Type to filter resources\"),\n\t\t];\n\t}\n}\n\nclass ResourceList implements Component, Focusable {\n\tprivate groups: ResourceGroup[];\n\tprivate flatItems: FlatEntry[] = [];\n\tprivate filteredItems: FlatEntry[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\tprivate maxVisible: number;\n\tprivate settingsManager: SettingsManager;\n\tprivate cwd: string;\n\tprivate agentDir: string;\n\n\tpublic onCancel?: () => void;\n\tpublic onExit?: () => void;\n\tpublic onToggle?: (item: ResourceItem, newEnabled: boolean) => void;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tconstructor(\n\t\tgroups: ResourceGroup[],\n\t\tsettingsManager: SettingsManager,\n\t\tcwd: string,\n\t\tagentDir: string,\n\t\tterminalHeight?: number,\n\t) {\n\t\tthis.groups = groups;\n\t\tthis.settingsManager = settingsManager;\n\t\tthis.cwd = cwd;\n\t\tthis.agentDir = agentDir;\n\t\tthis.searchInput = new Input();\n\t\t// 8 lines of chrome: top spacer + top border + spacer + header (2 lines) + spacer + bottom spacer + bottom border\n\t\tconst chrome = 8;\n\t\tthis.maxVisible = Math.max(5, (terminalHeight ?? 24) - chrome);\n\t\tthis.buildFlatList();\n\t\tthis.filteredItems = [...this.flatItems];\n\t}\n\n\tprivate buildFlatList(): void {\n\t\tthis.flatItems = [];\n\t\tfor (const group of this.groups) {\n\t\t\tthis.flatItems.push({ type: \"group\", group });\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tthis.flatItems.push({ type: \"subgroup\", subgroup, group });\n\t\t\t\tfor (const item of subgroup.items) {\n\t\t\t\t\tthis.flatItems.push({ type: \"item\", item });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Start selection on first item (not header)\n\t\tthis.selectedIndex = this.flatItems.findIndex((e) => e.type === \"item\");\n\t\tif (this.selectedIndex < 0) this.selectedIndex = 0;\n\t}\n\n\tprivate findNextItem(fromIndex: number, direction: 1 | -1): number {\n\t\tlet idx = fromIndex + direction;\n\t\twhile (idx >= 0 && idx < this.filteredItems.length) {\n\t\t\tif (this.filteredItems[idx].type === \"item\") {\n\t\t\t\treturn idx;\n\t\t\t}\n\t\t\tidx += direction;\n\t\t}\n\t\treturn fromIndex; // Stay at current if no item found\n\t}\n\n\tprivate filterItems(query: string): void {\n\t\tif (!query.trim()) {\n\t\t\tthis.filteredItems = [...this.flatItems];\n\t\t\tthis.selectFirstItem();\n\t\t\treturn;\n\t\t}\n\n\t\tconst lowerQuery = query.toLowerCase();\n\t\tconst matchingItems = new Set<ResourceItem>();\n\t\tconst matchingSubgroups = new Set<ResourceSubgroup>();\n\t\tconst matchingGroups = new Set<ResourceGroup>();\n\n\t\tfor (const entry of this.flatItems) {\n\t\t\tif (entry.type === \"item\") {\n\t\t\t\tconst item = entry.item;\n\t\t\t\tif (\n\t\t\t\t\titem.displayName.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\titem.resourceType.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\titem.path.toLowerCase().includes(lowerQuery)\n\t\t\t\t) {\n\t\t\t\t\tmatchingItems.add(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find which subgroups and groups contain matching items\n\t\tfor (const group of this.groups) {\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tfor (const item of subgroup.items) {\n\t\t\t\t\tif (matchingItems.has(item)) {\n\t\t\t\t\t\tmatchingSubgroups.add(subgroup);\n\t\t\t\t\t\tmatchingGroups.add(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.filteredItems = [];\n\t\tfor (const entry of this.flatItems) {\n\t\t\tif (entry.type === \"group\" && matchingGroups.has(entry.group)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t} else if (entry.type === \"subgroup\" && matchingSubgroups.has(entry.subgroup)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t} else if (entry.type === \"item\" && matchingItems.has(entry.item)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t}\n\t\t}\n\n\t\tthis.selectFirstItem();\n\t}\n\n\tprivate selectFirstItem(): void {\n\t\tconst firstItemIndex = this.filteredItems.findIndex((e) => e.type === \"item\");\n\t\tthis.selectedIndex = firstItemIndex >= 0 ? firstItemIndex : 0;\n\t}\n\n\tupdateItem(item: ResourceItem, enabled: boolean): void {\n\t\titem.enabled = enabled;\n\t\t// Update in groups too\n\t\tfor (const group of this.groups) {\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tconst found = subgroup.items.find((i) => i.path === item.path && i.resourceType === item.resourceType);\n\t\t\t\tif (found) {\n\t\t\t\t\tfound.enabled = enabled;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\t// Search input\n\t\tlines.push(...this.searchInput.render(width));\n\t\tlines.push(\"\");\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tlines.push(theme.fg(\"muted\", \" No resources found\"));\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Calculate visible range\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst entry = this.filteredItems[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tif (entry.type === \"group\") {\n\t\t\t\t// Main group header (no cursor)\n\t\t\t\tconst groupLine = theme.fg(\"accent\", theme.bold(entry.group.label));\n\t\t\t\tlines.push(truncateToWidth(` ${groupLine}`, width, \"\"));\n\t\t\t} else if (entry.type === \"subgroup\") {\n\t\t\t\t// Subgroup header (indented, no cursor)\n\t\t\t\tconst subgroupLine = theme.fg(\"muted\", entry.subgroup.label);\n\t\t\t\tlines.push(truncateToWidth(` ${subgroupLine}`, width, \"\"));\n\t\t\t} else {\n\t\t\t\t// Resource item (cursor only on items)\n\t\t\t\tconst item = entry.item;\n\t\t\t\tconst cursor = isSelected ? \"> \" : \" \";\n\t\t\t\tconst checkbox = item.enabled ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t\t\tconst name = isSelected ? theme.bold(item.displayName) : item.displayName;\n\t\t\t\tlines.push(truncateToWidth(`${cursor} ${checkbox} ${name}`, width, \"...\"));\n\t\t\t}\n\t\t}\n\n\t\t// Scroll indicator\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tconst itemCount = this.filteredItems.filter((e) => e.type === \"item\").length;\n\t\t\tconst currentItemIndex =\n\t\t\t\tthis.filteredItems.slice(0, this.selectedIndex).filter((e) => e.type === \"item\").length + 1;\n\t\t\tlines.push(theme.fg(\"dim\", ` (${currentItemIndex}/${itemCount})`));\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.selectedIndex = this.findNextItem(this.selectedIndex, -1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.selectedIndex = this.findNextItem(this.selectedIndex, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.pageUp\")) {\n\t\t\t// Jump up by maxVisible, then find nearest item\n\t\t\tlet target = Math.max(0, this.selectedIndex - this.maxVisible);\n\t\t\twhile (target < this.filteredItems.length && this.filteredItems[target].type !== \"item\") {\n\t\t\t\ttarget++;\n\t\t\t}\n\t\t\tif (target < this.filteredItems.length) {\n\t\t\t\tthis.selectedIndex = target;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.pageDown\")) {\n\t\t\t// Jump down by maxVisible, then find nearest item\n\t\t\tlet target = Math.min(this.filteredItems.length - 1, this.selectedIndex + this.maxVisible);\n\t\t\twhile (target >= 0 && this.filteredItems[target].type !== \"item\") {\n\t\t\t\ttarget--;\n\t\t\t}\n\t\t\tif (target >= 0) {\n\t\t\t\tthis.selectedIndex = target;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel?.();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \" \" || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst entry = this.filteredItems[this.selectedIndex];\n\t\t\tif (entry?.type === \"item\") {\n\t\t\t\tconst newEnabled = !entry.item.enabled;\n\t\t\t\tthis.toggleResource(entry.item, newEnabled);\n\t\t\t\tthis.updateItem(entry.item, newEnabled);\n\t\t\t\tthis.onToggle?.(entry.item, newEnabled);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.filterItems(this.searchInput.getValue());\n\t}\n\n\tprivate toggleResource(item: ResourceItem, enabled: boolean): void {\n\t\tif (item.metadata.origin === \"top-level\") {\n\t\t\tthis.toggleTopLevelResource(item, enabled);\n\t\t} else {\n\t\t\tthis.togglePackageResource(item, enabled);\n\t\t}\n\t}\n\n\tprivate toggleTopLevelResource(item: ResourceItem, enabled: boolean): void {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst settings =\n\t\t\tscope === \"project\" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();\n\n\t\tconst arrayKey = item.resourceType as \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\t\tconst current = (settings[arrayKey] ?? []) as string[];\n\n\t\t// Generate pattern for this resource\n\t\tconst pattern = this.getResourcePattern(item);\n\t\tconst disablePattern = `-${pattern}`;\n\t\tconst enablePattern = `+${pattern}`;\n\n\t\t// Filter out existing patterns for this resource\n\t\tconst updated = current.filter((p) => {\n\t\t\tconst stripped = p.startsWith(\"!\") || p.startsWith(\"+\") || p.startsWith(\"-\") ? p.slice(1) : p;\n\t\t\treturn stripped !== pattern;\n\t\t});\n\n\t\tif (enabled) {\n\t\t\tupdated.push(enablePattern);\n\t\t} else {\n\t\t\tupdated.push(disablePattern);\n\t\t}\n\n\t\tif (scope === \"project\") {\n\t\t\tif (arrayKey === \"extensions\") {\n\t\t\t\tthis.settingsManager.setProjectExtensionPaths(updated);\n\t\t\t} else if (arrayKey === \"skills\") {\n\t\t\t\tthis.settingsManager.setProjectSkillPaths(updated);\n\t\t\t} else if (arrayKey === \"prompts\") {\n\t\t\t\tthis.settingsManager.setProjectPromptTemplatePaths(updated);\n\t\t\t} else if (arrayKey === \"themes\") {\n\t\t\t\tthis.settingsManager.setProjectThemePaths(updated);\n\t\t\t}\n\t\t} else {\n\t\t\tif (arrayKey === \"extensions\") {\n\t\t\t\tthis.settingsManager.setExtensionPaths(updated);\n\t\t\t} else if (arrayKey === \"skills\") {\n\t\t\t\tthis.settingsManager.setSkillPaths(updated);\n\t\t\t} else if (arrayKey === \"prompts\") {\n\t\t\t\tthis.settingsManager.setPromptTemplatePaths(updated);\n\t\t\t} else if (arrayKey === \"themes\") {\n\t\t\t\tthis.settingsManager.setThemePaths(updated);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate togglePackageResource(item: ResourceItem, enabled: boolean): void {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst settings =\n\t\t\tscope === \"project\" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();\n\n\t\tconst packages = [...(settings.packages ?? [])] as PackageSource[];\n\t\tconst pkgIndex = packages.findIndex((pkg) => {\n\t\t\tconst source = typeof pkg === \"string\" ? pkg : pkg.source;\n\t\t\treturn source === item.metadata.source;\n\t\t});\n\n\t\tif (pkgIndex === -1) return;\n\n\t\tlet pkg = packages[pkgIndex];\n\n\t\t// Convert string to object form if needed\n\t\tif (typeof pkg === \"string\") {\n\t\t\tpkg = { source: pkg };\n\t\t\tpackages[pkgIndex] = pkg;\n\t\t}\n\n\t\t// Get the resource array for this type\n\t\tconst arrayKey = item.resourceType as \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\t\tconst current = (pkg[arrayKey] ?? []) as string[];\n\n\t\t// Generate pattern relative to package root\n\t\tconst pattern = this.getPackageResourcePattern(item);\n\t\tconst disablePattern = `-${pattern}`;\n\t\tconst enablePattern = `+${pattern}`;\n\n\t\t// Filter out existing patterns for this resource\n\t\tconst updated = current.filter((p) => {\n\t\t\tconst stripped = p.startsWith(\"!\") || p.startsWith(\"+\") || p.startsWith(\"-\") ? p.slice(1) : p;\n\t\t\treturn stripped !== pattern;\n\t\t});\n\n\t\tif (enabled) {\n\t\t\tupdated.push(enablePattern);\n\t\t} else {\n\t\t\tupdated.push(disablePattern);\n\t\t}\n\n\t\t(pkg as Record<string, unknown>)[arrayKey] = updated.length > 0 ? updated : undefined;\n\n\t\t// Clean up empty filter object\n\t\tconst hasFilters = [\"extensions\", \"skills\", \"prompts\", \"themes\"].some(\n\t\t\t(k) => (pkg as Record<string, unknown>)[k] !== undefined,\n\t\t);\n\t\tif (!hasFilters) {\n\t\t\tpackages[pkgIndex] = (pkg as { source: string }).source;\n\t\t}\n\n\t\tif (scope === \"project\") {\n\t\t\tthis.settingsManager.setProjectPackages(packages);\n\t\t} else {\n\t\t\tthis.settingsManager.setPackages(packages);\n\t\t}\n\t}\n\n\tprivate getTopLevelBaseDir(scope: \"user\" | \"project\"): string {\n\t\treturn scope === \"project\" ? join(this.cwd, CONFIG_DIR_NAME) : this.agentDir;\n\t}\n\n\tprivate getResourcePattern(item: ResourceItem): string {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst baseDir = item.metadata.baseDir ?? this.getTopLevelBaseDir(scope);\n\t\treturn relative(baseDir, item.path);\n\t}\n\n\tprivate getPackageResourcePattern(item: ResourceItem): string {\n\t\tconst baseDir = item.metadata.baseDir ?? dirname(item.path);\n\t\treturn relative(baseDir, item.path);\n\t}\n}\n\nexport class ConfigSelectorComponent extends Container implements Focusable {\n\tprivate resourceList: ResourceList;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.resourceList.focused = value;\n\t}\n\n\tconstructor(\n\t\tresolvedPaths: ResolvedPaths,\n\t\tsettingsManager: SettingsManager,\n\t\tcwd: string,\n\t\tagentDir: string,\n\t\tonClose: () => void,\n\t\tonExit: () => void,\n\t\trequestRender: () => void,\n\t\tterminalHeight?: number,\n\t) {\n\t\tsuper();\n\n\t\tconst groups = buildGroups(resolvedPaths);\n\n\t\t// Add header\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new ConfigSelectorHeader());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Resource list\n\t\tthis.resourceList = new ResourceList(groups, settingsManager, cwd, agentDir, terminalHeight);\n\t\tthis.resourceList.onCancel = onClose;\n\t\tthis.resourceList.onExit = onExit;\n\t\tthis.resourceList.onToggle = () => requestRender();\n\t\tthis.addChild(this.resourceList);\n\n\t\t// Bottom border\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetResourceList(): ResourceList {\n\t\treturn this.resourceList;\n\t}\n}\n"]}
1
+ {"version":3,"file":"config-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/config-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * TUI component for managing package resources (enable/disable)\n */\n\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join, relative } from \"node:path\";\nimport {\n\ttype Component,\n\tContainer,\n\ttype Focusable,\n\tgetKeybindings,\n\tInput,\n\tmatchesKey,\n\tSpacer,\n\ttruncateToWidth,\n\tvisibleWidth,\n} from \"omk-tui\";\nimport { CONFIG_DIR_NAME } from \"../../../config.ts\";\nimport type { PathMetadata, ResolvedPaths, ResolvedResource } from \"../../../core/package-manager.ts\";\nimport type { PackageSource, SettingsManager } from \"../../../core/settings-manager.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { rawKeyHint } from \"./keybinding-hints.ts\";\n\ntype ResourceType = \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\nconst RESOURCE_TYPE_LABELS: Record<ResourceType, string> = {\n\textensions: \"Extensions\",\n\tskills: \"Skills\",\n\tprompts: \"Prompts\",\n\tthemes: \"Themes\",\n};\n\ninterface ResourceItem {\n\tpath: string;\n\tenabled: boolean;\n\tmetadata: PathMetadata;\n\tresourceType: ResourceType;\n\tdisplayName: string;\n\tgroupKey: string;\n\tsubgroupKey: string;\n}\n\ninterface ResourceSubgroup {\n\ttype: ResourceType;\n\tlabel: string;\n\titems: ResourceItem[];\n}\n\ninterface ResourceGroup {\n\tkey: string;\n\tlabel: string;\n\tscope: \"user\" | \"project\" | \"temporary\";\n\torigin: \"package\" | \"top-level\";\n\tsource: string;\n\tsubgroups: ResourceSubgroup[];\n}\n\nfunction formatBaseDir(baseDir: string): string {\n\tconst homeDir = homedir();\n\tlet displayPath: string;\n\n\tif (baseDir === homeDir) {\n\t\tdisplayPath = \"~\";\n\t} else if (baseDir.startsWith(homeDir)) {\n\t\t// Replace home prefix with ~, normalize separators for display\n\t\tconst rest = baseDir.slice(homeDir.length);\n\t\tdisplayPath = `~${rest.replace(/\\\\/g, \"/\")}`;\n\t} else {\n\t\tdisplayPath = baseDir.replace(/\\\\/g, \"/\");\n\t}\n\n\treturn displayPath.endsWith(\"/\") ? displayPath : `${displayPath}/`;\n}\n\nfunction getGroupLabel(metadata: PathMetadata): string {\n\tif (metadata.origin === \"package\") {\n\t\treturn `${metadata.source} (${metadata.scope})`;\n\t}\n\t// Top-level resources\n\tif (metadata.source === \"auto\") {\n\t\tif (metadata.baseDir) {\n\t\t\treturn metadata.scope === \"user\"\n\t\t\t\t? `User (${formatBaseDir(metadata.baseDir)})`\n\t\t\t\t: `Project (${formatBaseDir(metadata.baseDir)})`;\n\t\t}\n\t\treturn metadata.scope === \"user\" ? \"User (~/.omk/agent/)\" : \"Project (.omk/)\";\n\t}\n\treturn metadata.scope === \"user\" ? \"User settings\" : \"Project settings\";\n}\n\nfunction buildGroups(resolved: ResolvedPaths): ResourceGroup[] {\n\tconst groupMap = new Map<string, ResourceGroup>();\n\n\tconst addToGroup = (resources: ResolvedResource[], resourceType: ResourceType) => {\n\t\tfor (const res of resources) {\n\t\t\tconst { path, enabled, metadata } = res;\n\t\t\tconst groupKey = `${metadata.origin}:${metadata.scope}:${metadata.source}:${metadata.baseDir ?? \"\"}`;\n\n\t\t\tif (!groupMap.has(groupKey)) {\n\t\t\t\tgroupMap.set(groupKey, {\n\t\t\t\t\tkey: groupKey,\n\t\t\t\t\tlabel: getGroupLabel(metadata),\n\t\t\t\t\tscope: metadata.scope,\n\t\t\t\t\torigin: metadata.origin,\n\t\t\t\t\tsource: metadata.source,\n\t\t\t\t\tsubgroups: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst group = groupMap.get(groupKey)!;\n\t\t\tconst subgroupKey = `${groupKey}:${resourceType}`;\n\n\t\t\tlet subgroup = group.subgroups.find((sg) => sg.type === resourceType);\n\t\t\tif (!subgroup) {\n\t\t\t\tsubgroup = {\n\t\t\t\t\ttype: resourceType,\n\t\t\t\t\tlabel: RESOURCE_TYPE_LABELS[resourceType],\n\t\t\t\t\titems: [],\n\t\t\t\t};\n\t\t\t\tgroup.subgroups.push(subgroup);\n\t\t\t}\n\n\t\t\tconst fileName = basename(path);\n\t\t\tconst parentFolder = basename(dirname(path));\n\t\t\tlet displayName: string;\n\t\t\tif (resourceType === \"extensions\" && parentFolder !== \"extensions\") {\n\t\t\t\tdisplayName = `${parentFolder}/${fileName}`;\n\t\t\t} else if (resourceType === \"skills\" && fileName === \"SKILL.md\") {\n\t\t\t\tdisplayName = parentFolder;\n\t\t\t} else {\n\t\t\t\tdisplayName = fileName;\n\t\t\t}\n\t\t\tsubgroup.items.push({\n\t\t\t\tpath,\n\t\t\t\tenabled,\n\t\t\t\tmetadata,\n\t\t\t\tresourceType,\n\t\t\t\tdisplayName,\n\t\t\t\tgroupKey,\n\t\t\t\tsubgroupKey,\n\t\t\t});\n\t\t}\n\t};\n\n\taddToGroup(resolved.extensions, \"extensions\");\n\taddToGroup(resolved.skills, \"skills\");\n\taddToGroup(resolved.prompts, \"prompts\");\n\taddToGroup(resolved.themes, \"themes\");\n\n\t// Sort groups: packages first, then top-level; user before project\n\tconst groups = Array.from(groupMap.values());\n\tgroups.sort((a, b) => {\n\t\tif (a.origin !== b.origin) {\n\t\t\treturn a.origin === \"package\" ? -1 : 1;\n\t\t}\n\t\tif (a.scope !== b.scope) {\n\t\t\treturn a.scope === \"user\" ? -1 : 1;\n\t\t}\n\t\treturn a.source.localeCompare(b.source);\n\t});\n\n\t// Sort subgroups within each group by type order, and items by name\n\tconst typeOrder: Record<ResourceType, number> = { extensions: 0, skills: 1, prompts: 2, themes: 3 };\n\tfor (const group of groups) {\n\t\tgroup.subgroups.sort((a, b) => typeOrder[a.type] - typeOrder[b.type]);\n\t\tfor (const subgroup of group.subgroups) {\n\t\t\tsubgroup.items.sort((a, b) => a.displayName.localeCompare(b.displayName));\n\t\t}\n\t}\n\n\treturn groups;\n}\n\ntype FlatEntry =\n\t| { type: \"group\"; group: ResourceGroup }\n\t| { type: \"subgroup\"; subgroup: ResourceSubgroup; group: ResourceGroup }\n\t| { type: \"item\"; item: ResourceItem };\n\nclass ConfigSelectorHeader implements Component {\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst title = theme.bold(\"Resource Configuration\");\n\t\tconst sep = theme.fg(\"muted\", \" · \");\n\t\tconst hint = rawKeyHint(\"space\", \"toggle\") + sep + rawKeyHint(\"esc\", \"close\");\n\t\tconst hintWidth = visibleWidth(hint);\n\t\tconst titleWidth = visibleWidth(title);\n\t\tconst spacing = Math.max(1, width - titleWidth - hintWidth);\n\n\t\treturn [\n\t\t\ttruncateToWidth(`${title}${\" \".repeat(spacing)}${hint}`, width, \"\"),\n\t\t\ttheme.fg(\"muted\", \"Type to filter resources\"),\n\t\t];\n\t}\n}\n\nclass ResourceList implements Component, Focusable {\n\tprivate groups: ResourceGroup[];\n\tprivate flatItems: FlatEntry[] = [];\n\tprivate filteredItems: FlatEntry[] = [];\n\tprivate selectedIndex = 0;\n\tprivate searchInput: Input;\n\tprivate maxVisible: number;\n\tprivate settingsManager: SettingsManager;\n\tprivate cwd: string;\n\tprivate agentDir: string;\n\n\tpublic onCancel?: () => void;\n\tpublic onExit?: () => void;\n\tpublic onToggle?: (item: ResourceItem, newEnabled: boolean) => void;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\tconstructor(\n\t\tgroups: ResourceGroup[],\n\t\tsettingsManager: SettingsManager,\n\t\tcwd: string,\n\t\tagentDir: string,\n\t\tterminalHeight?: number,\n\t) {\n\t\tthis.groups = groups;\n\t\tthis.settingsManager = settingsManager;\n\t\tthis.cwd = cwd;\n\t\tthis.agentDir = agentDir;\n\t\tthis.searchInput = new Input();\n\t\t// 8 lines of chrome: top spacer + top border + spacer + header (2 lines) + spacer + bottom spacer + bottom border\n\t\tconst chrome = 8;\n\t\tthis.maxVisible = Math.max(5, (terminalHeight ?? 24) - chrome);\n\t\tthis.buildFlatList();\n\t\tthis.filteredItems = [...this.flatItems];\n\t}\n\n\tprivate buildFlatList(): void {\n\t\tthis.flatItems = [];\n\t\tfor (const group of this.groups) {\n\t\t\tthis.flatItems.push({ type: \"group\", group });\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tthis.flatItems.push({ type: \"subgroup\", subgroup, group });\n\t\t\t\tfor (const item of subgroup.items) {\n\t\t\t\t\tthis.flatItems.push({ type: \"item\", item });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Start selection on first item (not header)\n\t\tthis.selectedIndex = this.flatItems.findIndex((e) => e.type === \"item\");\n\t\tif (this.selectedIndex < 0) this.selectedIndex = 0;\n\t}\n\n\tprivate findNextItem(fromIndex: number, direction: 1 | -1): number {\n\t\tlet idx = fromIndex + direction;\n\t\twhile (idx >= 0 && idx < this.filteredItems.length) {\n\t\t\tif (this.filteredItems[idx].type === \"item\") {\n\t\t\t\treturn idx;\n\t\t\t}\n\t\t\tidx += direction;\n\t\t}\n\t\treturn fromIndex; // Stay at current if no item found\n\t}\n\n\tprivate filterItems(query: string): void {\n\t\tif (!query.trim()) {\n\t\t\tthis.filteredItems = [...this.flatItems];\n\t\t\tthis.selectFirstItem();\n\t\t\treturn;\n\t\t}\n\n\t\tconst lowerQuery = query.toLowerCase();\n\t\tconst matchingItems = new Set<ResourceItem>();\n\t\tconst matchingSubgroups = new Set<ResourceSubgroup>();\n\t\tconst matchingGroups = new Set<ResourceGroup>();\n\n\t\tfor (const entry of this.flatItems) {\n\t\t\tif (entry.type === \"item\") {\n\t\t\t\tconst item = entry.item;\n\t\t\t\tif (\n\t\t\t\t\titem.displayName.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\titem.resourceType.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\titem.path.toLowerCase().includes(lowerQuery)\n\t\t\t\t) {\n\t\t\t\t\tmatchingItems.add(item);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Find which subgroups and groups contain matching items\n\t\tfor (const group of this.groups) {\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tfor (const item of subgroup.items) {\n\t\t\t\t\tif (matchingItems.has(item)) {\n\t\t\t\t\t\tmatchingSubgroups.add(subgroup);\n\t\t\t\t\t\tmatchingGroups.add(group);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.filteredItems = [];\n\t\tfor (const entry of this.flatItems) {\n\t\t\tif (entry.type === \"group\" && matchingGroups.has(entry.group)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t} else if (entry.type === \"subgroup\" && matchingSubgroups.has(entry.subgroup)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t} else if (entry.type === \"item\" && matchingItems.has(entry.item)) {\n\t\t\t\tthis.filteredItems.push(entry);\n\t\t\t}\n\t\t}\n\n\t\tthis.selectFirstItem();\n\t}\n\n\tprivate selectFirstItem(): void {\n\t\tconst firstItemIndex = this.filteredItems.findIndex((e) => e.type === \"item\");\n\t\tthis.selectedIndex = firstItemIndex >= 0 ? firstItemIndex : 0;\n\t}\n\n\tupdateItem(item: ResourceItem, enabled: boolean): void {\n\t\titem.enabled = enabled;\n\t\t// Update in groups too\n\t\tfor (const group of this.groups) {\n\t\t\tfor (const subgroup of group.subgroups) {\n\t\t\t\tconst found = subgroup.items.find((i) => i.path === item.path && i.resourceType === item.resourceType);\n\t\t\t\tif (found) {\n\t\t\t\t\tfound.enabled = enabled;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\n\t\t// Search input\n\t\tlines.push(...this.searchInput.render(width));\n\t\tlines.push(\"\");\n\n\t\tif (this.filteredItems.length === 0) {\n\t\t\tlines.push(theme.fg(\"muted\", \" No resources found\"));\n\t\t\treturn lines;\n\t\t}\n\n\t\t// Calculate visible range\n\t\tconst startIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.filteredItems.length - this.maxVisible),\n\t\t);\n\t\tconst endIndex = Math.min(startIndex + this.maxVisible, this.filteredItems.length);\n\n\t\tfor (let i = startIndex; i < endIndex; i++) {\n\t\t\tconst entry = this.filteredItems[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tif (entry.type === \"group\") {\n\t\t\t\t// Main group header (no cursor)\n\t\t\t\tconst groupLine = theme.fg(\"accent\", theme.bold(entry.group.label));\n\t\t\t\tlines.push(truncateToWidth(` ${groupLine}`, width, \"\"));\n\t\t\t} else if (entry.type === \"subgroup\") {\n\t\t\t\t// Subgroup header (indented, no cursor)\n\t\t\t\tconst subgroupLine = theme.fg(\"muted\", entry.subgroup.label);\n\t\t\t\tlines.push(truncateToWidth(` ${subgroupLine}`, width, \"\"));\n\t\t\t} else {\n\t\t\t\t// Resource item (cursor only on items)\n\t\t\t\tconst item = entry.item;\n\t\t\t\tconst cursor = isSelected ? \"> \" : \" \";\n\t\t\t\tconst checkbox = item.enabled ? theme.fg(\"success\", \"[x]\") : theme.fg(\"dim\", \"[ ]\");\n\t\t\t\tconst name = isSelected ? theme.bold(item.displayName) : item.displayName;\n\t\t\t\tlines.push(truncateToWidth(`${cursor} ${checkbox} ${name}`, width, \"...\"));\n\t\t\t}\n\t\t}\n\n\t\t// Scroll indicator\n\t\tif (startIndex > 0 || endIndex < this.filteredItems.length) {\n\t\t\tconst itemCount = this.filteredItems.filter((e) => e.type === \"item\").length;\n\t\t\tconst currentItemIndex =\n\t\t\t\tthis.filteredItems.slice(0, this.selectedIndex).filter((e) => e.type === \"item\").length + 1;\n\t\t\tlines.push(theme.fg(\"dim\", ` (${currentItemIndex}/${itemCount})`));\n\t\t}\n\n\t\treturn lines;\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getKeybindings();\n\n\t\tif (kb.matches(data, \"tui.select.up\")) {\n\t\t\tthis.selectedIndex = this.findNextItem(this.selectedIndex, -1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.down\")) {\n\t\t\tthis.selectedIndex = this.findNextItem(this.selectedIndex, 1);\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.pageUp\")) {\n\t\t\t// Jump up by maxVisible, then find nearest item\n\t\t\tlet target = Math.max(0, this.selectedIndex - this.maxVisible);\n\t\t\twhile (target < this.filteredItems.length && this.filteredItems[target].type !== \"item\") {\n\t\t\t\ttarget++;\n\t\t\t}\n\t\t\tif (target < this.filteredItems.length) {\n\t\t\t\tthis.selectedIndex = target;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.pageDown\")) {\n\t\t\t// Jump down by maxVisible, then find nearest item\n\t\t\tlet target = Math.min(this.filteredItems.length - 1, this.selectedIndex + this.maxVisible);\n\t\t\twhile (target >= 0 && this.filteredItems[target].type !== \"item\") {\n\t\t\t\ttarget--;\n\t\t\t}\n\t\t\tif (target >= 0) {\n\t\t\t\tthis.selectedIndex = target;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (kb.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onCancel?.();\n\t\t\treturn;\n\t\t}\n\t\tif (matchesKey(data, \"ctrl+c\")) {\n\t\t\tthis.onExit?.();\n\t\t\treturn;\n\t\t}\n\t\tif (data === \" \" || kb.matches(data, \"tui.select.confirm\")) {\n\t\t\tconst entry = this.filteredItems[this.selectedIndex];\n\t\t\tif (entry?.type === \"item\") {\n\t\t\t\tconst newEnabled = !entry.item.enabled;\n\t\t\t\tthis.toggleResource(entry.item, newEnabled);\n\t\t\t\tthis.updateItem(entry.item, newEnabled);\n\t\t\t\tthis.onToggle?.(entry.item, newEnabled);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass to search input\n\t\tthis.searchInput.handleInput(data);\n\t\tthis.filterItems(this.searchInput.getValue());\n\t}\n\n\tprivate toggleResource(item: ResourceItem, enabled: boolean): void {\n\t\tif (item.metadata.origin === \"top-level\") {\n\t\t\tthis.toggleTopLevelResource(item, enabled);\n\t\t} else {\n\t\t\tthis.togglePackageResource(item, enabled);\n\t\t}\n\t}\n\n\tprivate toggleTopLevelResource(item: ResourceItem, enabled: boolean): void {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst settings =\n\t\t\tscope === \"project\" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();\n\n\t\tconst arrayKey = item.resourceType as \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\t\tconst current = (settings[arrayKey] ?? []) as string[];\n\n\t\t// Generate pattern for this resource\n\t\tconst pattern = this.getResourcePattern(item);\n\t\tconst disablePattern = `-${pattern}`;\n\t\tconst enablePattern = `+${pattern}`;\n\n\t\t// Filter out existing patterns for this resource\n\t\tconst updated = current.filter((p) => {\n\t\t\tconst stripped = p.startsWith(\"!\") || p.startsWith(\"+\") || p.startsWith(\"-\") ? p.slice(1) : p;\n\t\t\treturn stripped !== pattern;\n\t\t});\n\n\t\tif (enabled) {\n\t\t\tupdated.push(enablePattern);\n\t\t} else {\n\t\t\tupdated.push(disablePattern);\n\t\t}\n\n\t\tif (scope === \"project\") {\n\t\t\tif (arrayKey === \"extensions\") {\n\t\t\t\tthis.settingsManager.setProjectExtensionPaths(updated);\n\t\t\t} else if (arrayKey === \"skills\") {\n\t\t\t\tthis.settingsManager.setProjectSkillPaths(updated);\n\t\t\t} else if (arrayKey === \"prompts\") {\n\t\t\t\tthis.settingsManager.setProjectPromptTemplatePaths(updated);\n\t\t\t} else if (arrayKey === \"themes\") {\n\t\t\t\tthis.settingsManager.setProjectThemePaths(updated);\n\t\t\t}\n\t\t} else {\n\t\t\tif (arrayKey === \"extensions\") {\n\t\t\t\tthis.settingsManager.setExtensionPaths(updated);\n\t\t\t} else if (arrayKey === \"skills\") {\n\t\t\t\tthis.settingsManager.setSkillPaths(updated);\n\t\t\t} else if (arrayKey === \"prompts\") {\n\t\t\t\tthis.settingsManager.setPromptTemplatePaths(updated);\n\t\t\t} else if (arrayKey === \"themes\") {\n\t\t\t\tthis.settingsManager.setThemePaths(updated);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate togglePackageResource(item: ResourceItem, enabled: boolean): void {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst settings =\n\t\t\tscope === \"project\" ? this.settingsManager.getProjectSettings() : this.settingsManager.getGlobalSettings();\n\n\t\tconst packages = [...(settings.packages ?? [])] as PackageSource[];\n\t\tconst pkgIndex = packages.findIndex((pkg) => {\n\t\t\tconst source = typeof pkg === \"string\" ? pkg : pkg.source;\n\t\t\treturn source === item.metadata.source;\n\t\t});\n\n\t\tif (pkgIndex === -1) return;\n\n\t\tlet pkg = packages[pkgIndex];\n\n\t\t// Convert string to object form if needed\n\t\tif (typeof pkg === \"string\") {\n\t\t\tpkg = { source: pkg };\n\t\t\tpackages[pkgIndex] = pkg;\n\t\t}\n\n\t\t// Get the resource array for this type\n\t\tconst arrayKey = item.resourceType as \"extensions\" | \"skills\" | \"prompts\" | \"themes\";\n\t\tconst current = (pkg[arrayKey] ?? []) as string[];\n\n\t\t// Generate pattern relative to package root\n\t\tconst pattern = this.getPackageResourcePattern(item);\n\t\tconst disablePattern = `-${pattern}`;\n\t\tconst enablePattern = `+${pattern}`;\n\n\t\t// Filter out existing patterns for this resource\n\t\tconst updated = current.filter((p) => {\n\t\t\tconst stripped = p.startsWith(\"!\") || p.startsWith(\"+\") || p.startsWith(\"-\") ? p.slice(1) : p;\n\t\t\treturn stripped !== pattern;\n\t\t});\n\n\t\tif (enabled) {\n\t\t\tupdated.push(enablePattern);\n\t\t} else {\n\t\t\tupdated.push(disablePattern);\n\t\t}\n\n\t\t(pkg as Record<string, unknown>)[arrayKey] = updated.length > 0 ? updated : undefined;\n\n\t\t// Clean up empty filter object\n\t\tconst hasFilters = [\"extensions\", \"skills\", \"prompts\", \"themes\"].some(\n\t\t\t(k) => (pkg as Record<string, unknown>)[k] !== undefined,\n\t\t);\n\t\tif (!hasFilters) {\n\t\t\tpackages[pkgIndex] = (pkg as { source: string }).source;\n\t\t}\n\n\t\tif (scope === \"project\") {\n\t\t\tthis.settingsManager.setProjectPackages(packages);\n\t\t} else {\n\t\t\tthis.settingsManager.setPackages(packages);\n\t\t}\n\t}\n\n\tprivate getTopLevelBaseDir(scope: \"user\" | \"project\"): string {\n\t\treturn scope === \"project\" ? join(this.cwd, CONFIG_DIR_NAME) : this.agentDir;\n\t}\n\n\tprivate getResourcePattern(item: ResourceItem): string {\n\t\tconst scope = item.metadata.scope as \"user\" | \"project\";\n\t\tconst baseDir = item.metadata.baseDir ?? this.getTopLevelBaseDir(scope);\n\t\treturn relative(baseDir, item.path);\n\t}\n\n\tprivate getPackageResourcePattern(item: ResourceItem): string {\n\t\tconst baseDir = item.metadata.baseDir ?? dirname(item.path);\n\t\treturn relative(baseDir, item.path);\n\t}\n}\n\nexport class ConfigSelectorComponent extends Container implements Focusable {\n\tprivate resourceList: ResourceList;\n\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.resourceList.focused = value;\n\t}\n\n\tconstructor(\n\t\tresolvedPaths: ResolvedPaths,\n\t\tsettingsManager: SettingsManager,\n\t\tcwd: string,\n\t\tagentDir: string,\n\t\tonClose: () => void,\n\t\tonExit: () => void,\n\t\trequestRender: () => void,\n\t\tterminalHeight?: number,\n\t) {\n\t\tsuper();\n\n\t\tconst groups = buildGroups(resolvedPaths);\n\n\t\t// Add header\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new ConfigSelectorHeader());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Resource list\n\t\tthis.resourceList = new ResourceList(groups, settingsManager, cwd, agentDir, terminalHeight);\n\t\tthis.resourceList.onCancel = onClose;\n\t\tthis.resourceList.onExit = onExit;\n\t\tthis.resourceList.onToggle = () => requestRender();\n\t\tthis.addChild(this.resourceList);\n\n\t\t// Bottom border\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetResourceList(): ResourceList {\n\t\treturn this.resourceList;\n\t}\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { type ThemeColor } from "../theme/theme.ts";
2
+ export declare function composeColumns(leftLines: string[], leftWidth: number, rightLines: string[], rightWidth: number, gapWidth: number, width: number): string[];
3
+ export declare function sidebarRule(width: number, label: string): string;
4
+ export declare function boxTop(width: number, label: string): string;
5
+ export declare function boxBottom(width: number): string;
6
+ export declare function boxBlankLine(width: number): string;
7
+ export declare function boxCenteredLine(width: number, text: string, color?: ThemeColor): string;
8
+ export declare function boxTextLine(width: number, text: string, color?: ThemeColor): string;
9
+ export declare function centerLine(width: number, text: string, color?: ThemeColor): string;
10
+ export declare function centerText(width: number, text: string): string;
11
+ export declare function divider(width: number, label: string, color: ThemeColor): string;
12
+ export declare function textLine(width: number, text: string, color?: ThemeColor): string;
13
+ export declare function fitLine(line: string, width: number): string;
14
+ export declare function clipLine(line: string, width: number): string;
15
+ //# sourceMappingURL=control-panel-box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-panel-box.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-box.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAS,MAAM,mBAAmB,CAAC;AAE3D,wBAAgB,cAAc,CAC7B,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,EACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACX,MAAM,EAAE,CAOV;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAEvF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAMnF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAElF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAM/E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,CAGhF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D","sourcesContent":["import { truncateToWidth, visibleWidth } from \"omk-tui\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\n\nexport function composeColumns(\n\tleftLines: string[],\n\tleftWidth: number,\n\trightLines: string[],\n\trightWidth: number,\n\tgapWidth: number,\n\twidth: number,\n): string[] {\n\treturn Array.from({ length: Math.max(leftLines.length, rightLines.length) }, (_, index) =>\n\t\tclipLine(\n\t\t\t`${fitLine(leftLines[index] ?? \"\", leftWidth)}${\" \".repeat(gapWidth)}${fitLine(rightLines[index] ?? \"\", rightWidth)}`,\n\t\t\twidth,\n\t\t),\n\t);\n}\n\nexport function sidebarRule(width: number, label: string): string {\n\tconst bodyWidth = Math.max(0, width - 2);\n\tconst labelText = ` ${label} `;\n\tconst fill = Math.max(0, bodyWidth - visibleWidth(labelText));\n\tconst left = Math.floor(fill / 2);\n\tconst right = fill - left;\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"|\")}${theme.fg(\"borderMuted\", \"-\".repeat(left))}${theme.bold(theme.fg(\"accent\", labelText))}${theme.fg(\"borderMuted\", \"-\".repeat(right))}${theme.fg(\"border\", \"|\")}`,\n\t\twidth,\n\t);\n}\n\nexport function boxTop(width: number, label: string): string {\n\tconst text = ` ${label} `;\n\tconst fillWidth = Math.max(0, width - visibleWidth(\"+\") - visibleWidth(text) - visibleWidth(\"+\"));\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"+\")}${theme.bold(theme.fg(\"accent\", text))}${theme.fg(\"border\", \"-\".repeat(fillWidth))}${theme.fg(\"border\", \"+\")}`,\n\t\twidth,\n\t);\n}\n\nexport function boxBottom(width: number): string {\n\treturn clipLine(theme.fg(\"border\", `+${\"-\".repeat(Math.max(0, width - 2))}+`), width);\n}\n\nexport function boxBlankLine(width: number): string {\n\treturn boxTextLine(width, \"\");\n}\n\nexport function boxCenteredLine(width: number, text: string, color?: ThemeColor): string {\n\treturn boxTextLine(width, centerText(Math.max(0, width - 4), color ? theme.fg(color, text) : text));\n}\n\nexport function boxTextLine(width: number, text: string, color?: ThemeColor): string {\n\tconst body = color ? theme.fg(color, text) : text;\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"| \")}${fitLine(body, Math.max(0, width - 4))}${theme.fg(\"border\", \" |\")}`,\n\t\twidth,\n\t);\n}\n\nexport function centerLine(width: number, text: string, color?: ThemeColor): string {\n\treturn clipLine(centerText(width, color ? theme.fg(color, text) : text), width);\n}\n\nexport function centerText(width: number, text: string): string {\n\tconst fitted = truncateToWidth(text, width, \"\");\n\tconst remaining = Math.max(0, width - visibleWidth(fitted));\n\treturn `${\" \".repeat(Math.floor(remaining / 2))}${fitted}${\" \".repeat(Math.ceil(remaining / 2))}`;\n}\n\nexport function divider(width: number, label: string, color: ThemeColor): string {\n\tconst fillWidth = Math.max(0, width - visibleWidth(\"+-- \") - visibleWidth(label) - 1);\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"+-- \")}${theme.bold(theme.fg(color, label))}${theme.fg(\"border\", ` ${\"-\".repeat(fillWidth)}`)}`,\n\t\twidth,\n\t);\n}\n\nexport function textLine(width: number, text: string, color?: ThemeColor): string {\n\tconst body = color ? theme.fg(color, text) : text;\n\treturn clipLine(`${theme.fg(\"borderMuted\", \"| \")}${body}`, width);\n}\n\nexport function fitLine(line: string, width: number): string {\n\tconst clipped = truncateToWidth(line, width, \"\");\n\treturn `${clipped}${\" \".repeat(Math.max(0, width - visibleWidth(clipped)))}`;\n}\n\nexport function clipLine(line: string, width: number): string {\n\treturn visibleWidth(line) <= width ? line : truncateToWidth(line, width, \"\");\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import { truncateToWidth, visibleWidth } from "omk-tui";
2
+ import { theme } from "../theme/theme.js";
3
+ export function composeColumns(leftLines, leftWidth, rightLines, rightWidth, gapWidth, width) {
4
+ return Array.from({ length: Math.max(leftLines.length, rightLines.length) }, (_, index) => clipLine(`${fitLine(leftLines[index] ?? "", leftWidth)}${" ".repeat(gapWidth)}${fitLine(rightLines[index] ?? "", rightWidth)}`, width));
5
+ }
6
+ export function sidebarRule(width, label) {
7
+ const bodyWidth = Math.max(0, width - 2);
8
+ const labelText = ` ${label} `;
9
+ const fill = Math.max(0, bodyWidth - visibleWidth(labelText));
10
+ const left = Math.floor(fill / 2);
11
+ const right = fill - left;
12
+ return clipLine(`${theme.fg("border", "|")}${theme.fg("borderMuted", "-".repeat(left))}${theme.bold(theme.fg("accent", labelText))}${theme.fg("borderMuted", "-".repeat(right))}${theme.fg("border", "|")}`, width);
13
+ }
14
+ export function boxTop(width, label) {
15
+ const text = ` ${label} `;
16
+ const fillWidth = Math.max(0, width - visibleWidth("+") - visibleWidth(text) - visibleWidth("+"));
17
+ return clipLine(`${theme.fg("border", "+")}${theme.bold(theme.fg("accent", text))}${theme.fg("border", "-".repeat(fillWidth))}${theme.fg("border", "+")}`, width);
18
+ }
19
+ export function boxBottom(width) {
20
+ return clipLine(theme.fg("border", `+${"-".repeat(Math.max(0, width - 2))}+`), width);
21
+ }
22
+ export function boxBlankLine(width) {
23
+ return boxTextLine(width, "");
24
+ }
25
+ export function boxCenteredLine(width, text, color) {
26
+ return boxTextLine(width, centerText(Math.max(0, width - 4), color ? theme.fg(color, text) : text));
27
+ }
28
+ export function boxTextLine(width, text, color) {
29
+ const body = color ? theme.fg(color, text) : text;
30
+ return clipLine(`${theme.fg("border", "| ")}${fitLine(body, Math.max(0, width - 4))}${theme.fg("border", " |")}`, width);
31
+ }
32
+ export function centerLine(width, text, color) {
33
+ return clipLine(centerText(width, color ? theme.fg(color, text) : text), width);
34
+ }
35
+ export function centerText(width, text) {
36
+ const fitted = truncateToWidth(text, width, "");
37
+ const remaining = Math.max(0, width - visibleWidth(fitted));
38
+ return `${" ".repeat(Math.floor(remaining / 2))}${fitted}${" ".repeat(Math.ceil(remaining / 2))}`;
39
+ }
40
+ export function divider(width, label, color) {
41
+ const fillWidth = Math.max(0, width - visibleWidth("+-- ") - visibleWidth(label) - 1);
42
+ return clipLine(`${theme.fg("border", "+-- ")}${theme.bold(theme.fg(color, label))}${theme.fg("border", ` ${"-".repeat(fillWidth)}`)}`, width);
43
+ }
44
+ export function textLine(width, text, color) {
45
+ const body = color ? theme.fg(color, text) : text;
46
+ return clipLine(`${theme.fg("borderMuted", "| ")}${body}`, width);
47
+ }
48
+ export function fitLine(line, width) {
49
+ const clipped = truncateToWidth(line, width, "");
50
+ return `${clipped}${" ".repeat(Math.max(0, width - visibleWidth(clipped)))}`;
51
+ }
52
+ export function clipLine(line, width) {
53
+ return visibleWidth(line) <= width ? line : truncateToWidth(line, width, "");
54
+ }
55
+ //# sourceMappingURL=control-panel-box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-panel-box.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-box.ts"],"names":[],"mappings":"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","sourcesContent":["import { truncateToWidth, visibleWidth } from \"omk-tui\";\nimport { type ThemeColor, theme } from \"../theme/theme.ts\";\n\nexport function composeColumns(\n\tleftLines: string[],\n\tleftWidth: number,\n\trightLines: string[],\n\trightWidth: number,\n\tgapWidth: number,\n\twidth: number,\n): string[] {\n\treturn Array.from({ length: Math.max(leftLines.length, rightLines.length) }, (_, index) =>\n\t\tclipLine(\n\t\t\t`${fitLine(leftLines[index] ?? \"\", leftWidth)}${\" \".repeat(gapWidth)}${fitLine(rightLines[index] ?? \"\", rightWidth)}`,\n\t\t\twidth,\n\t\t),\n\t);\n}\n\nexport function sidebarRule(width: number, label: string): string {\n\tconst bodyWidth = Math.max(0, width - 2);\n\tconst labelText = ` ${label} `;\n\tconst fill = Math.max(0, bodyWidth - visibleWidth(labelText));\n\tconst left = Math.floor(fill / 2);\n\tconst right = fill - left;\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"|\")}${theme.fg(\"borderMuted\", \"-\".repeat(left))}${theme.bold(theme.fg(\"accent\", labelText))}${theme.fg(\"borderMuted\", \"-\".repeat(right))}${theme.fg(\"border\", \"|\")}`,\n\t\twidth,\n\t);\n}\n\nexport function boxTop(width: number, label: string): string {\n\tconst text = ` ${label} `;\n\tconst fillWidth = Math.max(0, width - visibleWidth(\"+\") - visibleWidth(text) - visibleWidth(\"+\"));\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"+\")}${theme.bold(theme.fg(\"accent\", text))}${theme.fg(\"border\", \"-\".repeat(fillWidth))}${theme.fg(\"border\", \"+\")}`,\n\t\twidth,\n\t);\n}\n\nexport function boxBottom(width: number): string {\n\treturn clipLine(theme.fg(\"border\", `+${\"-\".repeat(Math.max(0, width - 2))}+`), width);\n}\n\nexport function boxBlankLine(width: number): string {\n\treturn boxTextLine(width, \"\");\n}\n\nexport function boxCenteredLine(width: number, text: string, color?: ThemeColor): string {\n\treturn boxTextLine(width, centerText(Math.max(0, width - 4), color ? theme.fg(color, text) : text));\n}\n\nexport function boxTextLine(width: number, text: string, color?: ThemeColor): string {\n\tconst body = color ? theme.fg(color, text) : text;\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"| \")}${fitLine(body, Math.max(0, width - 4))}${theme.fg(\"border\", \" |\")}`,\n\t\twidth,\n\t);\n}\n\nexport function centerLine(width: number, text: string, color?: ThemeColor): string {\n\treturn clipLine(centerText(width, color ? theme.fg(color, text) : text), width);\n}\n\nexport function centerText(width: number, text: string): string {\n\tconst fitted = truncateToWidth(text, width, \"\");\n\tconst remaining = Math.max(0, width - visibleWidth(fitted));\n\treturn `${\" \".repeat(Math.floor(remaining / 2))}${fitted}${\" \".repeat(Math.ceil(remaining / 2))}`;\n}\n\nexport function divider(width: number, label: string, color: ThemeColor): string {\n\tconst fillWidth = Math.max(0, width - visibleWidth(\"+-- \") - visibleWidth(label) - 1);\n\treturn clipLine(\n\t\t`${theme.fg(\"border\", \"+-- \")}${theme.bold(theme.fg(color, label))}${theme.fg(\"border\", ` ${\"-\".repeat(fillWidth)}`)}`,\n\t\twidth,\n\t);\n}\n\nexport function textLine(width: number, text: string, color?: ThemeColor): string {\n\tconst body = color ? theme.fg(color, text) : text;\n\treturn clipLine(`${theme.fg(\"borderMuted\", \"| \")}${body}`, width);\n}\n\nexport function fitLine(line: string, width: number): string {\n\tconst clipped = truncateToWidth(line, width, \"\");\n\treturn `${clipped}${\" \".repeat(Math.max(0, width - visibleWidth(clipped)))}`;\n}\n\nexport function clipLine(line: string, width: number): string {\n\treturn visibleWidth(line) <= width ? line : truncateToWidth(line, width, \"\");\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { type GradientColorMode } from "./control-panel-gradient.ts";
2
+ export declare const INTRO_MS = 900;
3
+ export declare const IDLE_MS = 6000;
4
+ /**
5
+ * Phase 2: one-shot intro reveal. Diagonal wipe using easeOutCubic.
6
+ * At elapsed >= INTRO_MS the output is byte-identical to composeStaticBanner.
7
+ */
8
+ export declare function composeIntroBanner(art: string[], mode: GradientColorMode, noColor: boolean, elapsedMs: number): string[];
9
+ /**
10
+ * Phase 3: opt-in idle drift. Reuses colorAt(x,y,t) DRIFT math.
11
+ */
12
+ export declare function composeIdleBanner(art: string[], mode: GradientColorMode, noColor: boolean, elapsedMs: number): string[];
13
+ /**
14
+ * Gate: should we animate the banner for this phase?
15
+ */
16
+ export declare function shouldAnimate(options: {
17
+ phase: "intro" | "idle";
18
+ isTTY: boolean;
19
+ noColor: boolean;
20
+ colorMode: GradientColorMode;
21
+ expanded: boolean;
22
+ width: number;
23
+ reducedMotion: boolean;
24
+ busy: boolean;
25
+ headerVisibleHint: boolean;
26
+ idleDriftEnabled: boolean;
27
+ }): boolean;
28
+ //# sourceMappingURL=control-panel-gradient-motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-panel-gradient-motion.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-gradient-motion.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,iBAAiB,EAItB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,QAAQ,MAAM,CAAC;AAC5B,eAAO,MAAM,OAAO,OAAO,CAAC;AAuC5B;;;GAGG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GACf,MAAM,EAAE,CAsCV;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GACf,MAAM,EAAE,CAmBV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACtC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAKV","sourcesContent":["import {\n\tcolorAt,\n\tcomposeStaticBanner,\n\ttype GradientColorMode,\n\ttype GradientGeom,\n\tpaintGlyph,\n\tshouldGradient,\n} from \"./control-panel-gradient.ts\";\n\nexport const INTRO_MS = 900;\nexport const IDLE_MS = 6000;\nconst IDLE_PERIOD_MS = 4200;\nconst REVEAL_BAND = 0.16;\nconst DEFAULT_SHEAR = 2.2;\n\nfunction clamp01(value: number): number {\n\tif (value < 0) return 0;\n\tif (value > 1) return 1;\n\treturn value;\n}\n\nfunction easeOutCubic(t: number): number {\n\tconst u = clamp01(t);\n\treturn 1 - (1 - u) * (1 - u) * (1 - u);\n}\n\nfunction diagonalPosition(x: number, y: number, geom: GradientGeom): number {\n\tconst span = geom.cols - 1 + (geom.rows - 1) * geom.shear;\n\tif (span <= 0) return 0;\n\treturn clamp01((x + (geom.rows - 1 - y) * geom.shear) / span);\n}\n\nconst SCRAMBLE_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%&*+=<>[]{}|/\\\\~^\";\nconst SCRAMBLE_LEN = SCRAMBLE_CHARS.length;\n\nfunction scrambleGlyph(x: number, y: number, seed: number): string {\n\t// Deterministic scramble from position + seed (no Math.random)\n\tconst hash = ((x * 374761393 + y * 668265263 + seed * 1274126177) >>> 0) % SCRAMBLE_LEN;\n\treturn SCRAMBLE_CHARS[hash]!;\n}\n\nfunction dimRgb(r: number, g: number, b: number, factor: number): { r: number; g: number; b: number } {\n\treturn {\n\t\tr: Math.round(r * factor),\n\t\tg: Math.round(g * factor),\n\t\tb: Math.round(b * factor),\n\t};\n}\n\n/**\n * Phase 2: one-shot intro reveal. Diagonal wipe using easeOutCubic.\n * At elapsed >= INTRO_MS the output is byte-identical to composeStaticBanner.\n */\nexport function composeIntroBanner(\n\tart: string[],\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n\telapsedMs: number,\n): string[] {\n\tif (elapsedMs >= INTRO_MS) {\n\t\treturn composeStaticBanner(art, mode, noColor);\n\t}\n\n\tconst geom: GradientGeom = {\n\t\tcols: Math.max(0, ...art.map((line) => Array.from(line).length)),\n\t\trows: art.length,\n\t\tshear: DEFAULT_SHEAR,\n\t};\n\n\tconst p = easeOutCubic(elapsedMs / INTRO_MS);\n\tconst seed = Math.floor(elapsedMs / 100); // changes every 100ms tick\n\n\treturn art.map((line, y) => {\n\t\tconst glyphs = Array.from(line);\n\t\tlet rendered = \"\";\n\t\tfor (let x = 0; x < glyphs.length; x++) {\n\t\t\tconst glyph = glyphs[x]!;\n\t\t\tif (glyph === \" \") {\n\t\t\t\trendered += \" \";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst d = diagonalPosition(x, y, geom);\n\t\t\tconst cell = clamp01((p - d + REVEAL_BAND) / REVEAL_BAND);\n\t\t\tconst { r, g, b } = colorAt(x, y, 0, geom);\n\t\t\tif (cell >= 1) {\n\t\t\t\trendered += paintGlyph(glyph, r, g, b, mode, noColor);\n\t\t\t} else {\n\t\t\t\t// Scramble with dimmed color\n\t\t\t\tconst scramble = scrambleGlyph(x, y, seed);\n\t\t\t\tconst dimFactor = 0.3 + 0.7 * cell;\n\t\t\t\tconst { r: dr, g: dg, b: db } = dimRgb(r, g, b, dimFactor);\n\t\t\t\trendered += paintGlyph(scramble, dr, dg, db, mode, noColor);\n\t\t\t}\n\t\t}\n\t\treturn rendered;\n\t});\n}\n\n/**\n * Phase 3: opt-in idle drift. Reuses colorAt(x,y,t) DRIFT math.\n */\nexport function composeIdleBanner(\n\tart: string[],\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n\telapsedMs: number,\n): string[] {\n\tconst geom: GradientGeom = {\n\t\tcols: Math.max(0, ...art.map((line) => Array.from(line).length)),\n\t\trows: art.length,\n\t\tshear: DEFAULT_SHEAR,\n\t};\n\n\tconst t = (elapsedMs % IDLE_PERIOD_MS) / IDLE_PERIOD_MS;\n\n\treturn art.map((line, y) => {\n\t\tconst glyphs = Array.from(line);\n\t\tlet rendered = \"\";\n\t\tfor (let x = 0; x < glyphs.length; x++) {\n\t\t\tconst glyph = glyphs[x]!;\n\t\t\tconst { r, g, b } = colorAt(x, y, t, geom);\n\t\t\trendered += paintGlyph(glyph, r, g, b, mode, noColor);\n\t\t}\n\t\treturn rendered;\n\t});\n}\n\n/**\n * Gate: should we animate the banner for this phase?\n */\nexport function shouldAnimate(options: {\n\tphase: \"intro\" | \"idle\";\n\tisTTY: boolean;\n\tnoColor: boolean;\n\tcolorMode: GradientColorMode;\n\texpanded: boolean;\n\twidth: number;\n\treducedMotion: boolean;\n\tbusy: boolean;\n\theaderVisibleHint: boolean;\n\tidleDriftEnabled: boolean;\n}): boolean {\n\tif (!shouldGradient(options)) return false;\n\tif (options.reducedMotion || options.busy || !options.headerVisibleHint) return false;\n\tif (options.phase === \"idle\" && !options.idleDriftEnabled) return false;\n\treturn true;\n}\n"]}
@@ -0,0 +1,112 @@
1
+ import { colorAt, composeStaticBanner, paintGlyph, shouldGradient, } from "./control-panel-gradient.js";
2
+ export const INTRO_MS = 900;
3
+ export const IDLE_MS = 6000;
4
+ const IDLE_PERIOD_MS = 4200;
5
+ const REVEAL_BAND = 0.16;
6
+ const DEFAULT_SHEAR = 2.2;
7
+ function clamp01(value) {
8
+ if (value < 0)
9
+ return 0;
10
+ if (value > 1)
11
+ return 1;
12
+ return value;
13
+ }
14
+ function easeOutCubic(t) {
15
+ const u = clamp01(t);
16
+ return 1 - (1 - u) * (1 - u) * (1 - u);
17
+ }
18
+ function diagonalPosition(x, y, geom) {
19
+ const span = geom.cols - 1 + (geom.rows - 1) * geom.shear;
20
+ if (span <= 0)
21
+ return 0;
22
+ return clamp01((x + (geom.rows - 1 - y) * geom.shear) / span);
23
+ }
24
+ const SCRAMBLE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%&*+=<>[]{}|/\\~^";
25
+ const SCRAMBLE_LEN = SCRAMBLE_CHARS.length;
26
+ function scrambleGlyph(x, y, seed) {
27
+ // Deterministic scramble from position + seed (no Math.random)
28
+ const hash = ((x * 374761393 + y * 668265263 + seed * 1274126177) >>> 0) % SCRAMBLE_LEN;
29
+ return SCRAMBLE_CHARS[hash];
30
+ }
31
+ function dimRgb(r, g, b, factor) {
32
+ return {
33
+ r: Math.round(r * factor),
34
+ g: Math.round(g * factor),
35
+ b: Math.round(b * factor),
36
+ };
37
+ }
38
+ /**
39
+ * Phase 2: one-shot intro reveal. Diagonal wipe using easeOutCubic.
40
+ * At elapsed >= INTRO_MS the output is byte-identical to composeStaticBanner.
41
+ */
42
+ export function composeIntroBanner(art, mode, noColor, elapsedMs) {
43
+ if (elapsedMs >= INTRO_MS) {
44
+ return composeStaticBanner(art, mode, noColor);
45
+ }
46
+ const geom = {
47
+ cols: Math.max(0, ...art.map((line) => Array.from(line).length)),
48
+ rows: art.length,
49
+ shear: DEFAULT_SHEAR,
50
+ };
51
+ const p = easeOutCubic(elapsedMs / INTRO_MS);
52
+ const seed = Math.floor(elapsedMs / 100); // changes every 100ms tick
53
+ return art.map((line, y) => {
54
+ const glyphs = Array.from(line);
55
+ let rendered = "";
56
+ for (let x = 0; x < glyphs.length; x++) {
57
+ const glyph = glyphs[x];
58
+ if (glyph === " ") {
59
+ rendered += " ";
60
+ continue;
61
+ }
62
+ const d = diagonalPosition(x, y, geom);
63
+ const cell = clamp01((p - d + REVEAL_BAND) / REVEAL_BAND);
64
+ const { r, g, b } = colorAt(x, y, 0, geom);
65
+ if (cell >= 1) {
66
+ rendered += paintGlyph(glyph, r, g, b, mode, noColor);
67
+ }
68
+ else {
69
+ // Scramble with dimmed color
70
+ const scramble = scrambleGlyph(x, y, seed);
71
+ const dimFactor = 0.3 + 0.7 * cell;
72
+ const { r: dr, g: dg, b: db } = dimRgb(r, g, b, dimFactor);
73
+ rendered += paintGlyph(scramble, dr, dg, db, mode, noColor);
74
+ }
75
+ }
76
+ return rendered;
77
+ });
78
+ }
79
+ /**
80
+ * Phase 3: opt-in idle drift. Reuses colorAt(x,y,t) DRIFT math.
81
+ */
82
+ export function composeIdleBanner(art, mode, noColor, elapsedMs) {
83
+ const geom = {
84
+ cols: Math.max(0, ...art.map((line) => Array.from(line).length)),
85
+ rows: art.length,
86
+ shear: DEFAULT_SHEAR,
87
+ };
88
+ const t = (elapsedMs % IDLE_PERIOD_MS) / IDLE_PERIOD_MS;
89
+ return art.map((line, y) => {
90
+ const glyphs = Array.from(line);
91
+ let rendered = "";
92
+ for (let x = 0; x < glyphs.length; x++) {
93
+ const glyph = glyphs[x];
94
+ const { r, g, b } = colorAt(x, y, t, geom);
95
+ rendered += paintGlyph(glyph, r, g, b, mode, noColor);
96
+ }
97
+ return rendered;
98
+ });
99
+ }
100
+ /**
101
+ * Gate: should we animate the banner for this phase?
102
+ */
103
+ export function shouldAnimate(options) {
104
+ if (!shouldGradient(options))
105
+ return false;
106
+ if (options.reducedMotion || options.busy || !options.headerVisibleHint)
107
+ return false;
108
+ if (options.phase === "idle" && !options.idleDriftEnabled)
109
+ return false;
110
+ return true;
111
+ }
112
+ //# sourceMappingURL=control-panel-gradient-motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-panel-gradient-motion.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-gradient-motion.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tcolorAt,\n\tcomposeStaticBanner,\n\ttype GradientColorMode,\n\ttype GradientGeom,\n\tpaintGlyph,\n\tshouldGradient,\n} from \"./control-panel-gradient.ts\";\n\nexport const INTRO_MS = 900;\nexport const IDLE_MS = 6000;\nconst IDLE_PERIOD_MS = 4200;\nconst REVEAL_BAND = 0.16;\nconst DEFAULT_SHEAR = 2.2;\n\nfunction clamp01(value: number): number {\n\tif (value < 0) return 0;\n\tif (value > 1) return 1;\n\treturn value;\n}\n\nfunction easeOutCubic(t: number): number {\n\tconst u = clamp01(t);\n\treturn 1 - (1 - u) * (1 - u) * (1 - u);\n}\n\nfunction diagonalPosition(x: number, y: number, geom: GradientGeom): number {\n\tconst span = geom.cols - 1 + (geom.rows - 1) * geom.shear;\n\tif (span <= 0) return 0;\n\treturn clamp01((x + (geom.rows - 1 - y) * geom.shear) / span);\n}\n\nconst SCRAMBLE_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#$%&*+=<>[]{}|/\\\\~^\";\nconst SCRAMBLE_LEN = SCRAMBLE_CHARS.length;\n\nfunction scrambleGlyph(x: number, y: number, seed: number): string {\n\t// Deterministic scramble from position + seed (no Math.random)\n\tconst hash = ((x * 374761393 + y * 668265263 + seed * 1274126177) >>> 0) % SCRAMBLE_LEN;\n\treturn SCRAMBLE_CHARS[hash]!;\n}\n\nfunction dimRgb(r: number, g: number, b: number, factor: number): { r: number; g: number; b: number } {\n\treturn {\n\t\tr: Math.round(r * factor),\n\t\tg: Math.round(g * factor),\n\t\tb: Math.round(b * factor),\n\t};\n}\n\n/**\n * Phase 2: one-shot intro reveal. Diagonal wipe using easeOutCubic.\n * At elapsed >= INTRO_MS the output is byte-identical to composeStaticBanner.\n */\nexport function composeIntroBanner(\n\tart: string[],\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n\telapsedMs: number,\n): string[] {\n\tif (elapsedMs >= INTRO_MS) {\n\t\treturn composeStaticBanner(art, mode, noColor);\n\t}\n\n\tconst geom: GradientGeom = {\n\t\tcols: Math.max(0, ...art.map((line) => Array.from(line).length)),\n\t\trows: art.length,\n\t\tshear: DEFAULT_SHEAR,\n\t};\n\n\tconst p = easeOutCubic(elapsedMs / INTRO_MS);\n\tconst seed = Math.floor(elapsedMs / 100); // changes every 100ms tick\n\n\treturn art.map((line, y) => {\n\t\tconst glyphs = Array.from(line);\n\t\tlet rendered = \"\";\n\t\tfor (let x = 0; x < glyphs.length; x++) {\n\t\t\tconst glyph = glyphs[x]!;\n\t\t\tif (glyph === \" \") {\n\t\t\t\trendered += \" \";\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst d = diagonalPosition(x, y, geom);\n\t\t\tconst cell = clamp01((p - d + REVEAL_BAND) / REVEAL_BAND);\n\t\t\tconst { r, g, b } = colorAt(x, y, 0, geom);\n\t\t\tif (cell >= 1) {\n\t\t\t\trendered += paintGlyph(glyph, r, g, b, mode, noColor);\n\t\t\t} else {\n\t\t\t\t// Scramble with dimmed color\n\t\t\t\tconst scramble = scrambleGlyph(x, y, seed);\n\t\t\t\tconst dimFactor = 0.3 + 0.7 * cell;\n\t\t\t\tconst { r: dr, g: dg, b: db } = dimRgb(r, g, b, dimFactor);\n\t\t\t\trendered += paintGlyph(scramble, dr, dg, db, mode, noColor);\n\t\t\t}\n\t\t}\n\t\treturn rendered;\n\t});\n}\n\n/**\n * Phase 3: opt-in idle drift. Reuses colorAt(x,y,t) DRIFT math.\n */\nexport function composeIdleBanner(\n\tart: string[],\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n\telapsedMs: number,\n): string[] {\n\tconst geom: GradientGeom = {\n\t\tcols: Math.max(0, ...art.map((line) => Array.from(line).length)),\n\t\trows: art.length,\n\t\tshear: DEFAULT_SHEAR,\n\t};\n\n\tconst t = (elapsedMs % IDLE_PERIOD_MS) / IDLE_PERIOD_MS;\n\n\treturn art.map((line, y) => {\n\t\tconst glyphs = Array.from(line);\n\t\tlet rendered = \"\";\n\t\tfor (let x = 0; x < glyphs.length; x++) {\n\t\t\tconst glyph = glyphs[x]!;\n\t\t\tconst { r, g, b } = colorAt(x, y, t, geom);\n\t\t\trendered += paintGlyph(glyph, r, g, b, mode, noColor);\n\t\t}\n\t\treturn rendered;\n\t});\n}\n\n/**\n * Gate: should we animate the banner for this phase?\n */\nexport function shouldAnimate(options: {\n\tphase: \"intro\" | \"idle\";\n\tisTTY: boolean;\n\tnoColor: boolean;\n\tcolorMode: GradientColorMode;\n\texpanded: boolean;\n\twidth: number;\n\treducedMotion: boolean;\n\tbusy: boolean;\n\theaderVisibleHint: boolean;\n\tidleDriftEnabled: boolean;\n}): boolean {\n\tif (!shouldGradient(options)) return false;\n\tif (options.reducedMotion || options.busy || !options.headerVisibleHint) return false;\n\tif (options.phase === \"idle\" && !options.idleDriftEnabled) return false;\n\treturn true;\n}\n"]}
@@ -0,0 +1,28 @@
1
+ export type GradientColorMode = "truecolor" | "256color";
2
+ export interface GradientGeom {
3
+ cols: number;
4
+ rows: number;
5
+ shear: number;
6
+ }
7
+ export declare const MIN_BANNER_WIDTH = 32;
8
+ export declare function colorAt(x: number, y: number, t: number, geom: GradientGeom): {
9
+ r: number;
10
+ g: number;
11
+ b: number;
12
+ };
13
+ export declare function staticColorAt(x: number, y: number, geom: GradientGeom): {
14
+ r: number;
15
+ g: number;
16
+ b: number;
17
+ };
18
+ export declare function paintGlyph(glyph: string, r: number, g: number, b: number, mode: GradientColorMode, noColor: boolean): string;
19
+ export declare function renderGradientLine(line: string, y: number, geom: GradientGeom, mode: GradientColorMode, noColor: boolean): string;
20
+ export declare function composeStaticBanner(art: string[], mode: GradientColorMode, noColor: boolean): string[];
21
+ export declare function shouldGradient(options: {
22
+ isTTY: boolean;
23
+ noColor: boolean;
24
+ colorMode: GradientColorMode;
25
+ expanded: boolean;
26
+ width: number;
27
+ }): boolean;
28
+ //# sourceMappingURL=control-panel-gradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-panel-gradient.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/control-panel-gradient.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB,KAAK,CAAC;AA4FnC,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAIhH;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAE3G;AAED,wBAAgB,UAAU,CACzB,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,OAAO,GACd,MAAM,CAWR;AAED,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,OAAO,GACd,MAAM,CASR;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAOtG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAKV","sourcesContent":["import { rgbTo256 } from \"../theme/theme.ts\";\n\nexport type GradientColorMode = \"truecolor\" | \"256color\";\n\nexport interface GradientGeom {\n\tcols: number;\n\trows: number;\n\tshear: number;\n}\n\nexport const MIN_BANNER_WIDTH = 32;\n\nconst DEFAULT_SHEAR = 2.2;\nconst DRIFT = 0.12;\n\nconst RAMP_STOPS = [\n\t{ pos: 0, l: 0.875, c: 0.144, h: 187.2 },\n\t{ pos: 0.38, l: 0.835, c: 0.174, h: 156.9 },\n\t{ pos: 0.7, l: 0.675, c: 0.256, h: 338.4 },\n\t{ pos: 1, l: 0.578, c: 0.247, h: 287.9 },\n] as const;\n\ninterface OklchColor {\n\tl: number;\n\tc: number;\n\th: number;\n}\n\nfunction clamp01(value: number): number {\n\tif (value < 0) return 0;\n\tif (value > 1) return 1;\n\treturn value;\n}\n\nfunction clampByte(value: number): number {\n\tif (!Number.isFinite(value)) return 0;\n\tif (value < 0) return 0;\n\tif (value > 255) return 255;\n\treturn Math.round(value);\n}\n\nfunction lerp(start: number, end: number, amount: number): number {\n\treturn start + (end - start) * amount;\n}\n\nfunction lerpHue(start: number, end: number, amount: number): number {\n\tlet delta = end - start;\n\tif (delta > 180) delta -= 360;\n\tif (delta < -180) delta += 360;\n\tconst hue = start + delta * amount;\n\treturn ((hue % 360) + 360) % 360;\n}\n\nfunction diagonalPosition(x: number, y: number, geom: GradientGeom): number {\n\tconst span = geom.cols - 1 + (geom.rows - 1) * geom.shear;\n\tif (span <= 0) return 0;\n\treturn clamp01((x + (geom.rows - 1 - y) * geom.shear) / span);\n}\n\nfunction rampColor(amount: number): OklchColor {\n\tconst u = clamp01(amount);\n\tfor (let i = 0; i < RAMP_STOPS.length - 1; i++) {\n\t\tconst current = RAMP_STOPS[i];\n\t\tconst next = RAMP_STOPS[i + 1];\n\t\tif (u <= next.pos) {\n\t\t\tconst local = (u - current.pos) / (next.pos - current.pos);\n\t\t\treturn {\n\t\t\t\tl: lerp(current.l, next.l, local),\n\t\t\t\tc: lerp(current.c, next.c, local),\n\t\t\t\th: lerpHue(current.h, next.h, local),\n\t\t\t};\n\t\t}\n\t}\n\tconst last = RAMP_STOPS[RAMP_STOPS.length - 1];\n\treturn { l: last.l, c: last.c, h: last.h };\n}\n\nfunction linearToSrgb(value: number): number {\n\tif (value <= 0) return 0;\n\tif (value >= 1) return 255;\n\tconst srgb = value <= 0.0031308 ? 12.92 * value : 1.055 * value ** (1 / 2.4) - 0.055;\n\treturn clampByte(srgb * 255);\n}\n\nfunction oklchToRgb({ l, c, h }: OklchColor): { r: number; g: number; b: number } {\n\tconst hue = (h * Math.PI) / 180;\n\tconst a = c * Math.cos(hue);\n\tconst b = c * Math.sin(hue);\n\tconst lPrime = l + 0.3963377774 * a + 0.2158037573 * b;\n\tconst mPrime = l - 0.1055613458 * a - 0.0638541728 * b;\n\tconst sPrime = l - 0.0894841775 * a - 1.291485548 * b;\n\tconst lLinear = lPrime * lPrime * lPrime;\n\tconst mLinear = mPrime * mPrime * mPrime;\n\tconst sLinear = sPrime * sPrime * sPrime;\n\n\treturn {\n\t\tr: linearToSrgb(4.0767416621 * lLinear - 3.3077115913 * mLinear + 0.2309699292 * sLinear),\n\t\tg: linearToSrgb(-1.2684380046 * lLinear + 2.6097574011 * mLinear - 0.3413193965 * sLinear),\n\t\tb: linearToSrgb(-0.0041960863 * lLinear - 0.7034186147 * mLinear + 1.707614701 * sLinear),\n\t};\n}\n\nexport function colorAt(x: number, y: number, t: number, geom: GradientGeom): { r: number; g: number; b: number } {\n\tconst base = diagonalPosition(x, y, geom);\n\tconst shifted = clamp01(base + DRIFT * Math.sin(2 * Math.PI * t));\n\treturn oklchToRgb(rampColor(shifted));\n}\n\nexport function staticColorAt(x: number, y: number, geom: GradientGeom): { r: number; g: number; b: number } {\n\treturn colorAt(x, y, 0, geom);\n}\n\nexport function paintGlyph(\n\tglyph: string,\n\tr: number,\n\tg: number,\n\tb: number,\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n): string {\n\tif (noColor || glyph === \" \") {\n\t\treturn glyph;\n\t}\n\tconst red = clampByte(r);\n\tconst green = clampByte(g);\n\tconst blue = clampByte(b);\n\tif (mode === \"truecolor\") {\n\t\treturn `\\x1b[38;2;${red};${green};${blue}m${glyph}\\x1b[39m`;\n\t}\n\treturn `\\x1b[38;5;${rgbTo256(red, green, blue)}m${glyph}\\x1b[39m`;\n}\n\nexport function renderGradientLine(\n\tline: string,\n\ty: number,\n\tgeom: GradientGeom,\n\tmode: GradientColorMode,\n\tnoColor: boolean,\n): string {\n\tconst glyphs = Array.from(line);\n\tlet rendered = \"\";\n\tfor (let x = 0; x < glyphs.length; x++) {\n\t\tconst glyph = glyphs[x];\n\t\tconst { r, g, b } = staticColorAt(x, y, geom);\n\t\trendered += paintGlyph(glyph, r, g, b, mode, noColor);\n\t}\n\treturn rendered;\n}\n\nexport function composeStaticBanner(art: string[], mode: GradientColorMode, noColor: boolean): string[] {\n\tconst geom: GradientGeom = {\n\t\tcols: Math.max(0, ...art.map((line) => Array.from(line).length)),\n\t\trows: art.length,\n\t\tshear: DEFAULT_SHEAR,\n\t};\n\treturn art.map((line, y) => renderGradientLine(line, y, geom, mode, noColor));\n}\n\nexport function shouldGradient(options: {\n\tisTTY: boolean;\n\tnoColor: boolean;\n\tcolorMode: GradientColorMode;\n\texpanded: boolean;\n\twidth: number;\n}): boolean {\n\tconst modeSupportsGradient = options.colorMode === \"truecolor\" || options.colorMode === \"256color\";\n\treturn (\n\t\tmodeSupportsGradient && options.isTTY && !options.noColor && options.expanded && options.width >= MIN_BANNER_WIDTH\n\t);\n}\n"]}