open-multi-agent-kit 0.80.6 → 0.80.7

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 (981) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +22 -14
  3. package/dist/cli/config-selector.d.ts +1 -1
  4. package/dist/cli/config-selector.d.ts.map +1 -1
  5. package/dist/cli/config-selector.js +1 -1
  6. package/dist/cli/config-selector.js.map +1 -1
  7. package/dist/config.d.ts +1 -0
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +9 -8
  10. package/dist/config.js.map +1 -1
  11. package/dist/core/agent-session.d.ts +45 -6
  12. package/dist/core/agent-session.d.ts.map +1 -1
  13. package/dist/core/agent-session.js +197 -13
  14. package/dist/core/agent-session.js.map +1 -1
  15. package/dist/core/auth-storage.d.ts +4 -1
  16. package/dist/core/auth-storage.d.ts.map +1 -1
  17. package/dist/core/auth-storage.js +5 -5
  18. package/dist/core/auth-storage.js.map +1 -1
  19. package/dist/core/bash-executor.d.ts.map +1 -1
  20. package/dist/core/bash-executor.js +1 -1
  21. package/dist/core/bash-executor.js.map +1 -1
  22. package/dist/core/command-safety.d.ts +11 -0
  23. package/dist/core/command-safety.d.ts.map +1 -0
  24. package/dist/core/command-safety.js +528 -0
  25. package/dist/core/command-safety.js.map +1 -0
  26. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  27. package/dist/core/compaction/branch-summarization.js +14 -4
  28. package/dist/core/compaction/branch-summarization.js.map +1 -1
  29. package/dist/core/compaction/compaction.d.ts +18 -1
  30. package/dist/core/compaction/compaction.d.ts.map +1 -1
  31. package/dist/core/compaction/compaction.js +80 -42
  32. package/dist/core/compaction/compaction.js.map +1 -1
  33. package/dist/core/compaction/pruner-policy.d.ts +84 -0
  34. package/dist/core/compaction/pruner-policy.d.ts.map +1 -0
  35. package/dist/core/compaction/pruner-policy.js +273 -0
  36. package/dist/core/compaction/pruner-policy.js.map +1 -0
  37. package/dist/core/context-graph-identity-resolution.d.ts +114 -0
  38. package/dist/core/context-graph-identity-resolution.d.ts.map +1 -0
  39. package/dist/core/context-graph-identity-resolution.js +127 -0
  40. package/dist/core/context-graph-identity-resolution.js.map +1 -0
  41. package/dist/core/context-graph-memory-store.d.ts +153 -0
  42. package/dist/core/context-graph-memory-store.d.ts.map +1 -0
  43. package/dist/core/context-graph-memory-store.js +377 -0
  44. package/dist/core/context-graph-memory-store.js.map +1 -0
  45. package/dist/core/context-graph-ontology-generation.d.ts +104 -0
  46. package/dist/core/context-graph-ontology-generation.d.ts.map +1 -0
  47. package/dist/core/context-graph-ontology-generation.js +135 -0
  48. package/dist/core/context-graph-ontology-generation.js.map +1 -0
  49. package/dist/core/context-graph-ontology-registry.d.ts +766 -0
  50. package/dist/core/context-graph-ontology-registry.d.ts.map +1 -0
  51. package/dist/core/context-graph-ontology-registry.js +1133 -0
  52. package/dist/core/context-graph-ontology-registry.js.map +1 -0
  53. package/dist/core/context-graph-policy.d.ts +68 -0
  54. package/dist/core/context-graph-policy.d.ts.map +1 -0
  55. package/dist/core/context-graph-policy.js +221 -0
  56. package/dist/core/context-graph-policy.js.map +1 -0
  57. package/dist/core/context-graph-reasoning.d.ts +130 -0
  58. package/dist/core/context-graph-reasoning.d.ts.map +1 -0
  59. package/dist/core/context-graph-reasoning.js +442 -0
  60. package/dist/core/context-graph-reasoning.js.map +1 -0
  61. package/dist/core/context-graph-retrieval.d.ts +120 -0
  62. package/dist/core/context-graph-retrieval.d.ts.map +1 -0
  63. package/dist/core/context-graph-retrieval.js +288 -0
  64. package/dist/core/context-graph-retrieval.js.map +1 -0
  65. package/dist/core/contract-verification.d.ts +78 -0
  66. package/dist/core/contract-verification.d.ts.map +1 -0
  67. package/dist/core/contract-verification.js +110 -0
  68. package/dist/core/contract-verification.js.map +1 -0
  69. package/dist/core/exact-cache-policy.d.ts +100 -0
  70. package/dist/core/exact-cache-policy.d.ts.map +1 -0
  71. package/dist/core/exact-cache-policy.js +175 -0
  72. package/dist/core/exact-cache-policy.js.map +1 -0
  73. package/dist/core/exec.d.ts +2 -0
  74. package/dist/core/exec.d.ts.map +1 -1
  75. package/dist/core/exec.js +1 -0
  76. package/dist/core/exec.js.map +1 -1
  77. package/dist/core/export-html/template.js +2 -2
  78. package/dist/core/extensions/builtin/command-safety-gate.d.ts +77 -0
  79. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/command-safety-gate.js +147 -0
  81. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -0
  82. package/dist/core/extensions/loader.d.ts +4 -4
  83. package/dist/core/extensions/loader.d.ts.map +1 -1
  84. package/dist/core/extensions/loader.js +94 -56
  85. package/dist/core/extensions/loader.js.map +1 -1
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +1 -1
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +38 -10
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/freedom/banner.d.ts +14 -0
  93. package/dist/core/freedom/banner.d.ts.map +1 -0
  94. package/dist/core/freedom/banner.js +22 -0
  95. package/dist/core/freedom/banner.js.map +1 -0
  96. package/dist/core/freedom/config.d.ts +27 -0
  97. package/dist/core/freedom/config.d.ts.map +1 -0
  98. package/dist/core/freedom/config.js +216 -0
  99. package/dist/core/freedom/config.js.map +1 -0
  100. package/dist/core/freedom/index.d.ts +23 -0
  101. package/dist/core/freedom/index.d.ts.map +1 -0
  102. package/dist/core/freedom/index.js +19 -0
  103. package/dist/core/freedom/index.js.map +1 -0
  104. package/dist/core/freedom/policy.d.ts +42 -0
  105. package/dist/core/freedom/policy.d.ts.map +1 -0
  106. package/dist/core/freedom/policy.js +47 -0
  107. package/dist/core/freedom/policy.js.map +1 -0
  108. package/dist/core/freedom/safety-floor.d.ts +73 -0
  109. package/dist/core/freedom/safety-floor.d.ts.map +1 -0
  110. package/dist/core/freedom/safety-floor.js +275 -0
  111. package/dist/core/freedom/safety-floor.js.map +1 -0
  112. package/dist/core/harness-control-events.d.ts +13 -1
  113. package/dist/core/harness-control-events.d.ts.map +1 -1
  114. package/dist/core/harness-control-events.js +216 -41
  115. package/dist/core/harness-control-events.js.map +1 -1
  116. package/dist/core/harness-control-replay.d.ts +7 -2
  117. package/dist/core/harness-control-replay.d.ts.map +1 -1
  118. package/dist/core/harness-control-replay.js +36 -4
  119. package/dist/core/harness-control-replay.js.map +1 -1
  120. package/dist/core/headroom-middleware.d.ts +35 -0
  121. package/dist/core/headroom-middleware.d.ts.map +1 -0
  122. package/dist/core/headroom-middleware.js +166 -0
  123. package/dist/core/headroom-middleware.js.map +1 -0
  124. package/dist/core/hook-inventory.d.ts +23 -0
  125. package/dist/core/hook-inventory.d.ts.map +1 -0
  126. package/dist/core/hook-inventory.js +50 -0
  127. package/dist/core/hook-inventory.js.map +1 -0
  128. package/dist/core/lean-context-middleware.d.ts +12 -0
  129. package/dist/core/lean-context-middleware.d.ts.map +1 -0
  130. package/dist/core/lean-context-middleware.js +87 -0
  131. package/dist/core/lean-context-middleware.js.map +1 -0
  132. package/dist/core/lean-context-policy.d.ts +45 -0
  133. package/dist/core/lean-context-policy.d.ts.map +1 -0
  134. package/dist/core/lean-context-policy.js +108 -0
  135. package/dist/core/lean-context-policy.js.map +1 -0
  136. package/dist/core/loadout-access-policy.d.ts +41 -0
  137. package/dist/core/loadout-access-policy.d.ts.map +1 -0
  138. package/dist/core/loadout-access-policy.js +182 -0
  139. package/dist/core/loadout-access-policy.js.map +1 -0
  140. package/dist/core/loadout-runtime.d.ts +84 -0
  141. package/dist/core/loadout-runtime.d.ts.map +1 -0
  142. package/dist/core/loadout-runtime.js +157 -0
  143. package/dist/core/loadout-runtime.js.map +1 -0
  144. package/dist/core/loadouts.d.ts +147 -0
  145. package/dist/core/loadouts.d.ts.map +1 -0
  146. package/dist/core/loadouts.js +442 -0
  147. package/dist/core/loadouts.js.map +1 -0
  148. package/dist/core/mcp-inventory.d.ts +34 -0
  149. package/dist/core/mcp-inventory.d.ts.map +1 -1
  150. package/dist/core/mcp-inventory.js +53 -1
  151. package/dist/core/mcp-inventory.js.map +1 -1
  152. package/dist/core/mcp-presets.d.ts +57 -0
  153. package/dist/core/mcp-presets.d.ts.map +1 -0
  154. package/dist/core/mcp-presets.js +81 -0
  155. package/dist/core/mcp-presets.js.map +1 -0
  156. package/dist/core/model-registry.d.ts +1 -0
  157. package/dist/core/model-registry.d.ts.map +1 -1
  158. package/dist/core/model-registry.js +40 -17
  159. package/dist/core/model-registry.js.map +1 -1
  160. package/dist/core/model-resolver.d.ts.map +1 -1
  161. package/dist/core/model-resolver.js +1 -0
  162. package/dist/core/model-resolver.js.map +1 -1
  163. package/dist/core/native-adoption-benchmark.d.ts +166 -0
  164. package/dist/core/native-adoption-benchmark.d.ts.map +1 -0
  165. package/dist/core/native-adoption-benchmark.js +624 -0
  166. package/dist/core/native-adoption-benchmark.js.map +1 -0
  167. package/dist/core/observability-trace.d.ts +80 -0
  168. package/dist/core/observability-trace.d.ts.map +1 -0
  169. package/dist/core/observability-trace.js +140 -0
  170. package/dist/core/observability-trace.js.map +1 -0
  171. package/dist/core/orchestration/checkpoint.d.ts +83 -0
  172. package/dist/core/orchestration/checkpoint.d.ts.map +1 -0
  173. package/dist/core/orchestration/checkpoint.js +152 -0
  174. package/dist/core/orchestration/checkpoint.js.map +1 -0
  175. package/dist/core/orchestration/errors.d.ts +74 -0
  176. package/dist/core/orchestration/errors.d.ts.map +1 -0
  177. package/dist/core/orchestration/errors.js +52 -0
  178. package/dist/core/orchestration/errors.js.map +1 -0
  179. package/dist/core/orchestration/merge-queue.d.ts +121 -0
  180. package/dist/core/orchestration/merge-queue.d.ts.map +1 -0
  181. package/dist/core/orchestration/merge-queue.js +149 -0
  182. package/dist/core/orchestration/merge-queue.js.map +1 -0
  183. package/dist/core/orchestration/recovery.d.ts +106 -0
  184. package/dist/core/orchestration/recovery.d.ts.map +1 -0
  185. package/dist/core/orchestration/recovery.js +110 -0
  186. package/dist/core/orchestration/recovery.js.map +1 -0
  187. package/dist/core/orchestration/replay-ledger.d.ts +76 -0
  188. package/dist/core/orchestration/replay-ledger.d.ts.map +1 -0
  189. package/dist/core/orchestration/replay-ledger.js +395 -0
  190. package/dist/core/orchestration/replay-ledger.js.map +1 -0
  191. package/dist/core/orchestration/scheduler-state.d.ts +78 -0
  192. package/dist/core/orchestration/scheduler-state.d.ts.map +1 -0
  193. package/dist/core/orchestration/scheduler-state.js +185 -0
  194. package/dist/core/orchestration/scheduler-state.js.map +1 -0
  195. package/dist/core/orchestration/scheduler-store.d.ts +309 -0
  196. package/dist/core/orchestration/scheduler-store.d.ts.map +1 -0
  197. package/dist/core/orchestration/scheduler-store.js +368 -0
  198. package/dist/core/orchestration/scheduler-store.js.map +1 -0
  199. package/dist/core/orchestration/sqlite-scheduler-store.d.ts +57 -0
  200. package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +1 -0
  201. package/dist/core/orchestration/sqlite-scheduler-store.js +528 -0
  202. package/dist/core/orchestration/sqlite-scheduler-store.js.map +1 -0
  203. package/dist/core/orchestration/transaction-coordinator.d.ts +217 -0
  204. package/dist/core/orchestration/transaction-coordinator.d.ts.map +1 -0
  205. package/dist/core/orchestration/transaction-coordinator.js +281 -0
  206. package/dist/core/orchestration/transaction-coordinator.js.map +1 -0
  207. package/dist/core/orchestration/verification-contract.d.ts +197 -0
  208. package/dist/core/orchestration/verification-contract.d.ts.map +1 -0
  209. package/dist/core/orchestration/verification-contract.js +145 -0
  210. package/dist/core/orchestration/verification-contract.js.map +1 -0
  211. package/dist/core/package-composition.d.ts +68 -0
  212. package/dist/core/package-composition.d.ts.map +1 -0
  213. package/dist/core/package-composition.js +304 -0
  214. package/dist/core/package-composition.js.map +1 -0
  215. package/dist/core/package-gallery.d.ts +124 -0
  216. package/dist/core/package-gallery.d.ts.map +1 -0
  217. package/dist/core/package-gallery.js +392 -0
  218. package/dist/core/package-gallery.js.map +1 -0
  219. package/dist/core/package-manager.d.ts +69 -0
  220. package/dist/core/package-manager.d.ts.map +1 -1
  221. package/dist/core/package-manager.js +367 -69
  222. package/dist/core/package-manager.js.map +1 -1
  223. package/dist/core/package-procurement.d.ts +268 -0
  224. package/dist/core/package-procurement.d.ts.map +1 -0
  225. package/dist/core/package-procurement.js +697 -0
  226. package/dist/core/package-procurement.js.map +1 -0
  227. package/dist/core/package-trial-runtime.d.ts +75 -0
  228. package/dist/core/package-trial-runtime.d.ts.map +1 -0
  229. package/dist/core/package-trial-runtime.js +73 -0
  230. package/dist/core/package-trial-runtime.js.map +1 -0
  231. package/dist/core/package-trial-sandbox.d.ts +27 -0
  232. package/dist/core/package-trial-sandbox.d.ts.map +1 -0
  233. package/dist/core/package-trial-sandbox.js +102 -0
  234. package/dist/core/package-trial-sandbox.js.map +1 -0
  235. package/dist/core/policy-overlays-runtime.d.ts +141 -0
  236. package/dist/core/policy-overlays-runtime.d.ts.map +1 -0
  237. package/dist/core/policy-overlays-runtime.js +720 -0
  238. package/dist/core/policy-overlays-runtime.js.map +1 -0
  239. package/dist/core/read-anchor-registry.d.ts +27 -0
  240. package/dist/core/read-anchor-registry.d.ts.map +1 -0
  241. package/dist/core/read-anchor-registry.js +103 -0
  242. package/dist/core/read-anchor-registry.js.map +1 -0
  243. package/dist/core/read-anchors.d.ts +110 -0
  244. package/dist/core/read-anchors.d.ts.map +1 -0
  245. package/dist/core/read-anchors.js +193 -0
  246. package/dist/core/read-anchors.js.map +1 -0
  247. package/dist/core/read-content-cache.d.ts +22 -0
  248. package/dist/core/read-content-cache.d.ts.map +1 -0
  249. package/dist/core/read-content-cache.js +79 -0
  250. package/dist/core/read-content-cache.js.map +1 -0
  251. package/dist/core/recovery-checkpoint.d.ts +196 -0
  252. package/dist/core/recovery-checkpoint.d.ts.map +1 -0
  253. package/dist/core/recovery-checkpoint.js +382 -0
  254. package/dist/core/recovery-checkpoint.js.map +1 -0
  255. package/dist/core/resolve-config-value.d.ts +1 -1
  256. package/dist/core/resolve-config-value.d.ts.map +1 -1
  257. package/dist/core/resolve-config-value.js +30 -2
  258. package/dist/core/resolve-config-value.js.map +1 -1
  259. package/dist/core/resource-loader.d.ts +23 -21
  260. package/dist/core/resource-loader.d.ts.map +1 -1
  261. package/dist/core/resource-loader.js +93 -15
  262. package/dist/core/resource-loader.js.map +1 -1
  263. package/dist/core/sandbox/backend.d.ts +25 -0
  264. package/dist/core/sandbox/backend.d.ts.map +1 -0
  265. package/dist/core/sandbox/backend.js +150 -0
  266. package/dist/core/sandbox/backend.js.map +1 -0
  267. package/dist/core/sandbox/env.d.ts +6 -0
  268. package/dist/core/sandbox/env.d.ts.map +1 -0
  269. package/dist/core/sandbox/env.js +46 -0
  270. package/dist/core/sandbox/env.js.map +1 -0
  271. package/dist/core/sandbox/path-resolver.d.ts +4 -0
  272. package/dist/core/sandbox/path-resolver.d.ts.map +1 -0
  273. package/dist/core/sandbox/path-resolver.js +44 -0
  274. package/dist/core/sandbox/path-resolver.js.map +1 -0
  275. package/dist/core/sandbox/policy.d.ts +87 -0
  276. package/dist/core/sandbox/policy.d.ts.map +1 -0
  277. package/dist/core/sandbox/policy.js +280 -0
  278. package/dist/core/sandbox/policy.js.map +1 -0
  279. package/dist/core/sandbox/spawn.d.ts +20 -0
  280. package/dist/core/sandbox/spawn.d.ts.map +1 -0
  281. package/dist/core/sandbox/spawn.js +80 -0
  282. package/dist/core/sandbox/spawn.js.map +1 -0
  283. package/dist/core/sdk.d.ts +83 -4
  284. package/dist/core/sdk.d.ts.map +1 -1
  285. package/dist/core/sdk.js +143 -55
  286. package/dist/core/sdk.js.map +1 -1
  287. package/dist/core/semantic-cache-policy.d.ts +45 -0
  288. package/dist/core/semantic-cache-policy.d.ts.map +1 -0
  289. package/dist/core/semantic-cache-policy.js +220 -0
  290. package/dist/core/semantic-cache-policy.js.map +1 -0
  291. package/dist/core/session-digest.d.ts +57 -0
  292. package/dist/core/session-digest.d.ts.map +1 -0
  293. package/dist/core/session-digest.js +193 -0
  294. package/dist/core/session-digest.js.map +1 -0
  295. package/dist/core/session-manager.d.ts +2 -2
  296. package/dist/core/session-manager.d.ts.map +1 -1
  297. package/dist/core/session-manager.js +5 -4
  298. package/dist/core/session-manager.js.map +1 -1
  299. package/dist/core/settings-manager.d.ts +14 -0
  300. package/dist/core/settings-manager.d.ts.map +1 -1
  301. package/dist/core/settings-manager.js +43 -2
  302. package/dist/core/settings-manager.js.map +1 -1
  303. package/dist/core/system-prompt.d.ts.map +1 -1
  304. package/dist/core/system-prompt.js +25 -7
  305. package/dist/core/system-prompt.js.map +1 -1
  306. package/dist/core/telemetry.d.ts.map +1 -1
  307. package/dist/core/telemetry.js +1 -1
  308. package/dist/core/telemetry.js.map +1 -1
  309. package/dist/core/timings.d.ts +1 -1
  310. package/dist/core/timings.d.ts.map +1 -1
  311. package/dist/core/timings.js +2 -2
  312. package/dist/core/timings.js.map +1 -1
  313. package/dist/core/tools/bash.d.ts +28 -3
  314. package/dist/core/tools/bash.d.ts.map +1 -1
  315. package/dist/core/tools/bash.js +53 -10
  316. package/dist/core/tools/bash.js.map +1 -1
  317. package/dist/core/tools/edit.d.ts +12 -0
  318. package/dist/core/tools/edit.d.ts.map +1 -1
  319. package/dist/core/tools/edit.js +24 -0
  320. package/dist/core/tools/edit.js.map +1 -1
  321. package/dist/core/tools/find.d.ts +3 -0
  322. package/dist/core/tools/find.d.ts.map +1 -1
  323. package/dist/core/tools/find.js +3 -0
  324. package/dist/core/tools/find.js.map +1 -1
  325. package/dist/core/tools/grep.d.ts +3 -0
  326. package/dist/core/tools/grep.d.ts.map +1 -1
  327. package/dist/core/tools/grep.js +4 -1
  328. package/dist/core/tools/grep.js.map +1 -1
  329. package/dist/core/tools/index.d.ts +1 -1
  330. package/dist/core/tools/index.d.ts.map +1 -1
  331. package/dist/core/tools/index.js.map +1 -1
  332. package/dist/core/tools/ls.d.ts +3 -0
  333. package/dist/core/tools/ls.d.ts.map +1 -1
  334. package/dist/core/tools/ls.js +3 -0
  335. package/dist/core/tools/ls.js.map +1 -1
  336. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  337. package/dist/core/tools/output-accumulator.js +1 -1
  338. package/dist/core/tools/output-accumulator.js.map +1 -1
  339. package/dist/core/tools/read.d.ts +13 -0
  340. package/dist/core/tools/read.d.ts.map +1 -1
  341. package/dist/core/tools/read.js +29 -2
  342. package/dist/core/tools/read.js.map +1 -1
  343. package/dist/core/tools/write.d.ts +3 -0
  344. package/dist/core/tools/write.d.ts.map +1 -1
  345. package/dist/core/tools/write.js +3 -0
  346. package/dist/core/tools/write.js.map +1 -1
  347. package/dist/index.d.ts +19 -4
  348. package/dist/index.d.ts.map +1 -1
  349. package/dist/index.js +17 -2
  350. package/dist/index.js.map +1 -1
  351. package/dist/main.d.ts.map +1 -1
  352. package/dist/main.js +4 -6
  353. package/dist/main.js.map +1 -1
  354. package/dist/migrations.d.ts.map +1 -1
  355. package/dist/migrations.js +1 -1
  356. package/dist/migrations.js.map +1 -1
  357. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts +28 -0
  358. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -0
  359. package/dist/modes/interactive/components/control-panel-gradient-motion.js +146 -0
  360. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -0
  361. package/dist/modes/interactive/components/control-panel-gradient.d.ts +27 -0
  362. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -0
  363. package/dist/modes/interactive/components/control-panel-gradient.js +127 -0
  364. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -0
  365. package/dist/modes/interactive/components/control-panel.d.ts +28 -1
  366. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/control-panel.js +153 -3
  368. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  369. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  371. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  372. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/extension-editor.js +1 -1
  374. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  375. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/footer.js +8 -0
  377. package/dist/modes/interactive/components/footer.js.map +1 -1
  378. package/dist/modes/interactive/components/mcp-selector.d.ts +2 -0
  379. package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/mcp-selector.js +18 -1
  381. package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/model-selector-state.d.ts +101 -0
  383. package/dist/modes/interactive/components/model-selector-state.d.ts.map +1 -0
  384. package/dist/modes/interactive/components/model-selector-state.js +261 -0
  385. package/dist/modes/interactive/components/model-selector-state.js.map +1 -0
  386. package/dist/modes/interactive/components/model-selector.d.ts +44 -10
  387. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/model-selector.js +163 -110
  389. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  390. package/dist/modes/interactive/components/theme-selector.d.ts +1 -0
  391. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/theme-selector.js +10 -1
  393. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  394. package/dist/modes/interactive/interactive-mode.d.ts +4 -2
  395. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  396. package/dist/modes/interactive/interactive-mode.js +61 -13
  397. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  398. package/dist/modes/interactive/theme/omk-blackboard.json +91 -0
  399. package/dist/modes/interactive/theme/omk-freedom-grid.json +91 -0
  400. package/dist/modes/interactive/theme/omk-neon-ops.json +90 -0
  401. package/dist/modes/interactive/theme/omk-slate-light.json +91 -0
  402. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  403. package/dist/modes/interactive/theme/theme.js +14 -0
  404. package/dist/modes/interactive/theme/theme.js.map +1 -1
  405. package/dist/modes/print-mode.d.ts +2 -2
  406. package/dist/modes/print-mode.d.ts.map +1 -1
  407. package/dist/modes/print-mode.js +2 -2
  408. package/dist/modes/print-mode.js.map +1 -1
  409. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  410. package/dist/modes/rpc/rpc-mode.js +4 -0
  411. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  412. package/dist/package-manager-cli.d.ts.map +1 -1
  413. package/dist/package-manager-cli.js +114 -49
  414. package/dist/package-manager-cli.js.map +1 -1
  415. package/dist/utils/clipboard-image.d.ts.map +1 -1
  416. package/dist/utils/clipboard-image.js +1 -1
  417. package/dist/utils/clipboard-image.js.map +1 -1
  418. package/dist/utils/omk-user-agent.d.ts +2 -0
  419. package/dist/utils/omk-user-agent.d.ts.map +1 -0
  420. package/dist/utils/{pi-user-agent.js → omk-user-agent.js} +2 -2
  421. package/dist/utils/omk-user-agent.js.map +1 -0
  422. package/dist/utils/tools-manager.d.ts.map +1 -1
  423. package/dist/utils/tools-manager.js +1 -1
  424. package/dist/utils/tools-manager.js.map +1 -1
  425. package/dist/utils/version-check.d.ts +5 -5
  426. package/dist/utils/version-check.d.ts.map +1 -1
  427. package/dist/utils/version-check.js +8 -11
  428. package/dist/utils/version-check.js.map +1 -1
  429. package/dist/utils/windows-self-update.d.ts.map +1 -1
  430. package/dist/utils/windows-self-update.js +1 -1
  431. package/dist/utils/windows-self-update.js.map +1 -1
  432. package/docs/packages.md +47 -6
  433. package/docs/prompt-templates.md +2 -0
  434. package/docs/usage.md +16 -6
  435. package/examples/README.md +1 -1
  436. package/examples/extensions/README.md +11 -11
  437. package/examples/extensions/auto-commit-on-exit.ts +6 -6
  438. package/examples/extensions/bash-spawn-hook.ts +4 -4
  439. package/examples/extensions/bookmark.ts +5 -5
  440. package/examples/extensions/border-status-editor.ts +7 -7
  441. package/examples/extensions/built-in-tool-renderer.ts +6 -6
  442. package/examples/extensions/claude-rules.ts +4 -4
  443. package/examples/extensions/commands.ts +5 -5
  444. package/examples/extensions/confirm-destructive.ts +3 -3
  445. package/examples/extensions/custom-compaction.ts +3 -3
  446. package/examples/extensions/custom-footer.ts +2 -2
  447. package/examples/extensions/custom-header.ts +5 -5
  448. package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
  449. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  450. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  451. package/examples/extensions/custom-provider-gitlab-duo/index.ts +3 -3
  452. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  453. package/examples/extensions/dirty-repo-guard.ts +7 -7
  454. package/examples/extensions/doom-overlay/README.md +3 -3
  455. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  456. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +1 -1
  457. package/examples/extensions/doom-overlay/index.ts +3 -3
  458. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  459. package/examples/extensions/dynamic-resources/index.ts +2 -2
  460. package/examples/extensions/dynamic-tools.ts +4 -4
  461. package/examples/extensions/event-bus.ts +8 -8
  462. package/examples/extensions/file-trigger.ts +3 -3
  463. package/examples/extensions/git-checkpoint.ts +7 -7
  464. package/examples/extensions/git-merge-and-resolve.ts +14 -14
  465. package/examples/extensions/github-issue-autocomplete.ts +6 -6
  466. package/examples/extensions/gondolin/index.ts +16 -16
  467. package/examples/extensions/gondolin/package-lock.json +2 -2
  468. package/examples/extensions/gondolin/package.json +1 -1
  469. package/examples/extensions/handoff.ts +2 -2
  470. package/examples/extensions/hello.ts +2 -2
  471. package/examples/extensions/hidden-thinking-label.ts +4 -4
  472. package/examples/extensions/inline-bash.ts +5 -5
  473. package/examples/extensions/input-transform-streaming.ts +5 -5
  474. package/examples/extensions/input-transform.ts +5 -5
  475. package/examples/extensions/interactive-shell.ts +3 -3
  476. package/examples/extensions/mac-system-theme.ts +5 -5
  477. package/examples/extensions/message-renderer.ts +4 -4
  478. package/examples/extensions/minimal-mode.ts +9 -9
  479. package/examples/extensions/modal-editor.ts +3 -3
  480. package/examples/extensions/model-status.ts +3 -3
  481. package/examples/extensions/notify.ts +5 -5
  482. package/examples/extensions/overlay-qa-tests.ts +20 -20
  483. package/examples/extensions/overlay-test.ts +3 -3
  484. package/examples/extensions/permission-gate.ts +2 -2
  485. package/examples/extensions/pirate.ts +4 -4
  486. package/examples/extensions/plan-mode/index.ts +22 -22
  487. package/examples/extensions/preset.ts +30 -30
  488. package/examples/extensions/prompt-customizer.ts +3 -3
  489. package/examples/extensions/protected-paths.ts +2 -2
  490. package/examples/extensions/provider-payload.ts +5 -5
  491. package/examples/extensions/qna.ts +2 -2
  492. package/examples/extensions/question.ts +2 -2
  493. package/examples/extensions/questionnaire.ts +2 -2
  494. package/examples/extensions/rainbow-editor.ts +3 -3
  495. package/examples/extensions/reload-runtime.ts +4 -4
  496. package/examples/extensions/rpc-demo.ts +10 -10
  497. package/examples/extensions/sandbox/index.ts +17 -17
  498. package/examples/extensions/sandbox/package-lock.json +2 -2
  499. package/examples/extensions/sandbox/package.json +1 -1
  500. package/examples/extensions/send-user-message.ts +13 -13
  501. package/examples/extensions/session-name.ts +4 -4
  502. package/examples/extensions/shutdown-command.ts +10 -10
  503. package/examples/extensions/snake.ts +3 -3
  504. package/examples/extensions/space-invaders.ts +3 -3
  505. package/examples/extensions/ssh.ts +12 -12
  506. package/examples/extensions/status-line.ts +4 -4
  507. package/examples/extensions/structured-output.ts +2 -2
  508. package/examples/extensions/subagent/README.md +13 -13
  509. package/examples/extensions/subagent/agents.ts +2 -2
  510. package/examples/extensions/subagent/index.ts +53 -21
  511. package/examples/extensions/summarize.ts +2 -2
  512. package/examples/extensions/system-prompt-header.ts +3 -3
  513. package/examples/extensions/tic-tac-toe.ts +15 -15
  514. package/examples/extensions/timed-confirm.ts +4 -4
  515. package/examples/extensions/titlebar-spinner.ts +9 -9
  516. package/examples/extensions/todo.ts +5 -5
  517. package/examples/extensions/tool-override.ts +5 -5
  518. package/examples/extensions/tools.ts +10 -10
  519. package/examples/extensions/trigger-compact.ts +3 -3
  520. package/examples/extensions/truncated-tool.ts +3 -3
  521. package/examples/extensions/widget-placement.ts +2 -2
  522. package/examples/extensions/with-deps/index.ts +2 -2
  523. package/examples/extensions/with-deps/package-lock.json +2 -2
  524. package/examples/extensions/with-deps/package.json +1 -1
  525. package/examples/extensions/working-indicator.ts +7 -7
  526. package/examples/extensions/working-message-test.ts +3 -3
  527. package/examples/sdk/01-minimal.ts +1 -1
  528. package/examples/sdk/03-custom-prompt.ts +1 -1
  529. package/examples/sdk/04-skills.ts +1 -1
  530. package/examples/sdk/05-tools.ts +1 -1
  531. package/examples/sdk/06-extensions.ts +11 -11
  532. package/examples/sdk/07-context-files.ts +2 -0
  533. package/examples/sdk/08-prompt-templates.ts +1 -1
  534. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  535. package/examples/sdk/README.md +2 -2
  536. package/node_modules/@earendil-works/omk-agent-core/README.md +488 -0
  537. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +24 -0
  538. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +1 -0
  539. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +553 -0
  540. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +1 -0
  541. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +118 -0
  542. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +1 -0
  543. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +402 -0
  544. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +1 -0
  545. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +95 -0
  546. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +1 -0
  547. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +996 -0
  548. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +1 -0
  549. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +53 -0
  550. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  551. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +175 -0
  552. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -0
  553. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +117 -0
  554. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -0
  555. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +568 -0
  556. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +1 -0
  557. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +25 -0
  558. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +1 -0
  559. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +131 -0
  560. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +1 -0
  561. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +51 -0
  562. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +1 -0
  563. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +510 -0
  564. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +1 -0
  565. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +51 -0
  566. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +1 -0
  567. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +102 -0
  568. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +1 -0
  569. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +48 -0
  570. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +1 -0
  571. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +230 -0
  572. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +1 -0
  573. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +26 -0
  574. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -0
  575. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +101 -0
  576. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +1 -0
  577. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +36 -0
  578. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -0
  579. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +273 -0
  580. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +1 -0
  581. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +18 -0
  582. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -0
  583. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +42 -0
  584. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +1 -0
  585. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +25 -0
  586. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -0
  587. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +114 -0
  588. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +1 -0
  589. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +11 -0
  590. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -0
  591. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +39 -0
  592. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +1 -0
  593. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +33 -0
  594. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +1 -0
  595. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +210 -0
  596. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +1 -0
  597. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +2 -0
  598. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +1 -0
  599. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +50 -0
  600. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +1 -0
  601. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +44 -0
  602. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +1 -0
  603. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +311 -0
  604. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +1 -0
  605. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +3 -0
  606. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +1 -0
  607. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +30 -0
  608. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +1 -0
  609. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +616 -0
  610. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +1 -0
  611. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +94 -0
  612. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +1 -0
  613. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +14 -0
  614. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -0
  615. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +126 -0
  616. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +1 -0
  617. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +70 -0
  618. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +1 -0
  619. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +297 -0
  620. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +1 -0
  621. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +20 -0
  622. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +1 -0
  623. package/node_modules/@earendil-works/omk-agent-core/dist/index.js +25 -0
  624. package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +1 -0
  625. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +3 -0
  626. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +1 -0
  627. package/node_modules/@earendil-works/omk-agent-core/dist/node.js +3 -0
  628. package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +1 -0
  629. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +69 -0
  630. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +1 -0
  631. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +278 -0
  632. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +1 -0
  633. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +393 -0
  634. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +1 -0
  635. package/node_modules/@earendil-works/omk-agent-core/dist/types.js +2 -0
  636. package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +1 -0
  637. package/node_modules/@earendil-works/omk-agent-core/package.json +60 -0
  638. package/node_modules/@earendil-works/omk-ai/README.md +1389 -0
  639. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +20 -0
  640. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +1 -0
  641. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +44 -0
  642. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +1 -0
  643. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +5 -0
  644. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +1 -0
  645. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +6 -0
  646. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +1 -0
  647. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +3 -0
  648. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +1 -0
  649. package/node_modules/@earendil-works/omk-ai/dist/cli.js +130 -0
  650. package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +1 -0
  651. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +20 -0
  652. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +1 -0
  653. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +199 -0
  654. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +1 -0
  655. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +10 -0
  656. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +1 -0
  657. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +515 -0
  658. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +1 -0
  659. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +517 -0
  660. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +1 -0
  661. package/node_modules/@earendil-works/omk-ai/dist/image-models.js +23 -0
  662. package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +1 -0
  663. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +14 -0
  664. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +1 -0
  665. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +22 -0
  666. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +1 -0
  667. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +4 -0
  668. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +1 -0
  669. package/node_modules/@earendil-works/omk-ai/dist/images.js +16 -0
  670. package/node_modules/@earendil-works/omk-ai/dist/images.js.map +1 -0
  671. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +33 -0
  672. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +1 -0
  673. package/node_modules/@earendil-works/omk-ai/dist/index.js +21 -0
  674. package/node_modules/@earendil-works/omk-ai/dist/index.js.map +1 -0
  675. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +18 -0
  676. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +1 -0
  677. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +18762 -0
  678. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +1 -0
  679. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +17197 -0
  680. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +1 -0
  681. package/node_modules/@earendil-works/omk-ai/dist/models.js +78 -0
  682. package/node_modules/@earendil-works/omk-ai/dist/models.js.map +1 -0
  683. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +2 -0
  684. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +1 -0
  685. package/node_modules/@earendil-works/omk-ai/dist/oauth.js +2 -0
  686. package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +1 -0
  687. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +39 -0
  688. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +1 -0
  689. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +170 -0
  690. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +1 -0
  691. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +38 -0
  692. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +1 -0
  693. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +826 -0
  694. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +1 -0
  695. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +77 -0
  696. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +1 -0
  697. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +1123 -0
  698. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +1 -0
  699. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +15 -0
  700. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +1 -0
  701. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +221 -0
  702. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +1 -0
  703. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +13 -0
  704. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +1 -0
  705. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +26 -0
  706. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +1 -0
  707. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +56 -0
  708. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +1 -0
  709. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +368 -0
  710. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +1 -0
  711. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +8 -0
  712. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +1 -0
  713. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +29 -0
  714. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +1 -0
  715. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +70 -0
  716. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +1 -0
  717. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +331 -0
  718. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +1 -0
  719. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +15 -0
  720. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +1 -0
  721. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +442 -0
  722. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +1 -0
  723. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +13 -0
  724. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +1 -0
  725. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +402 -0
  726. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +1 -0
  727. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +3 -0
  728. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +1 -0
  729. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +128 -0
  730. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +1 -0
  731. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +4 -0
  732. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +1 -0
  733. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +34 -0
  734. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +1 -0
  735. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +25 -0
  736. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +1 -0
  737. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +534 -0
  738. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +1 -0
  739. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +30 -0
  740. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +1 -0
  741. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +1171 -0
  742. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +1 -0
  743. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +19 -0
  744. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +1 -0
  745. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +977 -0
  746. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +1 -0
  747. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +11 -0
  748. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -0
  749. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +22 -0
  750. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +1 -0
  751. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +18 -0
  752. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +1 -0
  753. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +496 -0
  754. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +1 -0
  755. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +13 -0
  756. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +1 -0
  757. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +233 -0
  758. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +1 -0
  759. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +35 -0
  760. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +1 -0
  761. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +254 -0
  762. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +1 -0
  763. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +8 -0
  764. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +1 -0
  765. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +42 -0
  766. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +1 -0
  767. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +13 -0
  768. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +1 -0
  769. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +82 -0
  770. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +1 -0
  771. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +8 -0
  772. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +1 -0
  773. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +184 -0
  774. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +1 -0
  775. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +4 -0
  776. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +1 -0
  777. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +22 -0
  778. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +1 -0
  779. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +8 -0
  780. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +1 -0
  781. package/node_modules/@earendil-works/omk-ai/dist/stream.js +77 -0
  782. package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +1 -0
  783. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +570 -0
  784. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +1 -0
  785. package/node_modules/@earendil-works/omk-ai/dist/types.js +2 -0
  786. package/node_modules/@earendil-works/omk-ai/dist/types.js.map +1 -0
  787. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +6 -0
  788. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +1 -0
  789. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +34 -0
  790. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +1 -0
  791. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +19 -0
  792. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +1 -0
  793. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +25 -0
  794. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +1 -0
  795. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +21 -0
  796. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +1 -0
  797. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +81 -0
  798. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +1 -0
  799. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +3 -0
  800. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +1 -0
  801. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +14 -0
  802. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +1 -0
  803. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +2 -0
  804. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +1 -0
  805. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +8 -0
  806. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +1 -0
  807. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +16 -0
  808. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +1 -0
  809. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +113 -0
  810. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +1 -0
  811. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +10 -0
  812. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +1 -0
  813. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +97 -0
  814. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +1 -0
  815. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +25 -0
  816. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +1 -0
  817. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +335 -0
  818. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +1 -0
  819. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +21 -0
  820. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +1 -0
  821. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +56 -0
  822. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +1 -0
  823. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +30 -0
  824. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  825. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +280 -0
  826. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +1 -0
  827. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +58 -0
  828. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +1 -0
  829. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +122 -0
  830. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +1 -0
  831. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +3 -0
  832. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -0
  833. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +105 -0
  834. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +1 -0
  835. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +43 -0
  836. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  837. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +487 -0
  838. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +1 -0
  839. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +13 -0
  840. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +1 -0
  841. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +31 -0
  842. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +1 -0
  843. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +64 -0
  844. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +1 -0
  845. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +2 -0
  846. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +1 -0
  847. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +57 -0
  848. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +1 -0
  849. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +154 -0
  850. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +1 -0
  851. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +22 -0
  852. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +1 -0
  853. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +26 -0
  854. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +1 -0
  855. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +17 -0
  856. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +1 -0
  857. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +21 -0
  858. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +1 -0
  859. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +18 -0
  860. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +1 -0
  861. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +281 -0
  862. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +1 -0
  863. package/node_modules/@earendil-works/omk-ai/package.json +106 -0
  864. package/node_modules/@earendil-works/omk-tui/README.md +791 -0
  865. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +54 -0
  866. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +1 -0
  867. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +632 -0
  868. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +1 -0
  869. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +22 -0
  870. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +1 -0
  871. package/node_modules/@earendil-works/omk-tui/dist/components/box.js +104 -0
  872. package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +1 -0
  873. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +22 -0
  874. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +1 -0
  875. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +35 -0
  876. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +1 -0
  877. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +249 -0
  878. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +1 -0
  879. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +1857 -0
  880. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +1 -0
  881. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +28 -0
  882. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +1 -0
  883. package/node_modules/@earendil-works/omk-tui/dist/components/image.js +89 -0
  884. package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +1 -0
  885. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +37 -0
  886. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +1 -0
  887. package/node_modules/@earendil-works/omk-tui/dist/components/input.js +378 -0
  888. package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +1 -0
  889. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +31 -0
  890. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +1 -0
  891. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +69 -0
  892. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +1 -0
  893. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +96 -0
  894. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +1 -0
  895. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +644 -0
  896. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +1 -0
  897. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +50 -0
  898. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +1 -0
  899. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +159 -0
  900. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +1 -0
  901. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +50 -0
  902. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +1 -0
  903. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +185 -0
  904. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +1 -0
  905. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +12 -0
  906. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +1 -0
  907. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +23 -0
  908. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +1 -0
  909. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +19 -0
  910. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +1 -0
  911. package/node_modules/@earendil-works/omk-tui/dist/components/text.js +89 -0
  912. package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +1 -0
  913. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +13 -0
  914. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +1 -0
  915. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +51 -0
  916. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +1 -0
  917. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +39 -0
  918. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +1 -0
  919. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +2 -0
  920. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +1 -0
  921. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +16 -0
  922. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +1 -0
  923. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +110 -0
  924. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +1 -0
  925. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +23 -0
  926. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +1 -0
  927. package/node_modules/@earendil-works/omk-tui/dist/index.js +32 -0
  928. package/node_modules/@earendil-works/omk-tui/dist/index.js.map +1 -0
  929. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +212 -0
  930. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +1 -0
  931. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +252 -0
  932. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +1 -0
  933. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +184 -0
  934. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +1 -0
  935. package/node_modules/@earendil-works/omk-tui/dist/keys.js +1173 -0
  936. package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +1 -0
  937. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +28 -0
  938. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +1 -0
  939. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +44 -0
  940. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +1 -0
  941. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +3 -0
  942. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +1 -0
  943. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +53 -0
  944. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +1 -0
  945. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +50 -0
  946. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +1 -0
  947. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +361 -0
  948. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +1 -0
  949. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +90 -0
  950. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +1 -0
  951. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +366 -0
  952. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +1 -0
  953. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +113 -0
  954. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +1 -0
  955. package/node_modules/@earendil-works/omk-tui/dist/terminal.js +472 -0
  956. package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +1 -0
  957. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +242 -0
  958. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +1 -0
  959. package/node_modules/@earendil-works/omk-tui/dist/tui.js +1221 -0
  960. package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +1 -0
  961. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +17 -0
  962. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +1 -0
  963. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +25 -0
  964. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +1 -0
  965. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +84 -0
  966. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +1 -0
  967. package/node_modules/@earendil-works/omk-tui/dist/utils.js +1032 -0
  968. package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +1 -0
  969. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +25 -0
  970. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +1 -0
  971. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +96 -0
  972. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +1 -0
  973. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  974. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  975. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  976. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  977. package/node_modules/@earendil-works/omk-tui/package.json +47 -0
  978. package/package.json +22 -6
  979. package/dist/utils/pi-user-agent.d.ts +0 -2
  980. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  981. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/freedom/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `.omk/config.toml` loader for the freedom block.\n *\n * Implements a tiny, deterministic TOML subset that is exactly enough for the\n * schema defined in `.omk/runs/freedom-plan-20260619/config-schema.md`:\n *\n * - `# comment` lines and blank lines\n * - `[section.subsection]` headers\n * - `key = \"string\"` | `key = true` | `key = false`\n *\n * Anything outside that subset is treated as a malformed line and rejected\n * at parse time so users learn early that their config is wrong.\n *\n * Adding `@iarna/toml` would also work, but AGENTS.md keeps direct deps pinned\n * and reviewed; a 60-line hand parser avoids the dep-review cost for a config\n * shape this small.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport type ApprovalPolicy = \"yolo\" | \"prompt-per-tool\";\n\nexport interface FreedomConfig {\n\tenabled: boolean;\n\tapprovalPolicy: ApprovalPolicy;\n\tyoloMode: boolean;\n\tsafetyFloor: { enforced: true };\n\tbanner: { show: boolean; suppressAfter: \"session\" | \"forever\" };\n\taudit: { emitEvents: boolean; includeArgs: boolean; logPath: string };\n\tdoctrineVersion: string;\n}\n\nexport const FREEDOM_CONFIG_DEFAULTS: FreedomConfig = Object.freeze({\n\tenabled: false,\n\tapprovalPolicy: \"prompt-per-tool\",\n\tyoloMode: false,\n\tsafetyFloor: Object.freeze({ enforced: true }) as { enforced: true },\n\tbanner: Object.freeze({ show: true, suppressAfter: \"session\" }) as {\n\t\tshow: boolean;\n\t\tsuppressAfter: \"session\" | \"forever\";\n\t},\n\taudit: Object.freeze({ emitEvents: true, includeArgs: false, logPath: \".omk/audit/freedom.log\" }) as {\n\t\temitEvents: boolean;\n\t\tincludeArgs: boolean;\n\t\tlogPath: string;\n\t},\n\tdoctrineVersion: \"0.78.0-freedom\",\n}) as FreedomConfig;\n\ntype TomlValue = string | boolean | number;\n\ntype TomlTable = { [key: string]: TomlValue | TomlTable };\n\nexport class FreedomConfigError extends Error {\n\treadonly line?: number;\n\tconstructor(message: string, line?: number) {\n\t\tsuper(line ? `${message} (line ${line})` : message);\n\t\tthis.name = \"FreedomConfigError\";\n\t\tthis.line = line;\n\t}\n}\n\nexport function loadFreedomConfig(projectRoot: string): FreedomConfig {\n\tconst configPath = join(projectRoot, \".omk\", \"config.toml\");\n\tif (!existsSync(configPath)) return FREEDOM_CONFIG_DEFAULTS;\n\tconst raw = readFileSync(configPath, \"utf8\");\n\tconst parsed = parseToml(raw);\n\treturn materializeFreedomConfig(parsed);\n}\n\nexport function parseFreedomConfigFromString(raw: string): FreedomConfig {\n\treturn materializeFreedomConfig(parseToml(raw));\n}\n\nfunction parseToml(raw: string): TomlTable {\n\tconst root: TomlTable = {};\n\tlet current: TomlTable = root;\n\tconst normalized = raw.replace(/\\r\\n/g, \"\\n\");\n\tconst lines = normalized.split(\"\\n\");\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst lineNumber = i + 1;\n\t\tconst line = stripInlineComment(lines[i]).trim();\n\t\tif (line.length === 0) continue;\n\t\tif (line.startsWith(\"[\")) {\n\t\t\tif (!line.endsWith(\"]\")) {\n\t\t\t\tthrow new FreedomConfigError(`Unterminated section header: ${line}`, lineNumber);\n\t\t\t}\n\t\t\tconst path = line\n\t\t\t\t.slice(1, -1)\n\t\t\t\t.split(\".\")\n\t\t\t\t.map((part) => part.trim());\n\t\t\tfor (const part of path) {\n\t\t\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(part)) {\n\t\t\t\t\tthrow new FreedomConfigError(`Invalid section name '${part}'`, lineNumber);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcurrent = ensureTable(root, path);\n\t\t\tcontinue;\n\t\t}\n\t\tconst eq = line.indexOf(\"=\");\n\t\tif (eq < 0) {\n\t\t\tthrow new FreedomConfigError(`Expected 'key = value' but got '${line}'`, lineNumber);\n\t\t}\n\t\tconst key = line.slice(0, eq).trim();\n\t\tconst value = line.slice(eq + 1).trim();\n\t\tif (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n\t\t\tthrow new FreedomConfigError(`Invalid key '${key}'`, lineNumber);\n\t\t}\n\t\tcurrent[key] = parseValue(value, lineNumber);\n\t}\n\treturn root;\n}\n\nfunction ensureTable(root: TomlTable, path: readonly string[]): TomlTable {\n\tlet cursor: TomlTable = root;\n\tfor (const part of path) {\n\t\tconst next = cursor[part];\n\t\tif (next === undefined) {\n\t\t\tconst created: TomlTable = {};\n\t\t\tcursor[part] = created;\n\t\t\tcursor = created;\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof next !== \"object\" || next === null) {\n\t\t\tthrow new FreedomConfigError(`Section '${path.join(\".\")}' collides with a value`);\n\t\t}\n\t\tcursor = next as TomlTable;\n\t}\n\treturn cursor;\n}\n\nfunction stripInlineComment(line: string): string {\n\tlet inString = false;\n\tlet quote = \"\";\n\tfor (let i = 0; i < line.length; i++) {\n\t\tconst c = line[i];\n\t\tif (inString) {\n\t\t\tif (c === \"\\\\\") {\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (c === quote) inString = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === '\"' || c === \"'\") {\n\t\t\tinString = true;\n\t\t\tquote = c;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === \"#\") return line.slice(0, i);\n\t}\n\treturn line;\n}\n\nfunction parseValue(raw: string, lineNumber: number): TomlValue {\n\tif (raw === \"true\") return true;\n\tif (raw === \"false\") return false;\n\tif (/^-?\\d+$/.test(raw)) return Number(raw);\n\tif ((raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))) {\n\t\treturn raw.slice(1, -1).replace(/\\\\n/g, \"\\n\").replace(/\\\\t/g, \"\\t\").replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n\t}\n\tthrow new FreedomConfigError(`Unsupported value '${raw}'`, lineNumber);\n}\n\nfunction materializeFreedomConfig(parsed: TomlTable): FreedomConfig {\n\tconst block = parsed.freedom;\n\tif (block === undefined) return FREEDOM_CONFIG_DEFAULTS;\n\tif (typeof block !== \"object\" || block === null) {\n\t\tthrow new FreedomConfigError(\"'[freedom]' must be a table\");\n\t}\n\tconst freedom = block as TomlTable;\n\n\tconst enabled = readBool(freedom, \"enabled\", FREEDOM_CONFIG_DEFAULTS.enabled);\n\tconst approvalPolicy = readApprovalPolicy(freedom);\n\tconst yoloMode = readBool(freedom, \"yolo_mode\", FREEDOM_CONFIG_DEFAULTS.yoloMode);\n\tconst doctrineVersion = readString(freedom, \"doctrine_version\", FREEDOM_CONFIG_DEFAULTS.doctrineVersion);\n\n\tif (yoloMode && approvalPolicy !== \"yolo\") {\n\t\tthrow new FreedomConfigError('yolo_mode=true requires approval_policy=\"yolo\"');\n\t}\n\n\tconst safetyFloorBlock = (freedom.safety_floor ?? {}) as TomlTable;\n\tfor (const [key, value] of Object.entries(safetyFloorBlock)) {\n\t\tif (value !== \"enforced\") {\n\t\t\tthrow new FreedomConfigError(\n\t\t\t\t`[freedom.safety_floor] '${key}' must be \"enforced\", got ${JSON.stringify(value)}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst bannerBlock = (freedom.banner ?? {}) as TomlTable;\n\tconst banner = {\n\t\tshow: readBool(bannerBlock, \"show\", FREEDOM_CONFIG_DEFAULTS.banner.show),\n\t\tsuppressAfter: readSuppressAfter(bannerBlock),\n\t};\n\n\tconst auditBlock = (freedom.audit ?? {}) as TomlTable;\n\tconst audit = {\n\t\temitEvents: readBool(auditBlock, \"emit_events\", FREEDOM_CONFIG_DEFAULTS.audit.emitEvents),\n\t\tincludeArgs: readBool(auditBlock, \"include_args\", FREEDOM_CONFIG_DEFAULTS.audit.includeArgs),\n\t\tlogPath: readString(auditBlock, \"log_path\", FREEDOM_CONFIG_DEFAULTS.audit.logPath),\n\t};\n\n\treturn {\n\t\tenabled,\n\t\tapprovalPolicy,\n\t\tyoloMode,\n\t\tsafetyFloor: { enforced: true },\n\t\tbanner,\n\t\taudit,\n\t\tdoctrineVersion,\n\t};\n}\n\nfunction readBool(table: TomlTable, key: string, fallback: boolean): boolean {\n\tconst value = table[key];\n\tif (value === undefined) return fallback;\n\tif (typeof value !== \"boolean\") {\n\t\tthrow new FreedomConfigError(`'${key}' must be a boolean, got ${JSON.stringify(value)}`);\n\t}\n\treturn value;\n}\n\nfunction readString(table: TomlTable, key: string, fallback: string): string {\n\tconst value = table[key];\n\tif (value === undefined) return fallback;\n\tif (typeof value !== \"string\") {\n\t\tthrow new FreedomConfigError(`'${key}' must be a string, got ${JSON.stringify(value)}`);\n\t}\n\treturn value;\n}\n\nfunction readApprovalPolicy(table: TomlTable): ApprovalPolicy {\n\tconst value = table.approval_policy;\n\tif (value === undefined) return FREEDOM_CONFIG_DEFAULTS.approvalPolicy;\n\tif (value === \"yolo\" || value === \"prompt-per-tool\") return value;\n\tthrow new FreedomConfigError(`approval_policy must be \"yolo\" or \"prompt-per-tool\", got ${JSON.stringify(value)}`);\n}\n\nfunction readSuppressAfter(table: TomlTable): \"session\" | \"forever\" {\n\tconst value = table.suppress_after;\n\tif (value === undefined) return FREEDOM_CONFIG_DEFAULTS.banner.suppressAfter;\n\tif (value === \"session\" || value === \"forever\") return value;\n\tthrow new FreedomConfigError(`suppress_after must be \"session\" or \"forever\", got ${JSON.stringify(value)}`);\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Public surface for the OMK freedom-mode runtime.
