open-multi-agent-kit 0.80.7 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1494) hide show
  1. package/CHANGELOG.md +5 -27
  2. package/README.md +81 -38
  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 +8 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/cli/config-selector.d.ts.map +1 -1
  23. package/dist/cli/config-selector.js +1 -1
  24. package/dist/cli/config-selector.js.map +1 -1
  25. package/dist/cli/file-processor.d.ts +1 -1
  26. package/dist/cli/file-processor.d.ts.map +1 -1
  27. package/dist/cli/file-processor.js.map +1 -1
  28. package/dist/cli/initial-message.d.ts +1 -1
  29. package/dist/cli/initial-message.d.ts.map +1 -1
  30. package/dist/cli/initial-message.js.map +1 -1
  31. package/dist/cli/jailbreak-args.d.ts +26 -0
  32. package/dist/cli/jailbreak-args.d.ts.map +1 -0
  33. package/dist/cli/jailbreak-args.js +86 -0
  34. package/dist/cli/jailbreak-args.js.map +1 -0
  35. package/dist/cli/list-models.d.ts.map +1 -1
  36. package/dist/cli/list-models.js +1 -1
  37. package/dist/cli/list-models.js.map +1 -1
  38. package/dist/cli/session-picker.d.ts.map +1 -1
  39. package/dist/cli/session-picker.js +1 -1
  40. package/dist/cli/session-picker.js.map +1 -1
  41. package/dist/commands/doctor-provider.d.ts +19 -0
  42. package/dist/commands/doctor-provider.d.ts.map +1 -0
  43. package/dist/commands/doctor-provider.js +123 -0
  44. package/dist/commands/doctor-provider.js.map +1 -0
  45. package/dist/commands/jailbreak.d.ts +49 -0
  46. package/dist/commands/jailbreak.d.ts.map +1 -0
  47. package/dist/commands/jailbreak.js +201 -0
  48. package/dist/commands/jailbreak.js.map +1 -0
  49. package/dist/config.d.ts +9 -5
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +33 -52
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-session-services.d.ts +2 -2
  54. package/dist/core/agent-session-services.d.ts.map +1 -1
  55. package/dist/core/agent-session-services.js.map +1 -1
  56. package/dist/core/agent-session.d.ts +16 -27
  57. package/dist/core/agent-session.d.ts.map +1 -1
  58. package/dist/core/agent-session.js +185 -89
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/auth-storage.d.ts +3 -6
  61. package/dist/core/auth-storage.d.ts.map +1 -1
  62. package/dist/core/auth-storage.js +7 -7
  63. package/dist/core/auth-storage.js.map +1 -1
  64. package/dist/core/automation/index.d.ts +359 -0
  65. package/dist/core/automation/index.d.ts.map +1 -0
  66. package/dist/core/automation/index.js +665 -0
  67. package/dist/core/automation/index.js.map +1 -0
  68. package/dist/core/bash-executor.d.ts +1 -0
  69. package/dist/core/bash-executor.d.ts.map +1 -1
  70. package/dist/core/bash-executor.js +1 -0
  71. package/dist/core/bash-executor.js.map +1 -1
  72. package/dist/core/browser-use.d.ts +53 -0
  73. package/dist/core/browser-use.d.ts.map +1 -0
  74. package/dist/core/browser-use.js +108 -0
  75. package/dist/core/browser-use.js.map +1 -0
  76. package/dist/core/command-safety-parser.d.ts +77 -0
  77. package/dist/core/command-safety-parser.d.ts.map +1 -0
  78. package/dist/core/command-safety-parser.js +763 -0
  79. package/dist/core/command-safety-parser.js.map +1 -0
  80. package/dist/core/command-safety.d.ts.map +1 -1
  81. package/dist/core/command-safety.js +106 -3
  82. package/dist/core/command-safety.js.map +1 -1
  83. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  84. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  85. package/dist/core/compaction/branch-summarization.js +5 -21
  86. package/dist/core/compaction/branch-summarization.js.map +1 -1
  87. package/dist/core/compaction/compaction.d.ts +3 -101
  88. package/dist/core/compaction/compaction.d.ts.map +1 -1
  89. package/dist/core/compaction/compaction.js +21 -656
  90. package/dist/core/compaction/compaction.js.map +1 -1
  91. package/dist/core/compaction/utils.d.ts +2 -2
  92. package/dist/core/compaction/utils.d.ts.map +1 -1
  93. package/dist/core/compaction/utils.js.map +1 -1
  94. package/dist/core/compactor.d.ts +42 -0
  95. package/dist/core/compactor.d.ts.map +1 -0
  96. package/dist/core/compactor.js +131 -0
  97. package/dist/core/compactor.js.map +1 -0
  98. package/dist/core/context-budget-compressors.d.ts +50 -0
  99. package/dist/core/context-budget-compressors.d.ts.map +1 -0
  100. package/dist/core/context-budget-compressors.js +166 -0
  101. package/dist/core/context-budget-compressors.js.map +1 -0
  102. package/dist/core/context-budget-governor-v2.d.ts +7 -0
  103. package/dist/core/context-budget-governor-v2.d.ts.map +1 -0
  104. package/dist/core/context-budget-governor-v2.js +7 -0
  105. package/dist/core/context-budget-governor-v2.js.map +1 -0
  106. package/dist/core/context-budget-governor.d.ts +67 -0
  107. package/dist/core/context-budget-governor.d.ts.map +1 -0
  108. package/dist/core/context-budget-governor.js +224 -0
  109. package/dist/core/context-budget-governor.js.map +1 -0
  110. package/dist/core/context-budget-headroom-candidates.d.ts +3 -0
  111. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -0
  112. package/dist/core/context-budget-headroom-candidates.js +85 -0
  113. package/dist/core/context-budget-headroom-candidates.js.map +1 -0
  114. package/dist/core/context-budget-headroom-types.d.ts +67 -0
  115. package/dist/core/context-budget-headroom-types.d.ts.map +1 -0
  116. package/dist/core/context-budget-headroom-types.js +46 -0
  117. package/dist/core/context-budget-headroom-types.js.map +1 -0
  118. package/dist/core/context-budget-headroom.d.ts +5 -0
  119. package/dist/core/context-budget-headroom.d.ts.map +1 -0
  120. package/dist/core/context-budget-headroom.js +123 -0
  121. package/dist/core/context-budget-headroom.js.map +1 -0
  122. package/dist/core/context-budget-relevance.d.ts +46 -0
  123. package/dist/core/context-budget-relevance.d.ts.map +1 -0
  124. package/dist/core/context-budget-relevance.js +329 -0
  125. package/dist/core/context-budget-relevance.js.map +1 -0
  126. package/dist/core/context-budget-system-prompt-items.d.ts +19 -0
  127. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -0
  128. package/dist/core/context-budget-system-prompt-items.js +143 -0
  129. package/dist/core/context-budget-system-prompt-items.js.map +1 -0
  130. package/dist/core/context-budget-system-prompt.d.ts +31 -0
  131. package/dist/core/context-budget-system-prompt.d.ts.map +1 -0
  132. package/dist/core/context-budget-system-prompt.js +87 -0
  133. package/dist/core/context-budget-system-prompt.js.map +1 -0
  134. package/dist/core/context-budget-token-counter.d.ts +34 -0
  135. package/dist/core/context-budget-token-counter.d.ts.map +1 -0
  136. package/dist/core/context-budget-token-counter.js +315 -0
  137. package/dist/core/context-budget-token-counter.js.map +1 -0
  138. package/dist/core/context-budget-v2-coverage.d.ts +5 -0
  139. package/dist/core/context-budget-v2-coverage.d.ts.map +1 -0
  140. package/dist/core/context-budget-v2-coverage.js +58 -0
  141. package/dist/core/context-budget-v2-coverage.js.map +1 -0
  142. package/dist/core/context-budget-v2-plan-hash.d.ts +12 -0
  143. package/dist/core/context-budget-v2-plan-hash.d.ts.map +1 -0
  144. package/dist/core/context-budget-v2-plan-hash.js +38 -0
  145. package/dist/core/context-budget-v2-plan-hash.js.map +1 -0
  146. package/dist/core/context-budget-v2-planner.d.ts +3 -0
  147. package/dist/core/context-budget-v2-planner.d.ts.map +1 -0
  148. package/dist/core/context-budget-v2-planner.js +143 -0
  149. package/dist/core/context-budget-v2-planner.js.map +1 -0
  150. package/dist/core/context-budget-v2-scoring.d.ts +14 -0
  151. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -0
  152. package/dist/core/context-budget-v2-scoring.js +114 -0
  153. package/dist/core/context-budget-v2-scoring.js.map +1 -0
  154. package/dist/core/context-budget-v2-selection.d.ts +32 -0
  155. package/dist/core/context-budget-v2-selection.d.ts.map +1 -0
  156. package/dist/core/context-budget-v2-selection.js +158 -0
  157. package/dist/core/context-budget-v2-selection.js.map +1 -0
  158. package/dist/core/context-budget-v2-tiers.d.ts +15 -0
  159. package/dist/core/context-budget-v2-tiers.d.ts.map +1 -0
  160. package/dist/core/context-budget-v2-tiers.js +68 -0
  161. package/dist/core/context-budget-v2-tiers.js.map +1 -0
  162. package/dist/core/context-budget-v2-types.d.ts +92 -0
  163. package/dist/core/context-budget-v2-types.d.ts.map +1 -0
  164. package/dist/core/context-budget-v2-types.js +24 -0
  165. package/dist/core/context-budget-v2-types.js.map +1 -0
  166. package/dist/core/defaults.d.ts +1 -1
  167. package/dist/core/defaults.d.ts.map +1 -1
  168. package/dist/core/defaults.js.map +1 -1
  169. package/dist/core/diagnostics.d.ts +6 -0
  170. package/dist/core/diagnostics.d.ts.map +1 -1
  171. package/dist/core/diagnostics.js.map +1 -1
  172. package/dist/core/domain-confidence.d.ts +9 -0
  173. package/dist/core/domain-confidence.d.ts.map +1 -0
  174. package/dist/core/domain-confidence.js +39 -0
  175. package/dist/core/domain-confidence.js.map +1 -0
  176. package/dist/core/domain-dispatch.d.ts +44 -0
  177. package/dist/core/domain-dispatch.d.ts.map +1 -0
  178. package/dist/core/domain-dispatch.js +118 -0
  179. package/dist/core/domain-dispatch.js.map +1 -0
  180. package/dist/core/domain-loadouts.d.ts +76 -0
  181. package/dist/core/domain-loadouts.d.ts.map +1 -0
  182. package/dist/core/domain-loadouts.js +981 -0
  183. package/dist/core/domain-loadouts.js.map +1 -0
  184. package/dist/core/domain-registry.d.ts +7 -0
  185. package/dist/core/domain-registry.d.ts.map +1 -0
  186. package/dist/core/domain-registry.js +11 -0
  187. package/dist/core/domain-registry.js.map +1 -0
  188. package/dist/core/domain-router.d.ts +16 -0
  189. package/dist/core/domain-router.d.ts.map +1 -0
  190. package/dist/core/domain-router.js +24 -0
  191. package/dist/core/domain-router.js.map +1 -0
  192. package/dist/core/domain-score.d.ts +13 -0
  193. package/dist/core/domain-score.d.ts.map +1 -0
  194. package/dist/core/domain-score.js +48 -0
  195. package/dist/core/domain-score.js.map +1 -0
  196. package/dist/core/domain-trigger-match.d.ts +14 -0
  197. package/dist/core/domain-trigger-match.d.ts.map +1 -0
  198. package/dist/core/domain-trigger-match.js +51 -0
  199. package/dist/core/domain-trigger-match.js.map +1 -0
  200. package/dist/core/domain-types.d.ts +30 -0
  201. package/dist/core/domain-types.d.ts.map +1 -0
  202. package/dist/core/domain-types.js +2 -0
  203. package/dist/core/domain-types.js.map +1 -0
  204. package/dist/core/exact-cache-policy.d.ts +8 -0
  205. package/dist/core/exact-cache-policy.d.ts.map +1 -1
  206. package/dist/core/exact-cache-policy.js +9 -0
  207. package/dist/core/exact-cache-policy.js.map +1 -1
  208. package/dist/core/exec.d.ts +0 -2
  209. package/dist/core/exec.d.ts.map +1 -1
  210. package/dist/core/exec.js +0 -1
  211. package/dist/core/exec.js.map +1 -1
  212. package/dist/core/export-html/index.d.ts +1 -1
  213. package/dist/core/export-html/index.d.ts.map +1 -1
  214. package/dist/core/export-html/index.js.map +1 -1
  215. package/dist/core/export-html/template.js +1 -3
  216. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  217. package/dist/core/export-html/tool-renderer.js.map +1 -1
  218. package/dist/core/extensions/builtin/command-safety-gate.d.ts +3 -0
  219. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/command-safety-gate.js +15 -3
  221. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
  222. package/dist/core/extensions/builtin/todo-checklist.d.ts +20 -0
  223. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -0
  224. package/dist/core/extensions/builtin/todo-checklist.js +73 -0
  225. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
  226. package/dist/core/extensions/loader.d.ts +4 -4
  227. package/dist/core/extensions/loader.d.ts.map +1 -1
  228. package/dist/core/extensions/loader.js +57 -92
  229. package/dist/core/extensions/loader.js.map +1 -1
  230. package/dist/core/extensions/runner.d.ts +3 -3
  231. package/dist/core/extensions/runner.d.ts.map +1 -1
  232. package/dist/core/extensions/runner.js +1 -1
  233. package/dist/core/extensions/runner.js.map +1 -1
  234. package/dist/core/extensions/types.d.ts +7 -35
  235. package/dist/core/extensions/types.d.ts.map +1 -1
  236. package/dist/core/extensions/types.js.map +1 -1
  237. package/dist/core/extensions/wrapper.d.ts +1 -1
  238. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  239. package/dist/core/extensions/wrapper.js.map +1 -1
  240. package/dist/core/footer-data-provider.d.ts +3 -1
  241. package/dist/core/footer-data-provider.d.ts.map +1 -1
  242. package/dist/core/footer-data-provider.js +4 -0
  243. package/dist/core/footer-data-provider.js.map +1 -1
  244. package/dist/core/headroom.d.ts +45 -0
  245. package/dist/core/headroom.d.ts.map +1 -0
  246. package/dist/core/headroom.js +171 -0
  247. package/dist/core/headroom.js.map +1 -0
  248. package/dist/core/hook-inventory.d.ts +4 -2
  249. package/dist/core/hook-inventory.d.ts.map +1 -1
  250. package/dist/core/hook-inventory.js +80 -11
  251. package/dist/core/hook-inventory.js.map +1 -1
  252. package/dist/core/hooks/fail-closed.d.ts +4 -1
  253. package/dist/core/hooks/fail-closed.d.ts.map +1 -1
  254. package/dist/core/hooks/fail-closed.js +79 -5
  255. package/dist/core/hooks/fail-closed.js.map +1 -1
  256. package/dist/core/hooks/index.d.ts +2 -2
  257. package/dist/core/hooks/index.d.ts.map +1 -1
  258. package/dist/core/hooks/index.js +1 -1
  259. package/dist/core/hooks/index.js.map +1 -1
  260. package/dist/core/hooks/types.d.ts +9 -0
  261. package/dist/core/hooks/types.d.ts.map +1 -1
  262. package/dist/core/hooks/types.js.map +1 -1
  263. package/dist/core/keybindings.d.ts +2 -14
  264. package/dist/core/keybindings.d.ts.map +1 -1
  265. package/dist/core/keybindings.js +1 -31
  266. package/dist/core/keybindings.js.map +1 -1
  267. package/dist/core/lean-ctx.d.ts +99 -0
  268. package/dist/core/lean-ctx.d.ts.map +1 -0
  269. package/dist/core/lean-ctx.js +225 -0
  270. package/dist/core/lean-ctx.js.map +1 -0
  271. package/dist/core/loadout-compose.d.ts +53 -0
  272. package/dist/core/loadout-compose.d.ts.map +1 -0
  273. package/dist/core/loadout-compose.js +172 -0
  274. package/dist/core/loadout-compose.js.map +1 -0
  275. package/dist/core/loadout-policy-bridge.d.ts +22 -0
  276. package/dist/core/loadout-policy-bridge.d.ts.map +1 -0
  277. package/dist/core/loadout-policy-bridge.js +52 -0
  278. package/dist/core/loadout-policy-bridge.js.map +1 -0
  279. package/dist/core/loadout-runtime.d.ts +22 -0
  280. package/dist/core/loadout-runtime.d.ts.map +1 -1
  281. package/dist/core/loadout-runtime.js +41 -5
  282. package/dist/core/loadout-runtime.js.map +1 -1
  283. package/dist/core/loadout-safety.d.ts +55 -0
  284. package/dist/core/loadout-safety.d.ts.map +1 -0
  285. package/dist/core/loadout-safety.js +213 -0
  286. package/dist/core/loadout-safety.js.map +1 -0
  287. package/dist/core/loadouts.d.ts +4 -2
  288. package/dist/core/loadouts.d.ts.map +1 -1
  289. package/dist/core/loadouts.js +116 -5
  290. package/dist/core/loadouts.js.map +1 -1
  291. package/dist/core/loop-gates.d.ts +48 -0
  292. package/dist/core/loop-gates.d.ts.map +1 -0
  293. package/dist/core/loop-gates.js +352 -0
  294. package/dist/core/loop-gates.js.map +1 -0
  295. package/dist/core/loop-registry.d.ts +77 -0
  296. package/dist/core/loop-registry.d.ts.map +1 -0
  297. package/dist/core/loop-registry.js +831 -0
  298. package/dist/core/loop-registry.js.map +1 -0
  299. package/dist/core/loop-types.d.ts +194 -0
  300. package/dist/core/loop-types.d.ts.map +1 -0
  301. package/dist/core/loop-types.js +2 -0
  302. package/dist/core/loop-types.js.map +1 -0
  303. package/dist/core/mcp-inventory.d.ts +7 -0
  304. package/dist/core/mcp-inventory.d.ts.map +1 -1
  305. package/dist/core/mcp-inventory.js +5 -1
  306. package/dist/core/mcp-inventory.js.map +1 -1
  307. package/dist/core/mcp-presets.d.ts +43 -2
  308. package/dist/core/mcp-presets.d.ts.map +1 -1
  309. package/dist/core/mcp-presets.js +298 -2
  310. package/dist/core/mcp-presets.js.map +1 -1
  311. package/dist/core/messages.d.ts +3 -3
  312. package/dist/core/messages.d.ts.map +1 -1
  313. package/dist/core/messages.js.map +1 -1
  314. package/dist/core/metrics-sampler.d.ts +11 -0
  315. package/dist/core/metrics-sampler.d.ts.map +1 -1
  316. package/dist/core/metrics-sampler.js +52 -13
  317. package/dist/core/metrics-sampler.js.map +1 -1
  318. package/dist/core/model-registry.d.ts +1 -2
  319. package/dist/core/model-registry.d.ts.map +1 -1
  320. package/dist/core/model-registry.js +18 -41
  321. package/dist/core/model-registry.js.map +1 -1
  322. package/dist/core/model-resolver.d.ts +2 -2
  323. package/dist/core/model-resolver.d.ts.map +1 -1
  324. package/dist/core/model-resolver.js +2 -2
  325. package/dist/core/model-resolver.js.map +1 -1
  326. package/dist/core/package-gallery-identity.d.ts +7 -0
  327. package/dist/core/package-gallery-identity.d.ts.map +1 -0
  328. package/dist/core/package-gallery-identity.js +31 -0
  329. package/dist/core/package-gallery-identity.js.map +1 -0
  330. package/dist/core/package-gallery-install.d.ts +6 -0
  331. package/dist/core/package-gallery-install.d.ts.map +1 -0
  332. package/dist/core/package-gallery-install.js +59 -0
  333. package/dist/core/package-gallery-install.js.map +1 -0
  334. package/dist/core/package-gallery-manifest.d.ts +13 -0
  335. package/dist/core/package-gallery-manifest.d.ts.map +1 -0
  336. package/dist/core/package-gallery-manifest.js +183 -0
  337. package/dist/core/package-gallery-manifest.js.map +1 -0
  338. package/dist/core/package-gallery-trial.d.ts +4 -0
  339. package/dist/core/package-gallery-trial.d.ts.map +1 -0
  340. package/dist/core/package-gallery-trial.js +55 -0
  341. package/dist/core/package-gallery-trial.js.map +1 -0
  342. package/dist/core/package-gallery-types.d.ts +71 -0
  343. package/dist/core/package-gallery-types.d.ts.map +1 -0
  344. package/dist/core/package-gallery-types.js +2 -0
  345. package/dist/core/package-gallery-types.js.map +1 -0
  346. package/dist/core/package-gallery.d.ts +5 -123
  347. package/dist/core/package-gallery.d.ts.map +1 -1
  348. package/dist/core/package-gallery.js +5 -391
  349. package/dist/core/package-gallery.js.map +1 -1
  350. package/dist/core/package-manager.d.ts +0 -69
  351. package/dist/core/package-manager.d.ts.map +1 -1
  352. package/dist/core/package-manager.js +69 -367
  353. package/dist/core/package-manager.js.map +1 -1
  354. package/dist/core/package-procurement.d.ts +4 -4
  355. package/dist/core/package-procurement.d.ts.map +1 -1
  356. package/dist/core/package-procurement.js +29 -17
  357. package/dist/core/package-procurement.js.map +1 -1
  358. package/dist/core/pi-package-intake-candidates.d.ts +21 -0
  359. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
  360. package/dist/core/pi-package-intake-candidates.js +109 -0
  361. package/dist/core/pi-package-intake-candidates.js.map +1 -0
  362. package/dist/core/pi-package-intake.d.ts +43 -0
  363. package/dist/core/pi-package-intake.d.ts.map +1 -0
  364. package/dist/core/pi-package-intake.js +122 -0
  365. package/dist/core/pi-package-intake.js.map +1 -0
  366. package/dist/core/provider-attribution.d.ts +1 -1
  367. package/dist/core/provider-attribution.d.ts.map +1 -1
  368. package/dist/core/provider-attribution.js.map +1 -1
  369. package/dist/core/provider-display-names.d.ts.map +1 -1
  370. package/dist/core/provider-display-names.js +1 -0
  371. package/dist/core/provider-display-names.js.map +1 -1
  372. package/dist/core/read-anchors.d.ts +1 -1
  373. package/dist/core/read-anchors.d.ts.map +1 -1
  374. package/dist/core/read-anchors.js +1 -1
  375. package/dist/core/read-anchors.js.map +1 -1
  376. package/dist/core/recovery-checkpoint.d.ts +2 -2
  377. package/dist/core/recovery-checkpoint.d.ts.map +1 -1
  378. package/dist/core/recovery-checkpoint.js +2 -2
  379. package/dist/core/recovery-checkpoint.js.map +1 -1
  380. package/dist/core/resolve-config-value.d.ts +1 -1
  381. package/dist/core/resolve-config-value.d.ts.map +1 -1
  382. package/dist/core/resolve-config-value.js +2 -30
  383. package/dist/core/resolve-config-value.js.map +1 -1
  384. package/dist/core/resource-loader.d.ts +12 -20
  385. package/dist/core/resource-loader.d.ts.map +1 -1
  386. package/dist/core/resource-loader.js +67 -90
  387. package/dist/core/resource-loader.js.map +1 -1
  388. package/dist/core/sandbox-policy-v2.d.ts +49 -0
  389. package/dist/core/sandbox-policy-v2.d.ts.map +1 -0
  390. package/dist/core/sandbox-policy-v2.js +368 -0
  391. package/dist/core/sandbox-policy-v2.js.map +1 -0
  392. package/dist/core/sdk.d.ts +10 -78
  393. package/dist/core/sdk.d.ts.map +1 -1
  394. package/dist/core/sdk.js +97 -139
  395. package/dist/core/sdk.js.map +1 -1
  396. package/dist/core/semantic-cache-policy.d.ts +7 -1
  397. package/dist/core/semantic-cache-policy.d.ts.map +1 -1
  398. package/dist/core/semantic-cache-policy.js +8 -0
  399. package/dist/core/semantic-cache-policy.js.map +1 -1
  400. package/dist/core/session-manager.d.ts +2 -4
  401. package/dist/core/session-manager.d.ts.map +1 -1
  402. package/dist/core/session-manager.js +5 -6
  403. package/dist/core/session-manager.js.map +1 -1
  404. package/dist/core/settings-manager.d.ts +1 -18
  405. package/dist/core/settings-manager.d.ts.map +1 -1
  406. package/dist/core/settings-manager.js +2 -48
  407. package/dist/core/settings-manager.js.map +1 -1
  408. package/dist/core/skills.d.ts +5 -0
  409. package/dist/core/skills.d.ts.map +1 -1
  410. package/dist/core/skills.js +149 -36
  411. package/dist/core/skills.js.map +1 -1
  412. package/dist/core/slash-commands.d.ts.map +1 -1
  413. package/dist/core/slash-commands.js +0 -2
  414. package/dist/core/slash-commands.js.map +1 -1
  415. package/dist/core/subagent-orchestration.d.ts +73 -0
  416. package/dist/core/subagent-orchestration.d.ts.map +1 -0
  417. package/dist/core/subagent-orchestration.js +408 -0
  418. package/dist/core/subagent-orchestration.js.map +1 -0
  419. package/dist/core/system-prompt.d.ts +5 -4
  420. package/dist/core/system-prompt.d.ts.map +1 -1
  421. package/dist/core/system-prompt.js +57 -36
  422. package/dist/core/system-prompt.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 +0 -4
  426. package/dist/core/timings.js.map +1 -1
  427. package/dist/core/todo-runtime-state.d.ts +5 -0
  428. package/dist/core/todo-runtime-state.d.ts.map +1 -0
  429. package/dist/core/todo-runtime-state.js +12 -0
  430. package/dist/core/todo-runtime-state.js.map +1 -0
  431. package/dist/core/todo-state.d.ts +53 -0
  432. package/dist/core/todo-state.d.ts.map +1 -0
  433. package/dist/core/todo-state.js +87 -0
  434. package/dist/core/todo-state.js.map +1 -0
  435. package/dist/core/token-optimizer.d.ts +58 -0
  436. package/dist/core/token-optimizer.d.ts.map +1 -0
  437. package/dist/core/token-optimizer.js +179 -0
  438. package/dist/core/token-optimizer.js.map +1 -0
  439. package/dist/core/tools/bash.d.ts +8 -9
  440. package/dist/core/tools/bash.d.ts.map +1 -1
  441. package/dist/core/tools/bash.js +9 -8
  442. package/dist/core/tools/bash.js.map +1 -1
  443. package/dist/core/tools/edit.d.ts +3 -14
  444. package/dist/core/tools/edit.d.ts.map +1 -1
  445. package/dist/core/tools/edit.js +4 -25
  446. package/dist/core/tools/edit.js.map +1 -1
  447. package/dist/core/tools/find.d.ts +1 -4
  448. package/dist/core/tools/find.d.ts.map +1 -1
  449. package/dist/core/tools/find.js +1 -4
  450. package/dist/core/tools/find.js.map +1 -1
  451. package/dist/core/tools/grep.d.ts +1 -4
  452. package/dist/core/tools/grep.d.ts.map +1 -1
  453. package/dist/core/tools/grep.js +2 -5
  454. package/dist/core/tools/grep.js.map +1 -1
  455. package/dist/core/tools/index.d.ts +2 -2
  456. package/dist/core/tools/index.d.ts.map +1 -1
  457. package/dist/core/tools/index.js.map +1 -1
  458. package/dist/core/tools/ls.d.ts +1 -4
  459. package/dist/core/tools/ls.d.ts.map +1 -1
  460. package/dist/core/tools/ls.js +1 -4
  461. package/dist/core/tools/ls.js.map +1 -1
  462. package/dist/core/tools/read.d.ts +2 -14
  463. package/dist/core/tools/read.d.ts.map +1 -1
  464. package/dist/core/tools/read.js +4 -28
  465. package/dist/core/tools/read.js.map +1 -1
  466. package/dist/core/tools/render-utils.d.ts +1 -1
  467. package/dist/core/tools/render-utils.d.ts.map +1 -1
  468. package/dist/core/tools/render-utils.js +1 -1
  469. package/dist/core/tools/render-utils.js.map +1 -1
  470. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  471. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  472. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  473. package/dist/core/tools/write.d.ts +2 -4
  474. package/dist/core/tools/write.d.ts.map +1 -1
  475. package/dist/core/tools/write.js +4 -4
  476. package/dist/core/tools/write.js.map +1 -1
  477. package/dist/encoding/index.d.ts +6 -0
  478. package/dist/encoding/index.d.ts.map +1 -0
  479. package/dist/encoding/index.js +6 -0
  480. package/dist/encoding/index.js.map +1 -0
  481. package/dist/encoding/l4-encoder.d.ts +96 -0
  482. package/dist/encoding/l4-encoder.d.ts.map +1 -0
  483. package/dist/encoding/l4-encoder.js +474 -0
  484. package/dist/encoding/l4-encoder.js.map +1 -0
  485. package/dist/fuzzing/index.d.ts +6 -0
  486. package/dist/fuzzing/index.d.ts.map +1 -0
  487. package/dist/fuzzing/index.js +6 -0
  488. package/dist/fuzzing/index.js.map +1 -0
  489. package/dist/fuzzing/mutation-engine.d.ts +93 -0
  490. package/dist/fuzzing/mutation-engine.d.ts.map +1 -0
  491. package/dist/fuzzing/mutation-engine.js +244 -0
  492. package/dist/fuzzing/mutation-engine.js.map +1 -0
  493. package/dist/guardrails/audit-logger.d.ts +4 -0
  494. package/dist/guardrails/audit-logger.d.ts.map +1 -0
  495. package/dist/guardrails/audit-logger.js +28 -0
  496. package/dist/guardrails/audit-logger.js.map +1 -0
  497. package/dist/guardrails/evidence-system.d.ts +61 -0
  498. package/dist/guardrails/evidence-system.d.ts.map +1 -0
  499. package/dist/guardrails/evidence-system.js +302 -0
  500. package/dist/guardrails/evidence-system.js.map +1 -0
  501. package/dist/guardrails/freedomd-adapter.d.ts +16 -0
  502. package/dist/guardrails/freedomd-adapter.d.ts.map +1 -0
  503. package/dist/guardrails/freedomd-adapter.js +87 -0
  504. package/dist/guardrails/freedomd-adapter.js.map +1 -0
  505. package/dist/index.d.ts +5 -19
  506. package/dist/index.d.ts.map +1 -1
  507. package/dist/index.js +3 -17
  508. package/dist/index.js.map +1 -1
  509. package/dist/jailbreak-extension.d.ts +48 -0
  510. package/dist/jailbreak-extension.d.ts.map +1 -0
  511. package/dist/jailbreak-extension.js +47 -0
  512. package/dist/jailbreak-extension.js.map +1 -0
  513. package/dist/main.d.ts.map +1 -1
  514. package/dist/main.js +2 -2
  515. package/dist/main.js.map +1 -1
  516. package/dist/migrations.d.ts +0 -37
  517. package/dist/migrations.d.ts.map +1 -1
  518. package/dist/migrations.js +6 -414
  519. package/dist/migrations.js.map +1 -1
  520. package/dist/modes/interactive/components/armin.d.ts +1 -1
  521. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  522. package/dist/modes/interactive/components/armin.js.map +1 -1
  523. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  524. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  525. package/dist/modes/interactive/components/assistant-message.js +1 -1
  526. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  527. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  528. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/bash-execution.js +1 -1
  530. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  531. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  532. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  534. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  535. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  536. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  537. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  538. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  539. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  540. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  541. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  542. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  543. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  544. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  545. package/dist/modes/interactive/components/config-selector.js +1 -1
  546. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  547. package/dist/modes/interactive/components/control-panel-box.d.ts +15 -0
  548. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -0
  549. package/dist/modes/interactive/components/control-panel-box.js +55 -0
  550. package/dist/modes/interactive/components/control-panel-box.js.map +1 -0
  551. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -36
  553. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  554. package/dist/modes/interactive/components/control-panel-gradient.d.ts +1 -0
  555. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -1
  556. package/dist/modes/interactive/components/control-panel-gradient.js +6 -5
  557. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -1
  558. package/dist/modes/interactive/components/control-panel-layout.d.ts +30 -0
  559. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
  560. package/dist/modes/interactive/components/control-panel-layout.js +197 -0
  561. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
  562. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +6 -0
  563. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -0
  564. package/dist/modes/interactive/components/control-panel-runtime-status.js +29 -0
  565. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
  566. package/dist/modes/interactive/components/control-panel.d.ts +9 -31
  567. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/control-panel.js +49 -168
  569. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  570. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  571. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  572. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  573. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  574. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/custom-editor.js +14 -22
  576. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  577. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  578. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/custom-message.js +1 -1
  580. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  581. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  582. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  583. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  584. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  585. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  586. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  587. package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
  588. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  589. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  590. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  591. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  592. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  593. package/dist/modes/interactive/components/extension-editor.js +1 -1
  594. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  595. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  596. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  597. package/dist/modes/interactive/components/extension-input.js +1 -1
  598. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  599. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  600. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/extension-selector.js +1 -1
  602. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/footer.d.ts +1 -1
  604. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/footer.js +7 -9
  606. package/dist/modes/interactive/components/footer.js.map +1 -1
  607. package/dist/modes/interactive/components/index.d.ts +0 -2
  608. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/index.js +0 -2
  610. package/dist/modes/interactive/components/index.js.map +1 -1
  611. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  612. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  614. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  615. package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
  616. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/login-dialog.js +2 -2
  618. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  619. package/dist/modes/interactive/components/model-selector.d.ts +13 -47
  620. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/model-selector.js +118 -193
  622. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  623. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  624. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  626. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  627. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  628. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  630. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  631. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  632. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  633. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  634. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  635. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/session-selector.js +1 -1
  637. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  638. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  639. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  640. package/dist/modes/interactive/components/settings-selector.js +1 -1
  641. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  642. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  643. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  644. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  645. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  646. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  647. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  648. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  649. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  650. package/dist/modes/interactive/components/theme-selector.d.ts +1 -2
  651. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  652. package/dist/modes/interactive/components/theme-selector.js +2 -11
  653. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  654. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -7
  655. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  656. package/dist/modes/interactive/components/thinking-selector.js +48 -7
  657. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  658. package/dist/modes/interactive/components/todo-checklist.d.ts +31 -0
  659. package/dist/modes/interactive/components/todo-checklist.d.ts.map +1 -0
  660. package/dist/modes/interactive/components/todo-checklist.js +121 -0
  661. package/dist/modes/interactive/components/todo-checklist.js.map +1 -0
  662. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  663. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  664. package/dist/modes/interactive/components/tool-execution.js +1 -1
  665. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  666. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  667. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  668. package/dist/modes/interactive/components/tree-selector.js +1 -1
  669. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  670. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  671. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  672. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  673. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  674. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  675. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  676. package/dist/modes/interactive/components/user-message.js +1 -1
  677. package/dist/modes/interactive/components/user-message.js.map +1 -1
  678. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  679. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  680. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  681. package/dist/modes/interactive/interactive-mode.d.ts +3 -8
  682. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  683. package/dist/modes/interactive/interactive-mode.js +80 -232
  684. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  685. package/dist/modes/interactive/theme/omk-control-grid-dark.json +65 -77
  686. package/dist/modes/interactive/theme/omk-neon-control.json +90 -0
  687. package/dist/modes/interactive/theme/rust-forge.json +14 -24
  688. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  689. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme.js +25 -45
  691. package/dist/modes/interactive/theme/theme.js.map +1 -1
  692. package/dist/modes/print-mode.d.ts +1 -1
  693. package/dist/modes/print-mode.d.ts.map +1 -1
  694. package/dist/modes/print-mode.js.map +1 -1
  695. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  696. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  697. package/dist/modes/rpc/rpc-client.js.map +1 -1
  698. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  699. package/dist/modes/rpc/rpc-mode.js +0 -4
  700. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  701. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  702. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  703. package/dist/modes/rpc/rpc-types.js.map +1 -1
  704. package/dist/modules/index.d.ts +8 -0
  705. package/dist/modules/index.d.ts.map +1 -0
  706. package/dist/modules/index.js +7 -0
  707. package/dist/modules/index.js.map +1 -0
  708. package/dist/modules/lrl-bypass.d.ts +40 -0
  709. package/dist/modules/lrl-bypass.d.ts.map +1 -0
  710. package/dist/modules/lrl-bypass.js +84 -0
  711. package/dist/modules/lrl-bypass.js.map +1 -0
  712. package/dist/modules/lrl-deps.d.ts +38 -0
  713. package/dist/modules/lrl-deps.d.ts.map +1 -0
  714. package/dist/modules/lrl-deps.js +128 -0
  715. package/dist/modules/lrl-deps.js.map +1 -0
  716. package/dist/multiturn/easl-chain.d.ts +113 -0
  717. package/dist/multiturn/easl-chain.d.ts.map +1 -0
  718. package/dist/multiturn/easl-chain.js +351 -0
  719. package/dist/multiturn/easl-chain.js.map +1 -0
  720. package/dist/multiturn/index.d.ts +6 -0
  721. package/dist/multiturn/index.d.ts.map +1 -0
  722. package/dist/multiturn/index.js +6 -0
  723. package/dist/multiturn/index.js.map +1 -0
  724. package/dist/orchestration/lane-grant-auditor.d.ts +4 -0
  725. package/dist/orchestration/lane-grant-auditor.d.ts.map +1 -0
  726. package/dist/orchestration/lane-grant-auditor.js +87 -0
  727. package/dist/orchestration/lane-grant-auditor.js.map +1 -0
  728. package/dist/package-manager-cli.d.ts.map +1 -1
  729. package/dist/package-manager-cli.js +48 -113
  730. package/dist/package-manager-cli.js.map +1 -1
  731. package/dist/routing/fallback-router.d.ts +123 -0
  732. package/dist/routing/fallback-router.d.ts.map +1 -0
  733. package/dist/routing/fallback-router.js +355 -0
  734. package/dist/routing/fallback-router.js.map +1 -0
  735. package/dist/routing/index.d.ts +6 -0
  736. package/dist/routing/index.d.ts.map +1 -0
  737. package/dist/routing/index.js +6 -0
  738. package/dist/routing/index.js.map +1 -0
  739. package/dist/types/evidence.d.ts +117 -0
  740. package/dist/types/evidence.d.ts.map +1 -0
  741. package/dist/types/evidence.js +8 -0
  742. package/dist/types/evidence.js.map +1 -0
  743. package/dist/types/guardrails.d.ts +61 -0
  744. package/dist/types/guardrails.d.ts.map +1 -0
  745. package/dist/types/guardrails.js +9 -0
  746. package/dist/types/guardrails.js.map +1 -0
  747. package/dist/types/jailbreak.d.ts +246 -0
  748. package/dist/types/jailbreak.d.ts.map +1 -0
  749. package/dist/types/jailbreak.js +8 -0
  750. package/dist/types/jailbreak.js.map +1 -0
  751. package/dist/types/lane-grant.d.ts +58 -0
  752. package/dist/types/lane-grant.d.ts.map +1 -0
  753. package/dist/types/lane-grant.js +9 -0
  754. package/dist/types/lane-grant.js.map +1 -0
  755. package/dist/utils/jailbreak/common.d.ts +63 -0
  756. package/dist/utils/jailbreak/common.d.ts.map +1 -0
  757. package/dist/utils/jailbreak/common.js +130 -0
  758. package/dist/utils/jailbreak/common.js.map +1 -0
  759. package/dist/utils/jailbreak/index.d.ts +7 -0
  760. package/dist/utils/jailbreak/index.d.ts.map +1 -0
  761. package/dist/utils/jailbreak/index.js +7 -0
  762. package/dist/utils/jailbreak/index.js.map +1 -0
  763. package/dist/utils/windows-self-update.d.ts.map +1 -1
  764. package/dist/utils/windows-self-update.js +1 -1
  765. package/dist/utils/windows-self-update.js.map +1 -1
  766. package/docs/compaction.md +8 -21
  767. package/docs/custom-provider.md +2 -2
  768. package/docs/development.md +1 -1
  769. package/docs/extensions.md +11 -11
  770. package/docs/loadout-domains/README.md +70 -0
  771. package/docs/loadout-domains/ai-agent-ops.md +94 -0
  772. package/docs/loadout-domains/backend-api.md +116 -0
  773. package/docs/loadout-domains/data-science.md +100 -0
  774. package/docs/loadout-domains/devops-infra.md +85 -0
  775. package/docs/loadout-domains/docs-writing.md +92 -0
  776. package/docs/loadout-domains/frontend-ui.md +128 -0
  777. package/docs/loadout-domains/general.md +62 -0
  778. package/docs/loadout-domains/mobile.md +84 -0
  779. package/docs/loadout-domains/qa-testing.md +87 -0
  780. package/docs/loadout-domains/research.md +80 -0
  781. package/docs/loadout-domains/security-audit.md +97 -0
  782. package/docs/packages.md +7 -48
  783. package/docs/prompt-templates.md +0 -2
  784. package/docs/providers.md +12 -0
  785. package/docs/sdk.md +3 -3
  786. package/docs/security.md +145 -0
  787. package/docs/session-format.md +1 -1
  788. package/docs/themes.md +8 -7
  789. package/docs/tui.md +14 -14
  790. package/docs/usage.md +6 -16
  791. package/examples/extensions/README.md +2 -2
  792. package/examples/extensions/aside-computer-use/README.md +114 -0
  793. package/examples/extensions/aside-computer-use/action-scoring.ts +122 -0
  794. package/examples/extensions/aside-computer-use/assertions.ts +380 -0
  795. package/examples/extensions/aside-computer-use/controller.ts +491 -0
  796. package/examples/extensions/aside-computer-use/evidence.ts +229 -0
  797. package/examples/extensions/aside-computer-use/golden-trace.ts +141 -0
  798. package/examples/extensions/aside-computer-use/index.ts +76 -0
  799. package/examples/extensions/aside-computer-use/mcp-client.ts +381 -0
  800. package/examples/extensions/aside-computer-use/observation-snapshot.ts +121 -0
  801. package/examples/extensions/aside-computer-use/package.json +16 -0
  802. package/examples/extensions/aside-computer-use/policy.ts +257 -0
  803. package/examples/extensions/aside-computer-use/risk-authorize.ts +200 -0
  804. package/examples/extensions/aside-computer-use/risk-classifier.ts +205 -0
  805. package/examples/extensions/aside-computer-use/schema-fingerprint.ts +80 -0
  806. package/examples/extensions/aside-computer-use/session-binding.ts +161 -0
  807. package/examples/extensions/aside-computer-use/tools.ts +449 -0
  808. package/examples/extensions/aside-computer-use/types.ts +217 -0
  809. package/examples/extensions/aside-computer-use/url-origin.ts +132 -0
  810. package/examples/extensions/bash-spawn-hook.ts +1 -1
  811. package/examples/extensions/border-status-editor.ts +2 -2
  812. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  813. package/examples/extensions/custom-compaction.ts +1 -1
  814. package/examples/extensions/custom-footer.ts +2 -2
  815. package/examples/extensions/custom-header.ts +8 -8
  816. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  817. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  818. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  819. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  820. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  821. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  822. package/examples/extensions/doom-overlay/README.md +1 -2
  823. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  824. package/examples/extensions/doom-overlay/doom/build.sh +4 -4
  825. package/examples/extensions/doom-overlay/doom/doomgeneric_omk.c +72 -0
  826. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  827. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  828. package/examples/extensions/git-merge-and-resolve.ts +1 -1
  829. package/examples/extensions/github-issue-autocomplete.ts +1 -6
  830. package/examples/extensions/gondolin/index.ts +1 -1
  831. package/examples/extensions/gondolin/package-lock.json +2 -2
  832. package/examples/extensions/gondolin/package.json +1 -1
  833. package/examples/extensions/handoff.ts +2 -2
  834. package/examples/extensions/hello.ts +1 -1
  835. package/examples/extensions/inline-bash.ts +1 -1
  836. package/examples/extensions/input-transform-streaming.ts +1 -1
  837. package/examples/extensions/input-transform.ts +2 -2
  838. package/examples/extensions/mac-system-theme.ts +1 -1
  839. package/examples/extensions/message-renderer.ts +1 -1
  840. package/examples/extensions/minimal-mode.ts +1 -1
  841. package/examples/extensions/modal-editor.ts +1 -1
  842. package/examples/extensions/overlay-qa-tests.ts +7 -7
  843. package/examples/extensions/overlay-test.ts +1 -1
  844. package/examples/extensions/plan-mode/index.ts +3 -3
  845. package/examples/extensions/preset.ts +4 -4
  846. package/examples/extensions/provider-payload.ts +6 -3
  847. package/examples/extensions/qna.ts +1 -1
  848. package/examples/extensions/question.ts +1 -1
  849. package/examples/extensions/questionnaire.ts +1 -1
  850. package/examples/extensions/rpc-demo.ts +1 -1
  851. package/examples/extensions/sandbox/index.ts +2 -2
  852. package/examples/extensions/sandbox/package-lock.json +2 -2
  853. package/examples/extensions/sandbox/package.json +1 -1
  854. package/examples/extensions/shutdown-command.ts +5 -5
  855. package/examples/extensions/snake.ts +1 -1
  856. package/examples/extensions/space-invaders.ts +1 -1
  857. package/examples/extensions/structured-output.ts +1 -1
  858. package/examples/extensions/subagent/agents.ts +2 -2
  859. package/examples/extensions/subagent/index.ts +19 -51
  860. package/examples/extensions/summarize.ts +2 -2
  861. package/examples/extensions/tic-tac-toe.ts +2 -2
  862. package/examples/extensions/todo.ts +2 -2
  863. package/examples/extensions/tool-override.ts +1 -1
  864. package/examples/extensions/tools.ts +1 -1
  865. package/examples/extensions/truncated-tool.ts +1 -1
  866. package/examples/extensions/with-deps/package-lock.json +2 -2
  867. package/examples/extensions/with-deps/package.json +1 -1
  868. package/examples/extensions/working-indicator.ts +3 -3
  869. package/examples/rpc-extension-ui.ts +1 -9
  870. package/examples/sdk/02-custom-model.ts +1 -1
  871. package/examples/sdk/07-context-files.ts +0 -2
  872. package/examples/sdk/12-full-control.ts +1 -1
  873. package/examples/sdk/README.md +1 -1
  874. package/npm-shrinkwrap.json +1805 -0
  875. package/package.json +10 -32
  876. package/dist/core/compaction/pruner-policy.d.ts +0 -84
  877. package/dist/core/compaction/pruner-policy.d.ts.map +0 -1
  878. package/dist/core/compaction/pruner-policy.js +0 -273
  879. package/dist/core/compaction/pruner-policy.js.map +0 -1
  880. package/dist/core/context-graph-identity-resolution.d.ts +0 -114
  881. package/dist/core/context-graph-identity-resolution.d.ts.map +0 -1
  882. package/dist/core/context-graph-identity-resolution.js +0 -127
  883. package/dist/core/context-graph-identity-resolution.js.map +0 -1
  884. package/dist/core/context-graph-memory-store.d.ts +0 -153
  885. package/dist/core/context-graph-memory-store.d.ts.map +0 -1
  886. package/dist/core/context-graph-memory-store.js +0 -377
  887. package/dist/core/context-graph-memory-store.js.map +0 -1
  888. package/dist/core/context-graph-ontology-generation.d.ts +0 -104
  889. package/dist/core/context-graph-ontology-generation.d.ts.map +0 -1
  890. package/dist/core/context-graph-ontology-generation.js +0 -135
  891. package/dist/core/context-graph-ontology-generation.js.map +0 -1
  892. package/dist/core/context-graph-ontology-registry.d.ts +0 -766
  893. package/dist/core/context-graph-ontology-registry.d.ts.map +0 -1
  894. package/dist/core/context-graph-ontology-registry.js +0 -1133
  895. package/dist/core/context-graph-ontology-registry.js.map +0 -1
  896. package/dist/core/context-graph-policy.d.ts +0 -68
  897. package/dist/core/context-graph-policy.d.ts.map +0 -1
  898. package/dist/core/context-graph-policy.js +0 -221
  899. package/dist/core/context-graph-policy.js.map +0 -1
  900. package/dist/core/context-graph-reasoning.d.ts +0 -130
  901. package/dist/core/context-graph-reasoning.d.ts.map +0 -1
  902. package/dist/core/context-graph-reasoning.js +0 -442
  903. package/dist/core/context-graph-reasoning.js.map +0 -1
  904. package/dist/core/context-graph-retrieval.d.ts +0 -120
  905. package/dist/core/context-graph-retrieval.d.ts.map +0 -1
  906. package/dist/core/context-graph-retrieval.js +0 -288
  907. package/dist/core/context-graph-retrieval.js.map +0 -1
  908. package/dist/core/contract-verification.d.ts +0 -78
  909. package/dist/core/contract-verification.d.ts.map +0 -1
  910. package/dist/core/contract-verification.js +0 -110
  911. package/dist/core/contract-verification.js.map +0 -1
  912. package/dist/core/freedom/banner.d.ts +0 -14
  913. package/dist/core/freedom/banner.d.ts.map +0 -1
  914. package/dist/core/freedom/banner.js +0 -22
  915. package/dist/core/freedom/banner.js.map +0 -1
  916. package/dist/core/freedom/config.d.ts +0 -27
  917. package/dist/core/freedom/config.d.ts.map +0 -1
  918. package/dist/core/freedom/config.js +0 -216
  919. package/dist/core/freedom/config.js.map +0 -1
  920. package/dist/core/freedom/index.d.ts +0 -23
  921. package/dist/core/freedom/index.d.ts.map +0 -1
  922. package/dist/core/freedom/index.js +0 -19
  923. package/dist/core/freedom/index.js.map +0 -1
  924. package/dist/core/freedom/policy.d.ts +0 -42
  925. package/dist/core/freedom/policy.d.ts.map +0 -1
  926. package/dist/core/freedom/policy.js +0 -47
  927. package/dist/core/freedom/policy.js.map +0 -1
  928. package/dist/core/freedom/safety-floor.d.ts +0 -73
  929. package/dist/core/freedom/safety-floor.d.ts.map +0 -1
  930. package/dist/core/freedom/safety-floor.js +0 -275
  931. package/dist/core/freedom/safety-floor.js.map +0 -1
  932. package/dist/core/harness-control-events.d.ts +0 -91
  933. package/dist/core/harness-control-events.d.ts.map +0 -1
  934. package/dist/core/harness-control-events.js +0 -514
  935. package/dist/core/harness-control-events.js.map +0 -1
  936. package/dist/core/harness-control-replay.d.ts +0 -31
  937. package/dist/core/harness-control-replay.d.ts.map +0 -1
  938. package/dist/core/harness-control-replay.js +0 -187
  939. package/dist/core/harness-control-replay.js.map +0 -1
  940. package/dist/core/headroom-middleware.d.ts +0 -35
  941. package/dist/core/headroom-middleware.d.ts.map +0 -1
  942. package/dist/core/headroom-middleware.js +0 -166
  943. package/dist/core/headroom-middleware.js.map +0 -1
  944. package/dist/core/lean-context-middleware.d.ts +0 -12
  945. package/dist/core/lean-context-middleware.d.ts.map +0 -1
  946. package/dist/core/lean-context-middleware.js +0 -87
  947. package/dist/core/lean-context-middleware.js.map +0 -1
  948. package/dist/core/lean-context-policy.d.ts +0 -45
  949. package/dist/core/lean-context-policy.d.ts.map +0 -1
  950. package/dist/core/lean-context-policy.js +0 -108
  951. package/dist/core/lean-context-policy.js.map +0 -1
  952. package/dist/core/native-adoption-benchmark.d.ts +0 -166
  953. package/dist/core/native-adoption-benchmark.d.ts.map +0 -1
  954. package/dist/core/native-adoption-benchmark.js +0 -624
  955. package/dist/core/native-adoption-benchmark.js.map +0 -1
  956. package/dist/core/observability-trace.d.ts +0 -80
  957. package/dist/core/observability-trace.d.ts.map +0 -1
  958. package/dist/core/observability-trace.js +0 -140
  959. package/dist/core/observability-trace.js.map +0 -1
  960. package/dist/core/orchestration/checkpoint.d.ts +0 -83
  961. package/dist/core/orchestration/checkpoint.d.ts.map +0 -1
  962. package/dist/core/orchestration/checkpoint.js +0 -152
  963. package/dist/core/orchestration/checkpoint.js.map +0 -1
  964. package/dist/core/orchestration/errors.d.ts +0 -74
  965. package/dist/core/orchestration/errors.d.ts.map +0 -1
  966. package/dist/core/orchestration/errors.js +0 -52
  967. package/dist/core/orchestration/errors.js.map +0 -1
  968. package/dist/core/orchestration/merge-queue.d.ts +0 -121
  969. package/dist/core/orchestration/merge-queue.d.ts.map +0 -1
  970. package/dist/core/orchestration/merge-queue.js +0 -149
  971. package/dist/core/orchestration/merge-queue.js.map +0 -1
  972. package/dist/core/orchestration/recovery.d.ts +0 -106
  973. package/dist/core/orchestration/recovery.d.ts.map +0 -1
  974. package/dist/core/orchestration/recovery.js +0 -110
  975. package/dist/core/orchestration/recovery.js.map +0 -1
  976. package/dist/core/orchestration/replay-ledger.d.ts +0 -76
  977. package/dist/core/orchestration/replay-ledger.d.ts.map +0 -1
  978. package/dist/core/orchestration/replay-ledger.js +0 -395
  979. package/dist/core/orchestration/replay-ledger.js.map +0 -1
  980. package/dist/core/orchestration/scheduler-state.d.ts +0 -78
  981. package/dist/core/orchestration/scheduler-state.d.ts.map +0 -1
  982. package/dist/core/orchestration/scheduler-state.js +0 -185
  983. package/dist/core/orchestration/scheduler-state.js.map +0 -1
  984. package/dist/core/orchestration/scheduler-store.d.ts +0 -309
  985. package/dist/core/orchestration/scheduler-store.d.ts.map +0 -1
  986. package/dist/core/orchestration/scheduler-store.js +0 -368
  987. package/dist/core/orchestration/scheduler-store.js.map +0 -1
  988. package/dist/core/orchestration/sqlite-scheduler-store.d.ts +0 -57
  989. package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +0 -1
  990. package/dist/core/orchestration/sqlite-scheduler-store.js +0 -528
  991. package/dist/core/orchestration/sqlite-scheduler-store.js.map +0 -1
  992. package/dist/core/orchestration/transaction-coordinator.d.ts +0 -217
  993. package/dist/core/orchestration/transaction-coordinator.d.ts.map +0 -1
  994. package/dist/core/orchestration/transaction-coordinator.js +0 -281
  995. package/dist/core/orchestration/transaction-coordinator.js.map +0 -1
  996. package/dist/core/orchestration/verification-contract.d.ts +0 -197
  997. package/dist/core/orchestration/verification-contract.d.ts.map +0 -1
  998. package/dist/core/orchestration/verification-contract.js +0 -145
  999. package/dist/core/orchestration/verification-contract.js.map +0 -1
  1000. package/dist/core/package-composition.d.ts +0 -68
  1001. package/dist/core/package-composition.d.ts.map +0 -1
  1002. package/dist/core/package-composition.js +0 -304
  1003. package/dist/core/package-composition.js.map +0 -1
  1004. package/dist/core/package-trial-runtime.d.ts +0 -75
  1005. package/dist/core/package-trial-runtime.d.ts.map +0 -1
  1006. package/dist/core/package-trial-runtime.js +0 -73
  1007. package/dist/core/package-trial-runtime.js.map +0 -1
  1008. package/dist/core/package-trial-sandbox.d.ts +0 -27
  1009. package/dist/core/package-trial-sandbox.d.ts.map +0 -1
  1010. package/dist/core/package-trial-sandbox.js +0 -102
  1011. package/dist/core/package-trial-sandbox.js.map +0 -1
  1012. package/dist/core/policy-overlays-runtime.d.ts +0 -141
  1013. package/dist/core/policy-overlays-runtime.d.ts.map +0 -1
  1014. package/dist/core/policy-overlays-runtime.js +0 -720
  1015. package/dist/core/policy-overlays-runtime.js.map +0 -1
  1016. package/dist/core/read-anchor-registry.d.ts +0 -27
  1017. package/dist/core/read-anchor-registry.d.ts.map +0 -1
  1018. package/dist/core/read-anchor-registry.js +0 -103
  1019. package/dist/core/read-anchor-registry.js.map +0 -1
  1020. package/dist/core/read-content-cache.d.ts +0 -22
  1021. package/dist/core/read-content-cache.d.ts.map +0 -1
  1022. package/dist/core/read-content-cache.js +0 -79
  1023. package/dist/core/read-content-cache.js.map +0 -1
  1024. package/dist/core/session-digest.d.ts +0 -57
  1025. package/dist/core/session-digest.d.ts.map +0 -1
  1026. package/dist/core/session-digest.js +0 -193
  1027. package/dist/core/session-digest.js.map +0 -1
  1028. package/dist/core/spec-kit/compiler.d.ts +0 -67
  1029. package/dist/core/spec-kit/compiler.d.ts.map +0 -1
  1030. package/dist/core/spec-kit/compiler.js +0 -268
  1031. package/dist/core/spec-kit/compiler.js.map +0 -1
  1032. package/dist/core/transaction-coordinator.d.ts +0 -30
  1033. package/dist/core/transaction-coordinator.d.ts.map +0 -1
  1034. package/dist/core/transaction-coordinator.js +0 -173
  1035. package/dist/core/transaction-coordinator.js.map +0 -1
  1036. package/dist/modes/interactive/components/mcp-selector.d.ts +0 -30
  1037. package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
  1038. package/dist/modes/interactive/components/mcp-selector.js +0 -155
  1039. package/dist/modes/interactive/components/mcp-selector.js.map +0 -1
  1040. package/dist/modes/interactive/components/model-selector-state.d.ts +0 -101
  1041. package/dist/modes/interactive/components/model-selector-state.d.ts.map +0 -1
  1042. package/dist/modes/interactive/components/model-selector-state.js +0 -261
  1043. package/dist/modes/interactive/components/model-selector-state.js.map +0 -1
  1044. package/dist/modes/interactive/components/skills-selector.d.ts +0 -32
  1045. package/dist/modes/interactive/components/skills-selector.d.ts.map +0 -1
  1046. package/dist/modes/interactive/components/skills-selector.js +0 -130
  1047. package/dist/modes/interactive/components/skills-selector.js.map +0 -1
  1048. package/dist/modes/interactive/theme/omk-blackboard.json +0 -91
  1049. package/dist/modes/interactive/theme/omk-freedom-grid.json +0 -91
  1050. package/dist/modes/interactive/theme/omk-neon-ops.json +0 -90
  1051. package/dist/modes/interactive/theme/omk-slate-light.json +0 -91
  1052. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -72
  1053. package/node_modules/@earendil-works/omk-agent-core/README.md +0 -488
  1054. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +0 -24
  1055. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +0 -1
  1056. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +0 -553
  1057. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +0 -1
  1058. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +0 -118
  1059. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +0 -1
  1060. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +0 -402
  1061. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +0 -1
  1062. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +0 -95
  1063. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +0 -1
  1064. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +0 -996
  1065. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +0 -1
  1066. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +0 -53
  1067. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +0 -1
  1068. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +0 -175
  1069. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +0 -1
  1070. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +0 -117
  1071. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +0 -1
  1072. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +0 -568
  1073. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +0 -1
  1074. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +0 -25
  1075. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +0 -1
  1076. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +0 -131
  1077. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +0 -1
  1078. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +0 -51
  1079. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +0 -1
  1080. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +0 -510
  1081. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +0 -1
  1082. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +0 -51
  1083. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +0 -1
  1084. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +0 -102
  1085. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +0 -1
  1086. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +0 -48
  1087. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +0 -1
  1088. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +0 -230
  1089. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +0 -1
  1090. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +0 -26
  1091. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +0 -1
  1092. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +0 -101
  1093. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +0 -1
  1094. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +0 -36
  1095. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +0 -1
  1096. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +0 -273
  1097. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +0 -1
  1098. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +0 -18
  1099. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +0 -1
  1100. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +0 -42
  1101. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +0 -1
  1102. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +0 -25
  1103. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +0 -1
  1104. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +0 -114
  1105. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +0 -1
  1106. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +0 -11
  1107. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +0 -1
  1108. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +0 -39
  1109. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +0 -1
  1110. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +0 -33
  1111. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +0 -1
  1112. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +0 -210
  1113. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +0 -1
  1114. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +0 -2
  1115. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +0 -1
  1116. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +0 -50
  1117. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +0 -1
  1118. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +0 -44
  1119. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +0 -1
  1120. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +0 -311
  1121. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +0 -1
  1122. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +0 -3
  1123. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +0 -1
  1124. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +0 -30
  1125. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +0 -1
  1126. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +0 -616
  1127. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +0 -1
  1128. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +0 -94
  1129. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +0 -1
  1130. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +0 -14
  1131. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +0 -1
  1132. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +0 -126
  1133. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +0 -1
  1134. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +0 -70
  1135. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +0 -1
  1136. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +0 -297
  1137. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +0 -1
  1138. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +0 -20
  1139. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +0 -1
  1140. package/node_modules/@earendil-works/omk-agent-core/dist/index.js +0 -25
  1141. package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +0 -1
  1142. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +0 -3
  1143. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +0 -1
  1144. package/node_modules/@earendil-works/omk-agent-core/dist/node.js +0 -3
  1145. package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +0 -1
  1146. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +0 -69
  1147. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +0 -1
  1148. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +0 -278
  1149. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +0 -1
  1150. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +0 -393
  1151. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +0 -1
  1152. package/node_modules/@earendil-works/omk-agent-core/dist/types.js +0 -2
  1153. package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +0 -1
  1154. package/node_modules/@earendil-works/omk-agent-core/package.json +0 -60
  1155. package/node_modules/@earendil-works/omk-ai/README.md +0 -1389
  1156. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +0 -20
  1157. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +0 -1
  1158. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +0 -44
  1159. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +0 -1
  1160. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +0 -5
  1161. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +0 -1
  1162. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +0 -6
  1163. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +0 -1
  1164. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +0 -3
  1165. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +0 -1
  1166. package/node_modules/@earendil-works/omk-ai/dist/cli.js +0 -130
  1167. package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +0 -1
  1168. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +0 -20
  1169. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +0 -1
  1170. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +0 -199
  1171. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +0 -1
  1172. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +0 -10
  1173. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +0 -1
  1174. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +0 -515
  1175. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +0 -1
  1176. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +0 -517
  1177. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +0 -1
  1178. package/node_modules/@earendil-works/omk-ai/dist/image-models.js +0 -23
  1179. package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +0 -1
  1180. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +0 -14
  1181. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +0 -1
  1182. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +0 -22
  1183. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +0 -1
  1184. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +0 -4
  1185. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +0 -1
  1186. package/node_modules/@earendil-works/omk-ai/dist/images.js +0 -16
  1187. package/node_modules/@earendil-works/omk-ai/dist/images.js.map +0 -1
  1188. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +0 -33
  1189. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +0 -1
  1190. package/node_modules/@earendil-works/omk-ai/dist/index.js +0 -21
  1191. package/node_modules/@earendil-works/omk-ai/dist/index.js.map +0 -1
  1192. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +0 -18
  1193. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +0 -1
  1194. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +0 -18762
  1195. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +0 -1
  1196. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +0 -17197
  1197. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +0 -1
  1198. package/node_modules/@earendil-works/omk-ai/dist/models.js +0 -78
  1199. package/node_modules/@earendil-works/omk-ai/dist/models.js.map +0 -1
  1200. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +0 -2
  1201. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +0 -1
  1202. package/node_modules/@earendil-works/omk-ai/dist/oauth.js +0 -2
  1203. package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +0 -1
  1204. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +0 -39
  1205. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +0 -1
  1206. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +0 -170
  1207. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +0 -1
  1208. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +0 -38
  1209. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +0 -1
  1210. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +0 -826
  1211. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +0 -1
  1212. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +0 -77
  1213. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +0 -1
  1214. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +0 -1123
  1215. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +0 -1
  1216. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +0 -15
  1217. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +0 -1
  1218. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +0 -221
  1219. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +0 -1
  1220. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +0 -13
  1221. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +0 -1
  1222. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +0 -26
  1223. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +0 -1
  1224. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +0 -56
  1225. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +0 -1
  1226. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +0 -368
  1227. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +0 -1
  1228. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +0 -8
  1229. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +0 -1
  1230. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +0 -29
  1231. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +0 -1
  1232. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +0 -70
  1233. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +0 -1
  1234. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +0 -331
  1235. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +0 -1
  1236. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +0 -15
  1237. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +0 -1
  1238. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +0 -442
  1239. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +0 -1
  1240. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +0 -13
  1241. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +0 -1
  1242. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +0 -402
  1243. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +0 -1
  1244. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +0 -3
  1245. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +0 -1
  1246. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +0 -128
  1247. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +0 -1
  1248. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +0 -4
  1249. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +0 -1
  1250. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +0 -34
  1251. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +0 -1
  1252. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +0 -25
  1253. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +0 -1
  1254. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +0 -534
  1255. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +0 -1
  1256. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +0 -30
  1257. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +0 -1
  1258. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +0 -1171
  1259. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +0 -1
  1260. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +0 -19
  1261. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +0 -1
  1262. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +0 -977
  1263. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +0 -1
  1264. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +0 -11
  1265. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  1266. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +0 -22
  1267. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +0 -1
  1268. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +0 -18
  1269. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +0 -1
  1270. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +0 -496
  1271. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +0 -1
  1272. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +0 -13
  1273. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +0 -1
  1274. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +0 -233
  1275. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +0 -1
  1276. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +0 -35
  1277. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +0 -1
  1278. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +0 -254
  1279. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +0 -1
  1280. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +0 -8
  1281. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +0 -1
  1282. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +0 -42
  1283. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +0 -1
  1284. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +0 -13
  1285. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +0 -1
  1286. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +0 -82
  1287. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +0 -1
  1288. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +0 -8
  1289. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +0 -1
  1290. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +0 -184
  1291. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +0 -1
  1292. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +0 -4
  1293. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +0 -1
  1294. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +0 -22
  1295. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +0 -1
  1296. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +0 -8
  1297. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +0 -1
  1298. package/node_modules/@earendil-works/omk-ai/dist/stream.js +0 -77
  1299. package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +0 -1
  1300. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +0 -570
  1301. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +0 -1
  1302. package/node_modules/@earendil-works/omk-ai/dist/types.js +0 -2
  1303. package/node_modules/@earendil-works/omk-ai/dist/types.js.map +0 -1
  1304. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +0 -6
  1305. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +0 -1
  1306. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +0 -34
  1307. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +0 -1
  1308. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +0 -19
  1309. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +0 -1
  1310. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +0 -25
  1311. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +0 -1
  1312. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +0 -21
  1313. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +0 -1
  1314. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +0 -81
  1315. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +0 -1
  1316. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +0 -3
  1317. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +0 -1
  1318. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +0 -14
  1319. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +0 -1
  1320. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +0 -2
  1321. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +0 -1
  1322. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +0 -8
  1323. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +0 -1
  1324. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +0 -16
  1325. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +0 -1
  1326. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +0 -113
  1327. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +0 -1
  1328. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +0 -10
  1329. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +0 -1
  1330. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +0 -97
  1331. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +0 -1
  1332. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +0 -25
  1333. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  1334. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +0 -335
  1335. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +0 -1
  1336. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +0 -21
  1337. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
  1338. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +0 -56
  1339. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +0 -1
  1340. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +0 -30
  1341. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  1342. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +0 -280
  1343. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +0 -1
  1344. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +0 -58
  1345. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +0 -1
  1346. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +0 -122
  1347. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +0 -1
  1348. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +0 -3
  1349. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  1350. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +0 -105
  1351. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +0 -1
  1352. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +0 -43
  1353. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  1354. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +0 -487
  1355. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +0 -1
  1356. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +0 -13
  1357. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
  1358. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +0 -31
  1359. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +0 -1
  1360. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +0 -64
  1361. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +0 -1
  1362. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +0 -2
  1363. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +0 -1
  1364. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +0 -57
  1365. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +0 -1
  1366. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +0 -154
  1367. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +0 -1
  1368. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +0 -22
  1369. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +0 -1
  1370. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +0 -26
  1371. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +0 -1
  1372. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +0 -17
  1373. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +0 -1
  1374. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +0 -21
  1375. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +0 -1
  1376. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +0 -18
  1377. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +0 -1
  1378. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +0 -281
  1379. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +0 -1
  1380. package/node_modules/@earendil-works/omk-ai/package.json +0 -106
  1381. package/node_modules/@earendil-works/omk-tui/README.md +0 -791
  1382. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +0 -54
  1383. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +0 -1
  1384. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +0 -632
  1385. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +0 -1
  1386. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +0 -22
  1387. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +0 -1
  1388. package/node_modules/@earendil-works/omk-tui/dist/components/box.js +0 -104
  1389. package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +0 -1
  1390. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +0 -22
  1391. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +0 -1
  1392. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +0 -35
  1393. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +0 -1
  1394. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +0 -249
  1395. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +0 -1
  1396. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +0 -1857
  1397. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +0 -1
  1398. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +0 -28
  1399. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +0 -1
  1400. package/node_modules/@earendil-works/omk-tui/dist/components/image.js +0 -89
  1401. package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +0 -1
  1402. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +0 -37
  1403. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +0 -1
  1404. package/node_modules/@earendil-works/omk-tui/dist/components/input.js +0 -378
  1405. package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +0 -1
  1406. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +0 -31
  1407. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +0 -1
  1408. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +0 -69
  1409. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +0 -1
  1410. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +0 -96
  1411. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +0 -1
  1412. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +0 -644
  1413. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +0 -1
  1414. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +0 -50
  1415. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +0 -1
  1416. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +0 -159
  1417. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +0 -1
  1418. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +0 -50
  1419. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +0 -1
  1420. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +0 -185
  1421. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +0 -1
  1422. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +0 -12
  1423. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +0 -1
  1424. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +0 -23
  1425. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +0 -1
  1426. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +0 -19
  1427. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +0 -1
  1428. package/node_modules/@earendil-works/omk-tui/dist/components/text.js +0 -89
  1429. package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +0 -1
  1430. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +0 -13
  1431. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +0 -1
  1432. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +0 -51
  1433. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +0 -1
  1434. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +0 -39
  1435. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +0 -1
  1436. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +0 -2
  1437. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +0 -1
  1438. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +0 -16
  1439. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +0 -1
  1440. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +0 -110
  1441. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +0 -1
  1442. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +0 -23
  1443. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +0 -1
  1444. package/node_modules/@earendil-works/omk-tui/dist/index.js +0 -32
  1445. package/node_modules/@earendil-works/omk-tui/dist/index.js.map +0 -1
  1446. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +0 -212
  1447. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +0 -1
  1448. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +0 -252
  1449. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +0 -1
  1450. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +0 -184
  1451. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +0 -1
  1452. package/node_modules/@earendil-works/omk-tui/dist/keys.js +0 -1173
  1453. package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +0 -1
  1454. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +0 -28
  1455. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +0 -1
  1456. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +0 -44
  1457. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +0 -1
  1458. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +0 -3
  1459. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +0 -1
  1460. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +0 -53
  1461. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +0 -1
  1462. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +0 -50
  1463. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +0 -1
  1464. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +0 -361
  1465. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +0 -1
  1466. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +0 -90
  1467. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +0 -1
  1468. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +0 -366
  1469. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +0 -1
  1470. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +0 -113
  1471. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +0 -1
  1472. package/node_modules/@earendil-works/omk-tui/dist/terminal.js +0 -472
  1473. package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +0 -1
  1474. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +0 -242
  1475. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +0 -1
  1476. package/node_modules/@earendil-works/omk-tui/dist/tui.js +0 -1221
  1477. package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +0 -1
  1478. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +0 -17
  1479. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +0 -1
  1480. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +0 -25
  1481. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +0 -1
  1482. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +0 -84
  1483. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +0 -1
  1484. package/node_modules/@earendil-works/omk-tui/dist/utils.js +0 -1032
  1485. package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +0 -1
  1486. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +0 -25
  1487. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +0 -1
  1488. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +0 -96
  1489. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +0 -1
  1490. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  1491. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  1492. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  1493. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  1494. package/node_modules/@earendil-works/omk-tui/package.json +0 -47
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety-gate.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/command-safety-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,aAAa,CAAC;AAErE,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,kGAAkG;IAClG,qBAAqB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAiCzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,GAClB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM7C;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,kBAAkB,GACtB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAwBxD;AAED,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,4BAAsB,CAAC;AAEpD,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOjE;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAyBjE","sourcesContent":["/**\n * Built-in command-safety gate extension.\n *\n * Wires the pure `classifyShellCommand` verdict engine into the live bash entry\n * points with one shared decision engine (`evaluateCommandGate`):\n * - LLM tool calls (`tool_call` for the `bash` tool) — block-tier verdicts stop\n * execution via `{ block, reason }`. confirm-tier verdicts prompt when a\n * dialog-capable UI is available and otherwise deny headlessly (parity with\n * user bash). `priv.*` is never auto-allowed.\n * - User `!`/`!!` bash (`user_bash`) — block/confirm verdicts produce a synthetic\n * FAILED `BashResult` instead of running the command.\n * - RPC bash routes through `AgentSession.executeBash({ safetyGate: \"headless\" })`\n * which reuses `evaluateCommandGate` and `buildBlockedBashResult` directly.\n *\n * Fail-closed contract:\n * - `user_bash` deny NEVER throws. A thrown `user_bash` handler is logged by the\n * runner and default execution continues (fail-open). Returning a synthetic\n * failed `result` short-circuits execution safely.\n * - `confirm`-tier verdicts deny by default when no interactive UI is available.\n * - `priv.*` verdicts are never headless-allowed.\n *\n * This gate reuses `command-safety.ts` read-only and adds no new classification\n * branches. `extraDeny` patterns can only promote allow/confirm to block; they\n * can never relax a block verdict.\n */\n\nimport type { BashResult } from \"../../bash-executor.ts\";\nimport { type CommandVerdict, classifyShellCommand } from \"../../command-safety.ts\";\nimport { type ExtensionAPI, isToolCallEventType } from \"../types.ts\";\n\n/** Confirmation callback. Returns true when the user approves execution. */\nexport type ConfirmFn = (message: string) => Promise<boolean>;\n\n/** Options controlling how a bash command is evaluated by the shared gate. */\nexport interface CommandGateOptions {\n\t/** Whether a dialog-capable UI is available for confirmation. */\n\thasUI: boolean;\n\t/** Interactive confirmation callback used when `hasUI` is true. */\n\tconfirm?: ConfirmFn;\n\t/** Headless policy for `confirm`-tier verdicts. `priv.*` is never allowed. Defaults to \"deny\". */\n\theadlessConfirmPolicy?: \"deny\" | \"allow\";\n\t/** Extra substrings that promote allow/confirm verdicts to block. Never relaxes a block. */\n\textraDeny?: string[];\n}\n\n/** @deprecated Back-compat alias for {@link CommandGateOptions}. */\nexport type UserBashEvaluateOptions = CommandGateOptions;\n\nfunction formatReason(verdict: CommandVerdict): string {\n\treturn `[${verdict.rule}] ${verdict.reason}`;\n}\n\nfunction matchesExtraDeny(command: string, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) return false;\n\tfor (const pattern of patterns) {\n\t\tif (pattern.length > 0 && command.includes(pattern)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Classify a command, applying `extraDeny` promotion.\n *\n * `extraDeny` can only escalate allow/confirm to block; an existing block\n * verdict is returned unchanged.\n */\nfunction classifyWithExtraDeny(command: string, extraDeny?: string[]): CommandVerdict {\n\tconst verdict = classifyShellCommand(command);\n\tif (verdict.risk === \"block\") return verdict;\n\tif (matchesExtraDeny(command, extraDeny)) {\n\t\treturn {\n\t\t\trisk: \"block\",\n\t\t\trule: \"command.extra_deny\",\n\t\t\treason: \"Command matches a configured deny pattern.\",\n\t\t};\n\t}\n\treturn verdict;\n}\n\n/**\n * Pure block-only check for an LLM `bash` tool call.\n *\n * Only block-tier verdicts produce a block here; confirm/allow pass through.\n * Used as a low-level non-negotiable floor (for example by the bash tool's\n * effective-command check after commandPrefix/spawnHook) where no confirm UI\n * or policy context exists. The confirm-deny behavior for the live tool_call\n * gate lives in {@link evaluateCommandGate}.\n */\nexport function evaluateBashToolCall(\n\tcommand: string,\n\textraDeny?: string[],\n): { block: true; reason: string } | undefined {\n\tconst verdict = classifyWithExtraDeny(command, extraDeny);\n\tif (verdict.risk === \"block\") {\n\t\treturn { block: true, reason: formatReason(verdict) };\n\t}\n\treturn undefined;\n}\n\n/**\n * Shared gate decision for any bash command (LLM tool call, user bash, RPC bash).\n *\n * - block => deny.\n * - confirm => hasUI ? (approved ? undefined : deny) : (policy === \"allow\" && !priv ? undefined : deny).\n * - allow => undefined (preserve later extensions / default execution).\n */\nexport async function evaluateCommandGate(\n\tcommand: string,\n\topts: CommandGateOptions,\n): Promise<{ deny: boolean; reason: string } | undefined> {\n\tconst verdict = classifyWithExtraDeny(command, opts.extraDeny);\n\n\tif (verdict.risk === \"allow\") return undefined;\n\tif (verdict.risk === \"block\") {\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// confirm-tier verdict.\n\tif (opts.hasUI) {\n\t\tif (opts.confirm) {\n\t\t\tconst approved = await opts.confirm(formatReason(verdict));\n\t\t\treturn approved ? undefined : { deny: true, reason: formatReason(verdict) };\n\t\t}\n\t\t// UI claimed but no confirm callback: cannot obtain consent => fail-closed.\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// Headless: privilege escalation is never auto-allowed.\n\tconst isPrivilege = verdict.rule.startsWith(\"priv.\");\n\tif (!isPrivilege && opts.headlessConfirmPolicy === \"allow\") {\n\t\treturn undefined;\n\t}\n\treturn { deny: true, reason: formatReason(verdict) };\n}\n\n/** @deprecated Back-compat alias; prefer {@link evaluateCommandGate}. */\nexport const evaluateUserBash = evaluateCommandGate;\n\n/** Build a synthetic failed `BashResult` surfacing the safety reason. */\nexport function buildBlockedBashResult(reason: string): BashResult {\n\treturn {\n\t\toutput: `command-safety: blocked\\n${reason}`,\n\t\texitCode: 1,\n\t\tcancelled: false,\n\t\ttruncated: false,\n\t};\n}\n\n/**\n * Extension factory. Registered as the first extension so its handlers run\n * before any discovered extension (`tool_call` short-circuits on first block;\n * `user_bash` short-circuits on first truthy result).\n */\nexport default function commandSafetyGate(omk: ExtensionAPI): void {\n\tomk.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!isToolCallEventType(\"bash\", event)) return undefined;\n\t\tconst decision = await evaluateCommandGate(event.input.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\theadlessConfirmPolicy: \"deny\",\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { block: true, reason: decision.reason };\n\t\t}\n\t\treturn undefined;\n\t});\n\n\tomk.on(\"user_bash\", async (event, ctx) => {\n\t\tconst decision = await evaluateCommandGate(event.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\theadlessConfirmPolicy: \"deny\",\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { result: buildBlockedBashResult(decision.reason) };\n\t\t}\n\t\treturn undefined;\n\t});\n}\n"]}
1
+ {"version":3,"file":"command-safety-gate.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/command-safety-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,aAAa,CAAC;AAErE,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAClC,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uFAAuF;IACvF,wBAAwB,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;IAC3C,kGAAkG;IAClG,qBAAqB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,oEAAoE;AACpE,MAAM,MAAM,uBAAuB,GAAG,kBAAkB,CAAC;AAiCzD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAAE,GAClB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM7C;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,kBAAkB,GACtB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CA2BxD;AAED,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,4BAAsB,CAAC;AAEpD,wBAAgB,+BAA+B,CAC9C,GAAG,GAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GACjF,OAAO,CAET;AASD,yEAAyE;AACzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOjE;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAyBjE","sourcesContent":["/**\n * Built-in command-safety gate extension.\n *\n * Wires the pure `classifyShellCommand` verdict engine into the live bash entry\n * points with one shared decision engine (`evaluateCommandGate`):\n * - LLM tool calls (`tool_call` for the `bash` tool) — block-tier verdicts stop\n * execution via `{ block, reason }`. confirm-tier verdicts prompt when a\n * dialog-capable UI is available and otherwise deny headlessly (parity with\n * user bash). `priv.*` is never auto-allowed.\n * - User `!`/`!!` bash (`user_bash`) — block/confirm verdicts produce a synthetic\n * FAILED `BashResult` instead of running the command.\n * - RPC bash routes through `AgentSession.executeBash({ safetyGate: \"headless\" })`\n * which reuses `evaluateCommandGate` and `buildBlockedBashResult` directly.\n *\n * Fail-closed contract:\n * - `user_bash` deny NEVER throws. A thrown `user_bash` handler is logged by the\n * runner and default execution continues (fail-open). Returning a synthetic\n * failed `result` short-circuits execution safely.\n * - `confirm`-tier verdicts deny by default when no interactive UI is available.\n * - `priv.*` verdicts are never headless-allowed.\n *\n * This gate reuses `command-safety.ts` read-only and adds no new classification\n * branches. `extraDeny` patterns can only promote allow/confirm to block; they\n * can never relax a block verdict.\n */\n\nimport type { BashResult } from \"../../bash-executor.ts\";\nimport { type CommandVerdict, classifyShellCommand } from \"../../command-safety.ts\";\nimport { type ExtensionAPI, isToolCallEventType } from \"../types.ts\";\n\n/** Confirmation callback. Returns true when the user approves execution. */\nexport type ConfirmFn = (message: string) => Promise<boolean>;\n\n/** Options controlling how a bash command is evaluated by the shared gate. */\nexport interface CommandGateOptions {\n\t/** Whether a dialog-capable UI is available for confirmation. */\n\thasUI: boolean;\n\t/** Interactive confirmation callback used when `hasUI` is true. */\n\tconfirm?: ConfirmFn;\n\t/** Interactive policy for non-privilege `confirm`-tier verdicts. Defaults to \"ask\". */\n\tinteractiveConfirmPolicy?: \"ask\" | \"allow\";\n\t/** Headless policy for `confirm`-tier verdicts. `priv.*` is never allowed. Defaults to \"deny\". */\n\theadlessConfirmPolicy?: \"deny\" | \"allow\";\n\t/** Extra substrings that promote allow/confirm verdicts to block. Never relaxes a block. */\n\textraDeny?: string[];\n}\n\n/** @deprecated Back-compat alias for {@link CommandGateOptions}. */\nexport type UserBashEvaluateOptions = CommandGateOptions;\n\nfunction formatReason(verdict: CommandVerdict): string {\n\treturn `[${verdict.rule}] ${verdict.reason}`;\n}\n\nfunction matchesExtraDeny(command: string, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) return false;\n\tfor (const pattern of patterns) {\n\t\tif (pattern.length > 0 && command.includes(pattern)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Classify a command, applying `extraDeny` promotion.\n *\n * `extraDeny` can only escalate allow/confirm to block; an existing block\n * verdict is returned unchanged.\n */\nfunction classifyWithExtraDeny(command: string, extraDeny?: string[]): CommandVerdict {\n\tconst verdict = classifyShellCommand(command);\n\tif (verdict.risk === \"block\") return verdict;\n\tif (matchesExtraDeny(command, extraDeny)) {\n\t\treturn {\n\t\t\trisk: \"block\",\n\t\t\trule: \"command.extra_deny\",\n\t\t\treason: \"Command matches a configured deny pattern.\",\n\t\t};\n\t}\n\treturn verdict;\n}\n\n/**\n * Pure block-only check for an LLM `bash` tool call.\n *\n * Only block-tier verdicts produce a block here; confirm/allow pass through.\n * Used as a low-level non-negotiable floor (for example by the bash tool's\n * effective-command check after commandPrefix/spawnHook) where no confirm UI\n * or policy context exists. The confirm-deny behavior for the live tool_call\n * gate lives in {@link evaluateCommandGate}.\n */\nexport function evaluateBashToolCall(\n\tcommand: string,\n\textraDeny?: string[],\n): { block: true; reason: string } | undefined {\n\tconst verdict = classifyWithExtraDeny(command, extraDeny);\n\tif (verdict.risk === \"block\") {\n\t\treturn { block: true, reason: formatReason(verdict) };\n\t}\n\treturn undefined;\n}\n\n/**\n * Shared gate decision for any bash command (LLM tool call, user bash, RPC bash).\n *\n * - block => deny.\n * - confirm => hasUI ? (approved ? undefined : deny) : (policy === \"allow\" && !priv ? undefined : deny).\n * - allow => undefined (preserve later extensions / default execution).\n */\nexport async function evaluateCommandGate(\n\tcommand: string,\n\topts: CommandGateOptions,\n): Promise<{ deny: boolean; reason: string } | undefined> {\n\tconst verdict = classifyWithExtraDeny(command, opts.extraDeny);\n\n\tif (verdict.risk === \"allow\") return undefined;\n\tif (verdict.risk === \"block\") {\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// confirm-tier verdict.\n\tconst isPrivilege = verdict.rule.startsWith(\"priv.\");\n\tif (opts.hasUI) {\n\t\tif (!isPrivilege && opts.interactiveConfirmPolicy === \"allow\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (opts.confirm) {\n\t\t\tconst approved = await opts.confirm(formatReason(verdict));\n\t\t\treturn approved ? undefined : { deny: true, reason: formatReason(verdict) };\n\t\t}\n\t\t// UI claimed but no confirm callback: cannot obtain consent => fail-closed.\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// Headless: privilege escalation is never auto-allowed.\n\tif (!isPrivilege && opts.headlessConfirmPolicy === \"allow\") {\n\t\treturn undefined;\n\t}\n\treturn { deny: true, reason: formatReason(verdict) };\n}\n\n/** @deprecated Back-compat alias; prefer {@link evaluateCommandGate}. */\nexport const evaluateUserBash = evaluateCommandGate;\n\nexport function isCommandSafetyAssumeYesEnabled(\n\tenv: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,\n): boolean {\n\treturn env.OMK_COMMAND_SAFETY_ASSUME_YES === \"1\" || env.OMK_COMMAND_SAFETY_ASSUME_YES === \"true\";\n}\n\nfunction getAssumeYesConfirmPolicies(): Pick<CommandGateOptions, \"interactiveConfirmPolicy\" | \"headlessConfirmPolicy\"> {\n\tif (!isCommandSafetyAssumeYesEnabled()) {\n\t\treturn { interactiveConfirmPolicy: \"ask\", headlessConfirmPolicy: \"deny\" };\n\t}\n\treturn { interactiveConfirmPolicy: \"allow\", headlessConfirmPolicy: \"allow\" };\n}\n\n/** Build a synthetic failed `BashResult` surfacing the safety reason. */\nexport function buildBlockedBashResult(reason: string): BashResult {\n\treturn {\n\t\toutput: `command-safety: blocked\\n${reason}`,\n\t\texitCode: 1,\n\t\tcancelled: false,\n\t\ttruncated: false,\n\t};\n}\n\n/**\n * Extension factory. Registered as the first extension so its handlers run\n * before any discovered extension (`tool_call` short-circuits on first block;\n * `user_bash` short-circuits on first truthy result).\n */\nexport default function commandSafetyGate(omk: ExtensionAPI): void {\n\tomk.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!isToolCallEventType(\"bash\", event)) return undefined;\n\t\tconst decision = await evaluateCommandGate(event.input.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\t...getAssumeYesConfirmPolicies(),\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { block: true, reason: decision.reason };\n\t\t}\n\t\treturn undefined;\n\t});\n\n\tomk.on(\"user_bash\", async (event, ctx) => {\n\t\tconst decision = await evaluateCommandGate(event.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\t...getAssumeYesConfirmPolicies(),\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { result: buildBlockedBashResult(decision.reason) };\n\t\t}\n\t\treturn undefined;\n\t});\n}\n"]}
@@ -87,7 +87,11 @@ export async function evaluateCommandGate(command, opts) {
87
87
  return { deny: true, reason: formatReason(verdict) };
88
88
  }
