open-multi-agent-kit 0.80.7 → 0.80.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1470) hide show
  1. package/CHANGELOG.md +4 -30
  2. package/README.md +80 -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 +7 -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/bash-executor.d.ts +1 -0
  65. package/dist/core/bash-executor.d.ts.map +1 -1
  66. package/dist/core/bash-executor.js +1 -0
  67. package/dist/core/bash-executor.js.map +1 -1
  68. package/dist/core/browser-use.d.ts +45 -0
  69. package/dist/core/browser-use.d.ts.map +1 -0
  70. package/dist/core/browser-use.js +70 -0
  71. package/dist/core/browser-use.js.map +1 -0
  72. package/dist/core/command-safety-parser.d.ts +77 -0
  73. package/dist/core/command-safety-parser.d.ts.map +1 -0
  74. package/dist/core/command-safety-parser.js +763 -0
  75. package/dist/core/command-safety-parser.js.map +1 -0
  76. package/dist/core/command-safety.d.ts.map +1 -1
  77. package/dist/core/command-safety.js +106 -3
  78. package/dist/core/command-safety.js.map +1 -1
  79. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  80. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  81. package/dist/core/compaction/branch-summarization.js +5 -21
  82. package/dist/core/compaction/branch-summarization.js.map +1 -1
  83. package/dist/core/compaction/compaction.d.ts +3 -101
  84. package/dist/core/compaction/compaction.d.ts.map +1 -1
  85. package/dist/core/compaction/compaction.js +21 -656
  86. package/dist/core/compaction/compaction.js.map +1 -1
  87. package/dist/core/compaction/utils.d.ts +2 -2
  88. package/dist/core/compaction/utils.d.ts.map +1 -1
  89. package/dist/core/compaction/utils.js.map +1 -1
  90. package/dist/core/compactor.d.ts +42 -0
  91. package/dist/core/compactor.d.ts.map +1 -0
  92. package/dist/core/compactor.js +131 -0
  93. package/dist/core/compactor.js.map +1 -0
  94. package/dist/core/context-budget-compressors.d.ts +50 -0
  95. package/dist/core/context-budget-compressors.d.ts.map +1 -0
  96. package/dist/core/context-budget-compressors.js +166 -0
  97. package/dist/core/context-budget-compressors.js.map +1 -0
  98. package/dist/core/context-budget-governor-v2.d.ts +7 -0
  99. package/dist/core/context-budget-governor-v2.d.ts.map +1 -0
  100. package/dist/core/context-budget-governor-v2.js +7 -0
  101. package/dist/core/context-budget-governor-v2.js.map +1 -0
  102. package/dist/core/context-budget-governor.d.ts +67 -0
  103. package/dist/core/context-budget-governor.d.ts.map +1 -0
  104. package/dist/core/context-budget-governor.js +224 -0
  105. package/dist/core/context-budget-governor.js.map +1 -0
  106. package/dist/core/context-budget-headroom-candidates.d.ts +3 -0
  107. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -0
  108. package/dist/core/context-budget-headroom-candidates.js +85 -0
  109. package/dist/core/context-budget-headroom-candidates.js.map +1 -0
  110. package/dist/core/context-budget-headroom-types.d.ts +67 -0
  111. package/dist/core/context-budget-headroom-types.d.ts.map +1 -0
  112. package/dist/core/context-budget-headroom-types.js +46 -0
  113. package/dist/core/context-budget-headroom-types.js.map +1 -0
  114. package/dist/core/context-budget-headroom.d.ts +5 -0
  115. package/dist/core/context-budget-headroom.d.ts.map +1 -0
  116. package/dist/core/context-budget-headroom.js +123 -0
  117. package/dist/core/context-budget-headroom.js.map +1 -0
  118. package/dist/core/context-budget-relevance.d.ts +46 -0
  119. package/dist/core/context-budget-relevance.d.ts.map +1 -0
  120. package/dist/core/context-budget-relevance.js +329 -0
  121. package/dist/core/context-budget-relevance.js.map +1 -0
  122. package/dist/core/context-budget-system-prompt-items.d.ts +19 -0
  123. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -0
  124. package/dist/core/context-budget-system-prompt-items.js +143 -0
  125. package/dist/core/context-budget-system-prompt-items.js.map +1 -0
  126. package/dist/core/context-budget-system-prompt.d.ts +31 -0
  127. package/dist/core/context-budget-system-prompt.d.ts.map +1 -0
  128. package/dist/core/context-budget-system-prompt.js +87 -0
  129. package/dist/core/context-budget-system-prompt.js.map +1 -0
  130. package/dist/core/context-budget-token-counter.d.ts +34 -0
  131. package/dist/core/context-budget-token-counter.d.ts.map +1 -0
  132. package/dist/core/context-budget-token-counter.js +315 -0
  133. package/dist/core/context-budget-token-counter.js.map +1 -0
  134. package/dist/core/context-budget-v2-coverage.d.ts +5 -0
  135. package/dist/core/context-budget-v2-coverage.d.ts.map +1 -0
  136. package/dist/core/context-budget-v2-coverage.js +58 -0
  137. package/dist/core/context-budget-v2-coverage.js.map +1 -0
  138. package/dist/core/context-budget-v2-plan-hash.d.ts +12 -0
  139. package/dist/core/context-budget-v2-plan-hash.d.ts.map +1 -0
  140. package/dist/core/context-budget-v2-plan-hash.js +38 -0
  141. package/dist/core/context-budget-v2-plan-hash.js.map +1 -0
  142. package/dist/core/context-budget-v2-planner.d.ts +3 -0
  143. package/dist/core/context-budget-v2-planner.d.ts.map +1 -0
  144. package/dist/core/context-budget-v2-planner.js +143 -0
  145. package/dist/core/context-budget-v2-planner.js.map +1 -0
  146. package/dist/core/context-budget-v2-scoring.d.ts +14 -0
  147. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -0
  148. package/dist/core/context-budget-v2-scoring.js +114 -0
  149. package/dist/core/context-budget-v2-scoring.js.map +1 -0
  150. package/dist/core/context-budget-v2-selection.d.ts +32 -0
  151. package/dist/core/context-budget-v2-selection.d.ts.map +1 -0
  152. package/dist/core/context-budget-v2-selection.js +158 -0
  153. package/dist/core/context-budget-v2-selection.js.map +1 -0
  154. package/dist/core/context-budget-v2-tiers.d.ts +15 -0
  155. package/dist/core/context-budget-v2-tiers.d.ts.map +1 -0
  156. package/dist/core/context-budget-v2-tiers.js +68 -0
  157. package/dist/core/context-budget-v2-tiers.js.map +1 -0
  158. package/dist/core/context-budget-v2-types.d.ts +92 -0
  159. package/dist/core/context-budget-v2-types.d.ts.map +1 -0
  160. package/dist/core/context-budget-v2-types.js +24 -0
  161. package/dist/core/context-budget-v2-types.js.map +1 -0
  162. package/dist/core/defaults.d.ts +1 -1
  163. package/dist/core/defaults.d.ts.map +1 -1
  164. package/dist/core/defaults.js.map +1 -1
  165. package/dist/core/diagnostics.d.ts +4 -0
  166. package/dist/core/diagnostics.d.ts.map +1 -1
  167. package/dist/core/diagnostics.js.map +1 -1
  168. package/dist/core/domain-confidence.d.ts +9 -0
  169. package/dist/core/domain-confidence.d.ts.map +1 -0
  170. package/dist/core/domain-confidence.js +39 -0
  171. package/dist/core/domain-confidence.js.map +1 -0
  172. package/dist/core/domain-dispatch.d.ts +44 -0
  173. package/dist/core/domain-dispatch.d.ts.map +1 -0
  174. package/dist/core/domain-dispatch.js +118 -0
  175. package/dist/core/domain-dispatch.js.map +1 -0
  176. package/dist/core/domain-loadouts.d.ts +76 -0
  177. package/dist/core/domain-loadouts.d.ts.map +1 -0
  178. package/dist/core/domain-loadouts.js +981 -0
  179. package/dist/core/domain-loadouts.js.map +1 -0
  180. package/dist/core/domain-registry.d.ts +7 -0
  181. package/dist/core/domain-registry.d.ts.map +1 -0
  182. package/dist/core/domain-registry.js +11 -0
  183. package/dist/core/domain-registry.js.map +1 -0
  184. package/dist/core/domain-router.d.ts +16 -0
  185. package/dist/core/domain-router.d.ts.map +1 -0
  186. package/dist/core/domain-router.js +24 -0
  187. package/dist/core/domain-router.js.map +1 -0
  188. package/dist/core/domain-score.d.ts +13 -0
  189. package/dist/core/domain-score.d.ts.map +1 -0
  190. package/dist/core/domain-score.js +48 -0
  191. package/dist/core/domain-score.js.map +1 -0
  192. package/dist/core/domain-trigger-match.d.ts +14 -0
  193. package/dist/core/domain-trigger-match.d.ts.map +1 -0
  194. package/dist/core/domain-trigger-match.js +51 -0
  195. package/dist/core/domain-trigger-match.js.map +1 -0
  196. package/dist/core/domain-types.d.ts +30 -0
  197. package/dist/core/domain-types.d.ts.map +1 -0
  198. package/dist/core/domain-types.js +2 -0
  199. package/dist/core/domain-types.js.map +1 -0
  200. package/dist/core/exact-cache-policy.d.ts +8 -0
  201. package/dist/core/exact-cache-policy.d.ts.map +1 -1
  202. package/dist/core/exact-cache-policy.js +9 -0
  203. package/dist/core/exact-cache-policy.js.map +1 -1
  204. package/dist/core/exec.d.ts +0 -2
  205. package/dist/core/exec.d.ts.map +1 -1
  206. package/dist/core/exec.js +0 -1
  207. package/dist/core/exec.js.map +1 -1
  208. package/dist/core/export-html/index.d.ts +1 -1
  209. package/dist/core/export-html/index.d.ts.map +1 -1
  210. package/dist/core/export-html/index.js.map +1 -1
  211. package/dist/core/export-html/template.js +1 -3
  212. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  213. package/dist/core/export-html/tool-renderer.js.map +1 -1
  214. package/dist/core/extensions/builtin/command-safety-gate.d.ts +3 -0
  215. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
  216. package/dist/core/extensions/builtin/command-safety-gate.js +15 -3
  217. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
  218. package/dist/core/extensions/builtin/todo-checklist.d.ts +20 -0
  219. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -0
  220. package/dist/core/extensions/builtin/todo-checklist.js +70 -0
  221. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
  222. package/dist/core/extensions/loader.d.ts +4 -4
  223. package/dist/core/extensions/loader.d.ts.map +1 -1
  224. package/dist/core/extensions/loader.js +57 -92
  225. package/dist/core/extensions/loader.js.map +1 -1
  226. package/dist/core/extensions/runner.d.ts +3 -3
  227. package/dist/core/extensions/runner.d.ts.map +1 -1
  228. package/dist/core/extensions/runner.js +1 -1
  229. package/dist/core/extensions/runner.js.map +1 -1
  230. package/dist/core/extensions/types.d.ts +7 -35
  231. package/dist/core/extensions/types.d.ts.map +1 -1
  232. package/dist/core/extensions/types.js.map +1 -1
  233. package/dist/core/extensions/wrapper.d.ts +1 -1
  234. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  235. package/dist/core/extensions/wrapper.js.map +1 -1
  236. package/dist/core/headroom.d.ts +45 -0
  237. package/dist/core/headroom.d.ts.map +1 -0
  238. package/dist/core/headroom.js +171 -0
  239. package/dist/core/headroom.js.map +1 -0
  240. package/dist/core/hook-inventory.d.ts +4 -2
  241. package/dist/core/hook-inventory.d.ts.map +1 -1
  242. package/dist/core/hook-inventory.js +80 -11
  243. package/dist/core/hook-inventory.js.map +1 -1
  244. package/dist/core/hooks/fail-closed.d.ts +4 -1
  245. package/dist/core/hooks/fail-closed.d.ts.map +1 -1
  246. package/dist/core/hooks/fail-closed.js +79 -5
  247. package/dist/core/hooks/fail-closed.js.map +1 -1
  248. package/dist/core/hooks/index.d.ts +2 -2
  249. package/dist/core/hooks/index.d.ts.map +1 -1
  250. package/dist/core/hooks/index.js +1 -1
  251. package/dist/core/hooks/index.js.map +1 -1
  252. package/dist/core/hooks/types.d.ts +9 -0
  253. package/dist/core/hooks/types.d.ts.map +1 -1
  254. package/dist/core/hooks/types.js.map +1 -1
  255. package/dist/core/keybindings.d.ts +2 -14
  256. package/dist/core/keybindings.d.ts.map +1 -1
  257. package/dist/core/keybindings.js +1 -31
  258. package/dist/core/keybindings.js.map +1 -1
  259. package/dist/core/lean-ctx.d.ts +99 -0
  260. package/dist/core/lean-ctx.d.ts.map +1 -0
  261. package/dist/core/lean-ctx.js +225 -0
  262. package/dist/core/lean-ctx.js.map +1 -0
  263. package/dist/core/loadout-compose.d.ts +53 -0
  264. package/dist/core/loadout-compose.d.ts.map +1 -0
  265. package/dist/core/loadout-compose.js +172 -0
  266. package/dist/core/loadout-compose.js.map +1 -0
  267. package/dist/core/loadout-policy-bridge.d.ts +22 -0
  268. package/dist/core/loadout-policy-bridge.d.ts.map +1 -0
  269. package/dist/core/loadout-policy-bridge.js +52 -0
  270. package/dist/core/loadout-policy-bridge.js.map +1 -0
  271. package/dist/core/loadout-runtime.d.ts +22 -0
  272. package/dist/core/loadout-runtime.d.ts.map +1 -1
  273. package/dist/core/loadout-runtime.js +41 -5
  274. package/dist/core/loadout-runtime.js.map +1 -1
  275. package/dist/core/loadout-safety.d.ts +55 -0
  276. package/dist/core/loadout-safety.d.ts.map +1 -0
  277. package/dist/core/loadout-safety.js +213 -0
  278. package/dist/core/loadout-safety.js.map +1 -0
  279. package/dist/core/loadouts.d.ts +4 -2
  280. package/dist/core/loadouts.d.ts.map +1 -1
  281. package/dist/core/loadouts.js +116 -5
  282. package/dist/core/loadouts.js.map +1 -1
  283. package/dist/core/loop-gates.d.ts +48 -0
  284. package/dist/core/loop-gates.d.ts.map +1 -0
  285. package/dist/core/loop-gates.js +352 -0
  286. package/dist/core/loop-gates.js.map +1 -0
  287. package/dist/core/loop-registry.d.ts +77 -0
  288. package/dist/core/loop-registry.d.ts.map +1 -0
  289. package/dist/core/loop-registry.js +831 -0
  290. package/dist/core/loop-registry.js.map +1 -0
  291. package/dist/core/loop-types.d.ts +194 -0
  292. package/dist/core/loop-types.d.ts.map +1 -0
  293. package/dist/core/loop-types.js +2 -0
  294. package/dist/core/loop-types.js.map +1 -0
  295. package/dist/core/mcp-inventory.d.ts +7 -0
  296. package/dist/core/mcp-inventory.d.ts.map +1 -1
  297. package/dist/core/mcp-inventory.js +5 -1
  298. package/dist/core/mcp-inventory.js.map +1 -1
  299. package/dist/core/mcp-presets.d.ts +43 -2
  300. package/dist/core/mcp-presets.d.ts.map +1 -1
  301. package/dist/core/mcp-presets.js +298 -2
  302. package/dist/core/mcp-presets.js.map +1 -1
  303. package/dist/core/messages.d.ts +3 -3
  304. package/dist/core/messages.d.ts.map +1 -1
  305. package/dist/core/messages.js.map +1 -1
  306. package/dist/core/metrics-sampler.d.ts +11 -0
  307. package/dist/core/metrics-sampler.d.ts.map +1 -1
  308. package/dist/core/metrics-sampler.js +52 -13
  309. package/dist/core/metrics-sampler.js.map +1 -1
  310. package/dist/core/model-registry.d.ts +1 -2
  311. package/dist/core/model-registry.d.ts.map +1 -1
  312. package/dist/core/model-registry.js +18 -41
  313. package/dist/core/model-registry.js.map +1 -1
  314. package/dist/core/model-resolver.d.ts +2 -2
  315. package/dist/core/model-resolver.d.ts.map +1 -1
  316. package/dist/core/model-resolver.js +1 -2
  317. package/dist/core/model-resolver.js.map +1 -1
  318. package/dist/core/package-gallery-identity.d.ts +7 -0
  319. package/dist/core/package-gallery-identity.d.ts.map +1 -0
  320. package/dist/core/package-gallery-identity.js +31 -0
  321. package/dist/core/package-gallery-identity.js.map +1 -0
  322. package/dist/core/package-gallery-install.d.ts +6 -0
  323. package/dist/core/package-gallery-install.d.ts.map +1 -0
  324. package/dist/core/package-gallery-install.js +59 -0
  325. package/dist/core/package-gallery-install.js.map +1 -0
  326. package/dist/core/package-gallery-manifest.d.ts +13 -0
  327. package/dist/core/package-gallery-manifest.d.ts.map +1 -0
  328. package/dist/core/package-gallery-manifest.js +183 -0
  329. package/dist/core/package-gallery-manifest.js.map +1 -0
  330. package/dist/core/package-gallery-trial.d.ts +4 -0
  331. package/dist/core/package-gallery-trial.d.ts.map +1 -0
  332. package/dist/core/package-gallery-trial.js +55 -0
  333. package/dist/core/package-gallery-trial.js.map +1 -0
  334. package/dist/core/package-gallery-types.d.ts +71 -0
  335. package/dist/core/package-gallery-types.d.ts.map +1 -0
  336. package/dist/core/package-gallery-types.js +2 -0
  337. package/dist/core/package-gallery-types.js.map +1 -0
  338. package/dist/core/package-gallery.d.ts +5 -123
  339. package/dist/core/package-gallery.d.ts.map +1 -1
  340. package/dist/core/package-gallery.js +5 -391
  341. package/dist/core/package-gallery.js.map +1 -1
  342. package/dist/core/package-manager.d.ts +0 -69
  343. package/dist/core/package-manager.d.ts.map +1 -1
  344. package/dist/core/package-manager.js +69 -367
  345. package/dist/core/package-manager.js.map +1 -1
  346. package/dist/core/package-procurement.d.ts +4 -4
  347. package/dist/core/package-procurement.d.ts.map +1 -1
  348. package/dist/core/package-procurement.js +29 -17
  349. package/dist/core/package-procurement.js.map +1 -1
  350. package/dist/core/provider-attribution.d.ts +1 -1
  351. package/dist/core/provider-attribution.d.ts.map +1 -1
  352. package/dist/core/provider-attribution.js.map +1 -1
  353. package/dist/core/read-anchors.d.ts +1 -1
  354. package/dist/core/read-anchors.d.ts.map +1 -1
  355. package/dist/core/read-anchors.js +1 -1
  356. package/dist/core/read-anchors.js.map +1 -1
  357. package/dist/core/recovery-checkpoint.d.ts +2 -2
  358. package/dist/core/recovery-checkpoint.d.ts.map +1 -1
  359. package/dist/core/recovery-checkpoint.js +2 -2
  360. package/dist/core/recovery-checkpoint.js.map +1 -1
  361. package/dist/core/resolve-config-value.d.ts +1 -1
  362. package/dist/core/resolve-config-value.d.ts.map +1 -1
  363. package/dist/core/resolve-config-value.js +2 -30
  364. package/dist/core/resolve-config-value.js.map +1 -1
  365. package/dist/core/resource-loader.d.ts +12 -20
  366. package/dist/core/resource-loader.d.ts.map +1 -1
  367. package/dist/core/resource-loader.js +66 -90
  368. package/dist/core/resource-loader.js.map +1 -1
  369. package/dist/core/sandbox-policy-v2.d.ts +49 -0
  370. package/dist/core/sandbox-policy-v2.d.ts.map +1 -0
  371. package/dist/core/sandbox-policy-v2.js +368 -0
  372. package/dist/core/sandbox-policy-v2.js.map +1 -0
  373. package/dist/core/sdk.d.ts +10 -78
  374. package/dist/core/sdk.d.ts.map +1 -1
  375. package/dist/core/sdk.js +97 -139
  376. package/dist/core/sdk.js.map +1 -1
  377. package/dist/core/semantic-cache-policy.d.ts +7 -1
  378. package/dist/core/semantic-cache-policy.d.ts.map +1 -1
  379. package/dist/core/semantic-cache-policy.js +8 -0
  380. package/dist/core/semantic-cache-policy.js.map +1 -1
  381. package/dist/core/session-manager.d.ts +2 -4
  382. package/dist/core/session-manager.d.ts.map +1 -1
  383. package/dist/core/session-manager.js +5 -6
  384. package/dist/core/session-manager.js.map +1 -1
  385. package/dist/core/settings-manager.d.ts +1 -18
  386. package/dist/core/settings-manager.d.ts.map +1 -1
  387. package/dist/core/settings-manager.js +2 -48
  388. package/dist/core/settings-manager.js.map +1 -1
  389. package/dist/core/skills.d.ts +1 -0
  390. package/dist/core/skills.d.ts.map +1 -1
  391. package/dist/core/skills.js +46 -5
  392. package/dist/core/skills.js.map +1 -1
  393. package/dist/core/slash-commands.d.ts.map +1 -1
  394. package/dist/core/slash-commands.js +0 -2
  395. package/dist/core/slash-commands.js.map +1 -1
  396. package/dist/core/subagent-orchestration.d.ts +73 -0
  397. package/dist/core/subagent-orchestration.d.ts.map +1 -0
  398. package/dist/core/subagent-orchestration.js +408 -0
  399. package/dist/core/subagent-orchestration.js.map +1 -0
  400. package/dist/core/system-prompt.d.ts +5 -4
  401. package/dist/core/system-prompt.d.ts.map +1 -1
  402. package/dist/core/system-prompt.js +57 -36
  403. package/dist/core/system-prompt.js.map +1 -1
  404. package/dist/core/timings.d.ts +0 -4
  405. package/dist/core/timings.d.ts.map +1 -1
  406. package/dist/core/timings.js +0 -4
  407. package/dist/core/timings.js.map +1 -1
  408. package/dist/core/todo-state.d.ts +53 -0
  409. package/dist/core/todo-state.d.ts.map +1 -0
  410. package/dist/core/todo-state.js +87 -0
  411. package/dist/core/todo-state.js.map +1 -0
  412. package/dist/core/token-optimizer.d.ts +58 -0
  413. package/dist/core/token-optimizer.d.ts.map +1 -0
  414. package/dist/core/token-optimizer.js +179 -0
  415. package/dist/core/token-optimizer.js.map +1 -0
  416. package/dist/core/tools/bash.d.ts +8 -9
  417. package/dist/core/tools/bash.d.ts.map +1 -1
  418. package/dist/core/tools/bash.js +9 -8
  419. package/dist/core/tools/bash.js.map +1 -1
  420. package/dist/core/tools/edit.d.ts +3 -14
  421. package/dist/core/tools/edit.d.ts.map +1 -1
  422. package/dist/core/tools/edit.js +4 -25
  423. package/dist/core/tools/edit.js.map +1 -1
  424. package/dist/core/tools/find.d.ts +1 -4
  425. package/dist/core/tools/find.d.ts.map +1 -1
  426. package/dist/core/tools/find.js +1 -4
  427. package/dist/core/tools/find.js.map +1 -1
  428. package/dist/core/tools/grep.d.ts +1 -4
  429. package/dist/core/tools/grep.d.ts.map +1 -1
  430. package/dist/core/tools/grep.js +2 -5
  431. package/dist/core/tools/grep.js.map +1 -1
  432. package/dist/core/tools/index.d.ts +2 -2
  433. package/dist/core/tools/index.d.ts.map +1 -1
  434. package/dist/core/tools/index.js.map +1 -1
  435. package/dist/core/tools/ls.d.ts +1 -4
  436. package/dist/core/tools/ls.d.ts.map +1 -1
  437. package/dist/core/tools/ls.js +1 -4
  438. package/dist/core/tools/ls.js.map +1 -1
  439. package/dist/core/tools/read.d.ts +2 -14
  440. package/dist/core/tools/read.d.ts.map +1 -1
  441. package/dist/core/tools/read.js +4 -28
  442. package/dist/core/tools/read.js.map +1 -1
  443. package/dist/core/tools/render-utils.d.ts +1 -1
  444. package/dist/core/tools/render-utils.d.ts.map +1 -1
  445. package/dist/core/tools/render-utils.js +1 -1
  446. package/dist/core/tools/render-utils.js.map +1 -1
  447. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  448. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  449. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  450. package/dist/core/tools/write.d.ts +2 -4
  451. package/dist/core/tools/write.d.ts.map +1 -1
  452. package/dist/core/tools/write.js +4 -4
  453. package/dist/core/tools/write.js.map +1 -1
  454. package/dist/encoding/index.d.ts +6 -0
  455. package/dist/encoding/index.d.ts.map +1 -0
  456. package/dist/encoding/index.js +6 -0
  457. package/dist/encoding/index.js.map +1 -0
  458. package/dist/encoding/l4-encoder.d.ts +96 -0
  459. package/dist/encoding/l4-encoder.d.ts.map +1 -0
  460. package/dist/encoding/l4-encoder.js +474 -0
  461. package/dist/encoding/l4-encoder.js.map +1 -0
  462. package/dist/fuzzing/index.d.ts +6 -0
  463. package/dist/fuzzing/index.d.ts.map +1 -0
  464. package/dist/fuzzing/index.js +6 -0
  465. package/dist/fuzzing/index.js.map +1 -0
  466. package/dist/fuzzing/mutation-engine.d.ts +93 -0
  467. package/dist/fuzzing/mutation-engine.d.ts.map +1 -0
  468. package/dist/fuzzing/mutation-engine.js +244 -0
  469. package/dist/fuzzing/mutation-engine.js.map +1 -0
  470. package/dist/guardrails/audit-logger.d.ts +4 -0
  471. package/dist/guardrails/audit-logger.d.ts.map +1 -0
  472. package/dist/guardrails/audit-logger.js +28 -0
  473. package/dist/guardrails/audit-logger.js.map +1 -0
  474. package/dist/guardrails/evidence-system.d.ts +61 -0
  475. package/dist/guardrails/evidence-system.d.ts.map +1 -0
  476. package/dist/guardrails/evidence-system.js +302 -0
  477. package/dist/guardrails/evidence-system.js.map +1 -0
  478. package/dist/guardrails/freedomd-adapter.d.ts +16 -0
  479. package/dist/guardrails/freedomd-adapter.d.ts.map +1 -0
  480. package/dist/guardrails/freedomd-adapter.js +87 -0
  481. package/dist/guardrails/freedomd-adapter.js.map +1 -0
  482. package/dist/index.d.ts +4 -19
  483. package/dist/index.d.ts.map +1 -1
  484. package/dist/index.js +2 -17
  485. package/dist/index.js.map +1 -1
  486. package/dist/jailbreak-extension.d.ts +48 -0
  487. package/dist/jailbreak-extension.d.ts.map +1 -0
  488. package/dist/jailbreak-extension.js +47 -0
  489. package/dist/jailbreak-extension.js.map +1 -0
  490. package/dist/main.d.ts.map +1 -1
  491. package/dist/main.js +2 -2
  492. package/dist/main.js.map +1 -1
  493. package/dist/migrations.d.ts +0 -37
  494. package/dist/migrations.d.ts.map +1 -1
  495. package/dist/migrations.js +6 -414
  496. package/dist/migrations.js.map +1 -1
  497. package/dist/modes/interactive/components/armin.d.ts +1 -1
  498. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/armin.js.map +1 -1
  500. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  501. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/assistant-message.js +1 -1
  503. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  504. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  505. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  506. package/dist/modes/interactive/components/bash-execution.js +1 -1
  507. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  508. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  509. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  511. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  512. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  513. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  515. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  516. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  517. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  518. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  519. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  520. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  521. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  522. package/dist/modes/interactive/components/config-selector.js +1 -1
  523. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  524. package/dist/modes/interactive/components/control-panel-box.d.ts +15 -0
  525. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -0
  526. package/dist/modes/interactive/components/control-panel-box.js +55 -0
  527. package/dist/modes/interactive/components/control-panel-box.js.map +1 -0
  528. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -36
  530. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  531. package/dist/modes/interactive/components/control-panel-gradient.d.ts +1 -0
  532. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/control-panel-gradient.js +6 -5
  534. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -1
  535. package/dist/modes/interactive/components/control-panel-layout.d.ts +23 -0
  536. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
  537. package/dist/modes/interactive/components/control-panel-layout.js +165 -0
  538. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
  539. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +5 -0
  540. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -0
  541. package/dist/modes/interactive/components/control-panel-runtime-status.js +20 -0
  542. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
  543. package/dist/modes/interactive/components/control-panel.d.ts +8 -31
  544. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  545. package/dist/modes/interactive/components/control-panel.js +38 -169
  546. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  547. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  548. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  549. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  550. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  551. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/custom-editor.js +14 -22
  553. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  554. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  555. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  556. package/dist/modes/interactive/components/custom-message.js +1 -1
  557. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  558. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  559. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  560. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  561. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  562. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  563. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  564. package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
  565. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  566. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  567. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  568. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  569. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  570. package/dist/modes/interactive/components/extension-editor.js +1 -1
  571. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  572. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  573. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  574. package/dist/modes/interactive/components/extension-input.js +1 -1
  575. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  576. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  577. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  578. package/dist/modes/interactive/components/extension-selector.js +1 -1
  579. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  580. package/dist/modes/interactive/components/footer.d.ts +1 -1
  581. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  582. package/dist/modes/interactive/components/footer.js +1 -9
  583. package/dist/modes/interactive/components/footer.js.map +1 -1
  584. package/dist/modes/interactive/components/index.d.ts +0 -2
  585. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  586. package/dist/modes/interactive/components/index.js +0 -2
  587. package/dist/modes/interactive/components/index.js.map +1 -1
  588. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  589. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  590. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  591. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  592. package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
  593. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  594. package/dist/modes/interactive/components/login-dialog.js +2 -2
  595. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  596. package/dist/modes/interactive/components/model-selector.d.ts +13 -47
  597. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  598. package/dist/modes/interactive/components/model-selector.js +118 -193
  599. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  600. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  601. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  602. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  603. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  604. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  605. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  606. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  607. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  608. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  610. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  611. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  612. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/session-selector.js +1 -1
  614. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  615. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  616. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/settings-selector.js +1 -1
  618. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  619. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  620. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  622. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  623. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  624. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  626. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  627. package/dist/modes/interactive/components/theme-selector.d.ts +1 -2
  628. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/theme-selector.js +2 -11
  630. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  631. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -7
  632. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  633. package/dist/modes/interactive/components/thinking-selector.js +48 -7
  634. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  635. package/dist/modes/interactive/components/todo-checklist.d.ts +31 -0
  636. package/dist/modes/interactive/components/todo-checklist.d.ts.map +1 -0
  637. package/dist/modes/interactive/components/todo-checklist.js +121 -0
  638. package/dist/modes/interactive/components/todo-checklist.js.map +1 -0
  639. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  640. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  641. package/dist/modes/interactive/components/tool-execution.js +1 -1
  642. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  643. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  644. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  645. package/dist/modes/interactive/components/tree-selector.js +1 -1
  646. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  647. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  648. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  649. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  650. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  651. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  652. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  653. package/dist/modes/interactive/components/user-message.js +1 -1
  654. package/dist/modes/interactive/components/user-message.js.map +1 -1
  655. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  656. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  657. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  658. package/dist/modes/interactive/interactive-mode.d.ts +3 -8
  659. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  660. package/dist/modes/interactive/interactive-mode.js +74 -232
  661. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  662. package/dist/modes/interactive/theme/omk-control-grid-dark.json +65 -77
  663. package/dist/modes/interactive/theme/omk-neon-control.json +90 -0
  664. package/dist/modes/interactive/theme/rust-forge.json +14 -24
  665. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  666. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  667. package/dist/modes/interactive/theme/theme.js +22 -45
  668. package/dist/modes/interactive/theme/theme.js.map +1 -1
  669. package/dist/modes/print-mode.d.ts +1 -1
  670. package/dist/modes/print-mode.d.ts.map +1 -1
  671. package/dist/modes/print-mode.js.map +1 -1
  672. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  673. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  674. package/dist/modes/rpc/rpc-client.js.map +1 -1
  675. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  676. package/dist/modes/rpc/rpc-mode.js +0 -4
  677. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  678. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  679. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  680. package/dist/modes/rpc/rpc-types.js.map +1 -1
  681. package/dist/modules/index.d.ts +8 -0
  682. package/dist/modules/index.d.ts.map +1 -0
  683. package/dist/modules/index.js +7 -0
  684. package/dist/modules/index.js.map +1 -0
  685. package/dist/modules/lrl-bypass.d.ts +40 -0
  686. package/dist/modules/lrl-bypass.d.ts.map +1 -0
  687. package/dist/modules/lrl-bypass.js +84 -0
  688. package/dist/modules/lrl-bypass.js.map +1 -0
  689. package/dist/modules/lrl-deps.d.ts +38 -0
  690. package/dist/modules/lrl-deps.d.ts.map +1 -0
  691. package/dist/modules/lrl-deps.js +128 -0
  692. package/dist/modules/lrl-deps.js.map +1 -0
  693. package/dist/multiturn/easl-chain.d.ts +113 -0
  694. package/dist/multiturn/easl-chain.d.ts.map +1 -0
  695. package/dist/multiturn/easl-chain.js +351 -0
  696. package/dist/multiturn/easl-chain.js.map +1 -0
  697. package/dist/multiturn/index.d.ts +6 -0
  698. package/dist/multiturn/index.d.ts.map +1 -0
  699. package/dist/multiturn/index.js +6 -0
  700. package/dist/multiturn/index.js.map +1 -0
  701. package/dist/orchestration/lane-grant-auditor.d.ts +4 -0
  702. package/dist/orchestration/lane-grant-auditor.d.ts.map +1 -0
  703. package/dist/orchestration/lane-grant-auditor.js +87 -0
  704. package/dist/orchestration/lane-grant-auditor.js.map +1 -0
  705. package/dist/package-manager-cli.d.ts.map +1 -1
  706. package/dist/package-manager-cli.js +48 -113
  707. package/dist/package-manager-cli.js.map +1 -1
  708. package/dist/routing/fallback-router.d.ts +123 -0
  709. package/dist/routing/fallback-router.d.ts.map +1 -0
  710. package/dist/routing/fallback-router.js +355 -0
  711. package/dist/routing/fallback-router.js.map +1 -0
  712. package/dist/routing/index.d.ts +6 -0
  713. package/dist/routing/index.d.ts.map +1 -0
  714. package/dist/routing/index.js +6 -0
  715. package/dist/routing/index.js.map +1 -0
  716. package/dist/types/evidence.d.ts +117 -0
  717. package/dist/types/evidence.d.ts.map +1 -0
  718. package/dist/types/evidence.js +8 -0
  719. package/dist/types/evidence.js.map +1 -0
  720. package/dist/types/guardrails.d.ts +61 -0
  721. package/dist/types/guardrails.d.ts.map +1 -0
  722. package/dist/types/guardrails.js +9 -0
  723. package/dist/types/guardrails.js.map +1 -0
  724. package/dist/types/jailbreak.d.ts +246 -0
  725. package/dist/types/jailbreak.d.ts.map +1 -0
  726. package/dist/types/jailbreak.js +8 -0
  727. package/dist/types/jailbreak.js.map +1 -0
  728. package/dist/types/lane-grant.d.ts +58 -0
  729. package/dist/types/lane-grant.d.ts.map +1 -0
  730. package/dist/types/lane-grant.js +9 -0
  731. package/dist/types/lane-grant.js.map +1 -0
  732. package/dist/utils/jailbreak/common.d.ts +63 -0
  733. package/dist/utils/jailbreak/common.d.ts.map +1 -0
  734. package/dist/utils/jailbreak/common.js +130 -0
  735. package/dist/utils/jailbreak/common.js.map +1 -0
  736. package/dist/utils/jailbreak/index.d.ts +7 -0
  737. package/dist/utils/jailbreak/index.d.ts.map +1 -0
  738. package/dist/utils/jailbreak/index.js +7 -0
  739. package/dist/utils/jailbreak/index.js.map +1 -0
  740. package/dist/utils/windows-self-update.d.ts.map +1 -1
  741. package/dist/utils/windows-self-update.js +1 -1
  742. package/dist/utils/windows-self-update.js.map +1 -1
  743. package/docs/compaction.md +8 -21
  744. package/docs/custom-provider.md +2 -2
  745. package/docs/development.md +1 -1
  746. package/docs/extensions.md +11 -11
  747. package/docs/loadout-domains/README.md +70 -0
  748. package/docs/loadout-domains/ai-agent-ops.md +94 -0
  749. package/docs/loadout-domains/backend-api.md +116 -0
  750. package/docs/loadout-domains/data-science.md +100 -0
  751. package/docs/loadout-domains/devops-infra.md +85 -0
  752. package/docs/loadout-domains/docs-writing.md +92 -0
  753. package/docs/loadout-domains/frontend-ui.md +128 -0
  754. package/docs/loadout-domains/general.md +62 -0
  755. package/docs/loadout-domains/mobile.md +84 -0
  756. package/docs/loadout-domains/qa-testing.md +87 -0
  757. package/docs/loadout-domains/research.md +80 -0
  758. package/docs/loadout-domains/security-audit.md +97 -0
  759. package/docs/packages.md +7 -48
  760. package/docs/prompt-templates.md +0 -2
  761. package/docs/sdk.md +3 -3
  762. package/docs/security.md +145 -0
  763. package/docs/session-format.md +1 -1
  764. package/docs/themes.md +8 -7
  765. package/docs/tui.md +14 -14
  766. package/docs/usage.md +6 -16
  767. package/examples/extensions/README.md +2 -2
  768. package/examples/extensions/aside-computer-use/README.md +114 -0
  769. package/examples/extensions/aside-computer-use/action-scoring.ts +122 -0
  770. package/examples/extensions/aside-computer-use/assertions.ts +380 -0
  771. package/examples/extensions/aside-computer-use/controller.ts +491 -0
  772. package/examples/extensions/aside-computer-use/evidence.ts +229 -0
  773. package/examples/extensions/aside-computer-use/golden-trace.ts +141 -0
  774. package/examples/extensions/aside-computer-use/index.ts +76 -0
  775. package/examples/extensions/aside-computer-use/mcp-client.ts +381 -0
  776. package/examples/extensions/aside-computer-use/observation-snapshot.ts +121 -0
  777. package/examples/extensions/aside-computer-use/package.json +16 -0
  778. package/examples/extensions/aside-computer-use/policy.ts +257 -0
  779. package/examples/extensions/aside-computer-use/risk-authorize.ts +200 -0
  780. package/examples/extensions/aside-computer-use/risk-classifier.ts +205 -0
  781. package/examples/extensions/aside-computer-use/schema-fingerprint.ts +80 -0
  782. package/examples/extensions/aside-computer-use/session-binding.ts +161 -0
  783. package/examples/extensions/aside-computer-use/tools.ts +449 -0
  784. package/examples/extensions/aside-computer-use/types.ts +217 -0
  785. package/examples/extensions/aside-computer-use/url-origin.ts +132 -0
  786. package/examples/extensions/bash-spawn-hook.ts +1 -1
  787. package/examples/extensions/border-status-editor.ts +2 -2
  788. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  789. package/examples/extensions/custom-compaction.ts +1 -1
  790. package/examples/extensions/custom-footer.ts +2 -2
  791. package/examples/extensions/custom-header.ts +8 -8
  792. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  793. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  794. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  795. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  796. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  797. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  798. package/examples/extensions/doom-overlay/README.md +1 -2
  799. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  800. package/examples/extensions/doom-overlay/doom/build.sh +4 -4
  801. package/examples/extensions/doom-overlay/doom/doomgeneric_omk.c +72 -0
  802. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  803. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  804. package/examples/extensions/git-merge-and-resolve.ts +1 -1
  805. package/examples/extensions/github-issue-autocomplete.ts +1 -6
  806. package/examples/extensions/gondolin/index.ts +1 -1
  807. package/examples/extensions/gondolin/package-lock.json +2 -2
  808. package/examples/extensions/gondolin/package.json +1 -1
  809. package/examples/extensions/handoff.ts +2 -2
  810. package/examples/extensions/hello.ts +1 -1
  811. package/examples/extensions/inline-bash.ts +1 -1
  812. package/examples/extensions/input-transform-streaming.ts +1 -1
  813. package/examples/extensions/input-transform.ts +2 -2
  814. package/examples/extensions/mac-system-theme.ts +1 -1
  815. package/examples/extensions/message-renderer.ts +1 -1
  816. package/examples/extensions/minimal-mode.ts +1 -1
  817. package/examples/extensions/modal-editor.ts +1 -1
  818. package/examples/extensions/overlay-qa-tests.ts +7 -7
  819. package/examples/extensions/overlay-test.ts +1 -1
  820. package/examples/extensions/plan-mode/index.ts +3 -3
  821. package/examples/extensions/preset.ts +4 -4
  822. package/examples/extensions/provider-payload.ts +6 -3
  823. package/examples/extensions/qna.ts +1 -1
  824. package/examples/extensions/question.ts +1 -1
  825. package/examples/extensions/questionnaire.ts +1 -1
  826. package/examples/extensions/rpc-demo.ts +1 -1
  827. package/examples/extensions/sandbox/index.ts +2 -2
  828. package/examples/extensions/sandbox/package-lock.json +2 -2
  829. package/examples/extensions/sandbox/package.json +1 -1
  830. package/examples/extensions/shutdown-command.ts +5 -5
  831. package/examples/extensions/snake.ts +1 -1
  832. package/examples/extensions/space-invaders.ts +1 -1
  833. package/examples/extensions/structured-output.ts +1 -1
  834. package/examples/extensions/subagent/agents.ts +2 -2
  835. package/examples/extensions/subagent/index.ts +19 -51
  836. package/examples/extensions/summarize.ts +2 -2
  837. package/examples/extensions/tic-tac-toe.ts +2 -2
  838. package/examples/extensions/todo.ts +2 -2
  839. package/examples/extensions/tool-override.ts +1 -1
  840. package/examples/extensions/tools.ts +1 -1
  841. package/examples/extensions/truncated-tool.ts +1 -1
  842. package/examples/extensions/with-deps/package-lock.json +2 -2
  843. package/examples/extensions/with-deps/package.json +1 -1
  844. package/examples/extensions/working-indicator.ts +3 -3
  845. package/examples/rpc-extension-ui.ts +1 -9
  846. package/examples/sdk/02-custom-model.ts +1 -1
  847. package/examples/sdk/07-context-files.ts +0 -2
  848. package/examples/sdk/12-full-control.ts +1 -1
  849. package/examples/sdk/README.md +1 -1
  850. package/npm-shrinkwrap.json +1805 -0
  851. package/package.json +10 -32
  852. package/dist/core/compaction/pruner-policy.d.ts +0 -84
  853. package/dist/core/compaction/pruner-policy.d.ts.map +0 -1
  854. package/dist/core/compaction/pruner-policy.js +0 -273
  855. package/dist/core/compaction/pruner-policy.js.map +0 -1
  856. package/dist/core/context-graph-identity-resolution.d.ts +0 -114
  857. package/dist/core/context-graph-identity-resolution.d.ts.map +0 -1
  858. package/dist/core/context-graph-identity-resolution.js +0 -127
  859. package/dist/core/context-graph-identity-resolution.js.map +0 -1
  860. package/dist/core/context-graph-memory-store.d.ts +0 -153
  861. package/dist/core/context-graph-memory-store.d.ts.map +0 -1
  862. package/dist/core/context-graph-memory-store.js +0 -377
  863. package/dist/core/context-graph-memory-store.js.map +0 -1
  864. package/dist/core/context-graph-ontology-generation.d.ts +0 -104
  865. package/dist/core/context-graph-ontology-generation.d.ts.map +0 -1
  866. package/dist/core/context-graph-ontology-generation.js +0 -135
  867. package/dist/core/context-graph-ontology-generation.js.map +0 -1
  868. package/dist/core/context-graph-ontology-registry.d.ts +0 -766
  869. package/dist/core/context-graph-ontology-registry.d.ts.map +0 -1
  870. package/dist/core/context-graph-ontology-registry.js +0 -1133
  871. package/dist/core/context-graph-ontology-registry.js.map +0 -1
  872. package/dist/core/context-graph-policy.d.ts +0 -68
  873. package/dist/core/context-graph-policy.d.ts.map +0 -1
  874. package/dist/core/context-graph-policy.js +0 -221
  875. package/dist/core/context-graph-policy.js.map +0 -1
  876. package/dist/core/context-graph-reasoning.d.ts +0 -130
  877. package/dist/core/context-graph-reasoning.d.ts.map +0 -1
  878. package/dist/core/context-graph-reasoning.js +0 -442
  879. package/dist/core/context-graph-reasoning.js.map +0 -1
  880. package/dist/core/context-graph-retrieval.d.ts +0 -120
  881. package/dist/core/context-graph-retrieval.d.ts.map +0 -1
  882. package/dist/core/context-graph-retrieval.js +0 -288
  883. package/dist/core/context-graph-retrieval.js.map +0 -1
  884. package/dist/core/contract-verification.d.ts +0 -78
  885. package/dist/core/contract-verification.d.ts.map +0 -1
  886. package/dist/core/contract-verification.js +0 -110
  887. package/dist/core/contract-verification.js.map +0 -1
  888. package/dist/core/freedom/banner.d.ts +0 -14
  889. package/dist/core/freedom/banner.d.ts.map +0 -1
  890. package/dist/core/freedom/banner.js +0 -22
  891. package/dist/core/freedom/banner.js.map +0 -1
  892. package/dist/core/freedom/config.d.ts +0 -27
  893. package/dist/core/freedom/config.d.ts.map +0 -1
  894. package/dist/core/freedom/config.js +0 -216
  895. package/dist/core/freedom/config.js.map +0 -1
  896. package/dist/core/freedom/index.d.ts +0 -23
  897. package/dist/core/freedom/index.d.ts.map +0 -1
  898. package/dist/core/freedom/index.js +0 -19
  899. package/dist/core/freedom/index.js.map +0 -1
  900. package/dist/core/freedom/policy.d.ts +0 -42
  901. package/dist/core/freedom/policy.d.ts.map +0 -1
  902. package/dist/core/freedom/policy.js +0 -47
  903. package/dist/core/freedom/policy.js.map +0 -1
  904. package/dist/core/freedom/safety-floor.d.ts +0 -73
  905. package/dist/core/freedom/safety-floor.d.ts.map +0 -1
  906. package/dist/core/freedom/safety-floor.js +0 -275
  907. package/dist/core/freedom/safety-floor.js.map +0 -1
  908. package/dist/core/harness-control-events.d.ts +0 -91
  909. package/dist/core/harness-control-events.d.ts.map +0 -1
  910. package/dist/core/harness-control-events.js +0 -514
  911. package/dist/core/harness-control-events.js.map +0 -1
  912. package/dist/core/harness-control-replay.d.ts +0 -31
  913. package/dist/core/harness-control-replay.d.ts.map +0 -1
  914. package/dist/core/harness-control-replay.js +0 -187
  915. package/dist/core/harness-control-replay.js.map +0 -1
  916. package/dist/core/headroom-middleware.d.ts +0 -35
  917. package/dist/core/headroom-middleware.d.ts.map +0 -1
  918. package/dist/core/headroom-middleware.js +0 -166
  919. package/dist/core/headroom-middleware.js.map +0 -1
  920. package/dist/core/lean-context-middleware.d.ts +0 -12
  921. package/dist/core/lean-context-middleware.d.ts.map +0 -1
  922. package/dist/core/lean-context-middleware.js +0 -87
  923. package/dist/core/lean-context-middleware.js.map +0 -1
  924. package/dist/core/lean-context-policy.d.ts +0 -45
  925. package/dist/core/lean-context-policy.d.ts.map +0 -1
  926. package/dist/core/lean-context-policy.js +0 -108
  927. package/dist/core/lean-context-policy.js.map +0 -1
  928. package/dist/core/native-adoption-benchmark.d.ts +0 -166
  929. package/dist/core/native-adoption-benchmark.d.ts.map +0 -1
  930. package/dist/core/native-adoption-benchmark.js +0 -624
  931. package/dist/core/native-adoption-benchmark.js.map +0 -1
  932. package/dist/core/observability-trace.d.ts +0 -80
  933. package/dist/core/observability-trace.d.ts.map +0 -1
  934. package/dist/core/observability-trace.js +0 -140
  935. package/dist/core/observability-trace.js.map +0 -1
  936. package/dist/core/orchestration/checkpoint.d.ts +0 -83
  937. package/dist/core/orchestration/checkpoint.d.ts.map +0 -1
  938. package/dist/core/orchestration/checkpoint.js +0 -152
  939. package/dist/core/orchestration/checkpoint.js.map +0 -1
  940. package/dist/core/orchestration/errors.d.ts +0 -74
  941. package/dist/core/orchestration/errors.d.ts.map +0 -1
  942. package/dist/core/orchestration/errors.js +0 -52
  943. package/dist/core/orchestration/errors.js.map +0 -1
  944. package/dist/core/orchestration/merge-queue.d.ts +0 -121
  945. package/dist/core/orchestration/merge-queue.d.ts.map +0 -1
  946. package/dist/core/orchestration/merge-queue.js +0 -149
  947. package/dist/core/orchestration/merge-queue.js.map +0 -1
  948. package/dist/core/orchestration/recovery.d.ts +0 -106
  949. package/dist/core/orchestration/recovery.d.ts.map +0 -1
  950. package/dist/core/orchestration/recovery.js +0 -110
  951. package/dist/core/orchestration/recovery.js.map +0 -1
  952. package/dist/core/orchestration/replay-ledger.d.ts +0 -76
  953. package/dist/core/orchestration/replay-ledger.d.ts.map +0 -1
  954. package/dist/core/orchestration/replay-ledger.js +0 -395
  955. package/dist/core/orchestration/replay-ledger.js.map +0 -1
  956. package/dist/core/orchestration/scheduler-state.d.ts +0 -78
  957. package/dist/core/orchestration/scheduler-state.d.ts.map +0 -1
  958. package/dist/core/orchestration/scheduler-state.js +0 -185
  959. package/dist/core/orchestration/scheduler-state.js.map +0 -1
  960. package/dist/core/orchestration/scheduler-store.d.ts +0 -309
  961. package/dist/core/orchestration/scheduler-store.d.ts.map +0 -1
  962. package/dist/core/orchestration/scheduler-store.js +0 -368
  963. package/dist/core/orchestration/scheduler-store.js.map +0 -1
  964. package/dist/core/orchestration/sqlite-scheduler-store.d.ts +0 -57
  965. package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +0 -1
  966. package/dist/core/orchestration/sqlite-scheduler-store.js +0 -528
  967. package/dist/core/orchestration/sqlite-scheduler-store.js.map +0 -1
  968. package/dist/core/orchestration/transaction-coordinator.d.ts +0 -217
  969. package/dist/core/orchestration/transaction-coordinator.d.ts.map +0 -1
  970. package/dist/core/orchestration/transaction-coordinator.js +0 -281
  971. package/dist/core/orchestration/transaction-coordinator.js.map +0 -1
  972. package/dist/core/orchestration/verification-contract.d.ts +0 -197
  973. package/dist/core/orchestration/verification-contract.d.ts.map +0 -1
  974. package/dist/core/orchestration/verification-contract.js +0 -145
  975. package/dist/core/orchestration/verification-contract.js.map +0 -1
  976. package/dist/core/package-composition.d.ts +0 -68
  977. package/dist/core/package-composition.d.ts.map +0 -1
  978. package/dist/core/package-composition.js +0 -304
  979. package/dist/core/package-composition.js.map +0 -1
  980. package/dist/core/package-trial-runtime.d.ts +0 -75
  981. package/dist/core/package-trial-runtime.d.ts.map +0 -1
  982. package/dist/core/package-trial-runtime.js +0 -73
  983. package/dist/core/package-trial-runtime.js.map +0 -1
  984. package/dist/core/package-trial-sandbox.d.ts +0 -27
  985. package/dist/core/package-trial-sandbox.d.ts.map +0 -1
  986. package/dist/core/package-trial-sandbox.js +0 -102
  987. package/dist/core/package-trial-sandbox.js.map +0 -1
  988. package/dist/core/policy-overlays-runtime.d.ts +0 -141
  989. package/dist/core/policy-overlays-runtime.d.ts.map +0 -1
  990. package/dist/core/policy-overlays-runtime.js +0 -720
  991. package/dist/core/policy-overlays-runtime.js.map +0 -1
  992. package/dist/core/read-anchor-registry.d.ts +0 -27
  993. package/dist/core/read-anchor-registry.d.ts.map +0 -1
  994. package/dist/core/read-anchor-registry.js +0 -103
  995. package/dist/core/read-anchor-registry.js.map +0 -1
  996. package/dist/core/read-content-cache.d.ts +0 -22
  997. package/dist/core/read-content-cache.d.ts.map +0 -1
  998. package/dist/core/read-content-cache.js +0 -79
  999. package/dist/core/read-content-cache.js.map +0 -1
  1000. package/dist/core/session-digest.d.ts +0 -57
  1001. package/dist/core/session-digest.d.ts.map +0 -1
  1002. package/dist/core/session-digest.js +0 -193
  1003. package/dist/core/session-digest.js.map +0 -1
  1004. package/dist/core/spec-kit/compiler.d.ts +0 -67
  1005. package/dist/core/spec-kit/compiler.d.ts.map +0 -1
  1006. package/dist/core/spec-kit/compiler.js +0 -268
  1007. package/dist/core/spec-kit/compiler.js.map +0 -1
  1008. package/dist/core/transaction-coordinator.d.ts +0 -30
  1009. package/dist/core/transaction-coordinator.d.ts.map +0 -1
  1010. package/dist/core/transaction-coordinator.js +0 -173
  1011. package/dist/core/transaction-coordinator.js.map +0 -1
  1012. package/dist/modes/interactive/components/mcp-selector.d.ts +0 -30
  1013. package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
  1014. package/dist/modes/interactive/components/mcp-selector.js +0 -155
  1015. package/dist/modes/interactive/components/mcp-selector.js.map +0 -1
  1016. package/dist/modes/interactive/components/model-selector-state.d.ts +0 -101
  1017. package/dist/modes/interactive/components/model-selector-state.d.ts.map +0 -1
  1018. package/dist/modes/interactive/components/model-selector-state.js +0 -261
  1019. package/dist/modes/interactive/components/model-selector-state.js.map +0 -1
  1020. package/dist/modes/interactive/components/skills-selector.d.ts +0 -32
  1021. package/dist/modes/interactive/components/skills-selector.d.ts.map +0 -1
  1022. package/dist/modes/interactive/components/skills-selector.js +0 -130
  1023. package/dist/modes/interactive/components/skills-selector.js.map +0 -1
  1024. package/dist/modes/interactive/theme/omk-blackboard.json +0 -91
  1025. package/dist/modes/interactive/theme/omk-freedom-grid.json +0 -91
  1026. package/dist/modes/interactive/theme/omk-neon-ops.json +0 -90
  1027. package/dist/modes/interactive/theme/omk-slate-light.json +0 -91
  1028. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -72
  1029. package/node_modules/@earendil-works/omk-agent-core/README.md +0 -488
  1030. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +0 -24
  1031. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +0 -1
  1032. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +0 -553
  1033. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +0 -1
  1034. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +0 -118
  1035. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +0 -1
  1036. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +0 -402
  1037. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +0 -1
  1038. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +0 -95
  1039. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +0 -1
  1040. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +0 -996
  1041. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +0 -1
  1042. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +0 -53
  1043. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +0 -1
  1044. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +0 -175
  1045. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +0 -1
  1046. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +0 -117
  1047. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +0 -1
  1048. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +0 -568
  1049. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +0 -1
  1050. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +0 -25
  1051. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +0 -1
  1052. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +0 -131
  1053. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +0 -1
  1054. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +0 -51
  1055. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +0 -1
  1056. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +0 -510
  1057. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +0 -1
  1058. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +0 -51
  1059. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +0 -1
  1060. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +0 -102
  1061. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +0 -1
  1062. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +0 -48
  1063. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +0 -1
  1064. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +0 -230
  1065. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +0 -1
  1066. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +0 -26
  1067. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +0 -1
  1068. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +0 -101
  1069. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +0 -1
  1070. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +0 -36
  1071. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +0 -1
  1072. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +0 -273
  1073. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +0 -1
  1074. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +0 -18
  1075. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +0 -1
  1076. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +0 -42
  1077. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +0 -1
  1078. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +0 -25
  1079. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +0 -1
  1080. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +0 -114
  1081. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +0 -1
  1082. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +0 -11
  1083. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +0 -1
  1084. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +0 -39
  1085. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +0 -1
  1086. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +0 -33
  1087. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +0 -1
  1088. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +0 -210
  1089. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +0 -1
  1090. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +0 -2
  1091. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +0 -1
  1092. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +0 -50
  1093. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +0 -1
  1094. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +0 -44
  1095. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +0 -1
  1096. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +0 -311
  1097. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +0 -1
  1098. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +0 -3
  1099. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +0 -1
  1100. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +0 -30
  1101. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +0 -1
  1102. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +0 -616
  1103. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +0 -1
  1104. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +0 -94
  1105. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +0 -1
  1106. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +0 -14
  1107. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +0 -1
  1108. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +0 -126
  1109. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +0 -1
  1110. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +0 -70
  1111. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +0 -1
  1112. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +0 -297
  1113. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +0 -1
  1114. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +0 -20
  1115. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +0 -1
  1116. package/node_modules/@earendil-works/omk-agent-core/dist/index.js +0 -25
  1117. package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +0 -1
  1118. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +0 -3
  1119. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +0 -1
  1120. package/node_modules/@earendil-works/omk-agent-core/dist/node.js +0 -3
  1121. package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +0 -1
  1122. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +0 -69
  1123. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +0 -1
  1124. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +0 -278
  1125. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +0 -1
  1126. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +0 -393
  1127. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +0 -1
  1128. package/node_modules/@earendil-works/omk-agent-core/dist/types.js +0 -2
  1129. package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +0 -1
  1130. package/node_modules/@earendil-works/omk-agent-core/package.json +0 -60
  1131. package/node_modules/@earendil-works/omk-ai/README.md +0 -1389
  1132. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +0 -20
  1133. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +0 -1
  1134. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +0 -44
  1135. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +0 -1
  1136. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +0 -5
  1137. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +0 -1
  1138. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +0 -6
  1139. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +0 -1
  1140. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +0 -3
  1141. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +0 -1
  1142. package/node_modules/@earendil-works/omk-ai/dist/cli.js +0 -130
  1143. package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +0 -1
  1144. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +0 -20
  1145. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +0 -1
  1146. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +0 -199
  1147. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +0 -1
  1148. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +0 -10
  1149. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +0 -1
  1150. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +0 -515
  1151. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +0 -1
  1152. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +0 -517
  1153. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +0 -1
  1154. package/node_modules/@earendil-works/omk-ai/dist/image-models.js +0 -23
  1155. package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +0 -1
  1156. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +0 -14
  1157. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +0 -1
  1158. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +0 -22
  1159. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +0 -1
  1160. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +0 -4
  1161. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +0 -1
  1162. package/node_modules/@earendil-works/omk-ai/dist/images.js +0 -16
  1163. package/node_modules/@earendil-works/omk-ai/dist/images.js.map +0 -1
  1164. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +0 -33
  1165. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +0 -1
  1166. package/node_modules/@earendil-works/omk-ai/dist/index.js +0 -21
  1167. package/node_modules/@earendil-works/omk-ai/dist/index.js.map +0 -1
  1168. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +0 -18
  1169. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +0 -1
  1170. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +0 -18762
  1171. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +0 -1
  1172. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +0 -17197
  1173. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +0 -1
  1174. package/node_modules/@earendil-works/omk-ai/dist/models.js +0 -78
  1175. package/node_modules/@earendil-works/omk-ai/dist/models.js.map +0 -1
  1176. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +0 -2
  1177. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +0 -1
  1178. package/node_modules/@earendil-works/omk-ai/dist/oauth.js +0 -2
  1179. package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +0 -1
  1180. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +0 -39
  1181. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +0 -1
  1182. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +0 -170
  1183. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +0 -1
  1184. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +0 -38
  1185. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +0 -1
  1186. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +0 -826
  1187. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +0 -1
  1188. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +0 -77
  1189. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +0 -1
  1190. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +0 -1123
  1191. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +0 -1
  1192. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +0 -15
  1193. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +0 -1
  1194. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +0 -221
  1195. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +0 -1
  1196. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +0 -13
  1197. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +0 -1
  1198. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +0 -26
  1199. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +0 -1
  1200. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +0 -56
  1201. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +0 -1
  1202. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +0 -368
  1203. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +0 -1
  1204. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +0 -8
  1205. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +0 -1
  1206. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +0 -29
  1207. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +0 -1
  1208. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +0 -70
  1209. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +0 -1
  1210. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +0 -331
  1211. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +0 -1
  1212. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +0 -15
  1213. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +0 -1
  1214. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +0 -442
  1215. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +0 -1
  1216. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +0 -13
  1217. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +0 -1
  1218. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +0 -402
  1219. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +0 -1
  1220. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +0 -3
  1221. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +0 -1
  1222. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +0 -128
  1223. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +0 -1
  1224. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +0 -4
  1225. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +0 -1
  1226. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +0 -34
  1227. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +0 -1
  1228. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +0 -25
  1229. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +0 -1
  1230. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +0 -534
  1231. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +0 -1
  1232. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +0 -30
  1233. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +0 -1
  1234. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +0 -1171
  1235. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +0 -1
  1236. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +0 -19
  1237. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +0 -1
  1238. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +0 -977
  1239. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +0 -1
  1240. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +0 -11
  1241. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  1242. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +0 -22
  1243. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +0 -1
  1244. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +0 -18
  1245. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +0 -1
  1246. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +0 -496
  1247. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +0 -1
  1248. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +0 -13
  1249. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +0 -1
  1250. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +0 -233
  1251. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +0 -1
  1252. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +0 -35
  1253. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +0 -1
  1254. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +0 -254
  1255. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +0 -1
  1256. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +0 -8
  1257. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +0 -1
  1258. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +0 -42
  1259. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +0 -1
  1260. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +0 -13
  1261. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +0 -1
  1262. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +0 -82
  1263. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +0 -1
  1264. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +0 -8
  1265. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +0 -1
  1266. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +0 -184
  1267. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +0 -1
  1268. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +0 -4
  1269. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +0 -1
  1270. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +0 -22
  1271. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +0 -1
  1272. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +0 -8
  1273. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +0 -1
  1274. package/node_modules/@earendil-works/omk-ai/dist/stream.js +0 -77
  1275. package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +0 -1
  1276. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +0 -570
  1277. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +0 -1
  1278. package/node_modules/@earendil-works/omk-ai/dist/types.js +0 -2
  1279. package/node_modules/@earendil-works/omk-ai/dist/types.js.map +0 -1
  1280. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +0 -6
  1281. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +0 -1
  1282. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +0 -34
  1283. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +0 -1
  1284. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +0 -19
  1285. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +0 -1
  1286. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +0 -25
  1287. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +0 -1
  1288. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +0 -21
  1289. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +0 -1
  1290. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +0 -81
  1291. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +0 -1
  1292. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +0 -3
  1293. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +0 -1
  1294. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +0 -14
  1295. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +0 -1
  1296. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +0 -2
  1297. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +0 -1
  1298. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +0 -8
  1299. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +0 -1
  1300. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +0 -16
  1301. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +0 -1
  1302. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +0 -113
  1303. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +0 -1
  1304. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +0 -10
  1305. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +0 -1
  1306. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +0 -97
  1307. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +0 -1
  1308. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +0 -25
  1309. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  1310. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +0 -335
  1311. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +0 -1
  1312. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +0 -21
  1313. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
  1314. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +0 -56
  1315. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +0 -1
  1316. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +0 -30
  1317. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  1318. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +0 -280
  1319. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +0 -1
  1320. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +0 -58
  1321. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +0 -1
  1322. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +0 -122
  1323. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +0 -1
  1324. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +0 -3
  1325. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  1326. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +0 -105
  1327. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +0 -1
  1328. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +0 -43
  1329. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  1330. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +0 -487
  1331. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +0 -1
  1332. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +0 -13
  1333. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
  1334. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +0 -31
  1335. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +0 -1
  1336. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +0 -64
  1337. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +0 -1
  1338. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +0 -2
  1339. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +0 -1
  1340. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +0 -57
  1341. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +0 -1
  1342. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +0 -154
  1343. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +0 -1
  1344. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +0 -22
  1345. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +0 -1
  1346. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +0 -26
  1347. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +0 -1
  1348. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +0 -17
  1349. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +0 -1
  1350. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +0 -21
  1351. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +0 -1
  1352. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +0 -18
  1353. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +0 -1
  1354. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +0 -281
  1355. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +0 -1
  1356. package/node_modules/@earendil-works/omk-ai/package.json +0 -106
  1357. package/node_modules/@earendil-works/omk-tui/README.md +0 -791
  1358. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +0 -54
  1359. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +0 -1
  1360. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +0 -632
  1361. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +0 -1
  1362. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +0 -22
  1363. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +0 -1
  1364. package/node_modules/@earendil-works/omk-tui/dist/components/box.js +0 -104
  1365. package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +0 -1
  1366. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +0 -22
  1367. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +0 -1
  1368. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +0 -35
  1369. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +0 -1
  1370. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +0 -249
  1371. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +0 -1
  1372. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +0 -1857
  1373. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +0 -1
  1374. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +0 -28
  1375. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +0 -1
  1376. package/node_modules/@earendil-works/omk-tui/dist/components/image.js +0 -89
  1377. package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +0 -1
  1378. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +0 -37
  1379. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +0 -1
  1380. package/node_modules/@earendil-works/omk-tui/dist/components/input.js +0 -378
  1381. package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +0 -1
  1382. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +0 -31
  1383. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +0 -1
  1384. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +0 -69
  1385. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +0 -1
  1386. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +0 -96
  1387. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +0 -1
  1388. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +0 -644
  1389. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +0 -1
  1390. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +0 -50
  1391. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +0 -1
  1392. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +0 -159
  1393. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +0 -1
  1394. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +0 -50
  1395. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +0 -1
  1396. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +0 -185
  1397. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +0 -1
  1398. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +0 -12
  1399. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +0 -1
  1400. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +0 -23
  1401. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +0 -1
  1402. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +0 -19
  1403. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +0 -1
  1404. package/node_modules/@earendil-works/omk-tui/dist/components/text.js +0 -89
  1405. package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +0 -1
  1406. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +0 -13
  1407. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +0 -1
  1408. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +0 -51
  1409. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +0 -1
  1410. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +0 -39
  1411. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +0 -1
  1412. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +0 -2
  1413. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +0 -1
  1414. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +0 -16
  1415. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +0 -1
  1416. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +0 -110
  1417. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +0 -1
  1418. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +0 -23
  1419. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +0 -1
  1420. package/node_modules/@earendil-works/omk-tui/dist/index.js +0 -32
  1421. package/node_modules/@earendil-works/omk-tui/dist/index.js.map +0 -1
  1422. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +0 -212
  1423. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +0 -1
  1424. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +0 -252
  1425. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +0 -1
  1426. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +0 -184
  1427. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +0 -1
  1428. package/node_modules/@earendil-works/omk-tui/dist/keys.js +0 -1173
  1429. package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +0 -1
  1430. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +0 -28
  1431. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +0 -1
  1432. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +0 -44
  1433. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +0 -1
  1434. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +0 -3
  1435. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +0 -1
  1436. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +0 -53
  1437. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +0 -1
  1438. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +0 -50
  1439. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +0 -1
  1440. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +0 -361
  1441. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +0 -1
  1442. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +0 -90
  1443. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +0 -1
  1444. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +0 -366
  1445. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +0 -1
  1446. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +0 -113
  1447. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +0 -1
  1448. package/node_modules/@earendil-works/omk-tui/dist/terminal.js +0 -472
  1449. package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +0 -1
  1450. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +0 -242
  1451. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +0 -1
  1452. package/node_modules/@earendil-works/omk-tui/dist/tui.js +0 -1221
  1453. package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +0 -1
  1454. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +0 -17
  1455. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +0 -1
  1456. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +0 -25
  1457. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +0 -1
  1458. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +0 -84
  1459. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +0 -1
  1460. package/node_modules/@earendil-works/omk-tui/dist/utils.js +0 -1032
  1461. package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +0 -1
  1462. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +0 -25
  1463. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +0 -1
  1464. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +0 -96
  1465. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +0 -1
  1466. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  1467. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  1468. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  1469. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  1470. package/node_modules/@earendil-works/omk-tui/package.json +0 -47