3
+ *
4
+ * Tool dispatchers import `gate`. The interactive TUI imports `badgeText` and
5
+ * `bannerOnce`. Subprocess spawners import `applyFreedomEnv`. Everything else
6
+ * is implementation detail and stays inside this directory.
7
+ *
8
+ * Design: every doctrine clause from AGENTS.md §0 has exactly one owner here.
9
+ * - §0.1 safety floor → safety-floor.ts (always-on, never downgradable)
10
+ * - §0.2 defaults → config.ts (parsed from .omk/config.toml)
11
+ * - §0.3 no moralizing → not enforced at runtime (system prompt only)
12
+ * - banner & badge → banner.ts + policy.badgeText
13
+ * - subprocess env → policy.applyFreedomEnv
14
+ */
15
+ export type { BannerMemo } from "./banner.ts";
16
+ export { bannerOnce } from "./banner.ts";
17
+ export type { ApprovalPolicy, FreedomConfig } from "./config.ts";
18
+ export { FREEDOM_CONFIG_DEFAULTS, FreedomConfigError, loadFreedomConfig, parseFreedomConfigFromString, } from "./config.ts";
19
+ export type { PolicyDecision, ToolCallContext } from "./policy.ts";
20
+ export { applyFreedomEnv, badgeText, gate } from "./policy.ts";
21
+ export type { MatcherVerdict } from "./safety-floor.ts";
22
+ export { redactSecrets, runSafetyFloor } from "./safety-floor.ts";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/freedom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACN,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["/**\n * Public surface for the OMK freedom-mode runtime.\n *\n * Tool dispatchers import `gate`. The interactive TUI imports `badgeText` and\n * `bannerOnce`. Subprocess spawners import `applyFreedomEnv`. Everything else\n * is implementation detail and stays inside this directory.\n *\n * Design: every doctrine clause from AGENTS.md §0 has exactly one owner here.\n * - §0.1 safety floor → safety-floor.ts (always-on, never downgradable)\n * - §0.2 defaults → config.ts (parsed from .omk/config.toml)\n * - §0.3 no moralizing → not enforced at runtime (system prompt only)\n * - banner & badge → banner.ts + policy.badgeText\n * - subprocess env → policy.applyFreedomEnv\n */\n\nexport type { BannerMemo } from \"./banner.ts\";\nexport { bannerOnce } from \"./banner.ts\";\nexport type { ApprovalPolicy, FreedomConfig } from \"./config.ts\";\nexport {\n\tFREEDOM_CONFIG_DEFAULTS,\n\tFreedomConfigError,\n\tloadFreedomConfig,\n\tparseFreedomConfigFromString,\n} from \"./config.ts\";\nexport type { PolicyDecision, ToolCallContext } from \"./policy.ts\";\nexport { applyFreedomEnv, badgeText, gate } from \"./policy.ts\";\nexport type { MatcherVerdict } from \"./safety-floor.ts\";\nexport { redactSecrets, runSafetyFloor } from \"./safety-floor.ts\";\n"]}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Public surface for the OMK freedom-mode runtime.
3
+ *
4
+ * Tool dispatchers import `gate`. The interactive TUI imports `badgeText` and
5
+ * `bannerOnce`. Subprocess spawners import `applyFreedomEnv`. Everything else
6
+ * is implementation detail and stays inside this directory.
7
+ *
8
+ * Design: every doctrine clause from AGENTS.md §0 has exactly one owner here.
9
+ * - §0.1 safety floor → safety-floor.ts (always-on, never downgradable)
10
+ * - §0.2 defaults → config.ts (parsed from .omk/config.toml)
11
+ * - §0.3 no moralizing → not enforced at runtime (system prompt only)
12
+ * - banner & badge → banner.ts + policy.badgeText
13
+ * - subprocess env → policy.applyFreedomEnv
14
+ */
15
+ export { bannerOnce } from "./banner.js";
16
+ export { FREEDOM_CONFIG_DEFAULTS, FreedomConfigError, loadFreedomConfig, parseFreedomConfigFromString, } from "./config.js";
17
+ export { applyFreedomEnv, badgeText, gate } from "./policy.js";
18
+ export { redactSecrets, runSafetyFloor } from "./safety-floor.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/freedom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACN,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,GAC5B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["/**\n * Public surface for the OMK freedom-mode runtime.\n *\n * Tool dispatchers import `gate`. The interactive TUI imports `badgeText` and\n * `bannerOnce`. Subprocess spawners import `applyFreedomEnv`. Everything else\n * is implementation detail and stays inside this directory.\n *\n * Design: every doctrine clause from AGENTS.md §0 has exactly one owner here.\n * - §0.1 safety floor → safety-floor.ts (always-on, never downgradable)\n * - §0.2 defaults → config.ts (parsed from .omk/config.toml)\n * - §0.3 no moralizing → not enforced at runtime (system prompt only)\n * - banner & badge → banner.ts + policy.badgeText\n * - subprocess env → policy.applyFreedomEnv\n */\n\nexport type { BannerMemo } from \"./banner.ts\";\nexport { bannerOnce } from \"./banner.ts\";\nexport type { ApprovalPolicy, FreedomConfig } from \"./config.ts\";\nexport {\n\tFREEDOM_CONFIG_DEFAULTS,\n\tFreedomConfigError,\n\tloadFreedomConfig,\n\tparseFreedomConfigFromString,\n} from \"./config.ts\";\nexport type { PolicyDecision, ToolCallContext } from \"./policy.ts\";\nexport { applyFreedomEnv, badgeText, gate } from \"./policy.ts\";\nexport type { MatcherVerdict } from \"./safety-floor.ts\";\nexport { redactSecrets, runSafetyFloor } from \"./safety-floor.ts\";\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Freedom-mode policy gate.
3
+ *
4
+ * The dispatcher wraps every tool call in `gate(call, cfg)`. Three outcomes:
5
+ *
6
+ * - `allow`: dispatcher runs the tool without an interactive prompt.
7
+ * - `require-confirm`: dispatcher falls back to its existing confirm UI.
8
+ * - `deny-hard`: dispatcher returns a FailClosedToolResult and never runs.
9
+ *
10
+ * The safety floor (`safety-floor.ts`) is always consulted first. Only when
11
+ * the floor passes do we look at the approval policy from `.omk/config.toml`.
12
+ * Freedom mode can flip the second decision (approval) but never the first
13
+ * (safety floor), which matches AGENTS.md §0.1 ("non-negotiable").
14
+ */
15
+ import type { HookFailureCode } from "../hooks/types.ts";
16
+ import type { FreedomConfig } from "./config.ts";
17
+ import { type ToolCallContext } from "./safety-floor.ts";
18
+ export type { ToolCallContext } from "./safety-floor.ts";
19
+ export type PolicyDecision = {
20
+ kind: "allow";
21
+ } | {
22
+ kind: "require-confirm";
23
+ reason: string;
24
+ } | {
25
+ kind: "deny-hard";
26
+ code: HookFailureCode;
27
+ reason: string;
28
+ };
29
+ export declare function gate(call: ToolCallContext, cfg: FreedomConfig): PolicyDecision;
30
+ /**
31
+ * UI surface: returns a short badge string when freedom mode is on, otherwise
32
+ * undefined. Used by the interactive footer.
33
+ */
34
+ export declare function badgeText(cfg: FreedomConfig): string | undefined;
35
+ /**
36
+ * Environment passthrough for child processes spawned under freedom mode.
37
+ * Mirrors the legacy shell hook's exports for code that still reads them, but
38
+ * never auto-sets the advanced flags (TOS bypass / dark-web crawl); those must
39
+ * be enabled explicitly via a future [freedom.advanced] block.
40
+ */
41
+ export declare function applyFreedomEnv(env: NodeJS.ProcessEnv, cfg: FreedomConfig): NodeJS.ProcessEnv;
42
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/core/freedom/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,wBAAgB,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,GAAG,cAAc,CAiB9E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAGhE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,UAAU,CAS7F","sourcesContent":["/**\n * Freedom-mode policy gate.\n *\n * The dispatcher wraps every tool call in `gate(call, cfg)`. Three outcomes:\n *\n * - `allow`: dispatcher runs the tool without an interactive prompt.\n * - `require-confirm`: dispatcher falls back to its existing confirm UI.\n * - `deny-hard`: dispatcher returns a FailClosedToolResult and never runs.\n *\n * The safety floor (`safety-floor.ts`) is always consulted first. Only when\n * the floor passes do we look at the approval policy from `.omk/config.toml`.\n * Freedom mode can flip the second decision (approval) but never the first\n * (safety floor), which matches AGENTS.md §0.1 (\"non-negotiable\").\n */\nimport type { HookFailureCode } from \"../hooks/types.ts\";\nimport type { FreedomConfig } from \"./config.ts\";\nimport { runSafetyFloor, type ToolCallContext } from \"./safety-floor.ts\";\n\nexport type { ToolCallContext } from \"./safety-floor.ts\";\n\nexport type PolicyDecision =\n\t| { kind: \"allow\" }\n\t| { kind: \"require-confirm\"; reason: string }\n\t| { kind: \"deny-hard\"; code: HookFailureCode; reason: string };\n\nexport function gate(call: ToolCallContext, cfg: FreedomConfig): PolicyDecision {\n\t// §0.1 floor first. The floor can hard-deny or upgrade to require-confirm\n\t// (privilege escalation). It never returns 'allow' on its own.\n\tconst floor = runSafetyFloor(call);\n\tif (floor.kind === \"deny-hard\") return floor;\n\tif (floor.kind === \"require-confirm\") return floor;\n\n\t// Floor passed. Now consult the approval policy.\n\tif (cfg.enabled && cfg.approvalPolicy === \"yolo\" && cfg.yoloMode) {\n\t\treturn { kind: \"allow\" };\n\t}\n\treturn {\n\t\tkind: \"require-confirm\",\n\t\treason: cfg.enabled\n\t\t\t? \"approval_policy is not 'yolo'; falling back to per-tool confirmation.\"\n\t\t\t: \"Freedom mode disabled; per-tool confirmation required.\",\n\t};\n}\n\n/**\n * UI surface: returns a short badge string when freedom mode is on, otherwise\n * undefined. Used by the interactive footer.\n */\nexport function badgeText(cfg: FreedomConfig): string | undefined {\n\tif (!cfg.enabled) return undefined;\n\treturn cfg.approvalPolicy === \"yolo\" && cfg.yoloMode ? \"freedom·yolo\" : \"freedom·prompt\";\n}\n\n/**\n * Environment passthrough for child processes spawned under freedom mode.\n * Mirrors the legacy shell hook's exports for code that still reads them, but\n * never auto-sets the advanced flags (TOS bypass / dark-web crawl); those must\n * be enabled explicitly via a future [freedom.advanced] block.\n */\nexport function applyFreedomEnv(env: NodeJS.ProcessEnv, cfg: FreedomConfig): NodeJS.ProcessEnv {\n\tif (!cfg.enabled) return env;\n\tconst out: NodeJS.ProcessEnv = { ...env };\n\tout.OMK_FREEDOM_MODE = \"true\";\n\tout.OMK_DOCTRINE_VERSION = cfg.doctrineVersion;\n\tif (cfg.approvalPolicy === \"yolo\" && cfg.yoloMode) {\n\t\tout.OMK_EXECUTE_ALL = \"true\";\n\t}\n\treturn out;\n}\n"]}
@@ -0,0 +1,47 @@
1
+ import { runSafetyFloor } from "./safety-floor.js";
2
+ export function gate(call, cfg) {
3
+ // §0.1 floor first. The floor can hard-deny or upgrade to require-confirm
4
+ // (privilege escalation). It never returns 'allow' on its own.
5
+ const floor = runSafetyFloor(call);
6
+ if (floor.kind === "deny-hard")
7
+ return floor;
8
+ if (floor.kind === "require-confirm")
9
+ return floor;
10
+ // Floor passed. Now consult the approval policy.
11
+ if (cfg.enabled && cfg.approvalPolicy === "yolo" && cfg.yoloMode) {
12
+ return { kind: "allow" };
13
+ }
14
+ return {
15
+ kind: "require-confirm",
16
+ reason: cfg.enabled
17
+ ? "approval_policy is not 'yolo'; falling back to per-tool confirmation."
18
+ : "Freedom mode disabled; per-tool confirmation required.",
19
+ };
20
+ }
21
+ /**
22
+ * UI surface: returns a short badge string when freedom mode is on, otherwise
23
+ * undefined. Used by the interactive footer.
24
+ */
25
+ export function badgeText(cfg) {
26
+ if (!cfg.enabled)
27
+ return undefined;
28
+ return cfg.approvalPolicy === "yolo" && cfg.yoloMode ? "freedom·yolo" : "freedom·prompt";
29
+ }
30
+ /**
31
+ * Environment passthrough for child processes spawned under freedom mode.
32
+ * Mirrors the legacy shell hook's exports for code that still reads them, but
33
+ * never auto-sets the advanced flags (TOS bypass / dark-web crawl); those must
34
+ * be enabled explicitly via a future [freedom.advanced] block.
35
+ */
36
+ export function applyFreedomEnv(env, cfg) {
37
+ if (!cfg.enabled)
38
+ return env;
39
+ const out = { ...env };
40
+ out.OMK_FREEDOM_MODE = "true";
41
+ out.OMK_DOCTRINE_VERSION = cfg.doctrineVersion;
42
+ if (cfg.approvalPolicy === "yolo" && cfg.yoloMode) {
43
+ out.OMK_EXECUTE_ALL = "true";
44
+ }
45
+ return out;
46
+ }
47
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/core/freedom/policy.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AASzE,MAAM,UAAU,IAAI,CAAC,IAAqB,EAAE,GAAkB,EAAkB;IAC/E,2EAA0E;IAC1E,+DAA+D;IAC/D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAEnD,iDAAiD;IACjD,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO;QACN,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YAClB,CAAC,CAAC,uEAAuE;YACzE,CAAC,CAAC,wDAAwD;KAC3D,CAAC;AAAA,CACF;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAkB,EAAsB;IACjE,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACnC,OAAO,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAc,CAAC,CAAC,CAAC,iBAAgB,CAAC;AAAA,CACzF;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB,EAAE,GAAkB,EAAqB;IAC9F,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,GAAG,CAAC;IAC7B,MAAM,GAAG,GAAsB,EAAE,GAAG,GAAG,EAAE,CAAC;IAC1C,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAC9B,GAAG,CAAC,oBAAoB,GAAG,GAAG,CAAC,eAAe,CAAC;IAC/C,IAAI,GAAG,CAAC,cAAc,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnD,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AAAA,CACX","sourcesContent":["/**\n * Freedom-mode policy gate.\n *\n * The dispatcher wraps every tool call in `gate(call, cfg)`. Three outcomes:\n *\n * - `allow`: dispatcher runs the tool without an interactive prompt.\n * - `require-confirm`: dispatcher falls back to its existing confirm UI.\n * - `deny-hard`: dispatcher returns a FailClosedToolResult and never runs.\n *\n * The safety floor (`safety-floor.ts`) is always consulted first. Only when\n * the floor passes do we look at the approval policy from `.omk/config.toml`.\n * Freedom mode can flip the second decision (approval) but never the first\n * (safety floor), which matches AGENTS.md §0.1 (\"non-negotiable\").\n */\nimport type { HookFailureCode } from \"../hooks/types.ts\";\nimport type { FreedomConfig } from \"./config.ts\";\nimport { runSafetyFloor, type ToolCallContext } from \"./safety-floor.ts\";\n\nexport type { ToolCallContext } from \"./safety-floor.ts\";\n\nexport type PolicyDecision =\n\t| { kind: \"allow\" }\n\t| { kind: \"require-confirm\"; reason: string }\n\t| { kind: \"deny-hard\"; code: HookFailureCode; reason: string };\n\nexport function gate(call: ToolCallContext, cfg: FreedomConfig): PolicyDecision {\n\t// §0.1 floor first. The floor can hard-deny or upgrade to require-confirm\n\t// (privilege escalation). It never returns 'allow' on its own.\n\tconst floor = runSafetyFloor(call);\n\tif (floor.kind === \"deny-hard\") return floor;\n\tif (floor.kind === \"require-confirm\") return floor;\n\n\t// Floor passed. Now consult the approval policy.\n\tif (cfg.enabled && cfg.approvalPolicy === \"yolo\" && cfg.yoloMode) {\n\t\treturn { kind: \"allow\" };\n\t}\n\treturn {\n\t\tkind: \"require-confirm\",\n\t\treason: cfg.enabled\n\t\t\t? \"approval_policy is not 'yolo'; falling back to per-tool confirmation.\"\n\t\t\t: \"Freedom mode disabled; per-tool confirmation required.\",\n\t};\n}\n\n/**\n * UI surface: returns a short badge string when freedom mode is on, otherwise\n * undefined. Used by the interactive footer.\n */\nexport function badgeText(cfg: FreedomConfig): string | undefined {\n\tif (!cfg.enabled) return undefined;\n\treturn cfg.approvalPolicy === \"yolo\" && cfg.yoloMode ? \"freedom·yolo\" : \"freedom·prompt\";\n}\n\n/**\n * Environment passthrough for child processes spawned under freedom mode.\n * Mirrors the legacy shell hook's exports for code that still reads them, but\n * never auto-sets the advanced flags (TOS bypass / dark-web crawl); those must\n * be enabled explicitly via a future [freedom.advanced] block.\n */\nexport function applyFreedomEnv(env: NodeJS.ProcessEnv, cfg: FreedomConfig): NodeJS.ProcessEnv {\n\tif (!cfg.enabled) return env;\n\tconst out: NodeJS.ProcessEnv = { ...env };\n\tout.OMK_FREEDOM_MODE = \"true\";\n\tout.OMK_DOCTRINE_VERSION = cfg.doctrineVersion;\n\tif (cfg.approvalPolicy === \"yolo\" && cfg.yoloMode) {\n\t\tout.OMK_EXECUTE_ALL = \"true\";\n\t}\n\treturn out;\n}\n"]}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Non-negotiable §0.1 safety floor matchers.
3
+ *
4
+ * These are deterministic, pure functions used by `policy.ts:gate()`. They
5
+ * implement the four runtime-enforceable clauses from AGENTS.md §0.1:
6
+ *
7
+ * 1. Secrets must never be read, logged, or transmitted.
8
+ * 2. Privilege escalation must require an explicit per-command user confirm.
9
+ * 3. Filesystem-destructive commands at root or home are hard-denied.
10
+ * 4. Tool calls must stay inside the lane grant's writeScope / executeScope.
11
+ *
12
+ * Clause 5 (§0.3 "no moralizing") is an LLM behavior clause and lives in the
13
+ * orchestrator system prompt; there is no runtime matcher for it.
14
+ *
15
+ * Every matcher fails closed: if its internal regex throws, the call is
16
+ * treated as a hard deny instead of an implicit allow. This is enforced by
17
+ * the wrapper helpers in `policy.ts`, not here, so the matchers themselves
18
+ * can stay tiny and testable.
19
+ */
20
+ import type { HookFailureCode } from "../hooks/types.ts";
21
+ export interface ToolCallContext {
22
+ tool: "bash" | "edit" | "write" | "read";
23
+ args: {
24
+ path?: string;
25
+ command?: string;
26
+ [key: string]: unknown;
27
+ };
28
+ laneGrant?: {
29
+ writeScope?: readonly string[];
30
+ executeScope?: readonly string[];
31
+ };
32
+ }
33
+ export type MatcherVerdict = {
34
+ kind: "pass";
35
+ } | {
36
+ kind: "require-confirm";
37
+ reason: string;
38
+ } | {
39
+ kind: "deny-hard";
40
+ code: HookFailureCode;
41
+ reason: string;
42
+ };
43
+ /**
44
+ * Clause 1 — secrets. Block reads/writes/edits targeting credential files.
45
+ * Bash matchers check the command's argv for known credential paths too.
46
+ */
47
+ export declare function checkSecretsClause(call: ToolCallContext): MatcherVerdict;
48
+ /**
49
+ * Clause 2 — privilege escalation. Even under yolo mode, sudo/su require an
50
+ * explicit confirm. Never auto-approved.
51
+ */
52
+ export declare function checkPrivilegeClause(call: ToolCallContext): MatcherVerdict;
53
+ /**
54
+ * Clause 3 — filesystem destruction. Hard deny. No override path.
55
+ */
56
+ export declare function checkFsDestructionClause(call: ToolCallContext): MatcherVerdict;
57
+ /**
58
+ * Clause 4 — scope. Edits/writes must land inside writeScope; bash must stay
59
+ * inside executeScope when configured. Empty/undefined scope = no constraint
60
+ * (e.g. local CLI usage without a lane grant).
61
+ */
62
+ export declare function checkScopeClause(call: ToolCallContext): MatcherVerdict;
63
+ /**
64
+ * Redact bearer tokens and other secret-looking substrings before any sink
65
+ * (logger, audit event, tool result returned to the LLM).
66
+ */
67
+ export declare function redactSecrets(input: string): string;
68
+ /**
69
+ * Run every clause in order. First non-pass verdict wins; deny-hard beats
70
+ * require-confirm in the rare case both fire (privilege + fs-destruction).
71
+ */
72
+ export declare function runSafetyFloor(call: ToolCallContext): MatcherVerdict;
73
+ //# sourceMappingURL=safety-floor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-floor.d.ts","sourceRoot":"","sources":["../../../src/core/freedom/safety-floor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACvB,CAAC;IACF,SAAS,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC/B,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACjC,CAAC;CACF;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAgGhE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAsBxE;AAuBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAa1E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAc9E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAiCtE;AAsBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,cAAc,CAiBpE","sourcesContent":["/**\n * Non-negotiable §0.1 safety floor matchers.\n *\n * These are deterministic, pure functions used by `policy.ts:gate()`. They\n * implement the four runtime-enforceable clauses from AGENTS.md §0.1:\n *\n * 1. Secrets must never be read, logged, or transmitted.\n * 2. Privilege escalation must require an explicit per-command user confirm.\n * 3. Filesystem-destructive commands at root or home are hard-denied.\n * 4. Tool calls must stay inside the lane grant's writeScope / executeScope.\n *\n * Clause 5 (§0.3 \"no moralizing\") is an LLM behavior clause and lives in the\n * orchestrator system prompt; there is no runtime matcher for it.\n *\n * Every matcher fails closed: if its internal regex throws, the call is\n * treated as a hard deny instead of an implicit allow. This is enforced by\n * the wrapper helpers in `policy.ts`, not here, so the matchers themselves\n * can stay tiny and testable.\n */\nimport type { HookFailureCode } from \"../hooks/types.ts\";\n\nexport interface ToolCallContext {\n\ttool: \"bash\" | \"edit\" | \"write\" | \"read\";\n\targs: {\n\t\tpath?: string;\n\t\tcommand?: string;\n\t\t[key: string]: unknown;\n\t};\n\tlaneGrant?: {\n\t\twriteScope?: readonly string[];\n\t\texecuteScope?: readonly string[];\n\t};\n}\n\nexport type MatcherVerdict =\n\t| { kind: \"pass\" }\n\t| { kind: \"require-confirm\"; reason: string }\n\t| { kind: \"deny-hard\"; code: HookFailureCode; reason: string };\n\nconst SECRET_PATH_PATTERNS: readonly RegExp[] = [\n\t/(^|\\/)\\.env(\\.|$)/i,\n\t/(^|\\/)\\.env$/i,\n\t/(^|\\/)auth\\.json$/i,\n\t/(^|\\/)\\.netrc$/i,\n\t/(^|\\/)\\.aws\\/credentials$/i,\n\t/(^|\\/)\\.ssh\\/(id_[a-z0-9]+|[a-z0-9_-]+_(rsa|ed25519|ecdsa|dsa))$/i,\n\t/\\.pem$/i,\n\t/\\.key$/i,\n\t/(^|\\/)[^/]*secret[^/]*$/i,\n\t/(^|\\/)[^/]*token[^/]*$/i,\n];\n\nconst SECRET_CONTENT_PATTERNS: readonly RegExp[] = [\n\t/npm_[A-Za-z0-9_-]{16,}/g,\n\t/\\bgh[pousr]_[A-Za-z0-9]{36}\\b/g,\n\t/\\bxox[bpars]-[A-Za-z0-9-]+\\b/g,\n\t/\\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\\b/g,\n\t/\\bAKIA[0-9A-Z]{16}\\b/g,\n];\n\nconst PRIVILEGE_ESCALATION_PATTERNS: readonly RegExp[] = [\n\t/^\\s*sudo(\\s|$)/,\n\t/^\\s*su(\\s|$)/,\n\t/(^|\\s|;|&&|\\|\\|)sudo\\s/,\n\t/(^|\\s|;|&&|\\|\\|)su\\s/,\n\t/(^|\\s)doas(\\s|$)/,\n\t/chmod\\s+[ug]\\+s\\b/,\n\t/\\bsetcap\\s/,\n];\n\nconst FS_DESTRUCTION_PATTERNS: readonly RegExp[] = [\n\t/\\brm\\s+(-[a-zA-Z]*[rRfF][a-zA-Z]*\\s+)+(\\/|~|\\$HOME|\"\\/\"|'\\/')(\\s|$)/,\n\t/\\bmkfs(\\.\\w+)?\\s/,\n\t/\\bdd\\b[^|;&]*\\bof=\\/dev\\//,\n\t/:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/,\n\t/\\bchmod\\s+-R\\s+0+\\s+\\/(\\s|$)/,\n];\n\nconst REDACTION_PLACEHOLDER = \"***REDACTED***\";\n\nfunction normalizePath(input: string): string {\n\treturn input.replace(/\\\\/g, \"/\");\n}\n\nfunction basename(input: string): string {\n\tconst normalized = normalizePath(input);\n\tconst idx = normalized.lastIndexOf(\"/\");\n\treturn idx >= 0 ? normalized.slice(idx + 1) : normalized;\n}\n\nfunction matchesAnyGlob(path: string, scope: readonly string[]): boolean {\n\tif (scope.length === 0) return false;\n\tconst normalized = normalizePath(path);\n\tfor (const glob of scope) {\n\t\tconst re = globToRegex(glob);\n\t\tif (re.test(normalized)) return true;\n\t}\n\treturn false;\n}\n\nfunction globToRegex(glob: string): RegExp {\n\t// Minimal glob: ** -> .*, * -> [^/]*, ? -> [^/]. Other regex metachars escaped.\n\tconst normalized = normalizePath(glob);\n\tlet pattern = \"\";\n\tlet i = 0;\n\twhile (i < normalized.length) {\n\t\tconst c = normalized[i];\n\t\tif (c === \"*\" && normalized[i + 1] === \"*\") {\n\t\t\tpattern += \".*\";\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === \"*\") {\n\t\t\tpattern += \"[^/]*\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === \"?\") {\n\t\t\tpattern += \"[^/]\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[.+^${}()|[\\]\\\\]/.test(c)) {\n\t\t\tpattern += `\\\\${c}`;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tpattern += c;\n\t\ti += 1;\n\t}\n\treturn new RegExp(`^${pattern}$`);\n}\n\n/**\n * Clause 1 — secrets. Block reads/writes/edits targeting credential files.\n * Bash matchers check the command's argv for known credential paths too.\n */\nexport function checkSecretsClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool === \"read\" || call.tool === \"edit\" || call.tool === \"write\") {\n\t\tconst path = typeof call.args.path === \"string\" ? call.args.path : \"\";\n\t\tif (path && pathLooksLikeSecret(path)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: `Secrets clause blocks ${call.tool} on '${path}'.`,\n\t\t\t};\n\t\t}\n\t}\n\tif (call.tool === \"bash\") {\n\t\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\t\tif (cmd && bashTouchesSecret(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: \"Secrets clause blocks bash command that reads a credential file.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\nfunction pathLooksLikeSecret(path: string): boolean {\n\tconst normalized = normalizePath(path);\n\tconst base = basename(normalized);\n\tfor (const re of SECRET_PATH_PATTERNS) {\n\t\tif (re.test(normalized) || re.test(base)) return true;\n\t}\n\treturn false;\n}\n\nfunction bashTouchesSecret(cmd: string): boolean {\n\t// Catch the obvious cat / cp / mv / less / head / tail / source <secret-path>.\n\tconst readVerbs = /\\b(cat|less|more|head|tail|tac|nl|od|hexdump|xxd|cp|mv|source|\\.)\\b\\s+([^\\s|;&<>]+)/g;\n\tlet match: RegExpExecArray | null = readVerbs.exec(cmd);\n\twhile (match !== null) {\n\t\tconst target = match[2];\n\t\tif (target && pathLooksLikeSecret(target)) return true;\n\t\tmatch = readVerbs.exec(cmd);\n\t}\n\treturn false;\n}\n\n/**\n * Clause 2 — privilege escalation. Even under yolo mode, sudo/su require an\n * explicit confirm. Never auto-approved.\n */\nexport function checkPrivilegeClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool !== \"bash\") return { kind: \"pass\" };\n\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\tif (!cmd) return { kind: \"pass\" };\n\tfor (const re of PRIVILEGE_ESCALATION_PATTERNS) {\n\t\tif (re.test(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"require-confirm\",\n\t\t\t\treason: \"Privilege escalation requires explicit confirmation under §0.1.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\n/**\n * Clause 3 — filesystem destruction. Hard deny. No override path.\n */\nexport function checkFsDestructionClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool !== \"bash\") return { kind: \"pass\" };\n\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\tif (!cmd) return { kind: \"pass\" };\n\tfor (const re of FS_DESTRUCTION_PATTERNS) {\n\t\tif (re.test(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: \"Filesystem-destructive command is blocked by §0.1.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\n/**\n * Clause 4 — scope. Edits/writes must land inside writeScope; bash must stay\n * inside executeScope when configured. Empty/undefined scope = no constraint\n * (e.g. local CLI usage without a lane grant).\n */\nexport function checkScopeClause(call: ToolCallContext): MatcherVerdict {\n\tconst grant = call.laneGrant;\n\tif (!grant) return { kind: \"pass\" };\n\tif (call.tool === \"write\" || call.tool === \"edit\") {\n\t\tconst writeScope = grant.writeScope;\n\t\tif (writeScope && writeScope.length > 0) {\n\t\t\tconst path = typeof call.args.path === \"string\" ? call.args.path : \"\";\n\t\t\tif (path && !matchesAnyGlob(path, writeScope)) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"deny-hard\",\n\t\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\t\treason: `Path '${path}' is outside writeScope.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\tif (call.tool === \"bash\") {\n\t\tconst executeScope = grant.executeScope;\n\t\tif (executeScope && executeScope.length > 0) {\n\t\t\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\t\t\tconst touched = extractMutatingTargets(cmd);\n\t\t\tfor (const target of touched) {\n\t\t\t\tif (!matchesAnyGlob(target, executeScope)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"deny-hard\",\n\t\t\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\t\t\treason: `Bash mutates '${target}' outside executeScope.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\nfunction extractMutatingTargets(cmd: string): string[] {\n\t// Heuristic: top-level >, >>, tee target; ignore quoted forms inside strings.\n\tconst targets: string[] = [];\n\tconst redirectRe = />>?\\s*([^\\s|;&<>'\"]+)/g;\n\tlet m: RegExpExecArray | null = redirectRe.exec(cmd);\n\twhile (m !== null) {\n\t\tconst t = m[1];\n\t\tif (t && t !== \"/dev/null\") targets.push(t);\n\t\tm = redirectRe.exec(cmd);\n\t}\n\tconst teeRe = /\\btee\\s+(?:-a\\s+)?([^\\s|;&<>'\"]+)/g;\n\tm = teeRe.exec(cmd);\n\twhile (m !== null) {\n\t\tconst t = m[1];\n\t\tif (t) targets.push(t);\n\t\tm = teeRe.exec(cmd);\n\t}\n\treturn targets;\n}\n\n/**\n * Redact bearer tokens and other secret-looking substrings before any sink\n * (logger, audit event, tool result returned to the LLM).\n */\nexport function redactSecrets(input: string): string {\n\tif (!input) return input;\n\tlet out = input;\n\tfor (const re of SECRET_CONTENT_PATTERNS) {\n\t\tout = out.replace(re, REDACTION_PLACEHOLDER);\n\t}\n\treturn out;\n}\n\n/**\n * Run every clause in order. First non-pass verdict wins; deny-hard beats\n * require-confirm in the rare case both fire (privilege + fs-destruction).\n */\nexport function runSafetyFloor(call: ToolCallContext): MatcherVerdict {\n\tconst checks = [checkSecretsClause, checkFsDestructionClause, checkScopeClause, checkPrivilegeClause];\n\tlet firstConfirm: MatcherVerdict | null = null;\n\tfor (const check of checks) {\n\t\ttry {\n\t\t\tconst verdict = check(call);\n\t\t\tif (verdict.kind === \"deny-hard\") return verdict;\n\t\t\tif (verdict.kind === \"require-confirm\" && !firstConfirm) firstConfirm = verdict;\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_failed\",\n\t\t\t\treason: `Safety floor matcher threw: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\treturn firstConfirm ?? { kind: \"pass\" };\n}\n"]}
@@ -0,0 +1,275 @@
1
+ const SECRET_PATH_PATTERNS = [
2
+ /(^|\/)\.env(\.|$)/i,
3
+ /(^|\/)\.env$/i,
4
+ /(^|\/)auth\.json$/i,
5
+ /(^|\/)\.netrc$/i,
6
+ /(^|\/)\.aws\/credentials$/i,
7
+ /(^|\/)\.ssh\/(id_[a-z0-9]+|[a-z0-9_-]+_(rsa|ed25519|ecdsa|dsa))$/i,
8
+ /\.pem$/i,
9
+ /\.key$/i,
10
+ /(^|\/)[^/]*secret[^/]*$/i,
11
+ /(^|\/)[^/]*token[^/]*$/i,
12
+ ];
13
+ const SECRET_CONTENT_PATTERNS = [
14
+ /npm_[A-Za-z0-9_-]{16,}/g,
15
+ /\bgh[pousr]_[A-Za-z0-9]{36}\b/g,
16
+ /\bxox[bpars]-[A-Za-z0-9-]+\b/g,
17
+ /\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\b/g,
18
+ /\bAKIA[0-9A-Z]{16}\b/g,
19
+ ];
20
+ const PRIVILEGE_ESCALATION_PATTERNS = [
21
+ /^\s*sudo(\s|$)/,
22
+ /^\s*su(\s|$)/,
23
+ /(^|\s|;|&&|\|\|)sudo\s/,
24
+ /(^|\s|;|&&|\|\|)su\s/,
25
+ /(^|\s)doas(\s|$)/,
26
+ /chmod\s+[ug]\+s\b/,
27
+ /\bsetcap\s/,
28
+ ];
29
+ const FS_DESTRUCTION_PATTERNS = [
30
+ /\brm\s+(-[a-zA-Z]*[rRfF][a-zA-Z]*\s+)+(\/|~|\$HOME|"\/"|'\/')(\s|$)/,
31
+ /\bmkfs(\.\w+)?\s/,
32
+ /\bdd\b[^|;&]*\bof=\/dev\//,
33
+ /:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:/,
34
+ /\bchmod\s+-R\s+0+\s+\/(\s|$)/,
35
+ ];
36
+ const REDACTION_PLACEHOLDER = "***REDACTED***";
37
+ function normalizePath(input) {
38
+ return input.replace(/\\/g, "/");
39
+ }
40
+ function basename(input) {
41
+ const normalized = normalizePath(input);
42
+ const idx = normalized.lastIndexOf("/");
43
+ return idx >= 0 ? normalized.slice(idx + 1) : normalized;
44
+ }
45
+ function matchesAnyGlob(path, scope) {
46
+ if (scope.length === 0)
47
+ return false;
48
+ const normalized = normalizePath(path);
49
+ for (const glob of scope) {
50
+ const re = globToRegex(glob);
51
+ if (re.test(normalized))
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ function globToRegex(glob) {
57
+ // Minimal glob: ** -> .*, * -> [^/]*, ? -> [^/]. Other regex metachars escaped.
58
+ const normalized = normalizePath(glob);
59
+ let pattern = "";
60
+ let i = 0;
61
+ while (i < normalized.length) {
62
+ const c = normalized[i];
63
+ if (c === "*" && normalized[i + 1] === "*") {
64
+ pattern += ".*";
65
+ i += 2;
66
+ continue;
67
+ }
68
+ if (c === "*") {
69
+ pattern += "[^/]*";
70
+ i += 1;
71
+ continue;
72
+ }
73
+ if (c === "?") {
74
+ pattern += "[^/]";
75
+ i += 1;
76
+ continue;
77
+ }
78
+ if (/[.+^${}()|[\]\\]/.test(c)) {
79
+ pattern += `\\${c}`;
80
+ i += 1;
81
+ continue;
82
+ }
83
+ pattern += c;
84
+ i += 1;
85
+ }
86
+ return new RegExp(`^${pattern}$`);
87
+ }
88
+ /**
89
+ * Clause 1 — secrets. Block reads/writes/edits targeting credential files.
90
+ * Bash matchers check the command's argv for known credential paths too.
91
+ */
92
+ export function checkSecretsClause(call) {
93
+ if (call.tool === "read" || call.tool === "edit" || call.tool === "write") {
94
+ const path = typeof call.args.path === "string" ? call.args.path : "";
95
+ if (path && pathLooksLikeSecret(path)) {
96
+ return {
97
+ kind: "deny-hard",
98
+ code: "hook_rejected",
99
+ reason: `Secrets clause blocks ${call.tool} on '${path}'.`,
100
+ };
101
+ }
102
+ }
103
+ if (call.tool === "bash") {
104
+ const cmd = typeof call.args.command === "string" ? call.args.command : "";
105
+ if (cmd && bashTouchesSecret(cmd)) {
106
+ return {
107
+ kind: "deny-hard",
108
+ code: "hook_rejected",
109
+ reason: "Secrets clause blocks bash command that reads a credential file.",
110
+ };
111
+ }
112
+ }
113
+ return { kind: "pass" };
114
+ }
115
+ function pathLooksLikeSecret(path) {
116
+ const normalized = normalizePath(path);
117
+ const base = basename(normalized);
118
+ for (const re of SECRET_PATH_PATTERNS) {
119
+ if (re.test(normalized) || re.test(base))
120
+ return true;
121
+ }
122
+ return false;
123
+ }
124
+ function bashTouchesSecret(cmd) {
125
+ // Catch the obvious cat / cp / mv / less / head / tail / source <secret-path>.
126
+ const readVerbs = /\b(cat|less|more|head|tail|tac|nl|od|hexdump|xxd|cp|mv|source|\.)\b\s+([^\s|;&<>]+)/g;
127
+ let match = readVerbs.exec(cmd);
128
+ while (match !== null) {
129
+ const target = match[2];
130
+ if (target && pathLooksLikeSecret(target))
131
+ return true;
132
+ match = readVerbs.exec(cmd);
133
+ }
134
+ return false;
135
+ }
136
+ /**
137
+ * Clause 2 — privilege escalation. Even under yolo mode, sudo/su require an
138
+ * explicit confirm. Never auto-approved.
139
+ */
140
+ export function checkPrivilegeClause(call) {
141
+ if (call.tool !== "bash")
142
+ return { kind: "pass" };
143
+ const cmd = typeof call.args.command === "string" ? call.args.command : "";
144
+ if (!cmd)
145
+ return { kind: "pass" };
146
+ for (const re of PRIVILEGE_ESCALATION_PATTERNS) {
147
+ if (re.test(cmd)) {
148
+ return {
149
+ kind: "require-confirm",
150
+ reason: "Privilege escalation requires explicit confirmation under §0.1.",
151
+ };
152
+ }
153
+ }
154
+ return { kind: "pass" };
155
+ }
156
+ /**
157
+ * Clause 3 — filesystem destruction. Hard deny. No override path.
158
+ */
159
+ export function checkFsDestructionClause(call) {
160
+ if (call.tool !== "bash")
161
+ return { kind: "pass" };
162
+ const cmd = typeof call.args.command === "string" ? call.args.command : "";
163
+ if (!cmd)
164
+ return { kind: "pass" };
165
+ for (const re of FS_DESTRUCTION_PATTERNS) {
166
+ if (re.test(cmd)) {
167
+ return {
168
+ kind: "deny-hard",
169
+ code: "hook_rejected",
170
+ reason: "Filesystem-destructive command is blocked by §0.1.",
171
+ };
172
+ }
173
+ }
174
+ return { kind: "pass" };
175
+ }
176
+ /**
177
+ * Clause 4 — scope. Edits/writes must land inside writeScope; bash must stay
178
+ * inside executeScope when configured. Empty/undefined scope = no constraint
179
+ * (e.g. local CLI usage without a lane grant).
180
+ */
181
+ export function checkScopeClause(call) {
182
+ const grant = call.laneGrant;
183
+ if (!grant)
184
+ return { kind: "pass" };
185
+ if (call.tool === "write" || call.tool === "edit") {
186
+ const writeScope = grant.writeScope;
187
+ if (writeScope && writeScope.length > 0) {
188
+ const path = typeof call.args.path === "string" ? call.args.path : "";
189
+ if (path && !matchesAnyGlob(path, writeScope)) {
190
+ return {
191
+ kind: "deny-hard",
192
+ code: "hook_rejected",
193
+ reason: `Path '${path}' is outside writeScope.`,
194
+ };
195
+ }
196
+ }
197
+ }
198
+ if (call.tool === "bash") {
199
+ const executeScope = grant.executeScope;
200
+ if (executeScope && executeScope.length > 0) {
201
+ const cmd = typeof call.args.command === "string" ? call.args.command : "";
202
+ const touched = extractMutatingTargets(cmd);
203
+ for (const target of touched) {
204
+ if (!matchesAnyGlob(target, executeScope)) {
205
+ return {
206
+ kind: "deny-hard",
207
+ code: "hook_rejected",
208
+ reason: `Bash mutates '${target}' outside executeScope.`,
209
+ };
210
+ }
211
+ }
212
+ }
213
+ }
214
+ return { kind: "pass" };
215
+ }
216
+ function extractMutatingTargets(cmd) {
217
+ // Heuristic: top-level >, >>, tee target; ignore quoted forms inside strings.
218
+ const targets = [];
219
+ const redirectRe = />>?\s*([^\s|;&<>'"]+)/g;
220
+ let m = redirectRe.exec(cmd);
221
+ while (m !== null) {
222
+ const t = m[1];
223
+ if (t && t !== "/dev/null")
224
+ targets.push(t);
225
+ m = redirectRe.exec(cmd);
226
+ }
227
+ const teeRe = /\btee\s+(?:-a\s+)?([^\s|;&<>'"]+)/g;
228
+ m = teeRe.exec(cmd);
229
+ while (m !== null) {
230
+ const t = m[1];
231
+ if (t)
232
+ targets.push(t);
233
+ m = teeRe.exec(cmd);
234
+ }
235
+ return targets;
236
+ }
237
+ /**
238
+ * Redact bearer tokens and other secret-looking substrings before any sink
239
+ * (logger, audit event, tool result returned to the LLM).
240
+ */
241
+ export function redactSecrets(input) {
242
+ if (!input)
243
+ return input;
244
+ let out = input;
245
+ for (const re of SECRET_CONTENT_PATTERNS) {
246
+ out = out.replace(re, REDACTION_PLACEHOLDER);
247
+ }
248
+ return out;
249
+ }
250
+ /**
251
+ * Run every clause in order. First non-pass verdict wins; deny-hard beats
252
+ * require-confirm in the rare case both fire (privilege + fs-destruction).
253
+ */
254
+ export function runSafetyFloor(call) {
255
+ const checks = [checkSecretsClause, checkFsDestructionClause, checkScopeClause, checkPrivilegeClause];
256
+ let firstConfirm = null;
257
+ for (const check of checks) {
258
+ try {
259
+ const verdict = check(call);
260
+ if (verdict.kind === "deny-hard")
261
+ return verdict;
262
+ if (verdict.kind === "require-confirm" && !firstConfirm)
263
+ firstConfirm = verdict;
264
+ }
265
+ catch (error) {
266
+ return {
267
+ kind: "deny-hard",
268
+ code: "hook_failed",
269
+ reason: `Safety floor matcher threw: ${error instanceof Error ? error.message : String(error)}`,
270
+ };
271
+ }
272
+ }
273
+ return firstConfirm ?? { kind: "pass" };
274
+ }
275
+ //# sourceMappingURL=safety-floor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-floor.js","sourceRoot":"","sources":["../../../src/core/freedom/safety-floor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Non-negotiable §0.1 safety floor matchers.\n *\n * These are deterministic, pure functions used by `policy.ts:gate()`. They\n * implement the four runtime-enforceable clauses from AGENTS.md §0.1:\n *\n * 1. Secrets must never be read, logged, or transmitted.\n * 2. Privilege escalation must require an explicit per-command user confirm.\n * 3. Filesystem-destructive commands at root or home are hard-denied.\n * 4. Tool calls must stay inside the lane grant's writeScope / executeScope.\n *\n * Clause 5 (§0.3 \"no moralizing\") is an LLM behavior clause and lives in the\n * orchestrator system prompt; there is no runtime matcher for it.\n *\n * Every matcher fails closed: if its internal regex throws, the call is\n * treated as a hard deny instead of an implicit allow. This is enforced by\n * the wrapper helpers in `policy.ts`, not here, so the matchers themselves\n * can stay tiny and testable.\n */\nimport type { HookFailureCode } from \"../hooks/types.ts\";\n\nexport interface ToolCallContext {\n\ttool: \"bash\" | \"edit\" | \"write\" | \"read\";\n\targs: {\n\t\tpath?: string;\n\t\tcommand?: string;\n\t\t[key: string]: unknown;\n\t};\n\tlaneGrant?: {\n\t\twriteScope?: readonly string[];\n\t\texecuteScope?: readonly string[];\n\t};\n}\n\nexport type MatcherVerdict =\n\t| { kind: \"pass\" }\n\t| { kind: \"require-confirm\"; reason: string }\n\t| { kind: \"deny-hard\"; code: HookFailureCode; reason: string };\n\nconst SECRET_PATH_PATTERNS: readonly RegExp[] = [\n\t/(^|\\/)\\.env(\\.|$)/i,\n\t/(^|\\/)\\.env$/i,\n\t/(^|\\/)auth\\.json$/i,\n\t/(^|\\/)\\.netrc$/i,\n\t/(^|\\/)\\.aws\\/credentials$/i,\n\t/(^|\\/)\\.ssh\\/(id_[a-z0-9]+|[a-z0-9_-]+_(rsa|ed25519|ecdsa|dsa))$/i,\n\t/\\.pem$/i,\n\t/\\.key$/i,\n\t/(^|\\/)[^/]*secret[^/]*$/i,\n\t/(^|\\/)[^/]*token[^/]*$/i,\n];\n\nconst SECRET_CONTENT_PATTERNS: readonly RegExp[] = [\n\t/npm_[A-Za-z0-9_-]{16,}/g,\n\t/\\bgh[pousr]_[A-Za-z0-9]{36}\\b/g,\n\t/\\bxox[bpars]-[A-Za-z0-9-]+\\b/g,\n\t/\\bsk-(?:proj-)?[A-Za-z0-9_-]{20,}\\b/g,\n\t/\\bAKIA[0-9A-Z]{16}\\b/g,\n];\n\nconst PRIVILEGE_ESCALATION_PATTERNS: readonly RegExp[] = [\n\t/^\\s*sudo(\\s|$)/,\n\t/^\\s*su(\\s|$)/,\n\t/(^|\\s|;|&&|\\|\\|)sudo\\s/,\n\t/(^|\\s|;|&&|\\|\\|)su\\s/,\n\t/(^|\\s)doas(\\s|$)/,\n\t/chmod\\s+[ug]\\+s\\b/,\n\t/\\bsetcap\\s/,\n];\n\nconst FS_DESTRUCTION_PATTERNS: readonly RegExp[] = [\n\t/\\brm\\s+(-[a-zA-Z]*[rRfF][a-zA-Z]*\\s+)+(\\/|~|\\$HOME|\"\\/\"|'\\/')(\\s|$)/,\n\t/\\bmkfs(\\.\\w+)?\\s/,\n\t/\\bdd\\b[^|;&]*\\bof=\\/dev\\//,\n\t/:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/,\n\t/\\bchmod\\s+-R\\s+0+\\s+\\/(\\s|$)/,\n];\n\nconst REDACTION_PLACEHOLDER = \"***REDACTED***\";\n\nfunction normalizePath(input: string): string {\n\treturn input.replace(/\\\\/g, \"/\");\n}\n\nfunction basename(input: string): string {\n\tconst normalized = normalizePath(input);\n\tconst idx = normalized.lastIndexOf(\"/\");\n\treturn idx >= 0 ? normalized.slice(idx + 1) : normalized;\n}\n\nfunction matchesAnyGlob(path: string, scope: readonly string[]): boolean {\n\tif (scope.length === 0) return false;\n\tconst normalized = normalizePath(path);\n\tfor (const glob of scope) {\n\t\tconst re = globToRegex(glob);\n\t\tif (re.test(normalized)) return true;\n\t}\n\treturn false;\n}\n\nfunction globToRegex(glob: string): RegExp {\n\t// Minimal glob: ** -> .*, * -> [^/]*, ? -> [^/]. Other regex metachars escaped.\n\tconst normalized = normalizePath(glob);\n\tlet pattern = \"\";\n\tlet i = 0;\n\twhile (i < normalized.length) {\n\t\tconst c = normalized[i];\n\t\tif (c === \"*\" && normalized[i + 1] === \"*\") {\n\t\t\tpattern += \".*\";\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === \"*\") {\n\t\t\tpattern += \"[^/]*\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (c === \"?\") {\n\t\t\tpattern += \"[^/]\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/[.+^${}()|[\\]\\\\]/.test(c)) {\n\t\t\tpattern += `\\\\${c}`;\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tpattern += c;\n\t\ti += 1;\n\t}\n\treturn new RegExp(`^${pattern}$`);\n}\n\n/**\n * Clause 1 — secrets. Block reads/writes/edits targeting credential files.\n * Bash matchers check the command's argv for known credential paths too.\n */\nexport function checkSecretsClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool === \"read\" || call.tool === \"edit\" || call.tool === \"write\") {\n\t\tconst path = typeof call.args.path === \"string\" ? call.args.path : \"\";\n\t\tif (path && pathLooksLikeSecret(path)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: `Secrets clause blocks ${call.tool} on '${path}'.`,\n\t\t\t};\n\t\t}\n\t}\n\tif (call.tool === \"bash\") {\n\t\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\t\tif (cmd && bashTouchesSecret(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: \"Secrets clause blocks bash command that reads a credential file.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\nfunction pathLooksLikeSecret(path: string): boolean {\n\tconst normalized = normalizePath(path);\n\tconst base = basename(normalized);\n\tfor (const re of SECRET_PATH_PATTERNS) {\n\t\tif (re.test(normalized) || re.test(base)) return true;\n\t}\n\treturn false;\n}\n\nfunction bashTouchesSecret(cmd: string): boolean {\n\t// Catch the obvious cat / cp / mv / less / head / tail / source <secret-path>.\n\tconst readVerbs = /\\b(cat|less|more|head|tail|tac|nl|od|hexdump|xxd|cp|mv|source|\\.)\\b\\s+([^\\s|;&<>]+)/g;\n\tlet match: RegExpExecArray | null = readVerbs.exec(cmd);\n\twhile (match !== null) {\n\t\tconst target = match[2];\n\t\tif (target && pathLooksLikeSecret(target)) return true;\n\t\tmatch = readVerbs.exec(cmd);\n\t}\n\treturn false;\n}\n\n/**\n * Clause 2 — privilege escalation. Even under yolo mode, sudo/su require an\n * explicit confirm. Never auto-approved.\n */\nexport function checkPrivilegeClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool !== \"bash\") return { kind: \"pass\" };\n\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\tif (!cmd) return { kind: \"pass\" };\n\tfor (const re of PRIVILEGE_ESCALATION_PATTERNS) {\n\t\tif (re.test(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"require-confirm\",\n\t\t\t\treason: \"Privilege escalation requires explicit confirmation under §0.1.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\n/**\n * Clause 3 — filesystem destruction. Hard deny. No override path.\n */\nexport function checkFsDestructionClause(call: ToolCallContext): MatcherVerdict {\n\tif (call.tool !== \"bash\") return { kind: \"pass\" };\n\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\tif (!cmd) return { kind: \"pass\" };\n\tfor (const re of FS_DESTRUCTION_PATTERNS) {\n\t\tif (re.test(cmd)) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\treason: \"Filesystem-destructive command is blocked by §0.1.\",\n\t\t\t};\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\n/**\n * Clause 4 — scope. Edits/writes must land inside writeScope; bash must stay\n * inside executeScope when configured. Empty/undefined scope = no constraint\n * (e.g. local CLI usage without a lane grant).\n */\nexport function checkScopeClause(call: ToolCallContext): MatcherVerdict {\n\tconst grant = call.laneGrant;\n\tif (!grant) return { kind: \"pass\" };\n\tif (call.tool === \"write\" || call.tool === \"edit\") {\n\t\tconst writeScope = grant.writeScope;\n\t\tif (writeScope && writeScope.length > 0) {\n\t\t\tconst path = typeof call.args.path === \"string\" ? call.args.path : \"\";\n\t\t\tif (path && !matchesAnyGlob(path, writeScope)) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"deny-hard\",\n\t\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\t\treason: `Path '${path}' is outside writeScope.`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\tif (call.tool === \"bash\") {\n\t\tconst executeScope = grant.executeScope;\n\t\tif (executeScope && executeScope.length > 0) {\n\t\t\tconst cmd = typeof call.args.command === \"string\" ? call.args.command : \"\";\n\t\t\tconst touched = extractMutatingTargets(cmd);\n\t\t\tfor (const target of touched) {\n\t\t\t\tif (!matchesAnyGlob(target, executeScope)) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: \"deny-hard\",\n\t\t\t\t\t\tcode: \"hook_rejected\",\n\t\t\t\t\t\treason: `Bash mutates '${target}' outside executeScope.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn { kind: \"pass\" };\n}\n\nfunction extractMutatingTargets(cmd: string): string[] {\n\t// Heuristic: top-level >, >>, tee target; ignore quoted forms inside strings.\n\tconst targets: string[] = [];\n\tconst redirectRe = />>?\\s*([^\\s|;&<>'\"]+)/g;\n\tlet m: RegExpExecArray | null = redirectRe.exec(cmd);\n\twhile (m !== null) {\n\t\tconst t = m[1];\n\t\tif (t && t !== \"/dev/null\") targets.push(t);\n\t\tm = redirectRe.exec(cmd);\n\t}\n\tconst teeRe = /\\btee\\s+(?:-a\\s+)?([^\\s|;&<>'\"]+)/g;\n\tm = teeRe.exec(cmd);\n\twhile (m !== null) {\n\t\tconst t = m[1];\n\t\tif (t) targets.push(t);\n\t\tm = teeRe.exec(cmd);\n\t}\n\treturn targets;\n}\n\n/**\n * Redact bearer tokens and other secret-looking substrings before any sink\n * (logger, audit event, tool result returned to the LLM).\n */\nexport function redactSecrets(input: string): string {\n\tif (!input) return input;\n\tlet out = input;\n\tfor (const re of SECRET_CONTENT_PATTERNS) {\n\t\tout = out.replace(re, REDACTION_PLACEHOLDER);\n\t}\n\treturn out;\n}\n\n/**\n * Run every clause in order. First non-pass verdict wins; deny-hard beats\n * require-confirm in the rare case both fire (privilege + fs-destruction).\n */\nexport function runSafetyFloor(call: ToolCallContext): MatcherVerdict {\n\tconst checks = [checkSecretsClause, checkFsDestructionClause, checkScopeClause, checkPrivilegeClause];\n\tlet firstConfirm: MatcherVerdict | null = null;\n\tfor (const check of checks) {\n\t\ttry {\n\t\t\tconst verdict = check(call);\n\t\t\tif (verdict.kind === \"deny-hard\") return verdict;\n\t\t\tif (verdict.kind === \"require-confirm\" && !firstConfirm) firstConfirm = verdict;\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tkind: \"deny-hard\",\n\t\t\t\tcode: \"hook_failed\",\n\t\t\t\treason: `Safety floor matcher threw: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\treturn firstConfirm ?? { kind: \"pass\" };\n}\n"]}