89
89
  // confirm-tier verdict.
90
+ const isPrivilege = verdict.rule.startsWith("priv.");
90
91
  if (opts.hasUI) {
92
+ if (!isPrivilege && opts.interactiveConfirmPolicy === "allow") {
93
+ return undefined;
94
+ }
91
95
  if (opts.confirm) {
92
96
  const approved = await opts.confirm(formatReason(verdict));
93
97
  return approved ? undefined : { deny: true, reason: formatReason(verdict) };
@@ -96,7 +100,6 @@ export async function evaluateCommandGate(command, opts) {
96
100
  return { deny: true, reason: formatReason(verdict) };
97
101
  }
98
102
  // Headless: privilege escalation is never auto-allowed.
99
- const isPrivilege = verdict.rule.startsWith("priv.");
100
103
  if (!isPrivilege && opts.headlessConfirmPolicy === "allow") {
101
104
  return undefined;
102
105
  }
@@ -104,6 +107,15 @@ export async function evaluateCommandGate(command, opts) {
104
107
  }
105
108
  /** @deprecated Back-compat alias; prefer {@link evaluateCommandGate}. */
106
109
  export const evaluateUserBash = evaluateCommandGate;
110
+ export function isCommandSafetyAssumeYesEnabled(env = process.env) {
111
+ return env.OMK_COMMAND_SAFETY_ASSUME_YES === "1" || env.OMK_COMMAND_SAFETY_ASSUME_YES === "true";
112
+ }
113
+ function getAssumeYesConfirmPolicies() {
114
+ if (!isCommandSafetyAssumeYesEnabled()) {
115
+ return { interactiveConfirmPolicy: "ask", headlessConfirmPolicy: "deny" };
116
+ }
117
+ return { interactiveConfirmPolicy: "allow", headlessConfirmPolicy: "allow" };
118
+ }
107
119
  /** Build a synthetic failed `BashResult` surfacing the safety reason. */
108
120
  export function buildBlockedBashResult(reason) {
109
121
  return {
@@ -125,7 +137,7 @@ export default function commandSafetyGate(omk) {
125
137
  const decision = await evaluateCommandGate(event.input.command, {
126
138
  hasUI: ctx.hasUI,
127
139
  confirm: ctx.hasUI ? (message) => ctx.ui.confirm("Command safety", message) : undefined,
128
- headlessConfirmPolicy: "deny",
140
+ ...getAssumeYesConfirmPolicies(),
129
141
  });
130
142
  if (decision?.deny) {
131
143
  return { block: true, reason: decision.reason };
@@ -136,7 +148,7 @@ export default function commandSafetyGate(omk) {
136
148
  const decision = await evaluateCommandGate(event.command, {
137
149
  hasUI: ctx.hasUI,
138
150
  confirm: ctx.hasUI ? (message) => ctx.ui.confirm("Command safety", message) : undefined,
139
- headlessConfirmPolicy: "deny",
151
+ ...getAssumeYesConfirmPolicies(),
140
152
  });
141
153
  if (decision?.deny) {
142
154
  return { result: buildBlockedBashResult(decision.reason) };
@@ -1 +1 @@
1
- {"version":3,"file":"command-safety-gate.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/command-safety-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAuB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAqB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAoBrE,SAAS,YAAY,CAAC,OAAuB,EAAU;IACtD,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,CAC7C;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAA8B,EAAW;IACnF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,OAAe,EAAE,SAAoB,EAAkB;IACrF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7C,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO;YACN,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,4CAA4C;SACpD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CACnC,OAAe,EACf,SAAoB,EAC0B;IAC9C,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAe,EACf,IAAwB,EACiC;IACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,wBAAwB;IACxB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,4EAA4E;QAC5E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,wDAAwD;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,qBAAqB,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,CACrD;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAc;IAClE,OAAO;QACN,MAAM,EAAE,4BAA4B,MAAM,EAAE;QAC5C,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,KAAK;KAChB,CAAC;AAAA,CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAiB,EAAQ;IAClE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;YAC/D,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YACvF,qBAAqB,EAAE,MAAM;SAC7B,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE;YACzD,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YACvF,qBAAqB,EAAE,MAAM;SAC7B,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Built-in command-safety gate extension.\n *\n * Wires the pure `classifyShellCommand` verdict engine into the live bash entry\n * points with one shared decision engine (`evaluateCommandGate`):\n * - LLM tool calls (`tool_call` for the `bash` tool) — block-tier verdicts stop\n * execution via `{ block, reason }`. confirm-tier verdicts prompt when a\n * dialog-capable UI is available and otherwise deny headlessly (parity with\n * user bash). `priv.*` is never auto-allowed.\n * - User `!`/`!!` bash (`user_bash`) — block/confirm verdicts produce a synthetic\n * FAILED `BashResult` instead of running the command.\n * - RPC bash routes through `AgentSession.executeBash({ safetyGate: \"headless\" })`\n * which reuses `evaluateCommandGate` and `buildBlockedBashResult` directly.\n *\n * Fail-closed contract:\n * - `user_bash` deny NEVER throws. A thrown `user_bash` handler is logged by the\n * runner and default execution continues (fail-open). Returning a synthetic\n * failed `result` short-circuits execution safely.\n * - `confirm`-tier verdicts deny by default when no interactive UI is available.\n * - `priv.*` verdicts are never headless-allowed.\n *\n * This gate reuses `command-safety.ts` read-only and adds no new classification\n * branches. `extraDeny` patterns can only promote allow/confirm to block; they\n * can never relax a block verdict.\n */\n\nimport type { BashResult } from \"../../bash-executor.ts\";\nimport { type CommandVerdict, classifyShellCommand } from \"../../command-safety.ts\";\nimport { type ExtensionAPI, isToolCallEventType } from \"../types.ts\";\n\n/** Confirmation callback. Returns true when the user approves execution. */\nexport type ConfirmFn = (message: string) => Promise<boolean>;\n\n/** Options controlling how a bash command is evaluated by the shared gate. */\nexport interface CommandGateOptions {\n\t/** Whether a dialog-capable UI is available for confirmation. */\n\thasUI: boolean;\n\t/** Interactive confirmation callback used when `hasUI` is true. */\n\tconfirm?: ConfirmFn;\n\t/** Headless policy for `confirm`-tier verdicts. `priv.*` is never allowed. Defaults to \"deny\". */\n\theadlessConfirmPolicy?: \"deny\" | \"allow\";\n\t/** Extra substrings that promote allow/confirm verdicts to block. Never relaxes a block. */\n\textraDeny?: string[];\n}\n\n/** @deprecated Back-compat alias for {@link CommandGateOptions}. */\nexport type UserBashEvaluateOptions = CommandGateOptions;\n\nfunction formatReason(verdict: CommandVerdict): string {\n\treturn `[${verdict.rule}] ${verdict.reason}`;\n}\n\nfunction matchesExtraDeny(command: string, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) return false;\n\tfor (const pattern of patterns) {\n\t\tif (pattern.length > 0 && command.includes(pattern)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Classify a command, applying `extraDeny` promotion.\n *\n * `extraDeny` can only escalate allow/confirm to block; an existing block\n * verdict is returned unchanged.\n */\nfunction classifyWithExtraDeny(command: string, extraDeny?: string[]): CommandVerdict {\n\tconst verdict = classifyShellCommand(command);\n\tif (verdict.risk === \"block\") return verdict;\n\tif (matchesExtraDeny(command, extraDeny)) {\n\t\treturn {\n\t\t\trisk: \"block\",\n\t\t\trule: \"command.extra_deny\",\n\t\t\treason: \"Command matches a configured deny pattern.\",\n\t\t};\n\t}\n\treturn verdict;\n}\n\n/**\n * Pure block-only check for an LLM `bash` tool call.\n *\n * Only block-tier verdicts produce a block here; confirm/allow pass through.\n * Used as a low-level non-negotiable floor (for example by the bash tool's\n * effective-command check after commandPrefix/spawnHook) where no confirm UI\n * or policy context exists. The confirm-deny behavior for the live tool_call\n * gate lives in {@link evaluateCommandGate}.\n */\nexport function evaluateBashToolCall(\n\tcommand: string,\n\textraDeny?: string[],\n): { block: true; reason: string } | undefined {\n\tconst verdict = classifyWithExtraDeny(command, extraDeny);\n\tif (verdict.risk === \"block\") {\n\t\treturn { block: true, reason: formatReason(verdict) };\n\t}\n\treturn undefined;\n}\n\n/**\n * Shared gate decision for any bash command (LLM tool call, user bash, RPC bash).\n *\n * - block => deny.\n * - confirm => hasUI ? (approved ? undefined : deny) : (policy === \"allow\" && !priv ? undefined : deny).\n * - allow => undefined (preserve later extensions / default execution).\n */\nexport async function evaluateCommandGate(\n\tcommand: string,\n\topts: CommandGateOptions,\n): Promise<{ deny: boolean; reason: string } | undefined> {\n\tconst verdict = classifyWithExtraDeny(command, opts.extraDeny);\n\n\tif (verdict.risk === \"allow\") return undefined;\n\tif (verdict.risk === \"block\") {\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// confirm-tier verdict.\n\tif (opts.hasUI) {\n\t\tif (opts.confirm) {\n\t\t\tconst approved = await opts.confirm(formatReason(verdict));\n\t\t\treturn approved ? undefined : { deny: true, reason: formatReason(verdict) };\n\t\t}\n\t\t// UI claimed but no confirm callback: cannot obtain consent => fail-closed.\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// Headless: privilege escalation is never auto-allowed.\n\tconst isPrivilege = verdict.rule.startsWith(\"priv.\");\n\tif (!isPrivilege && opts.headlessConfirmPolicy === \"allow\") {\n\t\treturn undefined;\n\t}\n\treturn { deny: true, reason: formatReason(verdict) };\n}\n\n/** @deprecated Back-compat alias; prefer {@link evaluateCommandGate}. */\nexport const evaluateUserBash = evaluateCommandGate;\n\n/** Build a synthetic failed `BashResult` surfacing the safety reason. */\nexport function buildBlockedBashResult(reason: string): BashResult {\n\treturn {\n\t\toutput: `command-safety: blocked\\n${reason}`,\n\t\texitCode: 1,\n\t\tcancelled: false,\n\t\ttruncated: false,\n\t};\n}\n\n/**\n * Extension factory. Registered as the first extension so its handlers run\n * before any discovered extension (`tool_call` short-circuits on first block;\n * `user_bash` short-circuits on first truthy result).\n */\nexport default function commandSafetyGate(omk: ExtensionAPI): void {\n\tomk.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!isToolCallEventType(\"bash\", event)) return undefined;\n\t\tconst decision = await evaluateCommandGate(event.input.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\theadlessConfirmPolicy: \"deny\",\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { block: true, reason: decision.reason };\n\t\t}\n\t\treturn undefined;\n\t});\n\n\tomk.on(\"user_bash\", async (event, ctx) => {\n\t\tconst decision = await evaluateCommandGate(event.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\theadlessConfirmPolicy: \"deny\",\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { result: buildBlockedBashResult(decision.reason) };\n\t\t}\n\t\treturn undefined;\n\t});\n}\n"]}
1
+ {"version":3,"file":"command-safety-gate.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/command-safety-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAuB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAqB,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAsBrE,SAAS,YAAY,CAAC,OAAuB,EAAU;IACtD,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,CAC7C;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,QAA8B,EAAW;IACnF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,OAAe,EAAE,SAAoB,EAAkB;IACrF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7C,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO;YACN,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,4CAA4C;SACpD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AAAA,CACf;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB,CACnC,OAAe,EACf,SAAoB,EAC0B;IAC9C,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAe,EACf,IAAwB,EACiC;IACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAE/D,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,wBAAwB,KAAK,OAAO,EAAE,CAAC;YAC/D,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,4EAA4E;QAC5E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,qBAAqB,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;AAAA,CACrD;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,MAAM,UAAU,+BAA+B,CAC9C,GAAG,GAAqE,OAAO,CAAC,GAAG,EACzE;IACV,OAAO,GAAG,CAAC,6BAA6B,KAAK,GAAG,IAAI,GAAG,CAAC,6BAA6B,KAAK,MAAM,CAAC;AAAA,CACjG;AAED,SAAS,2BAA2B,GAAmF;IACtH,IAAI,CAAC,+BAA+B,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC;AAAA,CAC7E;AAED,yEAAyE;AACzE,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAc;IAClE,OAAO;QACN,MAAM,EAAE,4BAA4B,MAAM,EAAE;QAC5C,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,KAAK;QAChB,SAAS,EAAE,KAAK;KAChB,CAAC;AAAA,CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAiB,EAAQ;IAClE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;YAC/D,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YACvF,GAAG,2BAA2B,EAAE;SAChC,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB,CAAC,CAAC;IAEH,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE;YACzD,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YACvF,GAAG,2BAA2B,EAAE;SAChC,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CACjB,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Built-in command-safety gate extension.\n *\n * Wires the pure `classifyShellCommand` verdict engine into the live bash entry\n * points with one shared decision engine (`evaluateCommandGate`):\n * - LLM tool calls (`tool_call` for the `bash` tool) — block-tier verdicts stop\n * execution via `{ block, reason }`. confirm-tier verdicts prompt when a\n * dialog-capable UI is available and otherwise deny headlessly (parity with\n * user bash). `priv.*` is never auto-allowed.\n * - User `!`/`!!` bash (`user_bash`) — block/confirm verdicts produce a synthetic\n * FAILED `BashResult` instead of running the command.\n * - RPC bash routes through `AgentSession.executeBash({ safetyGate: \"headless\" })`\n * which reuses `evaluateCommandGate` and `buildBlockedBashResult` directly.\n *\n * Fail-closed contract:\n * - `user_bash` deny NEVER throws. A thrown `user_bash` handler is logged by the\n * runner and default execution continues (fail-open). Returning a synthetic\n * failed `result` short-circuits execution safely.\n * - `confirm`-tier verdicts deny by default when no interactive UI is available.\n * - `priv.*` verdicts are never headless-allowed.\n *\n * This gate reuses `command-safety.ts` read-only and adds no new classification\n * branches. `extraDeny` patterns can only promote allow/confirm to block; they\n * can never relax a block verdict.\n */\n\nimport type { BashResult } from \"../../bash-executor.ts\";\nimport { type CommandVerdict, classifyShellCommand } from \"../../command-safety.ts\";\nimport { type ExtensionAPI, isToolCallEventType } from \"../types.ts\";\n\n/** Confirmation callback. Returns true when the user approves execution. */\nexport type ConfirmFn = (message: string) => Promise<boolean>;\n\n/** Options controlling how a bash command is evaluated by the shared gate. */\nexport interface CommandGateOptions {\n\t/** Whether a dialog-capable UI is available for confirmation. */\n\thasUI: boolean;\n\t/** Interactive confirmation callback used when `hasUI` is true. */\n\tconfirm?: ConfirmFn;\n\t/** Interactive policy for non-privilege `confirm`-tier verdicts. Defaults to \"ask\". */\n\tinteractiveConfirmPolicy?: \"ask\" | \"allow\";\n\t/** Headless policy for `confirm`-tier verdicts. `priv.*` is never allowed. Defaults to \"deny\". */\n\theadlessConfirmPolicy?: \"deny\" | \"allow\";\n\t/** Extra substrings that promote allow/confirm verdicts to block. Never relaxes a block. */\n\textraDeny?: string[];\n}\n\n/** @deprecated Back-compat alias for {@link CommandGateOptions}. */\nexport type UserBashEvaluateOptions = CommandGateOptions;\n\nfunction formatReason(verdict: CommandVerdict): string {\n\treturn `[${verdict.rule}] ${verdict.reason}`;\n}\n\nfunction matchesExtraDeny(command: string, patterns: string[] | undefined): boolean {\n\tif (!patterns || patterns.length === 0) return false;\n\tfor (const pattern of patterns) {\n\t\tif (pattern.length > 0 && command.includes(pattern)) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Classify a command, applying `extraDeny` promotion.\n *\n * `extraDeny` can only escalate allow/confirm to block; an existing block\n * verdict is returned unchanged.\n */\nfunction classifyWithExtraDeny(command: string, extraDeny?: string[]): CommandVerdict {\n\tconst verdict = classifyShellCommand(command);\n\tif (verdict.risk === \"block\") return verdict;\n\tif (matchesExtraDeny(command, extraDeny)) {\n\t\treturn {\n\t\t\trisk: \"block\",\n\t\t\trule: \"command.extra_deny\",\n\t\t\treason: \"Command matches a configured deny pattern.\",\n\t\t};\n\t}\n\treturn verdict;\n}\n\n/**\n * Pure block-only check for an LLM `bash` tool call.\n *\n * Only block-tier verdicts produce a block here; confirm/allow pass through.\n * Used as a low-level non-negotiable floor (for example by the bash tool's\n * effective-command check after commandPrefix/spawnHook) where no confirm UI\n * or policy context exists. The confirm-deny behavior for the live tool_call\n * gate lives in {@link evaluateCommandGate}.\n */\nexport function evaluateBashToolCall(\n\tcommand: string,\n\textraDeny?: string[],\n): { block: true; reason: string } | undefined {\n\tconst verdict = classifyWithExtraDeny(command, extraDeny);\n\tif (verdict.risk === \"block\") {\n\t\treturn { block: true, reason: formatReason(verdict) };\n\t}\n\treturn undefined;\n}\n\n/**\n * Shared gate decision for any bash command (LLM tool call, user bash, RPC bash).\n *\n * - block => deny.\n * - confirm => hasUI ? (approved ? undefined : deny) : (policy === \"allow\" && !priv ? undefined : deny).\n * - allow => undefined (preserve later extensions / default execution).\n */\nexport async function evaluateCommandGate(\n\tcommand: string,\n\topts: CommandGateOptions,\n): Promise<{ deny: boolean; reason: string } | undefined> {\n\tconst verdict = classifyWithExtraDeny(command, opts.extraDeny);\n\n\tif (verdict.risk === \"allow\") return undefined;\n\tif (verdict.risk === \"block\") {\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// confirm-tier verdict.\n\tconst isPrivilege = verdict.rule.startsWith(\"priv.\");\n\tif (opts.hasUI) {\n\t\tif (!isPrivilege && opts.interactiveConfirmPolicy === \"allow\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (opts.confirm) {\n\t\t\tconst approved = await opts.confirm(formatReason(verdict));\n\t\t\treturn approved ? undefined : { deny: true, reason: formatReason(verdict) };\n\t\t}\n\t\t// UI claimed but no confirm callback: cannot obtain consent => fail-closed.\n\t\treturn { deny: true, reason: formatReason(verdict) };\n\t}\n\n\t// Headless: privilege escalation is never auto-allowed.\n\tif (!isPrivilege && opts.headlessConfirmPolicy === \"allow\") {\n\t\treturn undefined;\n\t}\n\treturn { deny: true, reason: formatReason(verdict) };\n}\n\n/** @deprecated Back-compat alias; prefer {@link evaluateCommandGate}. */\nexport const evaluateUserBash = evaluateCommandGate;\n\nexport function isCommandSafetyAssumeYesEnabled(\n\tenv: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,\n): boolean {\n\treturn env.OMK_COMMAND_SAFETY_ASSUME_YES === \"1\" || env.OMK_COMMAND_SAFETY_ASSUME_YES === \"true\";\n}\n\nfunction getAssumeYesConfirmPolicies(): Pick<CommandGateOptions, \"interactiveConfirmPolicy\" | \"headlessConfirmPolicy\"> {\n\tif (!isCommandSafetyAssumeYesEnabled()) {\n\t\treturn { interactiveConfirmPolicy: \"ask\", headlessConfirmPolicy: \"deny\" };\n\t}\n\treturn { interactiveConfirmPolicy: \"allow\", headlessConfirmPolicy: \"allow\" };\n}\n\n/** Build a synthetic failed `BashResult` surfacing the safety reason. */\nexport function buildBlockedBashResult(reason: string): BashResult {\n\treturn {\n\t\toutput: `command-safety: blocked\\n${reason}`,\n\t\texitCode: 1,\n\t\tcancelled: false,\n\t\ttruncated: false,\n\t};\n}\n\n/**\n * Extension factory. Registered as the first extension so its handlers run\n * before any discovered extension (`tool_call` short-circuits on first block;\n * `user_bash` short-circuits on first truthy result).\n */\nexport default function commandSafetyGate(omk: ExtensionAPI): void {\n\tomk.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!isToolCallEventType(\"bash\", event)) return undefined;\n\t\tconst decision = await evaluateCommandGate(event.input.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\t...getAssumeYesConfirmPolicies(),\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { block: true, reason: decision.reason };\n\t\t}\n\t\treturn undefined;\n\t});\n\n\tomk.on(\"user_bash\", async (event, ctx) => {\n\t\tconst decision = await evaluateCommandGate(event.command, {\n\t\t\thasUI: ctx.hasUI,\n\t\t\tconfirm: ctx.hasUI ? (message) => ctx.ui.confirm(\"Command safety\", message) : undefined,\n\t\t\t...getAssumeYesConfirmPolicies(),\n\t\t});\n\t\tif (decision?.deny) {\n\t\t\treturn { result: buildBlockedBashResult(decision.reason) };\n\t\t}\n\t\treturn undefined;\n\t});\n}\n"]}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Built-in TODO checklist extension.
3
+ *
4
+ * Exposes an `update_todo` tool the model calls to maintain a visible,
5
+ * dynamically-generated checklist of the current plan. The checklist is NOT
6
+ * hardcoded: the LLM emits the items on every call (replacing the previous
7
+ * list), and they render live in the terminal UI above the editor.
8
+ *
9
+ * Design notes:
10
+ * - State is held per-loaded-extension and reset on session_start.
11
+ * - The widget is mounted via ctx.ui.setWidget with a factory that binds the
12
+ * latest state snapshot, so each update re-renders with current items.
13
+ * - Headless / no-UI sessions still update state and return a summary; the
14
+ * setWidget call is wrapped so a missing UI never breaks the tool.
15
+ * - Web/extension observations are never involved; this tool only carries the
16
+ * model's own plan text.
17
+ */
18
+ import type { ExtensionAPI } from "../types.ts";
19
+ export default function todoChecklist(omk: ExtensionAPI): void;
20
+ //# sourceMappingURL=todo-checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-checklist.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/todo-checklist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CA2D7D","sourcesContent":["/**\n * Built-in TODO checklist extension.\n *\n * Exposes an `update_todo` tool the model calls to maintain a visible,\n * dynamically-generated checklist of the current plan. The checklist is NOT\n * hardcoded: the LLM emits the items on every call (replacing the previous\n * list), and they render live in the terminal UI above the editor.\n *\n * Design notes:\n * - State is held per-loaded-extension and reset on session_start.\n * - The widget is mounted via ctx.ui.setWidget with a factory that binds the\n * latest state snapshot, so each update re-renders with current items.\n * - Headless / no-UI sessions still update state and return a summary; the\n * setWidget call is wrapped so a missing UI never breaks the tool.\n * - Web/extension observations are never involved; this tool only carries the\n * model's own plan text.\n */\n\nimport { StringEnum, Type } from \"omk-ai\";\nimport { TodoChecklistComponent } from \"../../../modes/interactive/components/todo-checklist.ts\";\nimport { resetCurrentTodoState, setCurrentTodoState } from \"../../todo-runtime-state.ts\";\nimport type { TodoState, TodoStatus } from \"../../todo-state.ts\";\nimport { EMPTY_TODO_STATE, setTodoItems, summary } from \"../../todo-state.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\nexport default function todoChecklist(omk: ExtensionAPI): void {\n\tlet state: TodoState = EMPTY_TODO_STATE;\n\n\tomk.on(\"session_start\", () => {\n\t\tstate = EMPTY_TODO_STATE;\n\t\tresetCurrentTodoState();\n\t});\n\n\tomk.registerTool({\n\t\tname: \"update_todo\",\n\t\tlabel: \"Update TODO checklist\",\n\t\tdescription:\n\t\t\t\"Update the visible TODO checklist shown in the terminal UI with the current plan. Pass the FULL current list of tasks on every call (this replaces the previous list). Use this to keep the user informed of progress: mark items pending/active/done/blocked as work proceeds.\",\n\t\tpromptSnippet:\n\t\t\t\"Maintain a live TODO checklist in the terminal UI by calling update_todo with the current plan and item statuses.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Call update_todo at the start of non-trivial multi-step work and after each task transitions state.\",\n\t\t\t\"Pass the complete current list each call (the tool replaces, not appends). Keep labels short and verb-led.\",\n\t\t\t\"Set exactly one item to 'active' (the task in progress); mark finished items 'done' and blockers 'blocked'.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\titems: Type.Array(\n\t\t\t\tType.Object({\n\t\t\t\t\tid: Type.String({ description: \"Stable identifier for the task (reuse across updates).\" }),\n\t\t\t\t\tlabel: Type.String({ description: \"Short human-readable task description.\" }),\n\t\t\t\t\tstatus: StringEnum([\"pending\", \"active\", \"done\", \"blocked\"], {\n\t\t\t\t\t\tdescription: \"pending=not started, active=in progress, done=complete, blocked=stuck.\",\n\t\t\t\t\t}),\n\t\t\t\t\tdetail: Type.Optional(Type.String({ description: \"Optional extra context for the task.\" })),\n\t\t\t\t}),\n\t\t\t\t{ description: \"Full current list of checklist items.\" },\n\t\t\t),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tstate = setTodoItems(\n\t\t\t\tstate,\n\t\t\t\tparams.items.map((item) => ({ ...item, status: item.status as TodoStatus })),\n\t\t\t);\n\t\t\tsetCurrentTodoState(state);\n\t\t\tconst snapshot = state;\n\t\t\ttry {\n\t\t\t\tctx.ui.setWidget(\"omk-todo\", () => new TodoChecklistComponent(() => snapshot), {\n\t\t\t\t\tplacement: \"aboveEditor\",\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// UI may be unavailable in headless mode; state still updates.\n\t\t\t}\n\t\t\tconst s = summary(state);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `TODO updated: ${s.done}/${s.total} done · ${s.active} active · ${s.pending} pending · ${s.blocked} blocked`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { summary: s, total: s.total },\n\t\t\t};\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Built-in TODO checklist extension.
3
+ *
4
+ * Exposes an `update_todo` tool the model calls to maintain a visible,
5
+ * dynamically-generated checklist of the current plan. The checklist is NOT
6
+ * hardcoded: the LLM emits the items on every call (replacing the previous
7
+ * list), and they render live in the terminal UI above the editor.
8
+ *
9
+ * Design notes:
10
+ * - State is held per-loaded-extension and reset on session_start.
11
+ * - The widget is mounted via ctx.ui.setWidget with a factory that binds the
12
+ * latest state snapshot, so each update re-renders with current items.
13
+ * - Headless / no-UI sessions still update state and return a summary; the
14
+ * setWidget call is wrapped so a missing UI never breaks the tool.
15
+ * - Web/extension observations are never involved; this tool only carries the
16
+ * model's own plan text.
17
+ */
18
+ import { StringEnum, Type } from "omk-ai";
19
+ import { TodoChecklistComponent } from "../../../modes/interactive/components/todo-checklist.js";
20
+ import { resetCurrentTodoState, setCurrentTodoState } from "../../todo-runtime-state.js";
21
+ import { EMPTY_TODO_STATE, setTodoItems, summary } from "../../todo-state.js";
22
+ export default function todoChecklist(omk) {
23
+ let state = EMPTY_TODO_STATE;
24
+ omk.on("session_start", () => {
25
+ state = EMPTY_TODO_STATE;
26
+ resetCurrentTodoState();
27
+ });
28
+ omk.registerTool({
29
+ name: "update_todo",
30
+ label: "Update TODO checklist",
31
+ description: "Update the visible TODO checklist shown in the terminal UI with the current plan. Pass the FULL current list of tasks on every call (this replaces the previous list). Use this to keep the user informed of progress: mark items pending/active/done/blocked as work proceeds.",
32
+ promptSnippet: "Maintain a live TODO checklist in the terminal UI by calling update_todo with the current plan and item statuses.",
33
+ promptGuidelines: [
34
+ "Call update_todo at the start of non-trivial multi-step work and after each task transitions state.",
35
+ "Pass the complete current list each call (the tool replaces, not appends). Keep labels short and verb-led.",
36
+ "Set exactly one item to 'active' (the task in progress); mark finished items 'done' and blockers 'blocked'.",
37
+ ],
38
+ parameters: Type.Object({
39
+ items: Type.Array(Type.Object({
40
+ id: Type.String({ description: "Stable identifier for the task (reuse across updates)." }),
41
+ label: Type.String({ description: "Short human-readable task description." }),
42
+ status: StringEnum(["pending", "active", "done", "blocked"], {
43
+ description: "pending=not started, active=in progress, done=complete, blocked=stuck.",
44
+ }),
45
+ detail: Type.Optional(Type.String({ description: "Optional extra context for the task." })),
46
+ }), { description: "Full current list of checklist items." }),
47
+ }),
48
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
49
+ state = setTodoItems(state, params.items.map((item) => ({ ...item, status: item.status })));
50
+ setCurrentTodoState(state);
51
+ const snapshot = state;
52
+ try {
53
+ ctx.ui.setWidget("omk-todo", () => new TodoChecklistComponent(() => snapshot), {
54
+ placement: "aboveEditor",
55
+ });
56
+ }
57
+ catch {
58
+ // UI may be unavailable in headless mode; state still updates.
59
+ }
60
+ const s = summary(state);
61
+ return {
62
+ content: [
63
+ {
64
+ type: "text",
65
+ text: `TODO updated: ${s.done}/${s.total} done · ${s.active} active · ${s.pending} pending · ${s.blocked} blocked`,
66
+ },
67
+ ],
68
+ details: { summary: s, total: s.total },
69
+ };
70
+ },
71
+ });
72
+ }
73
+ //# sourceMappingURL=todo-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-checklist.js","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/todo-checklist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,yDAAyD,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG9E,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAiB,EAAQ;IAC9D,IAAI,KAAK,GAAc,gBAAgB,CAAC;IAExC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC;QAC7B,KAAK,GAAG,gBAAgB,CAAC;QACzB,qBAAqB,EAAE,CAAC;IAAA,CACxB,CAAC,CAAC;IAEH,GAAG,CAAC,YAAY,CAAC;QAChB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,iRAAiR;QAClR,aAAa,EACZ,mHAAmH;QACpH,gBAAgB,EAAE;YACjB,qGAAqG;YACrG,4GAA4G;YAC5G,6GAA6G;SAC7G;QACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,CAChB,IAAI,CAAC,MAAM,CAAC;gBACX,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wDAAwD,EAAE,CAAC;gBAC1F,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;gBAC7E,MAAM,EAAE,UAAU,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE;oBAC5D,WAAW,EAAE,wEAAwE;iBACrF,CAAC;gBACF,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC,CAAC;aAC3F,CAAC,EACF,EAAE,WAAW,EAAE,uCAAuC,EAAE,CACxD;SACD,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE;YAC3D,KAAK,GAAG,YAAY,CACnB,KAAK,EACL,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAoB,EAAE,CAAC,CAAC,CAC5E,CAAC;YACF,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC;gBACJ,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,sBAAsB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE;oBAC9E,SAAS,EAAE,aAAa;iBACxB,CAAC,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACR,+DAA+D;YAChE,CAAC;YACD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO;gBACN,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,YAAW,CAAC,CAAC,MAAM,cAAa,CAAC,CAAC,OAAO,eAAc,CAAC,CAAC,OAAO,UAAU;qBAClH;iBACD;gBACD,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE;aACvC,CAAC;QAAA,CACF;KACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["/**\n * Built-in TODO checklist extension.\n *\n * Exposes an `update_todo` tool the model calls to maintain a visible,\n * dynamically-generated checklist of the current plan. The checklist is NOT\n * hardcoded: the LLM emits the items on every call (replacing the previous\n * list), and they render live in the terminal UI above the editor.\n *\n * Design notes:\n * - State is held per-loaded-extension and reset on session_start.\n * - The widget is mounted via ctx.ui.setWidget with a factory that binds the\n * latest state snapshot, so each update re-renders with current items.\n * - Headless / no-UI sessions still update state and return a summary; the\n * setWidget call is wrapped so a missing UI never breaks the tool.\n * - Web/extension observations are never involved; this tool only carries the\n * model's own plan text.\n */\n\nimport { StringEnum, Type } from \"omk-ai\";\nimport { TodoChecklistComponent } from \"../../../modes/interactive/components/todo-checklist.ts\";\nimport { resetCurrentTodoState, setCurrentTodoState } from \"../../todo-runtime-state.ts\";\nimport type { TodoState, TodoStatus } from \"../../todo-state.ts\";\nimport { EMPTY_TODO_STATE, setTodoItems, summary } from \"../../todo-state.ts\";\nimport type { ExtensionAPI } from \"../types.ts\";\n\nexport default function todoChecklist(omk: ExtensionAPI): void {\n\tlet state: TodoState = EMPTY_TODO_STATE;\n\n\tomk.on(\"session_start\", () => {\n\t\tstate = EMPTY_TODO_STATE;\n\t\tresetCurrentTodoState();\n\t});\n\n\tomk.registerTool({\n\t\tname: \"update_todo\",\n\t\tlabel: \"Update TODO checklist\",\n\t\tdescription:\n\t\t\t\"Update the visible TODO checklist shown in the terminal UI with the current plan. Pass the FULL current list of tasks on every call (this replaces the previous list). Use this to keep the user informed of progress: mark items pending/active/done/blocked as work proceeds.\",\n\t\tpromptSnippet:\n\t\t\t\"Maintain a live TODO checklist in the terminal UI by calling update_todo with the current plan and item statuses.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Call update_todo at the start of non-trivial multi-step work and after each task transitions state.\",\n\t\t\t\"Pass the complete current list each call (the tool replaces, not appends). Keep labels short and verb-led.\",\n\t\t\t\"Set exactly one item to 'active' (the task in progress); mark finished items 'done' and blockers 'blocked'.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\titems: Type.Array(\n\t\t\t\tType.Object({\n\t\t\t\t\tid: Type.String({ description: \"Stable identifier for the task (reuse across updates).\" }),\n\t\t\t\t\tlabel: Type.String({ description: \"Short human-readable task description.\" }),\n\t\t\t\t\tstatus: StringEnum([\"pending\", \"active\", \"done\", \"blocked\"], {\n\t\t\t\t\t\tdescription: \"pending=not started, active=in progress, done=complete, blocked=stuck.\",\n\t\t\t\t\t}),\n\t\t\t\t\tdetail: Type.Optional(Type.String({ description: \"Optional extra context for the task.\" })),\n\t\t\t\t}),\n\t\t\t\t{ description: \"Full current list of checklist items.\" },\n\t\t\t),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tstate = setTodoItems(\n\t\t\t\tstate,\n\t\t\t\tparams.items.map((item) => ({ ...item, status: item.status as TodoStatus })),\n\t\t\t);\n\t\t\tsetCurrentTodoState(state);\n\t\t\tconst snapshot = state;\n\t\t\ttry {\n\t\t\t\tctx.ui.setWidget(\"omk-todo\", () => new TodoChecklistComponent(() => snapshot), {\n\t\t\t\t\tplacement: \"aboveEditor\",\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\t// UI may be unavailable in headless mode; state still updates.\n\t\t\t}\n\t\t\tconst s = summary(state);\n\t\t\treturn {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: `TODO updated: ${s.done}/${s.total} done · ${s.active} active · ${s.pending} pending · ${s.blocked} blocked`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { summary: s, total: s.total },\n\t\t\t};\n\t\t},\n\t});\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  */
5
5
  import { type EventBus } from "../event-bus.ts";
6
- import type { Extension, ExtensionFactory, ExtensionRuntime, LoadExtensionsOptions, LoadExtensionsResult } from "./types.ts";
6
+ import type { Extension, ExtensionFactory, ExtensionRuntime, LoadExtensionsResult } from "./types.ts";
7
7
  /**
8
8
  * Create a runtime with throwing stubs for action methods.
9
9
  * Runner.bindCore() replaces these with real implementations.
@@ -12,13 +12,13 @@ export declare function createExtensionRuntime(): ExtensionRuntime;
12
12
  /**
13
13
  * Create an Extension from an inline factory function.
14
14
  */
15
- export declare function loadExtensionFromFactory(factory: ExtensionFactory, cwd: string, eventBus: EventBus, runtime: ExtensionRuntime, extensionPath?: string, options?: LoadExtensionsOptions): Promise<Extension>;
15
+ export declare function loadExtensionFromFactory(factory: ExtensionFactory, cwd: string, eventBus: EventBus, runtime: ExtensionRuntime, extensionPath?: string): Promise<Extension>;
16
16
  /**
17
17
  * Load extensions from paths.
18
18
  */
19
- export declare function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus, options?: LoadExtensionsOptions): Promise<LoadExtensionsResult>;
19
+ export declare function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
20
20
  /**
21
21
  * Discover and load extensions from standard locations.
22
22
  */
23
- export declare function discoverAndLoadExtensions(configuredPaths: string[], cwd: string, agentDir?: string, eventBus?: EventBus, options?: LoadExtensionsOptions): Promise<LoadExtensionsResult>;
23
+ export declare function discoverAndLoadExtensions(configuredPaths: string[], cwd: string, agentDir?: string, eventBus?: EventBus): Promise<LoadExtensionsResult>;
24
24
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAMhE,OAAO,KAAK,EACX,SAAS,EAGT,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AAgJpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA8CzD;AA+OD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,EAC1B,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA+B/B;AA6GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA2C/B","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport * as _bundledOmkAgentCore from \"@earendil-works/omk-agent-core\";\nimport * as _bundledOmkAi from \"@earendil-works/omk-ai\";\nimport * as _bundledOmkAiOauth from \"@earendil-works/omk-ai/oauth\";\nimport type { KeyId } from \"@earendil-works/omk-tui\";\nimport * as _bundledOmkTui from \"@earendil-works/omk-tui\";\nimport { createJiti } from \"jiti/static\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"typebox\";\nimport * as _bundledTypeboxCompile from \"typebox/compile\";\nimport * as _bundledTypeboxValue from \"typebox/value\";\nimport { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from \"../../config.ts\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from open-multi-agent-kit.\nimport * as _bundledOmkCodingAgent from \"../../index.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions } from \"../exec.ts\";\nimport { execCommand } from \"../exec.ts\";\nimport type { SandboxBackendStatus, SandboxPlatform } from \"../sandbox/policy.ts\";\nimport { buildSandboxedSpawnRequest } from \"../sandbox/spawn.ts\";\nimport { createSyntheticSourceInfo } from \"../source-info.ts\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionExecSandbox,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsOptions,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.ts\";\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\ttypebox: _bundledTypebox,\n\t\"typebox/compile\": _bundledTypeboxCompile,\n\t\"typebox/value\": _bundledTypeboxValue,\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@sinclair/typebox/compile\": _bundledTypeboxCompile,\n\t\"@sinclair/typebox/value\": _bundledTypeboxValue,\n\t\"@earendil-works/omk-agent-core\": _bundledOmkAgentCore,\n\t\"@earendil-works/omk-tui\": _bundledOmkTui,\n\t\"@earendil-works/omk-ai\": _bundledOmkAi,\n\t\"@earendil-works/omk-ai/oauth\": _bundledOmkAiOauth,\n\t\"open-multi-agent-kit\": _bundledOmkCodingAgent,\n\t\"@earendil-works/pi-agent-core\": _bundledOmkAgentCore,\n\t\"@earendil-works/pi-tui\": _bundledOmkTui,\n\t\"@earendil-works/pi-ai\": _bundledOmkAi,\n\t\"@earendil-works/pi-ai/oauth\": _bundledOmkAiOauth,\n\t\"@earendil-works/pi-coding-agent\": _bundledOmkCodingAgent,\n\t\"@mariozechner/pi-agent-core\": _bundledOmkAgentCore,\n\t\"@mariozechner/pi-tui\": _bundledOmkTui,\n\t\"@mariozechner/pi-ai\": _bundledOmkAi,\n\t\"@mariozechner/pi-ai/oauth\": _bundledOmkAiOauth,\n\t\"@mariozechner/pi-coding-agent\": _bundledOmkCodingAgent,\n};\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Default sandbox backend status for extension exec when none is supplied: no\n * OS-level backend, on the current platform. This makes enforce mode fail closed\n * unless the caller explicitly provides an available backend.\n */\nfunction defaultExtensionExecBackend(): SandboxBackendStatus {\n\tconst platform: SandboxPlatform =\n\t\tprocess.platform === \"linux\" ? \"linux\" : process.platform === \"darwin\" ? \"macos\" : \"unsupported\";\n\treturn { platform, backendAvailable: false };\n}\n\ninterface ExtensionExecCommandPlan {\n\treadonly command: string;\n\treadonly args: readonly string[];\n\treadonly cwd: string;\n\treadonly env?: NodeJS.ProcessEnv;\n}\n\nfunction planExtensionExecCommand(\n\tcommand: string,\n\targs: readonly string[],\n\tcwd: string,\n\toptions: ExecOptions | undefined,\n\texecSandbox: ExtensionExecSandbox | undefined,\n): ExtensionExecCommandPlan {\n\tconst requestedCwd = options?.cwd ?? cwd;\n\tif (!execSandbox) {\n\t\treturn { command, args, cwd: requestedCwd, env: options?.env };\n\t}\n\n\tconst sandbox = buildSandboxedSpawnRequest({\n\t\targv: [command, ...args],\n\t\tcwd: requestedCwd,\n\t\tenv: options?.env ?? process.env,\n\t\tpolicy: execSandbox.policy,\n\t\tbackend: execSandbox.backend ?? defaultExtensionExecBackend(),\n\t\tresolver: execSandbox.resolver,\n\t});\n\tif (!sandbox.allowed) {\n\t\tthrow new Error(`sandbox: exec denied\\n[${sandbox.rule}] ${sandbox.reason}`);\n\t}\n\n\tconst [sandboxedCommand, ...sandboxedArgs] = sandbox.argv;\n\tif (!sandboxedCommand) {\n\t\tthrow new Error(\"sandbox: exec denied\\n[sandbox.empty_argv] Sandbox wrapper returned an empty argv.\");\n\t}\n\n\treturn {\n\t\tcommand: sandboxedCommand,\n\t\targs: sandboxedArgs,\n\t\tcwd: sandbox.cwd,\n\t\tenv: sandbox.env,\n\t};\n}\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\n\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"typebox\");\n\tconst typeboxCompileEntry = require.resolve(\"typebox/compile\");\n\tconst typeboxValueEntry = require.resolve(\"typebox/value\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst resolveWorkspaceOrImport = (workspaceRelativePath: string, specifier: string): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn fileURLToPath(import.meta.resolve(specifier));\n\t};\n\n\tconst omkCodingAgentEntry = packageIndex;\n\tconst omkAgentCoreEntry = resolveWorkspaceOrImport(\"agent/dist/index.js\", \"@earendil-works/omk-agent-core\");\n\tconst omkTuiEntry = resolveWorkspaceOrImport(\"tui/dist/index.js\", \"@earendil-works/omk-tui\");\n\tconst omkAiEntry = resolveWorkspaceOrImport(\"ai/dist/index.js\", \"@earendil-works/omk-ai\");\n\tconst omkAiOauthEntry = resolveWorkspaceOrImport(\"ai/dist/oauth.js\", \"@earendil-works/omk-ai/oauth\");\n\n\t_aliases = {\n\t\t\"open-multi-agent-kit\": omkCodingAgentEntry,\n\t\t\"@earendil-works/omk-agent-core\": omkAgentCoreEntry,\n\t\t\"@earendil-works/omk-tui\": omkTuiEntry,\n\t\t\"@earendil-works/omk-ai\": omkAiEntry,\n\t\t\"@earendil-works/omk-ai/oauth\": omkAiOauthEntry,\n\t\t\"@earendil-works/pi-coding-agent\": omkCodingAgentEntry,\n\t\t\"@earendil-works/pi-agent-core\": omkAgentCoreEntry,\n\t\t\"@earendil-works/pi-tui\": omkTuiEntry,\n\t\t\"@earendil-works/pi-ai\": omkAiEntry,\n\t\t\"@earendil-works/pi-ai/oauth\": omkAiOauthEntry,\n\t\t\"@mariozechner/pi-coding-agent\": omkCodingAgentEntry,\n\t\t\"@mariozechner/pi-agent-core\": omkAgentCoreEntry,\n\t\t\"@mariozechner/pi-tui\": omkTuiEntry,\n\t\t\"@mariozechner/pi-ai\": omkAiEntry,\n\t\t\"@mariozechner/pi-ai/oauth\": omkAiOauthEntry,\n\t\ttypebox: typeboxEntry,\n\t\t\"typebox/compile\": typeboxCompileEntry,\n\t\t\"typebox/value\": typeboxValueEntry,\n\t\t\"@sinclair/typebox\": typeboxEntry,\n\t\t\"@sinclair/typebox/compile\": typeboxCompileEntry,\n\t\t\"@sinclair/typebox/value\": typeboxValueEntry,\n\t};\n\n\treturn _aliases;\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\tconst state: { staleMessage?: string } = {};\n\tconst assertActive = () => {\n\t\tif (state.staleMessage) {\n\t\t\tthrow new Error(state.staleMessage);\n\t\t}\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tassertActive,\n\t\tinvalidate: (message) => {\n\t\t\tstate.staleMessage ??=\n\t\t\t\tmessage ??\n\t\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured omk or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\";\n\t\t},\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config, extensionPath = \"<unknown>\") => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config, extensionPath });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n\texecSandbox?: ExtensionExecSandbox,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\truntime.assertActive();\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\truntime.assertActive();\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void {\n\t\t\truntime.assertActive();\n\t\t\textension.commands.set(name, {\n\t\t\t\tname,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.ts\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\truntime.assertActive();\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\tasync exec(command: string, args: string[], options?: ExecOptions) {\n\t\t\truntime.assertActive();\n\t\t\tconst planned = planExtensionExecCommand(command, args, cwd, options, execSandbox);\n\t\t\treturn execCommand(planned.command, [...planned.args], planned.cwd, { ...options, env: planned.env });\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.assertActive();\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.assertActive();\n\t\t\truntime.registerProvider(name, config, extension.path);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.assertActive();\n\t\t\truntime.unregisterProvider(name, extension.path);\n\t\t},\n\n\t\t// Track omk.events subscriptions on the extension so they can be\n\t\t// unsubscribed on reload instead of stacking duplicate listeners\n\t\t// on the shared event bus.\n\t\tevents: {\n\t\t\temit: (channel, data) => {\n\t\t\t\teventBus.emit(channel, data);\n\t\t\t},\n\t\t\ton: (channel, handler) => {\n\t\t\t\tconst unsubscribe = eventBus.on(channel, handler);\n\t\t\t\textension.eventBusSubscriptions?.push(unsubscribe);\n\t\t\t\treturn unsubscribe;\n\t\t\t},\n\t\t},\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\tconst source =\n\t\textensionPath.startsWith(\"<\") && extensionPath.endsWith(\">\")\n\t\t\t? extensionPath.slice(1, -1).split(\":\")[0] || \"temporary\"\n\t\t\t: \"local\";\n\tconst baseDir = extensionPath.startsWith(\"<\") ? undefined : path.dirname(resolvedPath);\n\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\tsourceInfo: createSyntheticSourceInfo(extensionPath, { source, baseDir }),\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t\teventBusSubscriptions: [],\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\texecSandbox?: ExtensionExecSandbox,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd, { normalizeUnicodeSpaces: true });\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus, execSandbox);\n\t\tawait factory(api);\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n\toptions?: LoadExtensionsOptions,\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst api = createExtensionAPI(extension, runtime, resolvedCwd, eventBus, options?.execSandbox);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n */\nexport async function loadExtensions(\n\tpaths: string[],\n\tcwd: string,\n\teventBus?: EventBus,\n\toptions?: LoadExtensionsOptions,\n): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(\n\t\t\textPath,\n\t\t\tresolvedCwd,\n\t\t\tresolvedEventBus,\n\t\t\truntime,\n\t\t\toptions?.execSandbox,\n\t\t);\n\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface OmkManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readOmkManifest(packageJsonPath: string): OmkManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content) as { omk?: unknown; pi?: unknown };\n\t\tconst manifest = pkg.omk ?? pkg.pi;\n\t\treturn manifest && typeof manifest === \"object\" ? (manifest as OmkManifest) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"omk.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"omk\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readOmkManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/<name>/index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/<name>/package.json` with an `omk` manifest → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n\toptions?: LoadExtensionsOptions,\n): Promise<LoadExtensionsResult> {\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedAgentDir = resolvePath(agentDir);\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/${CONFIG_DIR_NAME}/extensions/\n\tconst localExtDir = path.join(resolvedCwd, CONFIG_DIR_NAME, \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(resolvedAgentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, resolvedCwd, { normalizeUnicodeSpaces: true });\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with omk manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, resolvedCwd, eventBus, options);\n}\n"]}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EAKpB,MAAM,YAAY,CAAC;AA+FpB;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CA8CzD;AA4OD;;GAEG;AACH,wBAAsB,wBAAwB,CAC7C,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,gBAAgB,EACzB,aAAa,SAAa,GACxB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBrH;AA6GD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,eAAe,EAAE,MAAM,EAAE,EACzB,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAsB,EAChC,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,oBAAoB,CAAC,CA2C/B","sourcesContent":["/**\n * Extension loader - loads TypeScript extension modules using jiti.\n *\n */\n\nimport * as fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createJiti } from \"jiti/static\";\nimport * as _bundledOmkAgentCore from \"omk-agent-core\";\nimport * as _bundledOmkAi from \"omk-ai\";\nimport * as _bundledOmkAiOauth from \"omk-ai/oauth\";\nimport type { KeyId } from \"omk-tui\";\nimport * as _bundledOmkTui from \"omk-tui\";\n// Static imports of packages that extensions may use.\n// These MUST be static so Bun bundles them into the compiled binary.\n// The virtualModules option then makes them available to extensions.\nimport * as _bundledTypebox from \"typebox\";\nimport * as _bundledTypeboxCompile from \"typebox/compile\";\nimport * as _bundledTypeboxValue from \"typebox/value\";\nimport { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from \"../../config.ts\";\n// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,\n// avoiding a circular dependency. Extensions can import from open-multi-agent-kit.\nimport * as _bundledOmkCodingAgent from \"../../index.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { createEventBus, type EventBus } from \"../event-bus.ts\";\nimport type { ExecOptions } from \"../exec.ts\";\nimport { execCommand } from \"../exec.ts\";\nimport { createSyntheticSourceInfo } from \"../source-info.ts\";\nimport type {\n\tExtension,\n\tExtensionAPI,\n\tExtensionFactory,\n\tExtensionRuntime,\n\tLoadExtensionsResult,\n\tMessageRenderer,\n\tProviderConfig,\n\tRegisteredCommand,\n\tToolDefinition,\n} from \"./types.ts\";\n\n/** Modules available to extensions via virtualModules (for compiled Bun binary) */\nconst VIRTUAL_MODULES: Record<string, unknown> = {\n\ttypebox: _bundledTypebox,\n\t\"typebox/compile\": _bundledTypeboxCompile,\n\t\"typebox/value\": _bundledTypeboxValue,\n\t\"@sinclair/typebox\": _bundledTypebox,\n\t\"@sinclair/typebox/compile\": _bundledTypeboxCompile,\n\t\"@sinclair/typebox/value\": _bundledTypeboxValue,\n\t\"omk-agent-core\": _bundledOmkAgentCore,\n\t\"omk-tui\": _bundledOmkTui,\n\t\"omk-ai\": _bundledOmkAi,\n\t\"omk-ai/oauth\": _bundledOmkAiOauth,\n\t\"open-multi-agent-kit\": _bundledOmkCodingAgent,\n};\n\nconst require = createRequire(import.meta.url);\n\n/**\n * Get aliases for jiti (used in Node.js/development mode).\n * In Bun binary mode, virtualModules is used instead.\n */\nlet _aliases: Record<string, string> | null = null;\n\nfunction getAliases(): Record<string, string> {\n\tif (_aliases) return _aliases;\n\n\tconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\tconst packageIndex = path.resolve(__dirname, \"../..\", \"index.js\");\n\n\tconst typeboxEntry = require.resolve(\"typebox\");\n\tconst typeboxCompileEntry = require.resolve(\"typebox/compile\");\n\tconst typeboxValueEntry = require.resolve(\"typebox/value\");\n\n\tconst packagesRoot = path.resolve(__dirname, \"../../../../\");\n\tconst findPackageJsonPath = (specifier: string): string => {\n\t\ttry {\n\t\t\treturn require.resolve(`${specifier}/package.json`);\n\t\t} catch {\n\t\t\tlet current = __dirname;\n\t\t\twhile (true) {\n\t\t\t\tconst candidate = path.join(current, \"node_modules\", ...specifier.split(\"/\"), \"package.json\");\n\t\t\t\tif (fs.existsSync(candidate)) {\n\t\t\t\t\treturn candidate;\n\t\t\t\t}\n\t\t\t\tconst parent = path.dirname(current);\n\t\t\t\tif (parent === current) {\n\t\t\t\t\tthrow new Error(`Unable to resolve package.json for ${specifier}`);\n\t\t\t\t}\n\t\t\t\tcurrent = parent;\n\t\t\t}\n\t\t}\n\t};\n\tconst resolvePackageFile = (specifier: string, packageRelativePath: string): string => {\n\t\tconst packageJsonPath = findPackageJsonPath(specifier);\n\t\treturn path.join(path.dirname(packageJsonPath), packageRelativePath);\n\t};\n\tconst resolveWorkspaceOrPackageFile = (\n\t\tworkspaceRelativePath: string,\n\t\tspecifier: string,\n\t\tpackageRelativePath: string,\n\t): string => {\n\t\tconst workspacePath = path.join(packagesRoot, workspaceRelativePath);\n\t\tif (fs.existsSync(workspacePath)) {\n\t\t\treturn workspacePath;\n\t\t}\n\t\treturn resolvePackageFile(specifier, packageRelativePath);\n\t};\n\n\tconst omkCodingAgentEntry = packageIndex;\n\tconst omkAgentCoreEntry = resolveWorkspaceOrPackageFile(\"agent/dist/index.js\", \"omk-agent-core\", \"dist/index.js\");\n\tconst omkTuiEntry = resolveWorkspaceOrPackageFile(\"tui/dist/index.js\", \"omk-tui\", \"dist/index.js\");\n\tconst omkAiEntry = resolveWorkspaceOrPackageFile(\"ai/dist/index.js\", \"omk-ai\", \"dist/index.js\");\n\tconst omkAiOauthEntry = resolveWorkspaceOrPackageFile(\"ai/dist/oauth.js\", \"omk-ai\", \"dist/oauth.js\");\n\n\t_aliases = {\n\t\t\"open-multi-agent-kit\": omkCodingAgentEntry,\n\t\t\"omk-agent-core\": omkAgentCoreEntry,\n\t\t\"omk-tui\": omkTuiEntry,\n\t\t\"omk-ai\": omkAiEntry,\n\t\t\"omk-ai/oauth\": omkAiOauthEntry,\n\t\ttypebox: typeboxEntry,\n\t\t\"typebox/compile\": typeboxCompileEntry,\n\t\t\"typebox/value\": typeboxValueEntry,\n\t\t\"@sinclair/typebox\": typeboxEntry,\n\t\t\"@sinclair/typebox/compile\": typeboxCompileEntry,\n\t\t\"@sinclair/typebox/value\": typeboxValueEntry,\n\t};\n\n\treturn _aliases;\n}\n\ntype HandlerFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Create a runtime with throwing stubs for action methods.\n * Runner.bindCore() replaces these with real implementations.\n */\nexport function createExtensionRuntime(): ExtensionRuntime {\n\tconst notInitialized = () => {\n\t\tthrow new Error(\"Extension runtime not initialized. Action methods cannot be called during extension loading.\");\n\t};\n\tconst state: { staleMessage?: string } = {};\n\tconst assertActive = () => {\n\t\tif (state.staleMessage) {\n\t\t\tthrow new Error(state.staleMessage);\n\t\t}\n\t};\n\n\tconst runtime: ExtensionRuntime = {\n\t\tsendMessage: notInitialized,\n\t\tsendUserMessage: notInitialized,\n\t\tappendEntry: notInitialized,\n\t\tsetSessionName: notInitialized,\n\t\tgetSessionName: notInitialized,\n\t\tsetLabel: notInitialized,\n\t\tgetActiveTools: notInitialized,\n\t\tgetAllTools: notInitialized,\n\t\tsetActiveTools: notInitialized,\n\t\t// registerTool() is valid during extension load; refresh is only needed post-bind.\n\t\trefreshTools: () => {},\n\t\tgetCommands: notInitialized,\n\t\tsetModel: () => Promise.reject(new Error(\"Extension runtime not initialized\")),\n\t\tgetThinkingLevel: notInitialized,\n\t\tsetThinkingLevel: notInitialized,\n\t\tflagValues: new Map(),\n\t\tpendingProviderRegistrations: [],\n\t\tassertActive,\n\t\tinvalidate: (message) => {\n\t\t\tstate.staleMessage ??=\n\t\t\t\tmessage ??\n\t\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured extension API or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\";\n\t\t},\n\t\t// Pre-bind: queue registrations so bindCore() can flush them once the\n\t\t// model registry is available. bindCore() replaces both with direct calls.\n\t\tregisterProvider: (name, config, extensionPath = \"<unknown>\") => {\n\t\t\truntime.pendingProviderRegistrations.push({ name, config, extensionPath });\n\t\t},\n\t\tunregisterProvider: (name) => {\n\t\t\truntime.pendingProviderRegistrations = runtime.pendingProviderRegistrations.filter((r) => r.name !== name);\n\t\t},\n\t};\n\n\treturn runtime;\n}\n\n/**\n * Create the ExtensionAPI for an extension.\n * Registration methods write to the extension object.\n * Action methods delegate to the shared runtime.\n */\nfunction createExtensionAPI(\n\textension: Extension,\n\truntime: ExtensionRuntime,\n\tcwd: string,\n\teventBus: EventBus,\n): ExtensionAPI {\n\tconst api = {\n\t\t// Registration methods - write to extension\n\t\ton(event: string, handler: HandlerFn): void {\n\t\t\truntime.assertActive();\n\t\t\tconst list = extension.handlers.get(event) ?? [];\n\t\t\tlist.push(handler);\n\t\t\textension.handlers.set(event, list);\n\t\t},\n\n\t\tregisterTool(tool: ToolDefinition): void {\n\t\t\truntime.assertActive();\n\t\t\textension.tools.set(tool.name, {\n\t\t\t\tdefinition: tool,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t});\n\t\t\truntime.refreshTools();\n\t\t},\n\n\t\tregisterCommand(name: string, options: Omit<RegisteredCommand, \"name\" | \"sourceInfo\">): void {\n\t\t\truntime.assertActive();\n\t\t\textension.commands.set(name, {\n\t\t\t\tname,\n\t\t\t\tsourceInfo: extension.sourceInfo,\n\t\t\t\t...options,\n\t\t\t});\n\t\t},\n\n\t\tregisterShortcut(\n\t\t\tshortcut: KeyId,\n\t\t\toptions: {\n\t\t\t\tdescription?: string;\n\t\t\t\thandler: (ctx: import(\"./types.ts\").ExtensionContext) => Promise<void> | void;\n\t\t\t},\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.shortcuts.set(shortcut, { shortcut, extensionPath: extension.path, ...options });\n\t\t},\n\n\t\tregisterFlag(\n\t\t\tname: string,\n\t\t\toptions: { description?: string; type: \"boolean\" | \"string\"; default?: boolean | string },\n\t\t): void {\n\t\t\truntime.assertActive();\n\t\t\textension.flags.set(name, { name, extensionPath: extension.path, ...options });\n\t\t\tif (options.default !== undefined && !runtime.flagValues.has(name)) {\n\t\t\t\truntime.flagValues.set(name, options.default);\n\t\t\t}\n\t\t},\n\n\t\tregisterMessageRenderer<T>(customType: string, renderer: MessageRenderer<T>): void {\n\t\t\truntime.assertActive();\n\t\t\textension.messageRenderers.set(customType, renderer as MessageRenderer);\n\t\t},\n\n\t\t// Flag access - checks extension registered it, reads from runtime\n\t\tgetFlag(name: string): boolean | string | undefined {\n\t\t\truntime.assertActive();\n\t\t\tif (!extension.flags.has(name)) return undefined;\n\t\t\treturn runtime.flagValues.get(name);\n\t\t},\n\n\t\t// Action methods - delegate to shared runtime\n\t\tsendMessage(message, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendMessage(message, options);\n\t\t},\n\n\t\tsendUserMessage(content, options): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.sendUserMessage(content, options);\n\t\t},\n\n\t\tappendEntry(customType: string, data?: unknown): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.appendEntry(customType, data);\n\t\t},\n\n\t\tsetSessionName(name: string): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setSessionName(name);\n\t\t},\n\n\t\tgetSessionName(): string | undefined {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getSessionName();\n\t\t},\n\n\t\tsetLabel(entryId: string, label: string | undefined): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setLabel(entryId, label);\n\t\t},\n\n\t\texec(command: string, args: string[], options?: ExecOptions) {\n\t\t\truntime.assertActive();\n\t\t\treturn execCommand(command, args, options?.cwd ?? cwd, options);\n\t\t},\n\n\t\tgetActiveTools(): string[] {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getActiveTools();\n\t\t},\n\n\t\tgetAllTools() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getAllTools();\n\t\t},\n\n\t\tsetActiveTools(toolNames: string[]): void {\n\t\t\truntime.assertActive();\n\t\t\truntime.setActiveTools(toolNames);\n\t\t},\n\n\t\tgetCommands() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getCommands();\n\t\t},\n\n\t\tsetModel(model) {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.setModel(model);\n\t\t},\n\n\t\tgetThinkingLevel() {\n\t\t\truntime.assertActive();\n\t\t\treturn runtime.getThinkingLevel();\n\t\t},\n\n\t\tsetThinkingLevel(level) {\n\t\t\truntime.assertActive();\n\t\t\truntime.setThinkingLevel(level);\n\t\t},\n\n\t\tregisterProvider(name: string, config: ProviderConfig) {\n\t\t\truntime.assertActive();\n\t\t\truntime.registerProvider(name, config, extension.path);\n\t\t},\n\n\t\tunregisterProvider(name: string) {\n\t\t\truntime.assertActive();\n\t\t\truntime.unregisterProvider(name, extension.path);\n\t\t},\n\n\t\t// Track extension event subscriptions so they can be\n\t\t// unsubscribed on reload instead of stacking duplicate listeners\n\t\t// on the shared event bus.\n\t\tevents: {\n\t\t\temit: (channel, data) => {\n\t\t\t\teventBus.emit(channel, data);\n\t\t\t},\n\t\t\ton: (channel, handler) => {\n\t\t\t\tconst unsubscribe = eventBus.on(channel, handler);\n\t\t\t\textension.eventBusSubscriptions?.push(unsubscribe);\n\t\t\t\treturn unsubscribe;\n\t\t\t},\n\t\t},\n\t} as ExtensionAPI;\n\n\treturn api;\n}\n\nasync function loadExtensionModule(extensionPath: string) {\n\tconst jiti = createJiti(import.meta.url, {\n\t\tmoduleCache: false,\n\t\t// In Bun binary: use virtualModules for bundled packages (no filesystem resolution)\n\t\t// Also disable tryNative so jiti handles ALL imports (not just the entry point)\n\t\t// In Node.js/dev: use aliases to resolve to node_modules paths\n\t\t...(isBunBinary ? { virtualModules: VIRTUAL_MODULES, tryNative: false } : { alias: getAliases() }),\n\t});\n\n\tconst module = await jiti.import(extensionPath, { default: true });\n\tconst factory = module as ExtensionFactory;\n\treturn typeof factory !== \"function\" ? undefined : factory;\n}\n\n/**\n * Create an Extension object with empty collections.\n */\nfunction createExtension(extensionPath: string, resolvedPath: string): Extension {\n\tconst source =\n\t\textensionPath.startsWith(\"<\") && extensionPath.endsWith(\">\")\n\t\t\t? extensionPath.slice(1, -1).split(\":\")[0] || \"temporary\"\n\t\t\t: \"local\";\n\tconst baseDir = extensionPath.startsWith(\"<\") ? undefined : path.dirname(resolvedPath);\n\n\treturn {\n\t\tpath: extensionPath,\n\t\tresolvedPath,\n\t\tsourceInfo: createSyntheticSourceInfo(extensionPath, { source, baseDir }),\n\t\thandlers: new Map(),\n\t\ttools: new Map(),\n\t\tmessageRenderers: new Map(),\n\t\tcommands: new Map(),\n\t\tflags: new Map(),\n\t\tshortcuts: new Map(),\n\t\teventBusSubscriptions: [],\n\t};\n}\n\nasync function loadExtension(\n\textensionPath: string,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n): Promise<{ extension: Extension | null; error: string | null }> {\n\tconst resolvedPath = resolvePath(extensionPath, cwd, { normalizeUnicodeSpaces: true });\n\n\ttry {\n\t\tconst factory = await loadExtensionModule(resolvedPath);\n\t\tif (!factory) {\n\t\t\treturn { extension: null, error: `Extension does not export a valid factory function: ${extensionPath}` };\n\t\t}\n\n\t\tconst extension = createExtension(extensionPath, resolvedPath);\n\t\tconst api = createExtensionAPI(extension, runtime, cwd, eventBus);\n\t\tawait factory(api);\n\n\t\treturn { extension, error: null };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn { extension: null, error: `Failed to load extension: ${message}` };\n\t}\n}\n\n/**\n * Create an Extension from an inline factory function.\n */\nexport async function loadExtensionFromFactory(\n\tfactory: ExtensionFactory,\n\tcwd: string,\n\teventBus: EventBus,\n\truntime: ExtensionRuntime,\n\textensionPath = \"<inline>\",\n): Promise<Extension> {\n\tconst extension = createExtension(extensionPath, extensionPath);\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst api = createExtensionAPI(extension, runtime, resolvedCwd, eventBus);\n\tawait factory(api);\n\treturn extension;\n}\n\n/**\n * Load extensions from paths.\n */\nexport async function loadExtensions(paths: string[], cwd: string, eventBus?: EventBus): Promise<LoadExtensionsResult> {\n\tconst extensions: Extension[] = [];\n\tconst errors: Array<{ path: string; error: string }> = [];\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedEventBus = eventBus ?? createEventBus();\n\tconst runtime = createExtensionRuntime();\n\n\tfor (const extPath of paths) {\n\t\tconst { extension, error } = await loadExtension(extPath, resolvedCwd, resolvedEventBus, runtime);\n\n\t\tif (error) {\n\t\t\terrors.push({ path: extPath, error });\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (extension) {\n\t\t\textensions.push(extension);\n\t\t}\n\t}\n\n\treturn {\n\t\textensions,\n\t\terrors,\n\t\truntime,\n\t};\n}\n\ninterface OmkManifest {\n\textensions?: string[];\n\tthemes?: string[];\n\tskills?: string[];\n\tprompts?: string[];\n}\n\nfunction readOmkManifest(packageJsonPath: string): OmkManifest | null {\n\ttry {\n\t\tconst content = fs.readFileSync(packageJsonPath, \"utf-8\");\n\t\tconst pkg = JSON.parse(content) as { omk?: unknown };\n\t\tconst manifest = pkg.omk;\n\t\treturn manifest && typeof manifest === \"object\" ? (manifest as OmkManifest) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction isExtensionFile(name: string): boolean {\n\treturn name.endsWith(\".ts\") || name.endsWith(\".js\");\n}\n\n/**\n * Resolve extension entry points from a directory.\n *\n * Checks for:\n * 1. package.json with \"omk.extensions\" field -> returns declared paths\n * 2. index.ts or index.js -> returns the index file\n *\n * Returns resolved paths or null if no entry points found.\n */\nfunction resolveExtensionEntries(dir: string): string[] | null {\n\t// Check for package.json with \"omk\" field first\n\tconst packageJsonPath = path.join(dir, \"package.json\");\n\tif (fs.existsSync(packageJsonPath)) {\n\t\tconst manifest = readOmkManifest(packageJsonPath);\n\t\tif (manifest?.extensions?.length) {\n\t\t\tconst entries: string[] = [];\n\t\t\tfor (const extPath of manifest.extensions) {\n\t\t\t\tconst resolvedExtPath = path.resolve(dir, extPath);\n\t\t\t\tif (fs.existsSync(resolvedExtPath)) {\n\t\t\t\t\tentries.push(resolvedExtPath);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (entries.length > 0) {\n\t\t\t\treturn entries;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check for index.ts or index.js\n\tconst indexTs = path.join(dir, \"index.ts\");\n\tconst indexJs = path.join(dir, \"index.js\");\n\tif (fs.existsSync(indexTs)) {\n\t\treturn [indexTs];\n\t}\n\tif (fs.existsSync(indexJs)) {\n\t\treturn [indexJs];\n\t}\n\n\treturn null;\n}\n\n/**\n * Discover extensions in a directory.\n *\n * Discovery rules:\n * 1. Direct files: `extensions/*.ts` or `*.js` → load\n * 2. Subdirectory with index: `extensions/* /index.ts` or `index.js` → load\n * 3. Subdirectory with package.json: `extensions/* /package.json` with OMK manifest → load what it declares\n *\n * No recursion beyond one level. Complex packages must use package.json manifest.\n */\nfunction discoverExtensionsInDir(dir: string): string[] {\n\tif (!fs.existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\tconst discovered: string[] = [];\n\n\ttry {\n\t\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\n\t\tfor (const entry of entries) {\n\t\t\tconst entryPath = path.join(dir, entry.name);\n\n\t\t\t// 1. Direct files: *.ts or *.js\n\t\t\tif ((entry.isFile() || entry.isSymbolicLink()) && isExtensionFile(entry.name)) {\n\t\t\t\tdiscovered.push(entryPath);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// 2 & 3. Subdirectories\n\t\t\tif (entry.isDirectory() || entry.isSymbolicLink()) {\n\t\t\t\tconst entries = resolveExtensionEntries(entryPath);\n\t\t\t\tif (entries) {\n\t\t\t\t\tdiscovered.push(...entries);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn [];\n\t}\n\n\treturn discovered;\n}\n\n/**\n * Discover and load extensions from standard locations.\n */\nexport async function discoverAndLoadExtensions(\n\tconfiguredPaths: string[],\n\tcwd: string,\n\tagentDir: string = getAgentDir(),\n\teventBus?: EventBus,\n): Promise<LoadExtensionsResult> {\n\tconst resolvedCwd = resolvePath(cwd);\n\tconst resolvedAgentDir = resolvePath(agentDir);\n\tconst allPaths: string[] = [];\n\tconst seen = new Set<string>();\n\n\tconst addPaths = (paths: string[]) => {\n\t\tfor (const p of paths) {\n\t\t\tconst resolved = path.resolve(p);\n\t\t\tif (!seen.has(resolved)) {\n\t\t\t\tseen.add(resolved);\n\t\t\t\tallPaths.push(p);\n\t\t\t}\n\t\t}\n\t};\n\n\t// 1. Project-local extensions: cwd/${CONFIG_DIR_NAME}/extensions/\n\tconst localExtDir = path.join(resolvedCwd, CONFIG_DIR_NAME, \"extensions\");\n\taddPaths(discoverExtensionsInDir(localExtDir));\n\n\t// 2. Global extensions: agentDir/extensions/\n\tconst globalExtDir = path.join(resolvedAgentDir, \"extensions\");\n\taddPaths(discoverExtensionsInDir(globalExtDir));\n\n\t// 3. Explicitly configured paths\n\tfor (const p of configuredPaths) {\n\t\tconst resolved = resolvePath(p, resolvedCwd, { normalizeUnicodeSpaces: true });\n\t\tif (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {\n\t\t\t// Check for package.json with omk manifest or index.ts\n\t\t\tconst entries = resolveExtensionEntries(resolved);\n\t\t\tif (entries) {\n\t\t\t\taddPaths(entries);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// No explicit entries - discover individual files in directory\n\t\t\taddPaths(discoverExtensionsInDir(resolved));\n\t\t\tcontinue;\n\t\t}\n\n\t\taddPaths([resolved]);\n\t}\n\n\treturn loadExtensions(allPaths, resolvedCwd, eventBus);\n}\n"]}