@@ -0,0 +1,352 @@
1
+ const TOKEN_STOP_WORDS = new Set([
2
+ "a",
3
+ "an",
4
+ "and",
5
+ "are",
6
+ "as",
7
+ "for",
8
+ "in",
9
+ "inside",
10
+ "is",
11
+ "of",
12
+ "on",
13
+ "or",
14
+ "the",
15
+ "to",
16
+ "with",
17
+ ]);
18
+ export function evaluateLoopSafetyGates(definition, state, item, evidence) {
19
+ const diagnostics = [];
20
+ if (state.killSwitch) {
21
+ diagnostics.push({ code: "loop-kill-switch", message: "Loop kill switch is active." });
22
+ }
23
+ if (state.status === "paused" || state.status === "retired") {
24
+ diagnostics.push({ code: "loop-not-active", message: `Loop status ${state.status} cannot take action.` });
25
+ }
26
+ if (item.attemptCount >= definition.budget.maxAttemptsPerItem) {
27
+ diagnostics.push({
28
+ code: "max-attempts-exceeded",
29
+ message: `Item ${item.id} reached maxAttemptsPerItem=${definition.budget.maxAttemptsPerItem}.`,
30
+ });
31
+ }
32
+ if (!evidence.writeScope) {
33
+ diagnostics.push({ code: "write-scope-missing", message: "Exact writeScope evidence is required." });
34
+ }
35
+ else {
36
+ diagnostics.push(...validateLoopWriteScope(definition, evidence.writeScope).diagnostics);
37
+ diagnostics.push(...validateRequestedWriteScopeDoesNotOverlapDenied(definition, evidence.writeScope));
38
+ }
39
+ if (evidence.writeScope && evidence.changedFiles) {
40
+ diagnostics.push(...validateChangedFilesWithinRequestedScope(evidence.writeScope, evidence.changedFiles));
41
+ }
42
+ if (requiresWorktreeIsolation(definition)) {
43
+ diagnostics.push(...validateWorktreeEvidence(definition, evidence.worktree));
44
+ }
45
+ if (definition.durableState?.requireReplayableEvidence === true) {
46
+ diagnostics.push(...validateDurableStateEvidence(evidence.durableState));
47
+ }
48
+ if (requiresHumanApproval(definition, item)) {
49
+ const approvalRef = evidence.humanGate?.approvalRef?.trim();
50
+ const approvalRefSatisfied = definition.humanGates?.approvalRefsRequired === false || Boolean(approvalRef);
51
+ if (evidence.humanGate?.approved !== true || !approvalRefSatisfied) {
52
+ diagnostics.push({
53
+ code: "human-gate-required",
54
+ message: "High-risk work item requires human approval evidence.",
55
+ });
56
+ }
57
+ }
58
+ if (!hasEvidenceRefs(evidence.evidenceRefs)) {
59
+ diagnostics.push({ code: "evidence-refs-missing", message: "Completion evidenceRefs are required." });
60
+ }
61
+ if (requiresIndependentVerifier(definition)) {
62
+ diagnostics.push(...validateIndependentVerifier(evidence.verifier));
63
+ }
64
+ return safetyGateResult(diagnostics);
65
+ }
66
+ export function calculateLoopDriftScore(definition, item) {
67
+ const itemTokens = tokenize([item.title, item.sourceRef, item.actingOn].join(" "));
68
+ const objectiveTokens = tokenize(definition.objective);
69
+ const objectiveOverlap = overlapRatio(itemTokens, objectiveTokens);
70
+ const nonGoalOverlap = Math.max(0, ...definition.nonGoals.map((nonGoal) => overlapRatio(itemTokens, tokenize(nonGoal))));
71
+ const scopeMatched = matchesWatchedScope(definition, item);
72
+ let score = 0.45;
73
+ score -= objectiveOverlap * 0.25;
74
+ score += objectiveOverlap === 0 ? 0.2 : 0;
75
+ score += scopeMatched ? -0.2 : 0.2;
76
+ score += nonGoalOverlap * 0.7;
77
+ return clamp01(score);
78
+ }
79
+ export function validateLoopWriteScope(definition, paths) {
80
+ const diagnostics = [];
81
+ if (paths.length === 0 && (definition.level === "L2" || definition.level === "L3")) {
82
+ diagnostics.push({
83
+ code: "write-scope-empty",
84
+ message: `${definition.level} loops require explicit write paths.`,
85
+ });
86
+ }
87
+ if (definition.safety.maxWriteScopeCount !== undefined && paths.length > definition.safety.maxWriteScopeCount) {
88
+ diagnostics.push({
89
+ code: "write-scope-count-exceeded",
90
+ message: `Write scope count ${paths.length} exceeds maxWriteScopeCount=${definition.safety.maxWriteScopeCount}.`,
91
+ });
92
+ }
93
+ for (const path of paths) {
94
+ const normalizedPath = normalizePath(path);
95
+ if (!normalizedPath) {
96
+ diagnostics.push({ code: "write-scope-empty-path", message: "Write scope contains an empty path." });
97
+ continue;
98
+ }
99
+ if (!matchesAnyScope(normalizedPath, definition.safety.allowedWriteScopes)) {
100
+ diagnostics.push({
101
+ code: "write-scope-outside-allowed",
102
+ message: `Path ${normalizedPath} is outside allowedWriteScopes.`,
103
+ path: normalizedPath,
104
+ });
105
+ }
106
+ if (matchesAnyScope(normalizedPath, definition.safety.deniedWriteScopes ?? [])) {
107
+ diagnostics.push({
108
+ code: "write-scope-denied",
109
+ message: `Path ${normalizedPath} is inside deniedWriteScopes.`,
110
+ path: normalizedPath,
111
+ });
112
+ }
113
+ }
114
+ return { passed: diagnostics.length === 0, diagnostics };
115
+ }
116
+ function safetyGateResult(diagnostics) {
117
+ if (diagnostics.length === 0) {
118
+ return { passed: true, action: "allow", diagnostics: [] };
119
+ }
120
+ if (hasDiagnostic(diagnostics, "loop-kill-switch")) {
121
+ return { passed: false, action: "block", outcome: "killed", diagnostics };
122
+ }
123
+ if (hasDiagnostic(diagnostics, "max-attempts-exceeded")) {
124
+ return { passed: false, action: "escalate", outcome: "escalated", diagnostics };
125
+ }
126
+ if (hasDiagnostic(diagnostics, "human-gate-required")) {
127
+ return { passed: false, action: "human-gate", outcome: "escalated", diagnostics };
128
+ }
129
+ return { passed: false, action: "block", outcome: "verifier-failed", diagnostics };
130
+ }
131
+ function hasDiagnostic(diagnostics, code) {
132
+ return diagnostics.some((diagnostic) => diagnostic.code === code);
133
+ }
134
+ function requiresIndependentVerifier(definition) {
135
+ return definition.level === "L2" || definition.level === "L3" || definition.safety.requireIndependentVerifier;
136
+ }
137
+ function validateIndependentVerifier(verifier) {
138
+ if (!verifier) {
139
+ return [{ code: "independent-verifier-required", message: "L2/L3 actions require an independent verifier." }];
140
+ }
141
+ const diagnostics = [];
142
+ const sameActor = Boolean(verifier.verifierId && verifier.implementerId && verifier.verifierId.trim() === verifier.implementerId.trim());
143
+ if (!verifier.independent || sameActor) {
144
+ diagnostics.push({ code: "independent-verifier-required", message: "Verifier must be independent." });
145
+ }
146
+ if (verifier.status && verifier.status !== "pass") {
147
+ diagnostics.push({ code: "verifier-failed", message: `Verifier status is ${verifier.status}.` });
148
+ }
149
+ if (!hasEvidenceRefs(verifier.evidenceRefs)) {
150
+ diagnostics.push({ code: "verifier-evidence-missing", message: "Verifier evidenceRefs are required." });
151
+ }
152
+ return diagnostics;
153
+ }
154
+ function requiresWorktreeIsolation(definition) {
155
+ return definition.worktree?.mode === "per-run" || definition.worktree?.mode === "per-item";
156
+ }
157
+ function validateWorktreeEvidence(definition, worktree) {
158
+ if (!worktree) {
159
+ return [
160
+ {
161
+ code: "worktree-isolation-required",
162
+ message: "Isolated loop actions require worktree evidence.",
163
+ },
164
+ ];
165
+ }
166
+ const diagnostics = [];
167
+ if (worktree.isolated !== true) {
168
+ diagnostics.push({
169
+ code: "worktree-isolation-required",
170
+ message: "Loop worktree evidence must confirm isolation.",
171
+ });
172
+ }
173
+ if (!worktree.worktreeId?.trim()) {
174
+ diagnostics.push({
175
+ code: "worktree-id-required",
176
+ message: "Loop worktree evidence must include a worktreeId.",
177
+ });
178
+ }
179
+ if (definition.worktree?.requireCleanCheckout === true && worktree.cleanCheckout !== true) {
180
+ diagnostics.push({
181
+ code: "worktree-clean-checkout-required",
182
+ message: "Loop worktree must start from a clean checkout.",
183
+ });
184
+ }
185
+ const branchPrefix = definition.worktree?.branchPrefix;
186
+ if (branchPrefix &&
187
+ worktree.branch &&
188
+ !pathHasScopePrefix(normalizePath(worktree.branch), normalizePath(branchPrefix))) {
189
+ diagnostics.push({
190
+ code: "worktree-branch-prefix-mismatch",
191
+ message: `Loop worktree branch must use prefix ${branchPrefix}.`,
192
+ path: worktree.branch,
193
+ });
194
+ }
195
+ return diagnostics;
196
+ }
197
+ function validateDurableStateEvidence(durableState) {
198
+ const diagnostics = [];
199
+ if (!durableState?.stateRevision?.trim()) {
200
+ diagnostics.push({
201
+ code: "state-revision-missing",
202
+ message: "Replayable loop actions require a stateRevision.",
203
+ });
204
+ }
205
+ if (!durableState?.runLogRef?.trim()) {
206
+ diagnostics.push({
207
+ code: "run-log-ref-missing",
208
+ message: "Replayable loop actions require a runLogRef.",
209
+ });
210
+ }
211
+ if (!durableState?.budgetReservationId?.trim()) {
212
+ diagnostics.push({
213
+ code: "budget-reservation-missing",
214
+ message: "Replayable loop actions require a budgetReservationId.",
215
+ });
216
+ }
217
+ return diagnostics;
218
+ }
219
+ function requiresHumanApproval(definition, item) {
220
+ const gatedRisks = definition.humanGates?.requiredForRisks;
221
+ if (gatedRisks !== undefined) {
222
+ return gatedRisks.includes(item.risk);
223
+ }
224
+ return definition.safety.requireHumanGateForHighRisk && item.risk === "high";
225
+ }
226
+ function validateRequestedWriteScopeDoesNotOverlapDenied(definition, requestedScopes) {
227
+ const deniedScopes = definition.safety.deniedWriteScopes ?? [];
228
+ const diagnostics = [];
229
+ for (const requestedScope of requestedScopes) {
230
+ const normalizedRequested = normalizePath(requestedScope);
231
+ if (!normalizedRequested) {
232
+ continue;
233
+ }
234
+ for (const deniedScope of deniedScopes) {
235
+ const normalizedDenied = normalizePath(deniedScope);
236
+ if (normalizedDenied && scopesOverlap(normalizedRequested, normalizedDenied)) {
237
+ diagnostics.push({
238
+ code: "write-scope-denied-overlap",
239
+ message: `Requested writeScope ${normalizedRequested} overlaps deniedWriteScope ${normalizedDenied}.`,
240
+ path: normalizedRequested,
241
+ });
242
+ }
243
+ }
244
+ }
245
+ return diagnostics;
246
+ }
247
+ function validateChangedFilesWithinRequestedScope(writeScope, changedFiles) {
248
+ const diagnostics = [];
249
+ for (const changedFile of changedFiles) {
250
+ const normalizedFile = normalizePath(changedFile);
251
+ if (!normalizedFile) {
252
+ continue;
253
+ }
254
+ if (!matchesAnyScope(normalizedFile, writeScope)) {
255
+ diagnostics.push({
256
+ code: "changed-file-outside-write-scope",
257
+ message: `Changed file ${normalizedFile} is outside the requested writeScope.`,
258
+ path: normalizedFile,
259
+ });
260
+ }
261
+ }
262
+ return diagnostics;
263
+ }
264
+ function hasEvidenceRefs(refs) {
265
+ return Boolean(refs?.some((ref) => ref.trim().length > 0));
266
+ }
267
+ function matchesWatchedScope(definition, item) {
268
+ const haystack = normalizePath([item.actingOn, item.sourceRef, item.title].join(" "));
269
+ const watchedPaths = definition.watchedScope.paths ?? [];
270
+ if (watchedPaths.some((scope) => pathHasScopePrefix(normalizePath(item.actingOn), normalizePath(scope)))) {
271
+ return true;
272
+ }
273
+ const watchedTickets = definition.watchedScope.tickets ?? [];
274
+ if (watchedTickets.some((ticket) => haystack.includes(normalizePath(ticket)))) {
275
+ return true;
276
+ }
277
+ const watchedBranches = definition.watchedScope.branches ?? [];
278
+ if (watchedBranches.some((branch) => haystack.includes(normalizePath(branch)))) {
279
+ return true;
280
+ }
281
+ return definition.watchedScope.repos.some((repo) => haystack.includes(normalizePath(repo)));
282
+ }
283
+ function tokenize(text) {
284
+ const matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? [];
285
+ return new Set(matches.filter((token) => token.length > 1 && !TOKEN_STOP_WORDS.has(token)));
286
+ }
287
+ function overlapRatio(source, target) {
288
+ if (target.size === 0) {
289
+ return 0;
290
+ }
291
+ let overlap = 0;
292
+ for (const token of target) {
293
+ if (source.has(token)) {
294
+ overlap++;
295
+ }
296
+ }
297
+ return overlap / target.size;
298
+ }
299
+ function clamp01(value) {
300
+ if (value < 0) {
301
+ return 0;
302
+ }
303
+ if (value > 1) {
304
+ return 1;
305
+ }
306
+ return value;
307
+ }
308
+ function matchesAnyScope(path, scopes) {
309
+ return scopes.some((scope) => scopeMatchesPath(path, scope));
310
+ }
311
+ function scopesOverlap(first, second) {
312
+ return scopeMatchesPath(first, second) || scopeMatchesPath(second, first);
313
+ }
314
+ function scopeMatchesPath(path, scope) {
315
+ const normalizedPath = normalizePath(path);
316
+ const normalizedScope = normalizePath(scope);
317
+ if (!normalizedPath || !normalizedScope) {
318
+ return false;
319
+ }
320
+ if (normalizedScope.includes("*")) {
321
+ return globToRegExp(normalizedScope).test(normalizedPath);
322
+ }
323
+ return pathHasScopePrefix(normalizedPath, normalizedScope);
324
+ }
325
+ function pathHasScopePrefix(path, scope) {
326
+ return path === scope || path.startsWith(`${scope}/`);
327
+ }
328
+ function normalizePath(path) {
329
+ return path.trim().replace(/\\/g, "/").replace(/\/+/g, "/").replace(/^\.\//, "").replace(/\/$/, "");
330
+ }
331
+ function globToRegExp(glob) {
332
+ let pattern = "^";
333
+ for (let index = 0; index < glob.length; index++) {
334
+ const char = glob[index];
335
+ const nextChar = glob[index + 1];
336
+ if (char === "*" && nextChar === "*") {
337
+ pattern += ".*";
338
+ index++;
339
+ }
340
+ else if (char === "*") {
341
+ pattern += "[^/]*";
342
+ }
343
+ else {
344
+ pattern += escapeRegExp(char);
345
+ }
346
+ }
347
+ return new RegExp(`${pattern}$`);
348
+ }
349
+ function escapeRegExp(char) {
350
+ return char.replace(/[|\\{}()[\]^$+?.]/g, "\\$&");
351
+ }
352
+ //# sourceMappingURL=loop-gates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-gates.js","sourceRoot":"","sources":["../../src/core/loop-gates.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tLoopDefinition,\n\tLoopRunOutcome,\n\tLoopState,\n\tLoopValidationDiagnostic,\n\tLoopWorkItem,\n} from \"./loop-types.ts\";\n\nexport type LoopGateAction = \"allow\" | \"block\" | \"human-gate\" | \"escalate\";\n\nexport type LoopVerifierStatus = \"pass\" | \"fail\" | \"blocked\";\n\nexport interface LoopVerifierEvidence {\n\treadonly independent: boolean;\n\treadonly status?: LoopVerifierStatus;\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifierId?: string;\n\treadonly implementerId?: string;\n}\n\nexport interface LoopHumanGateEvidence {\n\treadonly approved: boolean;\n\treadonly approvalRef?: string;\n}\n\nexport interface LoopWorktreeEvidence {\n\treadonly isolated: boolean;\n\treadonly worktreeId?: string;\n\treadonly branch?: string;\n\treadonly cleanCheckout?: boolean;\n}\n\nexport interface LoopDurableStateEvidence {\n\treadonly stateRevision?: string;\n\treadonly runLogRef?: string;\n\treadonly budgetReservationId?: string;\n}\n\nexport interface LoopGateEvidence {\n\treadonly writeScope?: readonly string[];\n\treadonly changedFiles?: readonly string[];\n\treadonly evidenceRefs?: readonly string[];\n\treadonly verifier?: LoopVerifierEvidence;\n\treadonly humanGate?: LoopHumanGateEvidence;\n\treadonly worktree?: LoopWorktreeEvidence;\n\treadonly durableState?: LoopDurableStateEvidence;\n}\n\nexport interface LoopSafetyGateResult {\n\treadonly passed: boolean;\n\treadonly action: LoopGateAction;\n\treadonly outcome?: LoopRunOutcome;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nexport interface LoopWriteScopeValidationResult {\n\treadonly passed: boolean;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nconst TOKEN_STOP_WORDS = new Set([\n\t\"a\",\n\t\"an\",\n\t\"and\",\n\t\"are\",\n\t\"as\",\n\t\"for\",\n\t\"in\",\n\t\"inside\",\n\t\"is\",\n\t\"of\",\n\t\"on\",\n\t\"or\",\n\t\"the\",\n\t\"to\",\n\t\"with\",\n]);\n\nexport function evaluateLoopSafetyGates(\n\tdefinition: LoopDefinition,\n\tstate: LoopState,\n\titem: LoopWorkItem,\n\tevidence: LoopGateEvidence,\n): LoopSafetyGateResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (state.killSwitch) {\n\t\tdiagnostics.push({ code: \"loop-kill-switch\", message: \"Loop kill switch is active.\" });\n\t}\n\tif (state.status === \"paused\" || state.status === \"retired\") {\n\t\tdiagnostics.push({ code: \"loop-not-active\", message: `Loop status ${state.status} cannot take action.` });\n\t}\n\n\tif (item.attemptCount >= definition.budget.maxAttemptsPerItem) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"max-attempts-exceeded\",\n\t\t\tmessage: `Item ${item.id} reached maxAttemptsPerItem=${definition.budget.maxAttemptsPerItem}.`,\n\t\t});\n\t}\n\n\tif (!evidence.writeScope) {\n\t\tdiagnostics.push({ code: \"write-scope-missing\", message: \"Exact writeScope evidence is required.\" });\n\t} else {\n\t\tdiagnostics.push(...validateLoopWriteScope(definition, evidence.writeScope).diagnostics);\n\t\tdiagnostics.push(...validateRequestedWriteScopeDoesNotOverlapDenied(definition, evidence.writeScope));\n\t}\n\n\tif (evidence.writeScope && evidence.changedFiles) {\n\t\tdiagnostics.push(...validateChangedFilesWithinRequestedScope(evidence.writeScope, evidence.changedFiles));\n\t}\n\n\tif (requiresWorktreeIsolation(definition)) {\n\t\tdiagnostics.push(...validateWorktreeEvidence(definition, evidence.worktree));\n\t}\n\n\tif (definition.durableState?.requireReplayableEvidence === true) {\n\t\tdiagnostics.push(...validateDurableStateEvidence(evidence.durableState));\n\t}\n\n\tif (requiresHumanApproval(definition, item)) {\n\t\tconst approvalRef = evidence.humanGate?.approvalRef?.trim();\n\t\tconst approvalRefSatisfied = definition.humanGates?.approvalRefsRequired === false || Boolean(approvalRef);\n\t\tif (evidence.humanGate?.approved !== true || !approvalRefSatisfied) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"human-gate-required\",\n\t\t\t\tmessage: \"High-risk work item requires human approval evidence.\",\n\t\t\t});\n\t\t}\n\t}\n\n\tif (!hasEvidenceRefs(evidence.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"evidence-refs-missing\", message: \"Completion evidenceRefs are required.\" });\n\t}\n\n\tif (requiresIndependentVerifier(definition)) {\n\t\tdiagnostics.push(...validateIndependentVerifier(evidence.verifier));\n\t}\n\n\treturn safetyGateResult(diagnostics);\n}\n\nexport function calculateLoopDriftScore(definition: LoopDefinition, item: LoopWorkItem): number {\n\tconst itemTokens = tokenize([item.title, item.sourceRef, item.actingOn].join(\" \"));\n\tconst objectiveTokens = tokenize(definition.objective);\n\tconst objectiveOverlap = overlapRatio(itemTokens, objectiveTokens);\n\tconst nonGoalOverlap = Math.max(\n\t\t0,\n\t\t...definition.nonGoals.map((nonGoal) => overlapRatio(itemTokens, tokenize(nonGoal))),\n\t);\n\tconst scopeMatched = matchesWatchedScope(definition, item);\n\n\tlet score = 0.45;\n\tscore -= objectiveOverlap * 0.25;\n\tscore += objectiveOverlap === 0 ? 0.2 : 0;\n\tscore += scopeMatched ? -0.2 : 0.2;\n\tscore += nonGoalOverlap * 0.7;\n\n\treturn clamp01(score);\n}\n\nexport function validateLoopWriteScope(\n\tdefinition: LoopDefinition,\n\tpaths: readonly string[],\n): LoopWriteScopeValidationResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (paths.length === 0 && (definition.level === \"L2\" || definition.level === \"L3\")) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-empty\",\n\t\t\tmessage: `${definition.level} loops require explicit write paths.`,\n\t\t});\n\t}\n\n\tif (definition.safety.maxWriteScopeCount !== undefined && paths.length > definition.safety.maxWriteScopeCount) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"write-scope-count-exceeded\",\n\t\t\tmessage: `Write scope count ${paths.length} exceeds maxWriteScopeCount=${definition.safety.maxWriteScopeCount}.`,\n\t\t});\n\t}\n\n\tfor (const path of paths) {\n\t\tconst normalizedPath = normalizePath(path);\n\t\tif (!normalizedPath) {\n\t\t\tdiagnostics.push({ code: \"write-scope-empty-path\", message: \"Write scope contains an empty path.\" });\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedPath, definition.safety.allowedWriteScopes)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-outside-allowed\",\n\t\t\t\tmessage: `Path ${normalizedPath} is outside allowedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t\tif (matchesAnyScope(normalizedPath, definition.safety.deniedWriteScopes ?? [])) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"write-scope-denied\",\n\t\t\t\tmessage: `Path ${normalizedPath} is inside deniedWriteScopes.`,\n\t\t\t\tpath: normalizedPath,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { passed: diagnostics.length === 0, diagnostics };\n}\n\nfunction safetyGateResult(diagnostics: readonly LoopValidationDiagnostic[]): LoopSafetyGateResult {\n\tif (diagnostics.length === 0) {\n\t\treturn { passed: true, action: \"allow\", diagnostics: [] };\n\t}\n\n\tif (hasDiagnostic(diagnostics, \"loop-kill-switch\")) {\n\t\treturn { passed: false, action: \"block\", outcome: \"killed\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"max-attempts-exceeded\")) {\n\t\treturn { passed: false, action: \"escalate\", outcome: \"escalated\", diagnostics };\n\t}\n\tif (hasDiagnostic(diagnostics, \"human-gate-required\")) {\n\t\treturn { passed: false, action: \"human-gate\", outcome: \"escalated\", diagnostics };\n\t}\n\treturn { passed: false, action: \"block\", outcome: \"verifier-failed\", diagnostics };\n}\n\nfunction hasDiagnostic(diagnostics: readonly LoopValidationDiagnostic[], code: string): boolean {\n\treturn diagnostics.some((diagnostic) => diagnostic.code === code);\n}\n\nfunction requiresIndependentVerifier(definition: LoopDefinition): boolean {\n\treturn definition.level === \"L2\" || definition.level === \"L3\" || definition.safety.requireIndependentVerifier;\n}\n\nfunction validateIndependentVerifier(verifier: LoopVerifierEvidence | undefined): LoopValidationDiagnostic[] {\n\tif (!verifier) {\n\t\treturn [{ code: \"independent-verifier-required\", message: \"L2/L3 actions require an independent verifier.\" }];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tconst sameActor = Boolean(\n\t\tverifier.verifierId && verifier.implementerId && verifier.verifierId.trim() === verifier.implementerId.trim(),\n\t);\n\tif (!verifier.independent || sameActor) {\n\t\tdiagnostics.push({ code: \"independent-verifier-required\", message: \"Verifier must be independent.\" });\n\t}\n\tif (verifier.status && verifier.status !== \"pass\") {\n\t\tdiagnostics.push({ code: \"verifier-failed\", message: `Verifier status is ${verifier.status}.` });\n\t}\n\tif (!hasEvidenceRefs(verifier.evidenceRefs)) {\n\t\tdiagnostics.push({ code: \"verifier-evidence-missing\", message: \"Verifier evidenceRefs are required.\" });\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresWorktreeIsolation(definition: LoopDefinition): boolean {\n\treturn definition.worktree?.mode === \"per-run\" || definition.worktree?.mode === \"per-item\";\n}\n\nfunction validateWorktreeEvidence(\n\tdefinition: LoopDefinition,\n\tworktree: LoopWorktreeEvidence | undefined,\n): LoopValidationDiagnostic[] {\n\tif (!worktree) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tcode: \"worktree-isolation-required\",\n\t\t\t\tmessage: \"Isolated loop actions require worktree evidence.\",\n\t\t\t},\n\t\t];\n\t}\n\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (worktree.isolated !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-isolation-required\",\n\t\t\tmessage: \"Loop worktree evidence must confirm isolation.\",\n\t\t});\n\t}\n\tif (!worktree.worktreeId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-id-required\",\n\t\t\tmessage: \"Loop worktree evidence must include a worktreeId.\",\n\t\t});\n\t}\n\tif (definition.worktree?.requireCleanCheckout === true && worktree.cleanCheckout !== true) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-clean-checkout-required\",\n\t\t\tmessage: \"Loop worktree must start from a clean checkout.\",\n\t\t});\n\t}\n\tconst branchPrefix = definition.worktree?.branchPrefix;\n\tif (\n\t\tbranchPrefix &&\n\t\tworktree.branch &&\n\t\t!pathHasScopePrefix(normalizePath(worktree.branch), normalizePath(branchPrefix))\n\t) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-branch-prefix-mismatch\",\n\t\t\tmessage: `Loop worktree branch must use prefix ${branchPrefix}.`,\n\t\t\tpath: worktree.branch,\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction validateDurableStateEvidence(durableState: LoopDurableStateEvidence | undefined): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (!durableState?.stateRevision?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"state-revision-missing\",\n\t\t\tmessage: \"Replayable loop actions require a stateRevision.\",\n\t\t});\n\t}\n\tif (!durableState?.runLogRef?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"run-log-ref-missing\",\n\t\t\tmessage: \"Replayable loop actions require a runLogRef.\",\n\t\t});\n\t}\n\tif (!durableState?.budgetReservationId?.trim()) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"budget-reservation-missing\",\n\t\t\tmessage: \"Replayable loop actions require a budgetReservationId.\",\n\t\t});\n\t}\n\treturn diagnostics;\n}\n\nfunction requiresHumanApproval(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst gatedRisks = definition.humanGates?.requiredForRisks;\n\tif (gatedRisks !== undefined) {\n\t\treturn gatedRisks.includes(item.risk);\n\t}\n\treturn definition.safety.requireHumanGateForHighRisk && item.risk === \"high\";\n}\n\nfunction validateRequestedWriteScopeDoesNotOverlapDenied(\n\tdefinition: LoopDefinition,\n\trequestedScopes: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst deniedScopes = definition.safety.deniedWriteScopes ?? [];\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const requestedScope of requestedScopes) {\n\t\tconst normalizedRequested = normalizePath(requestedScope);\n\t\tif (!normalizedRequested) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const deniedScope of deniedScopes) {\n\t\t\tconst normalizedDenied = normalizePath(deniedScope);\n\t\t\tif (normalizedDenied && scopesOverlap(normalizedRequested, normalizedDenied)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tcode: \"write-scope-denied-overlap\",\n\t\t\t\t\tmessage: `Requested writeScope ${normalizedRequested} overlaps deniedWriteScope ${normalizedDenied}.`,\n\t\t\t\t\tpath: normalizedRequested,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction validateChangedFilesWithinRequestedScope(\n\twriteScope: readonly string[],\n\tchangedFiles: readonly string[],\n): LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tfor (const changedFile of changedFiles) {\n\t\tconst normalizedFile = normalizePath(changedFile);\n\t\tif (!normalizedFile) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (!matchesAnyScope(normalizedFile, writeScope)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"changed-file-outside-write-scope\",\n\t\t\t\tmessage: `Changed file ${normalizedFile} is outside the requested writeScope.`,\n\t\t\t\tpath: normalizedFile,\n\t\t\t});\n\t\t}\n\t}\n\treturn diagnostics;\n}\n\nfunction hasEvidenceRefs(refs: readonly string[] | undefined): boolean {\n\treturn Boolean(refs?.some((ref) => ref.trim().length > 0));\n}\n\nfunction matchesWatchedScope(definition: LoopDefinition, item: LoopWorkItem): boolean {\n\tconst haystack = normalizePath([item.actingOn, item.sourceRef, item.title].join(\" \"));\n\tconst watchedPaths = definition.watchedScope.paths ?? [];\n\tif (watchedPaths.some((scope) => pathHasScopePrefix(normalizePath(item.actingOn), normalizePath(scope)))) {\n\t\treturn true;\n\t}\n\tconst watchedTickets = definition.watchedScope.tickets ?? [];\n\tif (watchedTickets.some((ticket) => haystack.includes(normalizePath(ticket)))) {\n\t\treturn true;\n\t}\n\tconst watchedBranches = definition.watchedScope.branches ?? [];\n\tif (watchedBranches.some((branch) => haystack.includes(normalizePath(branch)))) {\n\t\treturn true;\n\t}\n\treturn definition.watchedScope.repos.some((repo) => haystack.includes(normalizePath(repo)));\n}\n\nfunction tokenize(text: string): Set<string> {\n\tconst matches = text.toLowerCase().match(/[a-z0-9][a-z0-9_-]*/g) ?? [];\n\treturn new Set(matches.filter((token) => token.length > 1 && !TOKEN_STOP_WORDS.has(token)));\n}\n\nfunction overlapRatio(source: Set<string>, target: Set<string>): number {\n\tif (target.size === 0) {\n\t\treturn 0;\n\t}\n\tlet overlap = 0;\n\tfor (const token of target) {\n\t\tif (source.has(token)) {\n\t\t\toverlap++;\n\t\t}\n\t}\n\treturn overlap / target.size;\n}\n\nfunction clamp01(value: number): number {\n\tif (value < 0) {\n\t\treturn 0;\n\t}\n\tif (value > 1) {\n\t\treturn 1;\n\t}\n\treturn value;\n}\n\nfunction matchesAnyScope(path: string, scopes: readonly string[]): boolean {\n\treturn scopes.some((scope) => scopeMatchesPath(path, scope));\n}\n\nfunction scopesOverlap(first: string, second: string): boolean {\n\treturn scopeMatchesPath(first, second) || scopeMatchesPath(second, first);\n}\n\nfunction scopeMatchesPath(path: string, scope: string): boolean {\n\tconst normalizedPath = normalizePath(path);\n\tconst normalizedScope = normalizePath(scope);\n\tif (!normalizedPath || !normalizedScope) {\n\t\treturn false;\n\t}\n\tif (normalizedScope.includes(\"*\")) {\n\t\treturn globToRegExp(normalizedScope).test(normalizedPath);\n\t}\n\treturn pathHasScopePrefix(normalizedPath, normalizedScope);\n}\n\nfunction pathHasScopePrefix(path: string, scope: string): boolean {\n\treturn path === scope || path.startsWith(`${scope}/`);\n}\n\nfunction normalizePath(path: string): string {\n\treturn path.trim().replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\.\\//, \"\").replace(/\\/$/, \"\");\n}\n\nfunction globToRegExp(glob: string): RegExp {\n\tlet pattern = \"^\";\n\tfor (let index = 0; index < glob.length; index++) {\n\t\tconst char = glob[index];\n\t\tconst nextChar = glob[index + 1];\n\t\tif (char === \"*\" && nextChar === \"*\") {\n\t\t\tpattern += \".*\";\n\t\t\tindex++;\n\t\t} else if (char === \"*\") {\n\t\t\tpattern += \"[^/]*\";\n\t\t} else {\n\t\t\tpattern += escapeRegExp(char);\n\t\t}\n\t}\n\treturn new RegExp(`${pattern}$`);\n}\n\nfunction escapeRegExp(char: string): string {\n\treturn char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import type { LoopBudgetPolicy, LoopConnectorBinding, LoopDefinition, LoopDurableStatePolicy, LoopHumanGatePolicy, LoopLevel, LoopSafetyPolicy, LoopSchedulePolicy, LoopSkillBinding, LoopSubagentPolicy, LoopValidationDiagnostic, LoopWatchedScope, LoopWorktreeIsolationPolicy } from "./loop-types.ts";
2
+ export type LoopPatternRisk = "low" | "medium" | "high";
3
+ export type LoopPatternTool = "grok" | "claude-code" | "codex" | "github-actions" | "cursor" | "windsurf" | "aider";
4
+ export type LoopPatternTokenCost = "low" | "medium" | "high" | "very-high";
5
+ export interface LoopPatternCost {
6
+ readonly tokensNoop?: number;
7
+ readonly tokensReport?: number;
8
+ readonly tokensAction?: number;
9
+ readonly suggestedDailyCap?: number;
10
+ readonly earlyExitRequired?: boolean;
11
+ readonly tokens_noop?: number;
12
+ readonly tokens_report?: number;
13
+ readonly tokens_action?: number;
14
+ readonly suggested_daily_cap?: number;
15
+ readonly early_exit_required?: boolean;
16
+ }
17
+ export interface LoopPatternRegistryEntry {
18
+ readonly id: string;
19
+ readonly name: string;
20
+ readonly file: string;
21
+ readonly goal: string;
22
+ readonly cadence: string;
23
+ readonly risk: LoopPatternRisk;
24
+ readonly tools: readonly LoopPatternTool[];
25
+ readonly skills: readonly string[];
26
+ readonly state: string;
27
+ readonly phases: readonly string[];
28
+ readonly humanGates?: readonly string[];
29
+ readonly human_gates?: readonly string[];
30
+ readonly starter: string;
31
+ readonly weekOneMode?: LoopLevel;
32
+ readonly week_one_mode?: LoopLevel;
33
+ readonly tokenCost?: LoopPatternTokenCost;
34
+ readonly token_cost?: LoopPatternTokenCost;
35
+ readonly cost: LoopPatternCost;
36
+ readonly nonGoals?: readonly string[];
37
+ readonly non_goals?: readonly string[];
38
+ readonly triggerKeywords?: readonly string[];
39
+ readonly trigger_keywords?: readonly string[];
40
+ readonly skillTriggers?: Readonly<Record<string, readonly string[]>>;
41
+ readonly skill_triggers?: Readonly<Record<string, readonly string[]>>;
42
+ readonly connectors?: readonly LoopConnectorBinding[];
43
+ readonly worktree?: Partial<LoopWorktreeIsolationPolicy>;
44
+ readonly subagents?: Partial<LoopSubagentPolicy>;
45
+ readonly durableState?: Partial<LoopDurableStatePolicy>;
46
+ readonly durable_state?: Partial<LoopDurableStatePolicy>;
47
+ readonly humanGatePolicy?: Partial<LoopHumanGatePolicy>;
48
+ readonly human_gate_policy?: Partial<LoopHumanGatePolicy>;
49
+ }
50
+ export interface LoopPatternRegistryValidationResult {
51
+ readonly valid: boolean;
52
+ readonly diagnostics: readonly LoopValidationDiagnostic[];
53
+ }
54
+ export interface CompileLoopDefinitionOptions {
55
+ readonly id?: string;
56
+ readonly repo: string;
57
+ readonly scope?: Partial<LoopWatchedScope>;
58
+ readonly level?: LoopLevel;
59
+ readonly statePath?: string;
60
+ readonly runLogPath?: string;
61
+ readonly allowedWriteScopes?: readonly string[];
62
+ readonly deniedWriteScopes?: readonly string[];
63
+ readonly budget?: Partial<LoopBudgetPolicy>;
64
+ readonly safety?: Partial<LoopSafetyPolicy>;
65
+ readonly schedule?: Partial<LoopSchedulePolicy>;
66
+ readonly worktree?: Partial<LoopWorktreeIsolationPolicy>;
67
+ readonly skills?: readonly LoopSkillBinding[];
68
+ readonly connectors?: readonly LoopConnectorBinding[];
69
+ readonly subagents?: Partial<LoopSubagentPolicy>;
70
+ readonly durableState?: Partial<LoopDurableStatePolicy>;
71
+ readonly humanGates?: Partial<LoopHumanGatePolicy>;
72
+ }
73
+ export declare const OMK_LOOP_SKELETONS: readonly LoopPatternRegistryEntry[];
74
+ export declare function validateLoopPatternRegistry(entries: readonly LoopPatternRegistryEntry[]): LoopPatternRegistryValidationResult;
75
+ export declare function compileLoopDefinitionFromPattern(entry: LoopPatternRegistryEntry, options: CompileLoopDefinitionOptions): LoopDefinition;
76
+ export declare function detectStarterDrift(entry: LoopPatternRegistryEntry, availableStarterIds: readonly string[]): LoopPatternRegistryValidationResult;
77
+ //# sourceMappingURL=loop-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-registry.d.ts","sourceRoot":"","sources":["../../src/core/loop-registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tLoopBudgetPolicy,\n\tLoopConnectorBinding,\n\tLoopDefinition,\n\tLoopDurableStatePolicy,\n\tLoopHumanGatePolicy,\n\tLoopLevel,\n\tLoopSafetyPolicy,\n\tLoopSchedulePolicy,\n\tLoopSkillBinding,\n\tLoopSubagentPolicy,\n\tLoopValidationDiagnostic,\n\tLoopWatchedScope,\n\tLoopWorktreeIsolationPolicy,\n} from \"./loop-types.ts\";\n\nexport type LoopPatternRisk = \"low\" | \"medium\" | \"high\";\n\nexport type LoopPatternTool = \"grok\" | \"claude-code\" | \"codex\" | \"github-actions\" | \"cursor\" | \"windsurf\" | \"aider\";\n\nexport type LoopPatternTokenCost = \"low\" | \"medium\" | \"high\" | \"very-high\";\n\nexport interface LoopPatternCost {\n\treadonly tokensNoop?: number;\n\treadonly tokensReport?: number;\n\treadonly tokensAction?: number;\n\treadonly suggestedDailyCap?: number;\n\treadonly earlyExitRequired?: boolean;\n\treadonly tokens_noop?: number;\n\treadonly tokens_report?: number;\n\treadonly tokens_action?: number;\n\treadonly suggested_daily_cap?: number;\n\treadonly early_exit_required?: boolean;\n}\n\nexport interface LoopPatternRegistryEntry {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly file: string;\n\treadonly goal: string;\n\treadonly cadence: string;\n\treadonly risk: LoopPatternRisk;\n\treadonly tools: readonly LoopPatternTool[];\n\treadonly skills: readonly string[];\n\treadonly state: string;\n\treadonly phases: readonly string[];\n\treadonly humanGates?: readonly string[];\n\treadonly human_gates?: readonly string[];\n\treadonly starter: string;\n\treadonly weekOneMode?: LoopLevel;\n\treadonly week_one_mode?: LoopLevel;\n\treadonly tokenCost?: LoopPatternTokenCost;\n\treadonly token_cost?: LoopPatternTokenCost;\n\treadonly cost: LoopPatternCost;\n\treadonly nonGoals?: readonly string[];\n\treadonly non_goals?: readonly string[];\n\treadonly triggerKeywords?: readonly string[];\n\treadonly trigger_keywords?: readonly string[];\n\treadonly skillTriggers?: Readonly<Record<string, readonly string[]>>;\n\treadonly skill_triggers?: Readonly<Record<string, readonly string[]>>;\n\treadonly connectors?: readonly LoopConnectorBinding[];\n\treadonly worktree?: Partial<LoopWorktreeIsolationPolicy>;\n\treadonly subagents?: Partial<LoopSubagentPolicy>;\n\treadonly durableState?: Partial<LoopDurableStatePolicy>;\n\treadonly durable_state?: Partial<LoopDurableStatePolicy>;\n\treadonly humanGatePolicy?: Partial<LoopHumanGatePolicy>;\n\treadonly human_gate_policy?: Partial<LoopHumanGatePolicy>;\n}\n\nexport interface LoopPatternRegistryValidationResult {\n\treadonly valid: boolean;\n\treadonly diagnostics: readonly LoopValidationDiagnostic[];\n}\n\nexport interface CompileLoopDefinitionOptions {\n\treadonly id?: string;\n\treadonly repo: string;\n\treadonly scope?: Partial<LoopWatchedScope>;\n\treadonly level?: LoopLevel;\n\treadonly statePath?: string;\n\treadonly runLogPath?: string;\n\treadonly allowedWriteScopes?: readonly string[];\n\treadonly deniedWriteScopes?: readonly string[];\n\treadonly budget?: Partial<LoopBudgetPolicy>;\n\treadonly safety?: Partial<LoopSafetyPolicy>;\n\treadonly schedule?: Partial<LoopSchedulePolicy>;\n\treadonly worktree?: Partial<LoopWorktreeIsolationPolicy>;\n\treadonly skills?: readonly LoopSkillBinding[];\n\treadonly connectors?: readonly LoopConnectorBinding[];\n\treadonly subagents?: Partial<LoopSubagentPolicy>;\n\treadonly durableState?: Partial<LoopDurableStatePolicy>;\n\treadonly humanGates?: Partial<LoopHumanGatePolicy>;\n}\n\ninterface NormalizedCost {\n\treadonly tokensNoop: number;\n\treadonly tokensReport: number;\n\treadonly tokensAction: number;\n\treadonly suggestedDailyCap: number;\n\treadonly earlyExitRequired: boolean;\n}\n\ninterface ParsedCadence {\n\treadonly shortestMinutes: number;\n}\n\nconst WARNING_DIAGNOSTIC_CODES = new Set([\"trigger-overlap\", \"ambiguous-skill-trigger\"]);\n\nconst DENIED_WRITE_SCOPES = [\"**/.env*\", \"**/*secret*\", \"**/*key*\"] as const;\nconst WORKTREE_ISOLATION_MODES: readonly string[] = [\"none\", \"per-run\", \"per-item\"];\nconst WORKTREE_CLEANUP_POLICIES: readonly string[] = [\"after-run\", \"after-merge\", \"manual\"];\nconst CONNECTOR_KINDS: readonly string[] = [\"mcp\", \"connector\"];\nconst CAPABILITY_ACCESS_MODES: readonly string[] = [\"required\", \"optional\"];\nconst SUBAGENT_ROLES: readonly string[] = [\"maker\", \"checker\", \"scout\", \"planner\"];\nconst WORK_ITEM_RISKS: readonly string[] = [\"low\", \"medium\", \"high\"];\n\nexport const OMK_LOOP_SKELETONS: readonly LoopPatternRegistryEntry[] = [\n\t{\n\t\tid: \"omk-daily-triage\",\n\t\tname: \"OMK Daily Triage\",\n\t\tfile: \"omk-daily-triage.md\",\n\t\tgoal: \"Scan CI, issues, PRs, and run state, then report prioritized loop work.\",\n\t\tcadence: \"1d\",\n\t\trisk: \"low\",\n\t\ttools: [\"codex\", \"github-actions\"],\n\t\tskills: [\"loop-triage\", \"evidence-summary\"],\n\t\tstate: \".omk/loops/omk-daily-triage/state.json\",\n\t\tphases: [\"scan\", \"rank\", \"report\", \"escalate\"],\n\t\thumanGates: [\"priority-change\", \"cross-repo-action\"],\n\t\tstarter: \"starters/omk-daily-triage\",\n\t\tweekOneMode: \"L1\",\n\t\ttokenCost: \"medium\",\n\t\tcost: {\n\t\t\ttokensNoop: 5_000,\n\t\t\ttokensReport: 40_000,\n\t\t\ttokensAction: 80_000,\n\t\t\tsuggestedDailyCap: 120_000,\n\t\t\tearlyExitRequired: true,\n\t\t},\n\t\tnonGoals: [\"write code\", \"open pull requests\", \"modify release state\"],\n\t\ttriggerKeywords: [\"daily triage\", \"morning scan\", \"status sweep\"],\n\t\tskillTriggers: {\n\t\t\t\"loop-triage\": [\"ci red\", \"stale pr\", \"untriaged issue\"],\n\t\t\t\"evidence-summary\": [\"run log\", \"state diff\"],\n\t\t},\n\t\tconnectors: [\n\t\t\t{\n\t\t\t\tid: \"github\",\n\t\t\t\tkind: \"connector\",\n\t\t\t\tpurpose: \"Read issues, pull requests, and workflow status.\",\n\t\t\t\taccess: \"required\",\n\t\t\t\ttools: [\"issues\", \"pull-requests\", \"actions\"],\n\t\t\t},\n\t\t],\n\t\tworktree: {\n\t\t\tmode: \"none\",\n\t\t\tcleanup: \"manual\",\n\t\t\trequireCleanCheckout: false,\n\t\t},\n\t\tsubagents: {\n\t\t\trequireMakerChecker: false,\n\t\t\tmakerRole: \"triage-reporter\",\n\t\t\tmaxParallel: 1,\n\t\t},\n\t\thumanGatePolicy: {\n\t\t\trequiredForRisks: [\"high\"],\n\t\t\tgates: [\"priority-change\", \"cross-repo-action\"],\n\t\t\tapprovalRefsRequired: true,\n\t\t},\n\t},\n\t{\n\t\tid: \"omk-isolated-fix\",\n\t\tname: \"OMK Isolated Fix\",\n\t\tfile: \"omk-isolated-fix.md\",\n\t\tgoal: \"Claim one bounded work item, isolate it in a worktree, implement, and verify with maker/checker roles.\",\n\t\tcadence: \"2h-6h\",\n\t\trisk: \"medium\",\n\t\ttools: [\"codex\", \"github-actions\"],\n\t\tskills: [\"focused-implementation\", \"test-debug-loop\", \"code-review\"],\n\t\tstate: \".omk/loops/omk-isolated-fix/state.json\",\n\t\tphases: [\"claim\", \"isolate\", \"implement\", \"check\", \"record\"],\n\t\thumanGates: [\"high-risk-change\", \"scope-expansion\", \"release-impact\"],\n\t\tstarter: \"starters/omk-isolated-fix\",\n\t\tweekOneMode: \"L2\",\n\t\ttokenCost: \"high\",\n\t\tcost: {\n\t\t\ttokensNoop: 8_000,\n\t\t\ttokensReport: 50_000,\n\t\t\ttokensAction: 180_000,\n\t\t\tsuggestedDailyCap: 400_000,\n\t\t\tearlyExitRequired: true,\n\t\t},\n\t\tnonGoals: [\"large refactors\", \"dependency upgrades\", \"release automation\"],\n\t\ttriggerKeywords: [\"bounded fix\", \"loop regression\", \"failing focused test\"],\n\t\tskillTriggers: {\n\t\t\t\"focused-implementation\": [\"implement\", \"fix\", \"migrate\"],\n\t\t\t\"test-debug-loop\": [\"failing test\", \"regression\"],\n\t\t\t\"code-review\": [\"checker\", \"review\"],\n\t\t},\n\t\tconnectors: [\n\t\t\t{\n\t\t\t\tid: \"github\",\n\t\t\t\tkind: \"connector\",\n\t\t\t\tpurpose: \"Read linked issues, PR context, and workflow status.\",\n\t\t\t\taccess: \"required\",\n\t\t\t\ttools: [\"issues\", \"pull-requests\", \"actions\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"context7\",\n\t\t\t\tkind: \"mcp\",\n\t\t\t\tpurpose: \"Fetch current library documentation when implementation touches external APIs.\",\n\t\t\t\taccess: \"optional\",\n\t\t\t\ttools: [\"resolve-library-id\", \"get-library-docs\"],\n\t\t\t},\n\t\t],\n\t\tworktree: {\n\t\t\tmode: \"per-item\",\n\t\t\tbranchPrefix: \"omk/loops/isolated-fix/\",\n\t\t\tcleanup: \"after-run\",\n\t\t\trequireCleanCheckout: true,\n\t\t\tmaxConcurrentWorktrees: 1,\n\t\t},\n\t\tsubagents: {\n\t\t\trequireMakerChecker: true,\n\t\t\tmakerRole: \"implementation-worker\",\n\t\t\tcheckerRole: \"independent-checker\",\n\t\t\tmaxParallel: 2,\n\t\t},\n\t\thumanGatePolicy: {\n\t\t\trequiredForRisks: [\"high\"],\n\t\t\tgates: [\"high-risk-change\", \"scope-expansion\", \"release-impact\"],\n\t\t\tapprovalRefsRequired: true,\n\t\t},\n\t},\n\t{\n\t\tid: \"omk-release-guardian\",\n\t\tname: \"OMK Release Guardian\",\n\t\tfile: \"omk-release-guardian.md\",\n\t\tgoal: \"Guard release readiness with durable run logs, budget ceilings, human approvals, and independent checks.\",\n\t\tcadence: \"6h-1d\",\n\t\trisk: \"high\",\n\t\ttools: [\"codex\", \"github-actions\"],\n\t\tskills: [\"release-audit\", \"security-review\", \"verification-gates\"],\n\t\tstate: \".omk/loops/omk-release-guardian/state.json\",\n\t\tphases: [\"snapshot\", \"audit\", \"gate\", \"escalate\", \"record\"],\n\t\thumanGates: [\"release-cut\", \"publish\", \"security-exception\"],\n\t\tstarter: \"starters/omk-release-guardian\",\n\t\tweekOneMode: \"L3\",\n\t\ttokenCost: \"very-high\",\n\t\tcost: {\n\t\t\ttokensNoop: 12_000,\n\t\t\ttokensReport: 90_000,\n\t\t\ttokensAction: 240_000,\n\t\t\tsuggestedDailyCap: 600_000,\n\t\t\tearlyExitRequired: true,\n\t\t},\n\t\tnonGoals: [\"publish without approval\", \"skip changelog audit\", \"bypass failing verification\"],\n\t\ttriggerKeywords: [\"release\", \"publish\", \"release gate\"],\n\t\tskillTriggers: {\n\t\t\t\"release-audit\": [\"changelog\", \"version\", \"publish\"],\n\t\t\t\"security-review\": [\"secret\", \"credential\", \"security\"],\n\t\t\t\"verification-gates\": [\"smoke test\", \"release blocker\"],\n\t\t},\n\t\tconnectors: [\n\t\t\t{\n\t\t\t\tid: \"github\",\n\t\t\t\tkind: \"connector\",\n\t\t\t\tpurpose: \"Read release branches, workflow status, tags, and pull request approvals.\",\n\t\t\t\taccess: \"required\",\n\t\t\t\ttools: [\"branches\", \"pull-requests\", \"actions\", \"releases\"],\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"playwright\",\n\t\t\t\tkind: \"mcp\",\n\t\t\t\tpurpose: \"Collect browser smoke evidence for release readiness.\",\n\t\t\t\taccess: \"optional\",\n\t\t\t\ttools: [\"navigate\", \"screenshot\", \"assert\"],\n\t\t\t},\n\t\t],\n\t\tworktree: {\n\t\t\tmode: \"per-run\",\n\t\t\tbranchPrefix: \"omk/loops/release-guardian/\",\n\t\t\tcleanup: \"manual\",\n\t\t\trequireCleanCheckout: true,\n\t\t\tmaxConcurrentWorktrees: 1,\n\t\t},\n\t\tsubagents: {\n\t\t\trequireMakerChecker: true,\n\t\t\tmakerRole: \"release-auditor\",\n\t\t\tcheckerRole: \"release-checker\",\n\t\t\tmaxParallel: 3,\n\t\t},\n\t\thumanGatePolicy: {\n\t\t\trequiredForRisks: [\"medium\", \"high\"],\n\t\t\tgates: [\"release-cut\", \"publish\", \"security-exception\"],\n\t\t\tapprovalRefsRequired: true,\n\t\t},\n\t},\n];\n\nexport function validateLoopPatternRegistry(\n\tentries: readonly LoopPatternRegistryEntry[],\n): LoopPatternRegistryValidationResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tconst ids = new Map<string, number>();\n\tconst triggerOwners = new Map<string, { readonly id: string; readonly index: number }>();\n\tconst skillTriggerOwners = new Map<\n\t\tstring,\n\t\t{ readonly id: string; readonly skill: string; readonly index: number }\n\t>();\n\n\tfor (const [index, entry] of entries.entries()) {\n\t\tconst priorIndex = ids.get(entry.id);\n\t\tif (priorIndex !== undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"duplicate-id\",\n\t\t\t\tmessage: `Duplicate loop pattern id '${entry.id}' also appears at index ${priorIndex}.`,\n\t\t\t\tpath: `[${index}].id`,\n\t\t\t});\n\t\t} else {\n\t\t\tids.set(entry.id, index);\n\t\t}\n\n\t\tif (!isSafeStarterPath(entry.starter)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"invalid-starter-path\",\n\t\t\t\tmessage: `Starter path for '${entry.id}' must be a relative, non-traversing path.`,\n\t\t\t\tpath: `[${index}].starter`,\n\t\t\t});\n\t\t}\n\n\t\tif (parseCadence(entry.cadence) === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"invalid-cadence\",\n\t\t\t\tmessage: `Cadence for '${entry.id}' must be a positive duration or duration range.`,\n\t\t\t\tpath: `[${index}].cadence`,\n\t\t\t});\n\t\t}\n\n\t\tconst normalizedCost = normalizeCost(entry.cost);\n\t\tif (normalizedCost === undefined) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"invalid-cost\",\n\t\t\t\tmessage: `Cost for '${entry.id}' must include positive integer noop/report/action token estimates.`,\n\t\t\t\tpath: `[${index}].cost`,\n\t\t\t});\n\t\t} else if (\n\t\t\tnormalizedCost.tokensNoop > normalizedCost.tokensReport ||\n\t\t\tnormalizedCost.tokensReport > normalizedCost.tokensAction\n\t\t) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"non-monotonic-cost\",\n\t\t\t\tmessage: `Cost for '${entry.id}' must satisfy noop <= report <= action.`,\n\t\t\t\tpath: `[${index}].cost`,\n\t\t\t});\n\t\t}\n\n\t\tdiagnostics.push(...validatePatternPrimitives(entry, index));\n\n\t\tfor (const trigger of normalizedTriggerKeywords(entry)) {\n\t\t\tconst priorOwner = triggerOwners.get(trigger);\n\t\t\tif (priorOwner !== undefined && priorOwner.id !== entry.id) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tcode: \"trigger-overlap\",\n\t\t\t\t\tmessage: `Trigger '${trigger}' is shared by '${priorOwner.id}' and '${entry.id}'.`,\n\t\t\t\t\tpath: `[${index}].triggerKeywords`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttriggerOwners.set(trigger, { id: entry.id, index });\n\t\t\t}\n\t\t}\n\n\t\tfor (const trigger of normalizedSkillTriggers(entry)) {\n\t\t\tconst priorOwner = skillTriggerOwners.get(trigger.term);\n\t\t\tif (priorOwner !== undefined && (priorOwner.id !== entry.id || priorOwner.skill !== trigger.skill)) {\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\tcode: \"ambiguous-skill-trigger\",\n\t\t\t\t\tmessage: `Skill trigger '${trigger.term}' is shared by '${priorOwner.id}/${priorOwner.skill}' and '${entry.id}/${trigger.skill}'.`,\n\t\t\t\t\tpath: `[${index}].skillTriggers.${trigger.skill}`,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tskillTriggerOwners.set(trigger.term, { id: entry.id, skill: trigger.skill, index });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: diagnostics.every((diagnostic) => WARNING_DIAGNOSTIC_CODES.has(diagnostic.code)),\n\t\tdiagnostics,\n\t};\n}\n\nexport function compileLoopDefinitionFromPattern(\n\tentry: LoopPatternRegistryEntry,\n\toptions: CompileLoopDefinitionOptions,\n): LoopDefinition {\n\tconst validation = validateLoopPatternRegistry([entry]);\n\tconst errors = validation.diagnostics.filter((diagnostic) => !WARNING_DIAGNOSTIC_CODES.has(diagnostic.code));\n\tif (errors.length > 0) {\n\t\tthrow new Error(`Invalid loop pattern '${entry.id}': ${errors.map((diagnostic) => diagnostic.code).join(\", \")}`);\n\t}\n\n\tconst cost = requireNormalizedCost(entry);\n\tconst cadence = requireParsedCadence(entry);\n\tconst level = options.level ?? entry.weekOneMode ?? entry.week_one_mode ?? \"L1\";\n\tconst defaultBudget = budgetDefaultsForLevel(level, cost, cadence);\n\tconst allowedWriteScopes = level === \"L1\" ? [] : [...(options.allowedWriteScopes ?? [])];\n\tconst defaultSafety = safetyDefaultsForLevel(level, allowedWriteScopes, options.deniedWriteScopes);\n\tconst scope = options.scope ?? {};\n\tconst statePath = options.statePath ?? `.omk/loops/${entry.id}/state.json`;\n\tconst runLogPath = options.runLogPath ?? `.omk/loops/${entry.id}/run-log.ndjson`;\n\tconst schedule = {\n\t\t...scheduleDefaultsForPattern(entry, cadence),\n\t\t...options.schedule,\n\t};\n\tconst worktree = {\n\t\t...worktreeDefaultsForLevel(entry, level),\n\t\t...entry.worktree,\n\t\t...options.worktree,\n\t};\n\tconst skills = options.skills ?? skillBindingsForPattern(entry);\n\tconst connectors = options.connectors ?? [...(entry.connectors ?? [])];\n\tconst subagents = subagentDefaultsForLevel(entry, level, skills, connectors, {\n\t\t...entry.subagents,\n\t\t...options.subagents,\n\t});\n\tconst durableState = {\n\t\t...durableStateDefaultsForPattern(entry, statePath, runLogPath),\n\t\t...(entry.durableState ?? entry.durable_state),\n\t\t...options.durableState,\n\t};\n\tconst humanGates = {\n\t\t...humanGateDefaultsForPattern(entry),\n\t\t...(entry.humanGatePolicy ?? entry.human_gate_policy),\n\t\t...options.humanGates,\n\t};\n\n\treturn {\n\t\tid: options.id ?? entry.id,\n\t\tpattern: entry.id,\n\t\tobjective: entry.goal,\n\t\tnonGoals: entry.nonGoals ?? entry.non_goals ?? [],\n\t\tlevel,\n\t\twatchedScope: {\n\t\t\trepos: scope.repos?.length === undefined || scope.repos.length === 0 ? [options.repo] : scope.repos,\n\t\t\t...(scope.branches === undefined ? {} : { branches: scope.branches }),\n\t\t\t...(scope.paths === undefined ? {} : { paths: scope.paths }),\n\t\t\t...(scope.tickets === undefined ? {} : { tickets: scope.tickets }),\n\t\t},\n\t\tbudget: {\n\t\t\t...defaultBudget,\n\t\t\t...options.budget,\n\t\t},\n\t\tsafety: {\n\t\t\t...defaultSafety,\n\t\t\t...options.safety,\n\t\t\tallowedWriteScopes:\n\t\t\t\tlevel === \"L1\" ? [] : (options.safety?.allowedWriteScopes ?? defaultSafety.allowedWriteScopes),\n\t\t},\n\t\tstatePath,\n\t\trunLogPath,\n\t\tschedule,\n\t\tworktree,\n\t\tskills,\n\t\tconnectors,\n\t\tsubagents,\n\t\tdurableState,\n\t\thumanGates,\n\t};\n}\n\nexport function detectStarterDrift(\n\tentry: LoopPatternRegistryEntry,\n\tavailableStarterIds: readonly string[],\n): LoopPatternRegistryValidationResult {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\tif (!isSafeStarterPath(entry.starter)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"invalid-starter-path\",\n\t\t\tmessage: `Starter path for '${entry.id}' must be a relative, non-traversing path.`,\n\t\t\tpath: \"starter\",\n\t\t});\n\t\treturn { valid: false, diagnostics };\n\t}\n\n\tconst expected = normalizeStarterIdentifier(entry.starter);\n\tconst expectedId = lastPathSegment(expected);\n\tconst available = new Set(availableStarterIds.map(normalizeStarterIdentifier));\n\tif (!available.has(expected) && !available.has(expectedId)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"missing-starter\",\n\t\t\tmessage: `Starter '${entry.starter}' for '${entry.id}' is not present in the available starter inventory.`,\n\t\t\tpath: \"starter\",\n\t\t});\n\t}\n\n\treturn { valid: diagnostics.length === 0, diagnostics };\n}\n\nfunction validatePatternPrimitives(\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): readonly LoopValidationDiagnostic[] {\n\tconst diagnostics: LoopValidationDiagnostic[] = [];\n\n\tif (entry.skills.length === 0) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"skills-required\",\n\t\t\tmessage: `Loop pattern '${entry.id}' must declare at least one OMK skill.`,\n\t\t\tpath: `[${index}].skills`,\n\t\t});\n\t}\n\tpushNonEmptyUniqueDiagnostics(diagnostics, entry.skills, `[${index}].skills`, \"skill\");\n\tpushNonEmptyUniqueDiagnostics(diagnostics, entry.phases, `[${index}].phases`, \"phase\");\n\tpushNonEmptyUniqueDiagnostics(\n\t\tdiagnostics,\n\t\tentry.humanGates ?? entry.human_gates ?? [],\n\t\t`[${index}].humanGates`,\n\t\t\"human-gate\",\n\t);\n\tpushConnectorDiagnostics(diagnostics, entry, index);\n\tpushWorktreeDiagnostics(diagnostics, entry, index);\n\tpushSubagentDiagnostics(diagnostics, entry, index);\n\tpushDurableStateDiagnostics(diagnostics, entry, index);\n\tpushHumanGatePolicyDiagnostics(diagnostics, entry, index);\n\n\treturn diagnostics;\n}\n\nfunction scheduleDefaultsForPattern(entry: LoopPatternRegistryEntry, cadence: ParsedCadence): LoopSchedulePolicy {\n\treturn {\n\t\tmode: \"interval\",\n\t\tcadence: entry.cadence,\n\t\tshortestIntervalMinutes: cadence.shortestMinutes,\n\t\trunOn: [\"schedule\"],\n\t\tjitterMinutes: Math.min(15, Math.max(1, Math.floor(cadence.shortestMinutes * 0.1))),\n\t};\n}\n\nfunction worktreeDefaultsForLevel(entry: LoopPatternRegistryEntry, level: LoopLevel): LoopWorktreeIsolationPolicy {\n\tif (level === \"L1\") {\n\t\treturn {\n\t\t\tmode: \"none\",\n\t\t\tcleanup: \"manual\",\n\t\t\trequireCleanCheckout: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tmode: level === \"L2\" ? \"per-item\" : \"per-run\",\n\t\tbranchPrefix: `omk/loops/${entry.id}/`,\n\t\tcleanup: level === \"L2\" ? \"after-run\" : \"manual\",\n\t\trequireCleanCheckout: true,\n\t\tmaxConcurrentWorktrees: 1,\n\t};\n}\n\nfunction skillBindingsForPattern(entry: LoopPatternRegistryEntry): readonly LoopSkillBinding[] {\n\tconst triggerMap = entry.skillTriggers ?? entry.skill_triggers ?? {};\n\treturn uniqueTrimmedStrings(entry.skills).map((id) => {\n\t\tconst triggerKeywords = uniqueNormalizedTerms(triggerMap[id] ?? []);\n\t\treturn {\n\t\t\tid,\n\t\t\tpurpose: `Enable ${id} for ${entry.id}.`,\n\t\t\taccess: \"required\",\n\t\t\t...(triggerKeywords.length === 0 ? {} : { triggerKeywords }),\n\t\t};\n\t});\n}\n\nfunction subagentDefaultsForLevel(\n\tentry: LoopPatternRegistryEntry,\n\tlevel: LoopLevel,\n\tskills: readonly LoopSkillBinding[],\n\tconnectors: readonly LoopConnectorBinding[],\n\toverrides: Partial<LoopSubagentPolicy>,\n): LoopSubagentPolicy {\n\tconst requireMakerChecker = overrides.requireMakerChecker ?? level !== \"L1\";\n\tconst makerRole = nonEmptyString(overrides.makerRole) ?? `${entry.id}-maker`;\n\tconst checkerRole =\n\t\tnonEmptyString(overrides.checkerRole) ?? (requireMakerChecker ? `${entry.id}-checker` : undefined);\n\tconst skillIds = skills.map((skill) => skill.id);\n\tconst connectorIds = connectors.map((connector) => connector.id);\n\tconst roles = overrides.roles ?? [\n\t\t{\n\t\t\tid: makerRole,\n\t\t\trole: \"maker\" as const,\n\t\t\tskills: skillIds,\n\t\t\tconnectors: connectorIds,\n\t\t},\n\t\t...(checkerRole === undefined\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: checkerRole,\n\t\t\t\t\t\trole: \"checker\" as const,\n\t\t\t\t\t\tskills: skillIds,\n\t\t\t\t\t\tconnectors: connectorIds,\n\t\t\t\t\t\tindependentFrom: [makerRole],\n\t\t\t\t\t},\n\t\t\t\t]),\n\t];\n\n\treturn {\n\t\tmaxParallel: overrides.maxParallel ?? (level === \"L3\" ? 3 : level === \"L2\" ? 2 : 1),\n\t\trequireMakerChecker,\n\t\tmakerRole,\n\t\t...(checkerRole === undefined ? {} : { checkerRole }),\n\t\troles,\n\t};\n}\n\nfunction durableStateDefaultsForPattern(\n\tentry: LoopPatternRegistryEntry,\n\tstatePath: string,\n\trunLogPath: string,\n): LoopDurableStatePolicy {\n\treturn {\n\t\tstatePath,\n\t\trunLogPath,\n\t\tbudgetLedgerPath: `.omk/loops/${entry.id}/budget-ledger.ndjson`,\n\t\tretentionDays: 30,\n\t\trequireReplayableEvidence: true,\n\t};\n}\n\nfunction humanGateDefaultsForPattern(entry: LoopPatternRegistryEntry): LoopHumanGatePolicy {\n\tconst gates = normalizedHumanGateIds(entry);\n\treturn {\n\t\tgates: gates.length === 0 ? [\"high-risk-change\"] : gates,\n\t\trequiredForRisks: [\"high\"],\n\t\tapprovalRefsRequired: true,\n\t};\n}\n\nfunction pushNonEmptyUniqueDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tvalues: readonly string[],\n\tpath: string,\n\tlabel: string,\n): void {\n\tconst seen = new Set<string>();\n\tfor (const [valueIndex, value] of values.entries()) {\n\t\tconst normalized = normalizeTerm(value);\n\t\tif (normalized.length === 0) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: `${label}-id-required`,\n\t\t\t\tmessage: `${label} id must be non-empty.`,\n\t\t\t\tpath: `${path}[${valueIndex}]`,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (seen.has(normalized)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: `${label}-duplicate`,\n\t\t\t\tmessage: `${label} id '${value}' is declared more than once.`,\n\t\t\t\tpath: `${path}[${valueIndex}]`,\n\t\t\t});\n\t\t}\n\t\tseen.add(normalized);\n\t}\n}\n\nfunction pushConnectorDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): void {\n\tconst connectors = entry.connectors ?? [];\n\tconst seen = new Set<string>();\n\tfor (const [connectorIndex, connector] of connectors.entries()) {\n\t\tconst basePath = `[${index}].connectors[${connectorIndex}]`;\n\t\tconst id = normalizeTerm(connector.id);\n\t\tif (!id) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-id-required\",\n\t\t\t\tmessage: `Connector id for '${entry.id}' must be non-empty.`,\n\t\t\t\tpath: `${basePath}.id`,\n\t\t\t});\n\t\t} else if (seen.has(id)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-duplicate\",\n\t\t\t\tmessage: `Connector '${connector.id}' is declared more than once for '${entry.id}'.`,\n\t\t\t\tpath: `${basePath}.id`,\n\t\t\t});\n\t\t}\n\t\tseen.add(id);\n\n\t\tif (!CONNECTOR_KINDS.includes(connector.kind)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-kind-invalid\",\n\t\t\t\tmessage: `Connector '${connector.id}' has invalid kind '${connector.kind}'.`,\n\t\t\t\tpath: `${basePath}.kind`,\n\t\t\t});\n\t\t}\n\t\tif (!CAPABILITY_ACCESS_MODES.includes(connector.access)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-access-invalid\",\n\t\t\t\tmessage: `Connector '${connector.id}' has invalid access '${connector.access}'.`,\n\t\t\t\tpath: `${basePath}.access`,\n\t\t\t});\n\t\t}\n\t\tif (!nonEmptyString(connector.purpose)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-purpose-required\",\n\t\t\t\tmessage: `Connector '${connector.id}' must declare a purpose.`,\n\t\t\t\tpath: `${basePath}.purpose`,\n\t\t\t});\n\t\t}\n\t\tif (connector.tools?.some((tool) => tool.trim().length === 0)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"connector-tool-required\",\n\t\t\t\tmessage: `Connector '${connector.id}' has an empty tool id.`,\n\t\t\t\tpath: `${basePath}.tools`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction pushWorktreeDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): void {\n\tconst worktree = entry.worktree;\n\tif (worktree === undefined) {\n\t\treturn;\n\t}\n\n\tif (worktree.mode !== undefined && !WORKTREE_ISOLATION_MODES.includes(worktree.mode)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-mode-invalid\",\n\t\t\tmessage: `Worktree mode '${worktree.mode}' is not supported.`,\n\t\t\tpath: `[${index}].worktree.mode`,\n\t\t});\n\t}\n\tif (worktree.cleanup !== undefined && !WORKTREE_CLEANUP_POLICIES.includes(worktree.cleanup)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-cleanup-invalid\",\n\t\t\tmessage: `Worktree cleanup '${worktree.cleanup}' is not supported.`,\n\t\t\tpath: `[${index}].worktree.cleanup`,\n\t\t});\n\t}\n\tif (worktree.branchPrefix !== undefined && !isSafeBranchPrefix(worktree.branchPrefix)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-branch-prefix-invalid\",\n\t\t\tmessage: `Worktree branchPrefix for '${entry.id}' must be relative and non-empty.`,\n\t\t\tpath: `[${index}].worktree.branchPrefix`,\n\t\t});\n\t}\n\tif (worktree.maxConcurrentWorktrees !== undefined && !isPositiveInteger(worktree.maxConcurrentWorktrees)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"worktree-concurrency-invalid\",\n\t\t\tmessage: `Worktree maxConcurrentWorktrees for '${entry.id}' must be a positive integer.`,\n\t\t\tpath: `[${index}].worktree.maxConcurrentWorktrees`,\n\t\t});\n\t}\n}\n\nfunction pushSubagentDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): void {\n\tconst subagents = entry.subagents;\n\tif (subagents === undefined) {\n\t\treturn;\n\t}\n\n\tif (subagents.maxParallel !== undefined && !isPositiveInteger(subagents.maxParallel)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"subagent-max-parallel-invalid\",\n\t\t\tmessage: `Subagent maxParallel for '${entry.id}' must be a positive integer.`,\n\t\t\tpath: `[${index}].subagents.maxParallel`,\n\t\t});\n\t}\n\tif (subagents.makerRole !== undefined && !nonEmptyString(subagents.makerRole)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"subagent-maker-required\",\n\t\t\tmessage: `Subagent makerRole for '${entry.id}' must be non-empty.`,\n\t\t\tpath: `[${index}].subagents.makerRole`,\n\t\t});\n\t}\n\tif (subagents.requireMakerChecker === true && !nonEmptyString(subagents.checkerRole)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"subagent-checker-required\",\n\t\t\tmessage: `Maker/checker loop '${entry.id}' must declare a checkerRole.`,\n\t\t\tpath: `[${index}].subagents.checkerRole`,\n\t\t});\n\t}\n\n\tfor (const [roleIndex, role] of (subagents.roles ?? []).entries()) {\n\t\tconst basePath = `[${index}].subagents.roles[${roleIndex}]`;\n\t\tif (!nonEmptyString(role.id)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"subagent-role-id-required\",\n\t\t\t\tmessage: `Subagent role id for '${entry.id}' must be non-empty.`,\n\t\t\t\tpath: `${basePath}.id`,\n\t\t\t});\n\t\t}\n\t\tif (!SUBAGENT_ROLES.includes(role.role)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"subagent-role-invalid\",\n\t\t\t\tmessage: `Subagent role '${role.role}' is not supported.`,\n\t\t\t\tpath: `${basePath}.role`,\n\t\t\t});\n\t\t}\n\t\tpushNonEmptyUniqueDiagnostics(diagnostics, role.skills, `${basePath}.skills`, \"subagent-skill\");\n\t\tpushNonEmptyUniqueDiagnostics(diagnostics, role.connectors, `${basePath}.connectors`, \"subagent-connector\");\n\t}\n}\n\nfunction pushDurableStateDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): void {\n\tconst durableState = entry.durableState ?? entry.durable_state;\n\tif (durableState === undefined) {\n\t\treturn;\n\t}\n\n\tpushSafeRelativePathDiagnostic(diagnostics, durableState.statePath, `[${index}].durableState.statePath`);\n\tpushSafeRelativePathDiagnostic(diagnostics, durableState.runLogPath, `[${index}].durableState.runLogPath`);\n\tpushSafeRelativePathDiagnostic(\n\t\tdiagnostics,\n\t\tdurableState.budgetLedgerPath,\n\t\t`[${index}].durableState.budgetLedgerPath`,\n\t);\n\tpushSafeRelativePathDiagnostic(diagnostics, durableState.checkpointPath, `[${index}].durableState.checkpointPath`);\n\tif (durableState.retentionDays !== undefined && !isPositiveInteger(durableState.retentionDays)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"durable-state-retention-invalid\",\n\t\t\tmessage: `Durable state retentionDays for '${entry.id}' must be a positive integer.`,\n\t\t\tpath: `[${index}].durableState.retentionDays`,\n\t\t});\n\t}\n}\n\nfunction pushHumanGatePolicyDiagnostics(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tentry: LoopPatternRegistryEntry,\n\tindex: number,\n): void {\n\tconst policy = entry.humanGatePolicy ?? entry.human_gate_policy;\n\tif (policy === undefined) {\n\t\treturn;\n\t}\n\n\tpushNonEmptyUniqueDiagnostics(diagnostics, policy.gates ?? [], `[${index}].humanGatePolicy.gates`, \"human-gate\");\n\tfor (const [riskIndex, risk] of (policy.requiredForRisks ?? []).entries()) {\n\t\tif (!WORK_ITEM_RISKS.includes(risk)) {\n\t\t\tdiagnostics.push({\n\t\t\t\tcode: \"human-gate-risk-invalid\",\n\t\t\t\tmessage: `Human gate risk '${risk}' is not supported.`,\n\t\t\t\tpath: `[${index}].humanGatePolicy.requiredForRisks[${riskIndex}]`,\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction pushSafeRelativePathDiagnostic(\n\tdiagnostics: LoopValidationDiagnostic[],\n\tvalue: string | undefined,\n\tpath: string,\n): void {\n\tif (value !== undefined && !isSafeStarterPath(value)) {\n\t\tdiagnostics.push({\n\t\t\tcode: \"invalid-durable-state-path\",\n\t\t\tmessage: `${path} must be a relative, non-traversing path.`,\n\t\t\tpath,\n\t\t});\n\t}\n}\n\nfunction budgetDefaultsForLevel(level: LoopLevel, cost: NormalizedCost, cadence: ParsedCadence): LoopBudgetPolicy {\n\tconst maxRunsPerDay = Math.max(1, Math.ceil(1440 / cadence.shortestMinutes));\n\tif (level === \"L1\") {\n\t\treturn {\n\t\t\tmaxRunsPerDay,\n\t\t\tmaxTokensPerDay: cost.suggestedDailyCap,\n\t\t\tmaxSubagentsPerRun: 1,\n\t\t\tmaxAttemptsPerItem: 1,\n\t\t\tmaxAutoPrsPerDay: 0,\n\t\t\tslowDownAtRatio: cost.earlyExitRequired ? 0.75 : 0.9,\n\t\t};\n\t}\n\tif (level === \"L2\") {\n\t\treturn {\n\t\t\tmaxRunsPerDay,\n\t\t\tmaxTokensPerDay: cost.suggestedDailyCap,\n\t\t\tmaxSubagentsPerRun: 3,\n\t\t\tmaxAttemptsPerItem: 2,\n\t\t\tmaxAutoPrsPerDay: 0,\n\t\t\tslowDownAtRatio: cost.earlyExitRequired ? 0.75 : 0.9,\n\t\t};\n\t}\n\treturn {\n\t\tmaxRunsPerDay,\n\t\tmaxTokensPerDay: cost.suggestedDailyCap,\n\t\tmaxSubagentsPerRun: 5,\n\t\tmaxAttemptsPerItem: 3,\n\t\tmaxAutoPrsPerDay: 1,\n\t\tslowDownAtRatio: cost.earlyExitRequired ? 0.75 : 0.9,\n\t};\n}\n\nfunction safetyDefaultsForLevel(\n\tlevel: LoopLevel,\n\tallowedWriteScopes: readonly string[],\n\tdeniedWriteScopes: readonly string[] | undefined,\n): LoopSafetyPolicy {\n\treturn {\n\t\trequireIndependentVerifier: level !== \"L1\",\n\t\trequireHumanGateForHighRisk: true,\n\t\tallowedWriteScopes,\n\t\tdeniedWriteScopes: deniedWriteScopes ?? DENIED_WRITE_SCOPES,\n\t\tmaxWriteScopeCount: allowedWriteScopes.length,\n\t};\n}\n\nfunction isSafeStarterPath(starter: string): boolean {\n\tconst normalized = normalizeSlashes(starter).trim();\n\tif (normalized.length === 0) return false;\n\tif (normalized.startsWith(\"/\")) return false;\n\tif (/^[A-Za-z]:\\//.test(normalized)) return false;\n\treturn !normalized.split(\"/\").some((segment) => segment === \"..\");\n}\n\nfunction parseCadence(cadence: string): ParsedCadence | undefined {\n\tconst parts = cadence.split(\"-\");\n\tif (parts.length === 0 || parts.length > 2) return undefined;\n\tconst minutes = parts.map(parseDurationMinutes);\n\tif (minutes.some((value) => value === undefined)) return undefined;\n\tconst concreteMinutes = minutes.filter((value): value is number => value !== undefined);\n\treturn { shortestMinutes: Math.min(...concreteMinutes) };\n}\n\nfunction parseDurationMinutes(value: string): number | undefined {\n\tconst match = /^(?<amount>[1-9][0-9]*)(?<unit>[mhd])$/.exec(value);\n\tif (match?.groups === undefined) return undefined;\n\tconst amount = Number(match.groups.amount);\n\tif (!Number.isSafeInteger(amount) || amount <= 0) return undefined;\n\tconst unit = match.groups.unit;\n\tif (unit === \"m\") return amount;\n\tif (unit === \"h\") return amount * 60;\n\treturn amount * 1440;\n}\n\nfunction normalizeCost(cost: LoopPatternCost): NormalizedCost | undefined {\n\tconst tokensNoop = cost.tokensNoop ?? cost.tokens_noop;\n\tconst tokensReport = cost.tokensReport ?? cost.tokens_report;\n\tconst tokensAction = cost.tokensAction ?? cost.tokens_action;\n\tconst suggestedDailyCap = cost.suggestedDailyCap ?? cost.suggested_daily_cap;\n\tconst earlyExitRequired = cost.earlyExitRequired ?? cost.early_exit_required;\n\tif (\n\t\t!isPositiveInteger(tokensNoop) ||\n\t\t!isPositiveInteger(tokensReport) ||\n\t\t!isPositiveInteger(tokensAction) ||\n\t\t!isPositiveInteger(suggestedDailyCap) ||\n\t\ttypeof earlyExitRequired !== \"boolean\"\n\t) {\n\t\treturn undefined;\n\t}\n\treturn { tokensNoop, tokensReport, tokensAction, suggestedDailyCap, earlyExitRequired };\n}\n\nfunction requireNormalizedCost(entry: LoopPatternRegistryEntry): NormalizedCost {\n\tconst cost = normalizeCost(entry.cost);\n\tif (cost === undefined) throw new Error(`Invalid loop pattern '${entry.id}': invalid-cost`);\n\treturn cost;\n}\n\nfunction requireParsedCadence(entry: LoopPatternRegistryEntry): ParsedCadence {\n\tconst cadence = parseCadence(entry.cadence);\n\tif (cadence === undefined) throw new Error(`Invalid loop pattern '${entry.id}': invalid-cadence`);\n\treturn cadence;\n}\n\nfunction isPositiveInteger(value: number | undefined): value is number {\n\treturn typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\n\nfunction normalizedTriggerKeywords(entry: LoopPatternRegistryEntry): readonly string[] {\n\treturn uniqueNormalizedTerms(entry.triggerKeywords ?? entry.trigger_keywords ?? []);\n}\n\nfunction normalizedSkillTriggers(\n\tentry: LoopPatternRegistryEntry,\n): readonly { readonly skill: string; readonly term: string }[] {\n\tconst triggerMap = entry.skillTriggers ?? entry.skill_triggers ?? {};\n\tconst triggers: { readonly skill: string; readonly term: string }[] = [];\n\tfor (const [skill, terms] of Object.entries(triggerMap)) {\n\t\tfor (const term of uniqueNormalizedTerms(terms)) {\n\t\t\ttriggers.push({ skill, term });\n\t\t}\n\t}\n\treturn triggers;\n}\n\nfunction normalizedHumanGateIds(entry: LoopPatternRegistryEntry): readonly string[] {\n\treturn uniqueTrimmedStrings(entry.humanGates ?? entry.human_gates ?? []);\n}\n\nfunction uniqueNormalizedTerms(terms: readonly string[]): readonly string[] {\n\tconst normalized = terms.map(normalizeTerm).filter((term) => term.length > 0);\n\treturn [...new Set(normalized)];\n}\n\nfunction uniqueTrimmedStrings(values: readonly string[]): readonly string[] {\n\tconst seen = new Set<string>();\n\tconst unique: string[] = [];\n\tfor (const value of values) {\n\t\tconst trimmed = value.trim();\n\t\tconst normalized = normalizeTerm(trimmed);\n\t\tif (trimmed.length === 0 || seen.has(normalized)) {\n\t\t\tcontinue;\n\t\t}\n\t\tseen.add(normalized);\n\t\tunique.push(trimmed);\n\t}\n\treturn unique;\n}\n\nfunction normalizeTerm(term: string): string {\n\treturn term.toLowerCase().trim().replace(/\\s+/g, \" \");\n}\n\nfunction nonEmptyString(value: string | undefined): string | undefined {\n\tconst trimmed = value?.trim();\n\treturn trimmed ? trimmed : undefined;\n}\n\nfunction normalizeStarterIdentifier(starter: string): string {\n\tconst normalized = normalizeSlashes(starter).trim().replace(/^\\.\\//, \"\").replace(/\\/+$/g, \"\");\n\treturn normalized.length === 0 ? starter : normalized;\n}\n\nfunction normalizeSlashes(value: string): string {\n\treturn value.replace(/\\\\/g, \"/\");\n}\n\nfunction isSafeBranchPrefix(branchPrefix: string): boolean {\n\tconst normalized = normalizeSlashes(branchPrefix).trim();\n\tif (normalized.length === 0) return false;\n\tif (normalized.startsWith(\"/\") || normalized.includes(\"..\")) return false;\n\treturn !/\\s/.test(normalized);\n}\n\nfunction lastPathSegment(value: string): string {\n\tconst parts = value.split(\"/\").filter((part) => part.length > 0);\n\treturn parts.at(-1) ?? value;\n}\n"]}