open-multi-agent-kit 0.80.5 → 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 (1025) hide show
  1. package/CHANGELOG.md +31 -0
  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 +5 -9
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +55 -23
  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 +20 -5
  28. package/dist/core/compaction/branch-summarization.js.map +1 -1
  29. package/dist/core/compaction/compaction.d.ts +99 -1
  30. package/dist/core/compaction/compaction.d.ts.map +1 -1
  31. package/dist/core/compaction/compaction.js +655 -21
  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 +91 -0
  113. package/dist/core/harness-control-events.d.ts.map +1 -0
  114. package/dist/core/harness-control-events.js +514 -0
  115. package/dist/core/harness-control-events.js.map +1 -0
  116. package/dist/core/harness-control-replay.d.ts +31 -0
  117. package/dist/core/harness-control-replay.d.ts.map +1 -0
  118. package/dist/core/harness-control-replay.js +187 -0
  119. package/dist/core/harness-control-replay.js.map +1 -0
  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/keybindings.d.ts +12 -0
  129. package/dist/core/keybindings.d.ts.map +1 -1
  130. package/dist/core/keybindings.js +31 -1
  131. package/dist/core/keybindings.js.map +1 -1
  132. package/dist/core/lean-context-middleware.d.ts +12 -0
  133. package/dist/core/lean-context-middleware.d.ts.map +1 -0
  134. package/dist/core/lean-context-middleware.js +87 -0
  135. package/dist/core/lean-context-middleware.js.map +1 -0
  136. package/dist/core/lean-context-policy.d.ts +45 -0
  137. package/dist/core/lean-context-policy.d.ts.map +1 -0
  138. package/dist/core/lean-context-policy.js +108 -0
  139. package/dist/core/lean-context-policy.js.map +1 -0
  140. package/dist/core/loadout-access-policy.d.ts +41 -0
  141. package/dist/core/loadout-access-policy.d.ts.map +1 -0
  142. package/dist/core/loadout-access-policy.js +182 -0
  143. package/dist/core/loadout-access-policy.js.map +1 -0
  144. package/dist/core/loadout-runtime.d.ts +84 -0
  145. package/dist/core/loadout-runtime.d.ts.map +1 -0
  146. package/dist/core/loadout-runtime.js +157 -0
  147. package/dist/core/loadout-runtime.js.map +1 -0
  148. package/dist/core/loadouts.d.ts +147 -0
  149. package/dist/core/loadouts.d.ts.map +1 -0
  150. package/dist/core/loadouts.js +442 -0
  151. package/dist/core/loadouts.js.map +1 -0
  152. package/dist/core/mcp-inventory.d.ts +74 -0
  153. package/dist/core/mcp-inventory.d.ts.map +1 -0
  154. package/dist/core/mcp-inventory.js +156 -0
  155. package/dist/core/mcp-inventory.js.map +1 -0
  156. package/dist/core/mcp-presets.d.ts +57 -0
  157. package/dist/core/mcp-presets.d.ts.map +1 -0
  158. package/dist/core/mcp-presets.js +81 -0
  159. package/dist/core/mcp-presets.js.map +1 -0
  160. package/dist/core/model-registry.d.ts +1 -0
  161. package/dist/core/model-registry.d.ts.map +1 -1
  162. package/dist/core/model-registry.js +40 -17
  163. package/dist/core/model-registry.js.map +1 -1
  164. package/dist/core/model-resolver.d.ts.map +1 -1
  165. package/dist/core/model-resolver.js +1 -0
  166. package/dist/core/model-resolver.js.map +1 -1
  167. package/dist/core/native-adoption-benchmark.d.ts +166 -0
  168. package/dist/core/native-adoption-benchmark.d.ts.map +1 -0
  169. package/dist/core/native-adoption-benchmark.js +624 -0
  170. package/dist/core/native-adoption-benchmark.js.map +1 -0
  171. package/dist/core/observability-trace.d.ts +80 -0
  172. package/dist/core/observability-trace.d.ts.map +1 -0
  173. package/dist/core/observability-trace.js +140 -0
  174. package/dist/core/observability-trace.js.map +1 -0
  175. package/dist/core/orchestration/checkpoint.d.ts +83 -0
  176. package/dist/core/orchestration/checkpoint.d.ts.map +1 -0
  177. package/dist/core/orchestration/checkpoint.js +152 -0
  178. package/dist/core/orchestration/checkpoint.js.map +1 -0
  179. package/dist/core/orchestration/errors.d.ts +74 -0
  180. package/dist/core/orchestration/errors.d.ts.map +1 -0
  181. package/dist/core/orchestration/errors.js +52 -0
  182. package/dist/core/orchestration/errors.js.map +1 -0
  183. package/dist/core/orchestration/merge-queue.d.ts +121 -0
  184. package/dist/core/orchestration/merge-queue.d.ts.map +1 -0
  185. package/dist/core/orchestration/merge-queue.js +149 -0
  186. package/dist/core/orchestration/merge-queue.js.map +1 -0
  187. package/dist/core/orchestration/recovery.d.ts +106 -0
  188. package/dist/core/orchestration/recovery.d.ts.map +1 -0
  189. package/dist/core/orchestration/recovery.js +110 -0
  190. package/dist/core/orchestration/recovery.js.map +1 -0
  191. package/dist/core/orchestration/replay-ledger.d.ts +76 -0
  192. package/dist/core/orchestration/replay-ledger.d.ts.map +1 -0
  193. package/dist/core/orchestration/replay-ledger.js +395 -0
  194. package/dist/core/orchestration/replay-ledger.js.map +1 -0
  195. package/dist/core/orchestration/scheduler-state.d.ts +78 -0
  196. package/dist/core/orchestration/scheduler-state.d.ts.map +1 -0
  197. package/dist/core/orchestration/scheduler-state.js +185 -0
  198. package/dist/core/orchestration/scheduler-state.js.map +1 -0
  199. package/dist/core/orchestration/scheduler-store.d.ts +309 -0
  200. package/dist/core/orchestration/scheduler-store.d.ts.map +1 -0
  201. package/dist/core/orchestration/scheduler-store.js +368 -0
  202. package/dist/core/orchestration/scheduler-store.js.map +1 -0
  203. package/dist/core/orchestration/sqlite-scheduler-store.d.ts +57 -0
  204. package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +1 -0
  205. package/dist/core/orchestration/sqlite-scheduler-store.js +528 -0
  206. package/dist/core/orchestration/sqlite-scheduler-store.js.map +1 -0
  207. package/dist/core/orchestration/transaction-coordinator.d.ts +217 -0
  208. package/dist/core/orchestration/transaction-coordinator.d.ts.map +1 -0
  209. package/dist/core/orchestration/transaction-coordinator.js +281 -0
  210. package/dist/core/orchestration/transaction-coordinator.js.map +1 -0
  211. package/dist/core/orchestration/verification-contract.d.ts +197 -0
  212. package/dist/core/orchestration/verification-contract.d.ts.map +1 -0
  213. package/dist/core/orchestration/verification-contract.js +145 -0
  214. package/dist/core/orchestration/verification-contract.js.map +1 -0
  215. package/dist/core/package-composition.d.ts +68 -0
  216. package/dist/core/package-composition.d.ts.map +1 -0
  217. package/dist/core/package-composition.js +304 -0
  218. package/dist/core/package-composition.js.map +1 -0
  219. package/dist/core/package-gallery.d.ts +124 -0
  220. package/dist/core/package-gallery.d.ts.map +1 -0
  221. package/dist/core/package-gallery.js +392 -0
  222. package/dist/core/package-gallery.js.map +1 -0
  223. package/dist/core/package-manager.d.ts +69 -0
  224. package/dist/core/package-manager.d.ts.map +1 -1
  225. package/dist/core/package-manager.js +367 -69
  226. package/dist/core/package-manager.js.map +1 -1
  227. package/dist/core/package-procurement.d.ts +268 -0
  228. package/dist/core/package-procurement.d.ts.map +1 -0
  229. package/dist/core/package-procurement.js +697 -0
  230. package/dist/core/package-procurement.js.map +1 -0
  231. package/dist/core/package-trial-runtime.d.ts +75 -0
  232. package/dist/core/package-trial-runtime.d.ts.map +1 -0
  233. package/dist/core/package-trial-runtime.js +73 -0
  234. package/dist/core/package-trial-runtime.js.map +1 -0
  235. package/dist/core/package-trial-sandbox.d.ts +27 -0
  236. package/dist/core/package-trial-sandbox.d.ts.map +1 -0
  237. package/dist/core/package-trial-sandbox.js +102 -0
  238. package/dist/core/package-trial-sandbox.js.map +1 -0
  239. package/dist/core/policy-overlays-runtime.d.ts +141 -0
  240. package/dist/core/policy-overlays-runtime.d.ts.map +1 -0
  241. package/dist/core/policy-overlays-runtime.js +720 -0
  242. package/dist/core/policy-overlays-runtime.js.map +1 -0
  243. package/dist/core/read-anchor-registry.d.ts +27 -0
  244. package/dist/core/read-anchor-registry.d.ts.map +1 -0
  245. package/dist/core/read-anchor-registry.js +103 -0
  246. package/dist/core/read-anchor-registry.js.map +1 -0
  247. package/dist/core/read-anchors.d.ts +110 -0
  248. package/dist/core/read-anchors.d.ts.map +1 -0
  249. package/dist/core/read-anchors.js +193 -0
  250. package/dist/core/read-anchors.js.map +1 -0
  251. package/dist/core/read-content-cache.d.ts +22 -0
  252. package/dist/core/read-content-cache.d.ts.map +1 -0
  253. package/dist/core/read-content-cache.js +79 -0
  254. package/dist/core/read-content-cache.js.map +1 -0
  255. package/dist/core/recovery-checkpoint.d.ts +196 -0
  256. package/dist/core/recovery-checkpoint.d.ts.map +1 -0
  257. package/dist/core/recovery-checkpoint.js +382 -0
  258. package/dist/core/recovery-checkpoint.js.map +1 -0
  259. package/dist/core/resolve-config-value.d.ts +1 -1
  260. package/dist/core/resolve-config-value.d.ts.map +1 -1
  261. package/dist/core/resolve-config-value.js +30 -2
  262. package/dist/core/resolve-config-value.js.map +1 -1
  263. package/dist/core/resource-loader.d.ts +23 -21
  264. package/dist/core/resource-loader.d.ts.map +1 -1
  265. package/dist/core/resource-loader.js +93 -15
  266. package/dist/core/resource-loader.js.map +1 -1
  267. package/dist/core/sandbox/backend.d.ts +25 -0
  268. package/dist/core/sandbox/backend.d.ts.map +1 -0
  269. package/dist/core/sandbox/backend.js +150 -0
  270. package/dist/core/sandbox/backend.js.map +1 -0
  271. package/dist/core/sandbox/env.d.ts +6 -0
  272. package/dist/core/sandbox/env.d.ts.map +1 -0
  273. package/dist/core/sandbox/env.js +46 -0
  274. package/dist/core/sandbox/env.js.map +1 -0
  275. package/dist/core/sandbox/path-resolver.d.ts +4 -0
  276. package/dist/core/sandbox/path-resolver.d.ts.map +1 -0
  277. package/dist/core/sandbox/path-resolver.js +44 -0
  278. package/dist/core/sandbox/path-resolver.js.map +1 -0
  279. package/dist/core/sandbox/policy.d.ts +87 -0
  280. package/dist/core/sandbox/policy.d.ts.map +1 -0
  281. package/dist/core/sandbox/policy.js +280 -0
  282. package/dist/core/sandbox/policy.js.map +1 -0
  283. package/dist/core/sandbox/spawn.d.ts +20 -0
  284. package/dist/core/sandbox/spawn.d.ts.map +1 -0
  285. package/dist/core/sandbox/spawn.js +80 -0
  286. package/dist/core/sandbox/spawn.js.map +1 -0
  287. package/dist/core/sdk.d.ts +83 -4
  288. package/dist/core/sdk.d.ts.map +1 -1
  289. package/dist/core/sdk.js +143 -55
  290. package/dist/core/sdk.js.map +1 -1
  291. package/dist/core/semantic-cache-policy.d.ts +45 -0
  292. package/dist/core/semantic-cache-policy.d.ts.map +1 -0
  293. package/dist/core/semantic-cache-policy.js +220 -0
  294. package/dist/core/semantic-cache-policy.js.map +1 -0
  295. package/dist/core/session-digest.d.ts +57 -0
  296. package/dist/core/session-digest.d.ts.map +1 -0
  297. package/dist/core/session-digest.js +193 -0
  298. package/dist/core/session-digest.js.map +1 -0
  299. package/dist/core/session-manager.d.ts +2 -2
  300. package/dist/core/session-manager.d.ts.map +1 -1
  301. package/dist/core/session-manager.js +5 -4
  302. package/dist/core/session-manager.js.map +1 -1
  303. package/dist/core/settings-manager.d.ts +17 -0
  304. package/dist/core/settings-manager.d.ts.map +1 -1
  305. package/dist/core/settings-manager.js +47 -2
  306. package/dist/core/settings-manager.js.map +1 -1
  307. package/dist/core/slash-commands.d.ts.map +1 -1
  308. package/dist/core/slash-commands.js +4 -1
  309. package/dist/core/slash-commands.js.map +1 -1
  310. package/dist/core/spec-kit/compiler.d.ts +67 -0
  311. package/dist/core/spec-kit/compiler.d.ts.map +1 -0
  312. package/dist/core/spec-kit/compiler.js +268 -0
  313. package/dist/core/spec-kit/compiler.js.map +1 -0
  314. package/dist/core/system-prompt.d.ts.map +1 -1
  315. package/dist/core/system-prompt.js +25 -7
  316. package/dist/core/system-prompt.js.map +1 -1
  317. package/dist/core/telemetry.d.ts.map +1 -1
  318. package/dist/core/telemetry.js +1 -1
  319. package/dist/core/telemetry.js.map +1 -1
  320. package/dist/core/timings.d.ts +1 -1
  321. package/dist/core/timings.d.ts.map +1 -1
  322. package/dist/core/timings.js +2 -2
  323. package/dist/core/timings.js.map +1 -1
  324. package/dist/core/tools/bash.d.ts +28 -3
  325. package/dist/core/tools/bash.d.ts.map +1 -1
  326. package/dist/core/tools/bash.js +53 -10
  327. package/dist/core/tools/bash.js.map +1 -1
  328. package/dist/core/tools/edit.d.ts +12 -0
  329. package/dist/core/tools/edit.d.ts.map +1 -1
  330. package/dist/core/tools/edit.js +24 -0
  331. package/dist/core/tools/edit.js.map +1 -1
  332. package/dist/core/tools/find.d.ts +3 -0
  333. package/dist/core/tools/find.d.ts.map +1 -1
  334. package/dist/core/tools/find.js +3 -0
  335. package/dist/core/tools/find.js.map +1 -1
  336. package/dist/core/tools/grep.d.ts +3 -0
  337. package/dist/core/tools/grep.d.ts.map +1 -1
  338. package/dist/core/tools/grep.js +4 -1
  339. package/dist/core/tools/grep.js.map +1 -1
  340. package/dist/core/tools/index.d.ts +1 -1
  341. package/dist/core/tools/index.d.ts.map +1 -1
  342. package/dist/core/tools/index.js.map +1 -1
  343. package/dist/core/tools/ls.d.ts +3 -0
  344. package/dist/core/tools/ls.d.ts.map +1 -1
  345. package/dist/core/tools/ls.js +3 -0
  346. package/dist/core/tools/ls.js.map +1 -1
  347. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  348. package/dist/core/tools/output-accumulator.js +1 -1
  349. package/dist/core/tools/output-accumulator.js.map +1 -1
  350. package/dist/core/tools/read.d.ts +13 -0
  351. package/dist/core/tools/read.d.ts.map +1 -1
  352. package/dist/core/tools/read.js +29 -2
  353. package/dist/core/tools/read.js.map +1 -1
  354. package/dist/core/tools/write.d.ts +3 -0
  355. package/dist/core/tools/write.d.ts.map +1 -1
  356. package/dist/core/tools/write.js +3 -0
  357. package/dist/core/tools/write.js.map +1 -1
  358. package/dist/core/transaction-coordinator.d.ts +30 -0
  359. package/dist/core/transaction-coordinator.d.ts.map +1 -0
  360. package/dist/core/transaction-coordinator.js +173 -0
  361. package/dist/core/transaction-coordinator.js.map +1 -0
  362. package/dist/index.d.ts +19 -4
  363. package/dist/index.d.ts.map +1 -1
  364. package/dist/index.js +17 -2
  365. package/dist/index.js.map +1 -1
  366. package/dist/main.d.ts.map +1 -1
  367. package/dist/main.js +4 -6
  368. package/dist/main.js.map +1 -1
  369. package/dist/migrations.d.ts +35 -0
  370. package/dist/migrations.d.ts.map +1 -1
  371. package/dist/migrations.js +410 -4
  372. package/dist/migrations.js.map +1 -1
  373. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts +28 -0
  374. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/control-panel-gradient-motion.js +146 -0
  376. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -0
  377. package/dist/modes/interactive/components/control-panel-gradient.d.ts +27 -0
  378. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -0
  379. package/dist/modes/interactive/components/control-panel-gradient.js +127 -0
  380. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -0
  381. package/dist/modes/interactive/components/control-panel.d.ts +56 -0
  382. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -0
  383. package/dist/modes/interactive/components/control-panel.js +240 -0
  384. package/dist/modes/interactive/components/control-panel.js.map +1 -0
  385. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/custom-editor.js +21 -13
  387. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  388. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  390. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  391. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.js +1 -1
  393. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  394. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  395. package/dist/modes/interactive/components/footer.js +8 -0
  396. package/dist/modes/interactive/components/footer.js.map +1 -1
  397. package/dist/modes/interactive/components/index.d.ts +3 -0
  398. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  399. package/dist/modes/interactive/components/index.js +3 -0
  400. package/dist/modes/interactive/components/index.js.map +1 -1
  401. package/dist/modes/interactive/components/mcp-selector.d.ts +30 -0
  402. package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -0
  403. package/dist/modes/interactive/components/mcp-selector.js +155 -0
  404. package/dist/modes/interactive/components/mcp-selector.js.map +1 -0
  405. package/dist/modes/interactive/components/model-selector-state.d.ts +101 -0
  406. package/dist/modes/interactive/components/model-selector-state.d.ts.map +1 -0
  407. package/dist/modes/interactive/components/model-selector-state.js +261 -0
  408. package/dist/modes/interactive/components/model-selector-state.js.map +1 -0
  409. package/dist/modes/interactive/components/model-selector.d.ts +52 -9
  410. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  411. package/dist/modes/interactive/components/model-selector.js +212 -66
  412. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  413. package/dist/modes/interactive/components/settings-selector.d.ts +19 -1
  414. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/settings-selector.js +21 -8
  416. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  417. package/dist/modes/interactive/components/skills-selector.d.ts +32 -0
  418. package/dist/modes/interactive/components/skills-selector.d.ts.map +1 -0
  419. package/dist/modes/interactive/components/skills-selector.js +130 -0
  420. package/dist/modes/interactive/components/skills-selector.js.map +1 -0
  421. package/dist/modes/interactive/components/theme-selector.d.ts +1 -0
  422. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/theme-selector.js +10 -1
  424. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  425. package/dist/modes/interactive/components/thinking-selector.d.ts +7 -8
  426. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/thinking-selector.js +7 -48
  428. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  429. package/dist/modes/interactive/interactive-mode.d.ts +13 -2
  430. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  431. package/dist/modes/interactive/interactive-mode.js +399 -108
  432. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  433. package/dist/modes/interactive/theme/catppuccin-mocha.json +86 -0
  434. package/dist/modes/interactive/theme/dracula.json +86 -0
  435. package/dist/modes/interactive/theme/gruvbox-dark.json +86 -0
  436. package/dist/modes/interactive/theme/kanagawa-dragon.json +86 -0
  437. package/dist/modes/interactive/theme/omk-blackboard.json +91 -0
  438. package/dist/modes/interactive/theme/omk-control-panel.json +91 -0
  439. package/dist/modes/interactive/theme/omk-freedom-grid.json +91 -0
  440. package/dist/modes/interactive/theme/omk-neon-ops.json +90 -0
  441. package/dist/modes/interactive/theme/omk-slate-light.json +91 -0
  442. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  443. package/dist/modes/interactive/theme/theme.js +55 -16
  444. package/dist/modes/interactive/theme/theme.js.map +1 -1
  445. package/dist/modes/interactive/theme/tokyo-night-storm.json +86 -0
  446. package/dist/modes/print-mode.d.ts +2 -2
  447. package/dist/modes/print-mode.d.ts.map +1 -1
  448. package/dist/modes/print-mode.js +2 -2
  449. package/dist/modes/print-mode.js.map +1 -1
  450. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  451. package/dist/modes/rpc/rpc-mode.js +4 -0
  452. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  453. package/dist/package-manager-cli.d.ts.map +1 -1
  454. package/dist/package-manager-cli.js +114 -49
  455. package/dist/package-manager-cli.js.map +1 -1
  456. package/dist/utils/clipboard-image.d.ts.map +1 -1
  457. package/dist/utils/clipboard-image.js +1 -1
  458. package/dist/utils/clipboard-image.js.map +1 -1
  459. package/dist/utils/omk-user-agent.d.ts +2 -0
  460. package/dist/utils/omk-user-agent.d.ts.map +1 -0
  461. package/dist/utils/{pi-user-agent.js → omk-user-agent.js} +2 -2
  462. package/dist/utils/omk-user-agent.js.map +1 -0
  463. package/dist/utils/tools-manager.d.ts.map +1 -1
  464. package/dist/utils/tools-manager.js +1 -1
  465. package/dist/utils/tools-manager.js.map +1 -1
  466. package/dist/utils/version-check.d.ts +5 -5
  467. package/dist/utils/version-check.d.ts.map +1 -1
  468. package/dist/utils/version-check.js +8 -11
  469. package/dist/utils/version-check.js.map +1 -1
  470. package/dist/utils/windows-self-update.d.ts.map +1 -1
  471. package/dist/utils/windows-self-update.js +1 -1
  472. package/dist/utils/windows-self-update.js.map +1 -1
  473. package/docs/compaction.md +21 -8
  474. package/docs/packages.md +47 -6
  475. package/docs/prompt-templates.md +2 -0
  476. package/docs/quickstart.md +1 -1
  477. package/docs/themes.md +10 -2
  478. package/docs/usage.md +18 -7
  479. package/examples/README.md +1 -1
  480. package/examples/extensions/README.md +11 -11
  481. package/examples/extensions/auto-commit-on-exit.ts +6 -6
  482. package/examples/extensions/bash-spawn-hook.ts +4 -4
  483. package/examples/extensions/bookmark.ts +5 -5
  484. package/examples/extensions/border-status-editor.ts +7 -7
  485. package/examples/extensions/built-in-tool-renderer.ts +6 -6
  486. package/examples/extensions/claude-rules.ts +4 -4
  487. package/examples/extensions/commands.ts +5 -5
  488. package/examples/extensions/confirm-destructive.ts +3 -3
  489. package/examples/extensions/custom-compaction.ts +3 -3
  490. package/examples/extensions/custom-footer.ts +2 -2
  491. package/examples/extensions/custom-header.ts +5 -5
  492. package/examples/extensions/custom-provider-anthropic/index.ts +4 -4
  493. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  494. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  495. package/examples/extensions/custom-provider-gitlab-duo/index.ts +3 -3
  496. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  497. package/examples/extensions/dirty-repo-guard.ts +7 -7
  498. package/examples/extensions/doom-overlay/README.md +3 -3
  499. package/examples/extensions/doom-overlay/doom/build.sh +2 -2
  500. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +1 -1
  501. package/examples/extensions/doom-overlay/index.ts +3 -3
  502. package/examples/extensions/dynamic-resources/dynamic.json +1 -1
  503. package/examples/extensions/dynamic-resources/index.ts +2 -2
  504. package/examples/extensions/dynamic-tools.ts +4 -4
  505. package/examples/extensions/event-bus.ts +8 -8
  506. package/examples/extensions/file-trigger.ts +3 -3
  507. package/examples/extensions/git-checkpoint.ts +7 -7
  508. package/examples/extensions/git-merge-and-resolve.ts +14 -14
  509. package/examples/extensions/github-issue-autocomplete.ts +6 -6
  510. package/examples/extensions/gondolin/index.ts +16 -16
  511. package/examples/extensions/gondolin/package-lock.json +2 -2
  512. package/examples/extensions/gondolin/package.json +1 -1
  513. package/examples/extensions/handoff.ts +2 -2
  514. package/examples/extensions/hello.ts +2 -2
  515. package/examples/extensions/hidden-thinking-label.ts +4 -4
  516. package/examples/extensions/inline-bash.ts +5 -5
  517. package/examples/extensions/input-transform-streaming.ts +5 -5
  518. package/examples/extensions/input-transform.ts +5 -5
  519. package/examples/extensions/interactive-shell.ts +3 -3
  520. package/examples/extensions/mac-system-theme.ts +5 -5
  521. package/examples/extensions/message-renderer.ts +4 -4
  522. package/examples/extensions/minimal-mode.ts +9 -9
  523. package/examples/extensions/modal-editor.ts +3 -3
  524. package/examples/extensions/model-status.ts +3 -3
  525. package/examples/extensions/notify.ts +5 -5
  526. package/examples/extensions/overlay-qa-tests.ts +20 -20
  527. package/examples/extensions/overlay-test.ts +3 -3
  528. package/examples/extensions/permission-gate.ts +2 -2
  529. package/examples/extensions/pirate.ts +4 -4
  530. package/examples/extensions/plan-mode/index.ts +22 -22
  531. package/examples/extensions/preset.ts +30 -30
  532. package/examples/extensions/prompt-customizer.ts +3 -3
  533. package/examples/extensions/protected-paths.ts +2 -2
  534. package/examples/extensions/provider-payload.ts +5 -5
  535. package/examples/extensions/qna.ts +2 -2
  536. package/examples/extensions/question.ts +2 -2
  537. package/examples/extensions/questionnaire.ts +2 -2
  538. package/examples/extensions/rainbow-editor.ts +3 -3
  539. package/examples/extensions/reload-runtime.ts +4 -4
  540. package/examples/extensions/rpc-demo.ts +10 -10
  541. package/examples/extensions/sandbox/index.ts +17 -17
  542. package/examples/extensions/sandbox/package-lock.json +2 -2
  543. package/examples/extensions/sandbox/package.json +1 -1
  544. package/examples/extensions/send-user-message.ts +13 -13
  545. package/examples/extensions/session-name.ts +4 -4
  546. package/examples/extensions/shutdown-command.ts +10 -10
  547. package/examples/extensions/snake.ts +3 -3
  548. package/examples/extensions/space-invaders.ts +3 -3
  549. package/examples/extensions/ssh.ts +12 -12
  550. package/examples/extensions/status-line.ts +4 -4
  551. package/examples/extensions/structured-output.ts +2 -2
  552. package/examples/extensions/subagent/README.md +13 -13
  553. package/examples/extensions/subagent/agents.ts +2 -2
  554. package/examples/extensions/subagent/index.ts +53 -21
  555. package/examples/extensions/summarize.ts +2 -2
  556. package/examples/extensions/system-prompt-header.ts +3 -3
  557. package/examples/extensions/tic-tac-toe.ts +15 -15
  558. package/examples/extensions/timed-confirm.ts +4 -4
  559. package/examples/extensions/titlebar-spinner.ts +9 -9
  560. package/examples/extensions/todo.ts +5 -5
  561. package/examples/extensions/tool-override.ts +5 -5
  562. package/examples/extensions/tools.ts +10 -10
  563. package/examples/extensions/trigger-compact.ts +3 -3
  564. package/examples/extensions/truncated-tool.ts +3 -3
  565. package/examples/extensions/widget-placement.ts +2 -2
  566. package/examples/extensions/with-deps/index.ts +2 -2
  567. package/examples/extensions/with-deps/package-lock.json +2 -2
  568. package/examples/extensions/with-deps/package.json +1 -1
  569. package/examples/extensions/working-indicator.ts +7 -7
  570. package/examples/extensions/working-message-test.ts +3 -3
  571. package/examples/sdk/01-minimal.ts +1 -1
  572. package/examples/sdk/03-custom-prompt.ts +1 -1
  573. package/examples/sdk/04-skills.ts +1 -1
  574. package/examples/sdk/05-tools.ts +1 -1
  575. package/examples/sdk/06-extensions.ts +11 -11
  576. package/examples/sdk/07-context-files.ts +2 -0
  577. package/examples/sdk/08-prompt-templates.ts +1 -1
  578. package/examples/sdk/09-api-keys-and-oauth.ts +2 -2
  579. package/examples/sdk/README.md +2 -2
  580. package/node_modules/@earendil-works/omk-agent-core/README.md +488 -0
  581. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +24 -0
  582. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +1 -0
  583. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +553 -0
  584. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +1 -0
  585. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +118 -0
  586. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +1 -0
  587. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +402 -0
  588. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +1 -0
  589. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +95 -0
  590. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +1 -0
  591. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +996 -0
  592. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +1 -0
  593. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +53 -0
  594. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  595. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +175 -0
  596. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -0
  597. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +117 -0
  598. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -0
  599. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +568 -0
  600. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +1 -0
  601. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +25 -0
  602. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +1 -0
  603. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +131 -0
  604. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +1 -0
  605. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +51 -0
  606. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +1 -0
  607. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +510 -0
  608. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +1 -0
  609. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +51 -0
  610. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +1 -0
  611. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +102 -0
  612. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +1 -0
  613. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +48 -0
  614. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +1 -0
  615. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +230 -0
  616. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +1 -0
  617. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +26 -0
  618. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -0
  619. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +101 -0
  620. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +1 -0
  621. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +36 -0
  622. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -0
  623. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +273 -0
  624. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +1 -0
  625. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +18 -0
  626. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -0
  627. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +42 -0
  628. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +1 -0
  629. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +25 -0
  630. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -0
  631. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +114 -0
  632. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +1 -0
  633. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +11 -0
  634. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -0
  635. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +39 -0
  636. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +1 -0
  637. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +33 -0
  638. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +1 -0
  639. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +210 -0
  640. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +1 -0
  641. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +2 -0
  642. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +1 -0
  643. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +50 -0
  644. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +1 -0
  645. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +44 -0
  646. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +1 -0
  647. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +311 -0
  648. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +1 -0
  649. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +3 -0
  650. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +1 -0
  651. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +30 -0
  652. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +1 -0
  653. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +616 -0
  654. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +1 -0
  655. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +94 -0
  656. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +1 -0
  657. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +14 -0
  658. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -0
  659. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +126 -0
  660. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +1 -0
  661. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +70 -0
  662. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +1 -0
  663. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +297 -0
  664. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +1 -0
  665. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +20 -0
  666. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +1 -0
  667. package/node_modules/@earendil-works/omk-agent-core/dist/index.js +25 -0
  668. package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +1 -0
  669. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +3 -0
  670. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +1 -0
  671. package/node_modules/@earendil-works/omk-agent-core/dist/node.js +3 -0
  672. package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +1 -0
  673. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +69 -0
  674. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +1 -0
  675. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +278 -0
  676. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +1 -0
  677. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +393 -0
  678. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +1 -0
  679. package/node_modules/@earendil-works/omk-agent-core/dist/types.js +2 -0
  680. package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +1 -0
  681. package/node_modules/@earendil-works/omk-agent-core/package.json +60 -0
  682. package/node_modules/@earendil-works/omk-ai/README.md +1389 -0
  683. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +20 -0
  684. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +1 -0
  685. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +44 -0
  686. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +1 -0
  687. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +5 -0
  688. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +1 -0
  689. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +6 -0
  690. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +1 -0
  691. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +3 -0
  692. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +1 -0
  693. package/node_modules/@earendil-works/omk-ai/dist/cli.js +130 -0
  694. package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +1 -0
  695. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +20 -0
  696. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +1 -0
  697. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +199 -0
  698. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +1 -0
  699. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +10 -0
  700. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +1 -0
  701. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +515 -0
  702. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +1 -0
  703. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +517 -0
  704. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +1 -0
  705. package/node_modules/@earendil-works/omk-ai/dist/image-models.js +23 -0
  706. package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +1 -0
  707. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +14 -0
  708. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +1 -0
  709. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +22 -0
  710. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +1 -0
  711. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +4 -0
  712. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +1 -0
  713. package/node_modules/@earendil-works/omk-ai/dist/images.js +16 -0
  714. package/node_modules/@earendil-works/omk-ai/dist/images.js.map +1 -0
  715. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +33 -0
  716. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +1 -0
  717. package/node_modules/@earendil-works/omk-ai/dist/index.js +21 -0
  718. package/node_modules/@earendil-works/omk-ai/dist/index.js.map +1 -0
  719. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +18 -0
  720. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +1 -0
  721. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +18762 -0
  722. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +1 -0
  723. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +17197 -0
  724. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +1 -0
  725. package/node_modules/@earendil-works/omk-ai/dist/models.js +78 -0
  726. package/node_modules/@earendil-works/omk-ai/dist/models.js.map +1 -0
  727. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +2 -0
  728. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +1 -0
  729. package/node_modules/@earendil-works/omk-ai/dist/oauth.js +2 -0
  730. package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +1 -0
  731. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +39 -0
  732. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +1 -0
  733. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +170 -0
  734. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +1 -0
  735. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +38 -0
  736. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +1 -0
  737. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +826 -0
  738. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +1 -0
  739. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +77 -0
  740. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +1 -0
  741. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +1123 -0
  742. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +1 -0
  743. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +15 -0
  744. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +1 -0
  745. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +221 -0
  746. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +1 -0
  747. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +13 -0
  748. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +1 -0
  749. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +26 -0
  750. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +1 -0
  751. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +56 -0
  752. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +1 -0
  753. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +368 -0
  754. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +1 -0
  755. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +8 -0
  756. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +1 -0
  757. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +29 -0
  758. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +1 -0
  759. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +70 -0
  760. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +1 -0
  761. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +331 -0
  762. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +1 -0
  763. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +15 -0
  764. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +1 -0
  765. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +442 -0
  766. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +1 -0
  767. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +13 -0
  768. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +1 -0
  769. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +402 -0
  770. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +1 -0
  771. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +3 -0
  772. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +1 -0
  773. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +128 -0
  774. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +1 -0
  775. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +4 -0
  776. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +1 -0
  777. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +34 -0
  778. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +1 -0
  779. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +25 -0
  780. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +1 -0
  781. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +534 -0
  782. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +1 -0
  783. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +30 -0
  784. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +1 -0
  785. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +1171 -0
  786. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +1 -0
  787. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +19 -0
  788. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +1 -0
  789. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +977 -0
  790. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +1 -0
  791. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +11 -0
  792. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -0
  793. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +22 -0
  794. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +1 -0
  795. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +18 -0
  796. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +1 -0
  797. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +496 -0
  798. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +1 -0
  799. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +13 -0
  800. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +1 -0
  801. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +233 -0
  802. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +1 -0
  803. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +35 -0
  804. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +1 -0
  805. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +254 -0
  806. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +1 -0
  807. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +8 -0
  808. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +1 -0
  809. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +42 -0
  810. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +1 -0
  811. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +13 -0
  812. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +1 -0
  813. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +82 -0
  814. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +1 -0
  815. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +8 -0
  816. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +1 -0
  817. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +184 -0
  818. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +1 -0
  819. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +4 -0
  820. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +1 -0
  821. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +22 -0
  822. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +1 -0
  823. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +8 -0
  824. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +1 -0
  825. package/node_modules/@earendil-works/omk-ai/dist/stream.js +77 -0
  826. package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +1 -0
  827. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +570 -0
  828. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +1 -0
  829. package/node_modules/@earendil-works/omk-ai/dist/types.js +2 -0
  830. package/node_modules/@earendil-works/omk-ai/dist/types.js.map +1 -0
  831. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +6 -0
  832. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +1 -0
  833. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +34 -0
  834. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +1 -0
  835. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +19 -0
  836. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +1 -0
  837. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +25 -0
  838. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +1 -0
  839. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +21 -0
  840. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +1 -0
  841. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +81 -0
  842. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +1 -0
  843. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +3 -0
  844. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +1 -0
  845. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +14 -0
  846. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +1 -0
  847. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +2 -0
  848. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +1 -0
  849. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +8 -0
  850. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +1 -0
  851. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +16 -0
  852. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +1 -0
  853. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +113 -0
  854. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +1 -0
  855. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +10 -0
  856. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +1 -0
  857. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +97 -0
  858. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +1 -0
  859. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +25 -0
  860. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +1 -0
  861. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +335 -0
  862. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +1 -0
  863. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +21 -0
  864. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +1 -0
  865. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +56 -0
  866. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +1 -0
  867. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +30 -0
  868. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -0
  869. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +280 -0
  870. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +1 -0
  871. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +58 -0
  872. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +1 -0
  873. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +122 -0
  874. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +1 -0
  875. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +3 -0
  876. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -0
  877. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +105 -0
  878. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +1 -0
  879. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +43 -0
  880. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -0
  881. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +487 -0
  882. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +1 -0
  883. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +13 -0
  884. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +1 -0
  885. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +31 -0
  886. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +1 -0
  887. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +64 -0
  888. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +1 -0
  889. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +2 -0
  890. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +1 -0
  891. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +57 -0
  892. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +1 -0
  893. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +154 -0
  894. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +1 -0
  895. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +22 -0
  896. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +1 -0
  897. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +26 -0
  898. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +1 -0
  899. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +17 -0
  900. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +1 -0
  901. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +21 -0
  902. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +1 -0
  903. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +18 -0
  904. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +1 -0
  905. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +281 -0
  906. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +1 -0
  907. package/node_modules/@earendil-works/omk-ai/package.json +106 -0
  908. package/node_modules/@earendil-works/omk-tui/README.md +791 -0
  909. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +54 -0
  910. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +1 -0
  911. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +632 -0
  912. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +1 -0
  913. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +22 -0
  914. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +1 -0
  915. package/node_modules/@earendil-works/omk-tui/dist/components/box.js +104 -0
  916. package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +1 -0
  917. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +22 -0
  918. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +1 -0
  919. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +35 -0
  920. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +1 -0
  921. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +249 -0
  922. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +1 -0
  923. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +1857 -0
  924. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +1 -0
  925. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +28 -0
  926. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +1 -0
  927. package/node_modules/@earendil-works/omk-tui/dist/components/image.js +89 -0
  928. package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +1 -0
  929. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +37 -0
  930. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +1 -0
  931. package/node_modules/@earendil-works/omk-tui/dist/components/input.js +378 -0
  932. package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +1 -0
  933. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +31 -0
  934. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +1 -0
  935. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +69 -0
  936. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +1 -0
  937. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +96 -0
  938. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +1 -0
  939. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +644 -0
  940. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +1 -0
  941. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +50 -0
  942. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +1 -0
  943. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +159 -0
  944. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +1 -0
  945. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +50 -0
  946. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +1 -0
  947. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +185 -0
  948. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +1 -0
  949. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +12 -0
  950. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +1 -0
  951. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +23 -0
  952. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +1 -0
  953. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +19 -0
  954. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +1 -0
  955. package/node_modules/@earendil-works/omk-tui/dist/components/text.js +89 -0
  956. package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +1 -0
  957. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +13 -0
  958. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +1 -0
  959. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +51 -0
  960. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +1 -0
  961. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +39 -0
  962. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +1 -0
  963. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +2 -0
  964. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +1 -0
  965. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +16 -0
  966. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +1 -0
  967. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +110 -0
  968. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +1 -0
  969. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +23 -0
  970. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +1 -0
  971. package/node_modules/@earendil-works/omk-tui/dist/index.js +32 -0
  972. package/node_modules/@earendil-works/omk-tui/dist/index.js.map +1 -0
  973. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +212 -0
  974. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +1 -0
  975. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +252 -0
  976. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +1 -0
  977. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +184 -0
  978. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +1 -0
  979. package/node_modules/@earendil-works/omk-tui/dist/keys.js +1173 -0
  980. package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +1 -0
  981. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +28 -0
  982. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +1 -0
  983. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +44 -0
  984. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +1 -0
  985. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +3 -0
  986. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +1 -0
  987. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +53 -0
  988. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +1 -0
  989. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +50 -0
  990. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +1 -0
  991. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +361 -0
  992. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +1 -0
  993. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +90 -0
  994. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +1 -0
  995. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +366 -0
  996. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +1 -0
  997. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +113 -0
  998. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +1 -0
  999. package/node_modules/@earendil-works/omk-tui/dist/terminal.js +472 -0
  1000. package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +1 -0
  1001. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +242 -0
  1002. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +1 -0
  1003. package/node_modules/@earendil-works/omk-tui/dist/tui.js +1221 -0
  1004. package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +1 -0
  1005. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +17 -0
  1006. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +1 -0
  1007. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +25 -0
  1008. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +1 -0
  1009. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +84 -0
  1010. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +1 -0
  1011. package/node_modules/@earendil-works/omk-tui/dist/utils.js +1032 -0
  1012. package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +1 -0
  1013. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +25 -0
  1014. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +1 -0
  1015. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +96 -0
  1016. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +1 -0
  1017. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  1018. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  1019. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  1020. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  1021. package/node_modules/@earendil-works/omk-tui/package.json +47 -0
  1022. package/package.json +22 -6
  1023. package/dist/utils/pi-user-agent.d.ts +0 -2
  1024. package/dist/utils/pi-user-agent.d.ts.map +0 -1
  1025. package/dist/utils/pi-user-agent.js.map +0 -1
@@ -0,0 +1,395 @@
1
+ import { createHash } from "node:crypto";
2
+ import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeSync, } from "node:fs";
3
+ import path, { dirname } from "node:path";
4
+ export function stableStringify(value) {
5
+ if (value === null) {
6
+ return "null";
7
+ }
8
+ if (typeof value === "string") {
9
+ return JSON.stringify(value);
10
+ }
11
+ if (typeof value === "number") {
12
+ if (!Number.isFinite(value)) {
13
+ throw new Error("Cannot stableStringify non-finite number");
14
+ }
15
+ return JSON.stringify(value);
16
+ }
17
+ if (typeof value === "boolean") {
18
+ return value ? "true" : "false";
19
+ }
20
+ if (Array.isArray(value)) {
21
+ return `[${value.map((item) => stableStringify(item)).join(",")}]`;
22
+ }
23
+ if (!isPlainObject(value)) {
24
+ throw new Error("Cannot stableStringify unsupported object");
25
+ }
26
+ const record = value;
27
+ const parts = [];
28
+ for (const key of Object.keys(record).sort()) {
29
+ const entryValue = record[key];
30
+ if (entryValue === undefined) {
31
+ throw new Error(`Cannot stableStringify undefined value at key ${key}`);
32
+ }
33
+ parts.push(`${JSON.stringify(key)}:${stableStringify(entryValue)}`);
34
+ }
35
+ return `{${parts.join(",")}}`;
36
+ }
37
+ export function sha256Hex(input) {
38
+ return createHash("sha256").update(input).digest("hex");
39
+ }
40
+ export function computeEventHash(event) {
41
+ return sha256Hex(stableStringify(eventToJson(event)));
42
+ }
43
+ export function verifyReplayLedger(events) {
44
+ let previous;
45
+ for (let index = 0; index < events.length; index += 1) {
46
+ const current = events[index];
47
+ if (current.sequence !== index + 1) {
48
+ return { ok: false, error: `sequence mismatch at index ${index}: expected ${index + 1}` };
49
+ }
50
+ const expectedHash = computeEventHash(stripEventHash(current));
51
+ if (current.eventHash !== expectedHash) {
52
+ return { ok: false, error: `eventHash mismatch at sequence ${current.sequence}` };
53
+ }
54
+ const expectedPrevHash = previous?.eventHash ?? null;
55
+ if (current.prevEventHash !== expectedPrevHash) {
56
+ return { ok: false, error: `prevEventHash mismatch at sequence ${current.sequence}` };
57
+ }
58
+ if (previous !== undefined && current.beforeStateHash !== previous.afterStateHash) {
59
+ return { ok: false, error: `beforeStateHash mismatch at sequence ${current.sequence}` };
60
+ }
61
+ previous = current;
62
+ }
63
+ return { ok: true };
64
+ }
65
+ export function verifyArtifactReference(ref, resolver) {
66
+ const resolved = resolver(ref.path);
67
+ if (resolved === undefined) {
68
+ return { ok: false, error: `artifact not found: ${ref.path}` };
69
+ }
70
+ if (!resolved.isFile) {
71
+ return { ok: false, error: `artifact is not a file: ${ref.path}` };
72
+ }
73
+ if (!pathIsInside(ref.repoRoot, resolved.realPath)) {
74
+ return { ok: false, error: `artifact resolved outside repo root: ${resolved.realPath}` };
75
+ }
76
+ if (resolved.sha256 !== ref.sha256) {
77
+ return { ok: false, error: `artifact sha256 mismatch for ${ref.path}` };
78
+ }
79
+ return { ok: true };
80
+ }
81
+ // Canonicalize a base directory through realpath so symlinked roots (for example
82
+ // macOS /tmp -> /private/tmp) compare consistently against realpath'd artifacts.
83
+ // ── Persistence ────────────────────────────────────────────────────────────
84
+ const LOCK_STALE_MS = 30000;
85
+ /**
86
+ * Acquires an exclusive lock for the ledger file using O_CREAT|O_EXCL.
87
+ * Stale locks (older than LOCK_STALE_MS) are removed before retry.
88
+ */
89
+ function acquireLock(lockPath, timeoutMs) {
90
+ const start = Date.now();
91
+ while (true) {
92
+ try {
93
+ return openSync(lockPath, "wx", 0o600);
94
+ }
95
+ catch (error) {
96
+ if (existsSync(lockPath)) {
97
+ try {
98
+ const stats = statSync(lockPath);
99
+ if (Date.now() - stats.mtimeMs > LOCK_STALE_MS)
100
+ rmSync(lockPath, { force: true });
101
+ }
102
+ catch {
103
+ /* stale check best-effort */
104
+ }
105
+ }
106
+ if (Date.now() - start >= timeoutMs) {
107
+ throw error;
108
+ }
109
+ }
110
+ }
111
+ }
112
+ /**
113
+ * Appends a JSON line to the ledger file and fsyncs both the file and its
114
+ * parent directory so the write is durable on crash.
115
+ *
116
+ * Platform fallback: some filesystems (e.g. tmpfs, NFS) do not support
117
+ * directory fsync. In those cases the directory fsync is best-effort; the
118
+ * file fsync remains mandatory.
119
+ */
120
+ function fsyncDirectory(dirPath) {
121
+ try {
122
+ const dirFd = openSync(dirPath, "r");
123
+ try {
124
+ fsyncSync(dirFd);
125
+ }
126
+ finally {
127
+ closeSync(dirFd);
128
+ }
129
+ }
130
+ catch {
131
+ // Directory fsync is not supported on all platforms/filesystems.
132
+ // File fsync remains the mandatory durability guarantee.
133
+ }
134
+ }
135
+ function enforcePrivateFilePermissions(filePath) {
136
+ try {
137
+ if (existsSync(filePath) && (statSync(filePath).mode & 0o777) !== 0o600) {
138
+ chmodSync(filePath, 0o600);
139
+ }
140
+ }
141
+ catch {
142
+ /* best-effort permission enforcement */
143
+ }
144
+ }
145
+ function appendJsonLineWithFsync(ledgerPath, line) {
146
+ const fd = openSync(ledgerPath, "a", 0o600);
147
+ try {
148
+ enforcePrivateFilePermissions(ledgerPath);
149
+ writeSync(fd, `${line}\n`, undefined, "utf-8");
150
+ fsyncSync(fd);
151
+ }
152
+ finally {
153
+ closeSync(fd);
154
+ }
155
+ fsyncDirectory(dirname(ledgerPath));
156
+ }
157
+ /**
158
+ * Persists a replay ledger event to disk with durable write (fsync),
159
+ * directory permissions 0o700, and file permissions 0o600. Uses advisory
160
+ * locking to serialize concurrent appends.
161
+ */
162
+ export function recordReplayLedgerEvent(event, options) {
163
+ const { ledgerPath } = options;
164
+ const lockPath = `${ledgerPath}.lock`;
165
+ let lockFd;
166
+ try {
167
+ // Create the ledger directory with owner-only permissions.
168
+ // mode is applied to the deepest directory; recursive parents use umask-adjusted defaults.
169
+ mkdirSync(dirname(ledgerPath), { recursive: true, mode: 0o700 });
170
+ // On platforms where mkdirSync with mode over umask can produce
171
+ // group/world-readable directories, re-apply the mode explicitly.
172
+ try {
173
+ const dirStats = statSync(dirname(ledgerPath));
174
+ if ((dirStats.mode & 0o777) !== 0o700) {
175
+ chmodSync(dirname(ledgerPath), 0o700);
176
+ }
177
+ }
178
+ catch {
179
+ /* best-effort permission enforcement */
180
+ }
181
+ lockFd = acquireLock(lockPath, options.lockTimeoutMs ?? 1000);
182
+ // Rotate if the ledger exceeds the size threshold.
183
+ if (Number.isFinite(options.maxLedgerBytes) && (options.maxLedgerBytes ?? 0) > 0 && existsSync(ledgerPath)) {
184
+ enforcePrivateFilePermissions(ledgerPath);
185
+ const stats = statSync(ledgerPath);
186
+ if (stats.size >= Math.floor(options.maxLedgerBytes)) {
187
+ // Simple rotation: rename current to .rotated, start fresh.
188
+ // The new ledger will start from genesis since we don't carry
189
+ // forward the previous hash chain across rotations for the
190
+ // orchestration replay ledger (unlike harness-control which uses anchors).
191
+ const rotatedPath = `${ledgerPath}.${new Date().toISOString().replace(/[:.]/g, "-")}.rotated`;
192
+ renameSync(ledgerPath, rotatedPath);
193
+ enforcePrivateFilePermissions(rotatedPath);
194
+ fsyncDirectory(dirname(ledgerPath));
195
+ }
196
+ }
197
+ appendJsonLineWithFsync(ledgerPath, JSON.stringify(event));
198
+ return { ok: true, path: ledgerPath, event };
199
+ }
200
+ catch (error) {
201
+ return {
202
+ ok: false,
203
+ path: ledgerPath,
204
+ error: error instanceof Error ? error.message : String(error),
205
+ };
206
+ }
207
+ finally {
208
+ if (lockFd !== undefined) {
209
+ try {
210
+ closeSync(lockFd);
211
+ }
212
+ catch {
213
+ /* fd may already be closed */
214
+ }
215
+ rmSync(lockPath, { force: true });
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Reads a replay ledger file and verifies every record against:
221
+ * - Valid JSON (malformed lines are quarantined)
222
+ * - Required fields present and well-formed (truncated records quarantined)
223
+ * - Full hash-chain integrity (tampered records quarantined)
224
+ *
225
+ * Quarantined records are skipped so replay consumers only receive the
226
+ * deterministic verified prefix/chain. Any quarantine still makes ok=false.
227
+ */
228
+ export function verifyReplayLedgerFromFile(ledgerPath) {
229
+ const errors = [];
230
+ const events = [];
231
+ const quarantinedLines = [];
232
+ if (!existsSync(ledgerPath))
233
+ return { ok: true, events, errors, quarantinedLines };
234
+ const content = readFileSync(ledgerPath, "utf-8");
235
+ const lines = content
236
+ .split("\n")
237
+ .map((line) => line.trim())
238
+ .filter((line) => line.length > 0);
239
+ function quarantine(lineNumber, reason) {
240
+ quarantinedLines.push({ lineNumber, reason });
241
+ errors.push(`line ${lineNumber}: quarantined — ${reason}`);
242
+ }
243
+ for (let index = 0; index < lines.length; index++) {
244
+ const lineNumber = index + 1;
245
+ let parsed;
246
+ try {
247
+ parsed = JSON.parse(lines[index]);
248
+ }
249
+ catch (jsonError) {
250
+ quarantine(lineNumber, `malformed JSON — ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`);
251
+ continue;
252
+ }
253
+ const requiredFields = [
254
+ "sequence",
255
+ "type",
256
+ "reducerVersion",
257
+ "payload",
258
+ "beforeStateHash",
259
+ "afterStateHash",
260
+ "prevEventHash",
261
+ "eventHash",
262
+ ];
263
+ const missingFields = requiredFields.filter((field) => !(field in parsed));
264
+ if (missingFields.length > 0) {
265
+ quarantine(lineNumber, `truncated or incomplete record — missing fields: ${missingFields.join(", ")}`);
266
+ continue;
267
+ }
268
+ if (typeof parsed.sequence !== "number" || !Number.isInteger(parsed.sequence) || parsed.sequence < 1) {
269
+ quarantine(lineNumber, "invalid sequence");
270
+ continue;
271
+ }
272
+ if (typeof parsed.eventHash !== "string" || !/^[a-f0-9]{64}$/.test(parsed.eventHash)) {
273
+ quarantine(lineNumber, "invalid eventHash");
274
+ continue;
275
+ }
276
+ if (typeof parsed.prevEventHash !== "string" && parsed.prevEventHash !== null) {
277
+ quarantine(lineNumber, "invalid prevEventHash");
278
+ continue;
279
+ }
280
+ if (typeof parsed.beforeStateHash !== "string") {
281
+ quarantine(lineNumber, "invalid beforeStateHash");
282
+ continue;
283
+ }
284
+ if (typeof parsed.afterStateHash !== "string") {
285
+ quarantine(lineNumber, "invalid afterStateHash");
286
+ continue;
287
+ }
288
+ if (typeof parsed.type !== "string") {
289
+ quarantine(lineNumber, "invalid type");
290
+ continue;
291
+ }
292
+ if (typeof parsed.reducerVersion !== "number" || !Number.isInteger(parsed.reducerVersion)) {
293
+ quarantine(lineNumber, "invalid reducerVersion");
294
+ continue;
295
+ }
296
+ const event = parsed;
297
+ const expectedSequence = events.length + 1;
298
+ if (event.sequence !== expectedSequence) {
299
+ quarantine(lineNumber, `sequence mismatch: expected ${expectedSequence}, got ${event.sequence}`);
300
+ continue;
301
+ }
302
+ const expectedHash = computeEventHash(stripEventHash(event));
303
+ if (event.eventHash !== expectedHash) {
304
+ quarantine(lineNumber, `eventHash mismatch at sequence ${event.sequence}`);
305
+ continue;
306
+ }
307
+ const previous = events.at(-1);
308
+ const expectedPrevHash = previous?.eventHash ?? null;
309
+ if (event.prevEventHash !== expectedPrevHash) {
310
+ quarantine(lineNumber, `prevEventHash mismatch at sequence ${event.sequence}`);
311
+ continue;
312
+ }
313
+ if (previous !== undefined && event.beforeStateHash !== previous.afterStateHash) {
314
+ quarantine(lineNumber, `beforeStateHash mismatch at sequence ${event.sequence}`);
315
+ continue;
316
+ }
317
+ events.push(event);
318
+ }
319
+ return { ok: errors.length === 0, events, errors, quarantinedLines };
320
+ }
321
+ export function canonicalizeBaseDir(baseDir) {
322
+ try {
323
+ return realpathSync(baseDir);
324
+ }
325
+ catch {
326
+ return path.resolve(baseDir);
327
+ }
328
+ }
329
+ // Filesystem-backed resolver that follows symlinks via realpath and uses lstat to
330
+ // detect existence without following. Symlink escapes are caught downstream by
331
+ // verifyArtifactReference's realpath containment check.
332
+ export function createFsArtifactResolver(baseDir) {
333
+ return (artifactPath) => {
334
+ const resolved = path.resolve(baseDir, artifactPath);
335
+ try {
336
+ lstatSync(resolved);
337
+ }
338
+ catch {
339
+ return undefined;
340
+ }
341
+ let realPath;
342
+ try {
343
+ realPath = realpathSync(resolved);
344
+ }
345
+ catch {
346
+ return undefined;
347
+ }
348
+ let isFile = false;
349
+ try {
350
+ isFile = statSync(realPath).isFile();
351
+ }
352
+ catch {
353
+ return undefined;
354
+ }
355
+ return { realPath, isFile, sha256: isFile ? sha256File(realPath) : "" };
356
+ };
357
+ }
358
+ function sha256File(filePath) {
359
+ return createHash("sha256").update(readFileSync(filePath)).digest("hex");
360
+ }
361
+ function isPlainObject(value) {
362
+ const prototype = Object.getPrototypeOf(value);
363
+ return prototype === Object.prototype || prototype === null;
364
+ }
365
+ function stripEventHash(event) {
366
+ return {
367
+ sequence: event.sequence,
368
+ type: event.type,
369
+ reducerVersion: event.reducerVersion,
370
+ payload: event.payload,
371
+ beforeStateHash: event.beforeStateHash,
372
+ afterStateHash: event.afterStateHash,
373
+ prevEventHash: event.prevEventHash,
374
+ };
375
+ }
376
+ function eventToJson(event) {
377
+ return {
378
+ sequence: event.sequence,
379
+ type: event.type,
380
+ reducerVersion: event.reducerVersion,
381
+ payload: event.payload,
382
+ beforeStateHash: event.beforeStateHash,
383
+ afterStateHash: event.afterStateHash,
384
+ prevEventHash: event.prevEventHash,
385
+ };
386
+ }
387
+ function normalizePath(value) {
388
+ return path.resolve(value).replace(/\\/g, "/").replace(/\/$/, "");
389
+ }
390
+ function pathIsInside(root, candidate) {
391
+ const normalizedRoot = normalizePath(root);
392
+ const normalizedCandidate = normalizePath(candidate);
393
+ return normalizedCandidate === normalizedRoot || normalizedCandidate.startsWith(`${normalizedRoot}/`);
394
+ }
395
+ //# sourceMappingURL=replay-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-ledger.js","sourceRoot":"","sources":["../../../src/core/orchestration/replay-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport {\n\tchmodSync,\n\tcloseSync,\n\texistsSync,\n\tfsyncSync,\n\tlstatSync,\n\tmkdirSync,\n\topenSync,\n\treadFileSync,\n\trealpathSync,\n\trenameSync,\n\trmSync,\n\tstatSync,\n\twriteSync,\n} from \"node:fs\";\nimport path, { dirname } from \"node:path\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | readonly JsonValue[] | { readonly [key: string]: JsonValue };\n\nexport interface ReplayLedgerEventInput {\n\tsequence: number;\n\ttype: string;\n\treducerVersion: number;\n\tpayload: JsonValue;\n\tbeforeStateHash: string;\n\tafterStateHash: string;\n\tprevEventHash: string | null;\n}\n\nexport interface ReplayLedgerEvent extends ReplayLedgerEventInput {\n\teventHash: string;\n}\n\nexport interface ReplayLedgerVerificationResult {\n\tok: boolean;\n\terror?: string;\n}\n\nexport interface ArtifactReference {\n\tpath: string;\n\trepoRoot: string;\n\tsha256: string;\n}\n\nexport interface ResolvedArtifactReference {\n\trealPath: string;\n\tisFile: boolean;\n\tsha256: string;\n}\n\nexport type ArtifactReferenceResolver = (path: string) => ResolvedArtifactReference | undefined;\n\nexport function stableStringify(value: JsonValue): string {\n\tif (value === null) {\n\t\treturn \"null\";\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn JSON.stringify(value);\n\t}\n\tif (typeof value === \"number\") {\n\t\tif (!Number.isFinite(value)) {\n\t\t\tthrow new Error(\"Cannot stableStringify non-finite number\");\n\t\t}\n\t\treturn JSON.stringify(value);\n\t}\n\tif (typeof value === \"boolean\") {\n\t\treturn value ? \"true\" : \"false\";\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n\t}\n\tif (!isPlainObject(value)) {\n\t\tthrow new Error(\"Cannot stableStringify unsupported object\");\n\t}\n\n\tconst record = value as { readonly [key: string]: JsonValue | undefined };\n\tconst parts: string[] = [];\n\tfor (const key of Object.keys(record).sort()) {\n\t\tconst entryValue = record[key];\n\t\tif (entryValue === undefined) {\n\t\t\tthrow new Error(`Cannot stableStringify undefined value at key ${key}`);\n\t\t}\n\t\tparts.push(`${JSON.stringify(key)}:${stableStringify(entryValue)}`);\n\t}\n\treturn `{${parts.join(\",\")}}`;\n}\n\nexport function sha256Hex(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nexport function computeEventHash(event: ReplayLedgerEventInput): string {\n\treturn sha256Hex(stableStringify(eventToJson(event)));\n}\n\nexport function verifyReplayLedger(events: readonly ReplayLedgerEvent[]): ReplayLedgerVerificationResult {\n\tlet previous: ReplayLedgerEvent | undefined;\n\tfor (let index = 0; index < events.length; index += 1) {\n\t\tconst current = events[index];\n\t\tif (current.sequence !== index + 1) {\n\t\t\treturn { ok: false, error: `sequence mismatch at index ${index}: expected ${index + 1}` };\n\t\t}\n\n\t\tconst expectedHash = computeEventHash(stripEventHash(current));\n\t\tif (current.eventHash !== expectedHash) {\n\t\t\treturn { ok: false, error: `eventHash mismatch at sequence ${current.sequence}` };\n\t\t}\n\n\t\tconst expectedPrevHash = previous?.eventHash ?? null;\n\t\tif (current.prevEventHash !== expectedPrevHash) {\n\t\t\treturn { ok: false, error: `prevEventHash mismatch at sequence ${current.sequence}` };\n\t\t}\n\n\t\tif (previous !== undefined && current.beforeStateHash !== previous.afterStateHash) {\n\t\t\treturn { ok: false, error: `beforeStateHash mismatch at sequence ${current.sequence}` };\n\t\t}\n\n\t\tprevious = current;\n\t}\n\treturn { ok: true };\n}\n\nexport function verifyArtifactReference(\n\tref: ArtifactReference,\n\tresolver: ArtifactReferenceResolver,\n): ReplayLedgerVerificationResult {\n\tconst resolved = resolver(ref.path);\n\tif (resolved === undefined) {\n\t\treturn { ok: false, error: `artifact not found: ${ref.path}` };\n\t}\n\tif (!resolved.isFile) {\n\t\treturn { ok: false, error: `artifact is not a file: ${ref.path}` };\n\t}\n\tif (!pathIsInside(ref.repoRoot, resolved.realPath)) {\n\t\treturn { ok: false, error: `artifact resolved outside repo root: ${resolved.realPath}` };\n\t}\n\tif (resolved.sha256 !== ref.sha256) {\n\t\treturn { ok: false, error: `artifact sha256 mismatch for ${ref.path}` };\n\t}\n\treturn { ok: true };\n}\n\n// Canonicalize a base directory through realpath so symlinked roots (for example\n// macOS /tmp -> /private/tmp) compare consistently against realpath'd artifacts.\n// ── Persistence ────────────────────────────────────────────────────────────\n\nconst LOCK_STALE_MS = 30000;\n\nexport interface ReplayLedgerPersistOptions {\n\tledgerPath: string;\n\tlockTimeoutMs?: number;\n\tmaxLedgerBytes?: number;\n}\n\nexport interface ReplayLedgerWriteResult {\n\tok: boolean;\n\tpath?: string;\n\tevent?: ReplayLedgerEvent;\n\terror?: string;\n}\n\nexport interface ReplayLedgerQuarantineEntry {\n\tlineNumber: number;\n\treason: string;\n}\n\nexport interface ReplayLedgerFileVerificationResult {\n\tok: boolean;\n\tevents: ReplayLedgerEvent[];\n\terrors: string[];\n\tquarantinedLines: ReplayLedgerQuarantineEntry[];\n}\n\n/**\n * Acquires an exclusive lock for the ledger file using O_CREAT|O_EXCL.\n * Stale locks (older than LOCK_STALE_MS) are removed before retry.\n */\nfunction acquireLock(lockPath: string, timeoutMs: number): number {\n\tconst start = Date.now();\n\twhile (true) {\n\t\ttry {\n\t\t\treturn openSync(lockPath, \"wx\", 0o600);\n\t\t} catch (error) {\n\t\t\tif (existsSync(lockPath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst stats = statSync(lockPath);\n\t\t\t\t\tif (Date.now() - stats.mtimeMs > LOCK_STALE_MS) rmSync(lockPath, { force: true });\n\t\t\t\t} catch {\n\t\t\t\t\t/* stale check best-effort */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Date.now() - start >= timeoutMs) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Appends a JSON line to the ledger file and fsyncs both the file and its\n * parent directory so the write is durable on crash.\n *\n * Platform fallback: some filesystems (e.g. tmpfs, NFS) do not support\n * directory fsync. In those cases the directory fsync is best-effort; the\n * file fsync remains mandatory.\n */\nfunction fsyncDirectory(dirPath: string): void {\n\ttry {\n\t\tconst dirFd = openSync(dirPath, \"r\");\n\t\ttry {\n\t\t\tfsyncSync(dirFd);\n\t\t} finally {\n\t\t\tcloseSync(dirFd);\n\t\t}\n\t} catch {\n\t\t// Directory fsync is not supported on all platforms/filesystems.\n\t\t// File fsync remains the mandatory durability guarantee.\n\t}\n}\n\nfunction enforcePrivateFilePermissions(filePath: string): void {\n\ttry {\n\t\tif (existsSync(filePath) && (statSync(filePath).mode & 0o777) !== 0o600) {\n\t\t\tchmodSync(filePath, 0o600);\n\t\t}\n\t} catch {\n\t\t/* best-effort permission enforcement */\n\t}\n}\n\nfunction appendJsonLineWithFsync(ledgerPath: string, line: string): void {\n\tconst fd = openSync(ledgerPath, \"a\", 0o600);\n\ttry {\n\t\tenforcePrivateFilePermissions(ledgerPath);\n\t\twriteSync(fd, `${line}\\n`, undefined, \"utf-8\");\n\t\tfsyncSync(fd);\n\t} finally {\n\t\tcloseSync(fd);\n\t}\n\tfsyncDirectory(dirname(ledgerPath));\n}\n\n/**\n * Persists a replay ledger event to disk with durable write (fsync),\n * directory permissions 0o700, and file permissions 0o600. Uses advisory\n * locking to serialize concurrent appends.\n */\nexport function recordReplayLedgerEvent(\n\tevent: ReplayLedgerEvent,\n\toptions: ReplayLedgerPersistOptions,\n): ReplayLedgerWriteResult {\n\tconst { ledgerPath } = options;\n\tconst lockPath = `${ledgerPath}.lock`;\n\tlet lockFd: number | undefined;\n\ttry {\n\t\t// Create the ledger directory with owner-only permissions.\n\t\t// mode is applied to the deepest directory; recursive parents use umask-adjusted defaults.\n\t\tmkdirSync(dirname(ledgerPath), { recursive: true, mode: 0o700 });\n\n\t\t// On platforms where mkdirSync with mode over umask can produce\n\t\t// group/world-readable directories, re-apply the mode explicitly.\n\t\ttry {\n\t\t\tconst dirStats = statSync(dirname(ledgerPath));\n\t\t\tif ((dirStats.mode & 0o777) !== 0o700) {\n\t\t\t\tchmodSync(dirname(ledgerPath), 0o700);\n\t\t\t}\n\t\t} catch {\n\t\t\t/* best-effort permission enforcement */\n\t\t}\n\n\t\tlockFd = acquireLock(lockPath, options.lockTimeoutMs ?? 1000);\n\n\t\t// Rotate if the ledger exceeds the size threshold.\n\t\tif (Number.isFinite(options.maxLedgerBytes) && (options.maxLedgerBytes ?? 0) > 0 && existsSync(ledgerPath)) {\n\t\t\tenforcePrivateFilePermissions(ledgerPath);\n\t\t\tconst stats = statSync(ledgerPath);\n\t\t\tif (stats.size >= Math.floor(options.maxLedgerBytes!)) {\n\t\t\t\t// Simple rotation: rename current to .rotated, start fresh.\n\t\t\t\t// The new ledger will start from genesis since we don't carry\n\t\t\t\t// forward the previous hash chain across rotations for the\n\t\t\t\t// orchestration replay ledger (unlike harness-control which uses anchors).\n\t\t\t\tconst rotatedPath = `${ledgerPath}.${new Date().toISOString().replace(/[:.]/g, \"-\")}.rotated`;\n\t\t\t\trenameSync(ledgerPath, rotatedPath);\n\t\t\t\tenforcePrivateFilePermissions(rotatedPath);\n\t\t\t\tfsyncDirectory(dirname(ledgerPath));\n\t\t\t}\n\t\t}\n\n\t\tappendJsonLineWithFsync(ledgerPath, JSON.stringify(event));\n\t\treturn { ok: true, path: ledgerPath, event };\n\t} catch (error) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tpath: ledgerPath,\n\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t};\n\t} finally {\n\t\tif (lockFd !== undefined) {\n\t\t\ttry {\n\t\t\t\tcloseSync(lockFd);\n\t\t\t} catch {\n\t\t\t\t/* fd may already be closed */\n\t\t\t}\n\t\t\trmSync(lockPath, { force: true });\n\t\t}\n\t}\n}\n\n/**\n * Reads a replay ledger file and verifies every record against:\n * - Valid JSON (malformed lines are quarantined)\n * - Required fields present and well-formed (truncated records quarantined)\n * - Full hash-chain integrity (tampered records quarantined)\n *\n * Quarantined records are skipped so replay consumers only receive the\n * deterministic verified prefix/chain. Any quarantine still makes ok=false.\n */\nexport function verifyReplayLedgerFromFile(ledgerPath: string): ReplayLedgerFileVerificationResult {\n\tconst errors: string[] = [];\n\tconst events: ReplayLedgerEvent[] = [];\n\tconst quarantinedLines: ReplayLedgerQuarantineEntry[] = [];\n\n\tif (!existsSync(ledgerPath)) return { ok: true, events, errors, quarantinedLines };\n\n\tconst content = readFileSync(ledgerPath, \"utf-8\");\n\tconst lines = content\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.filter((line) => line.length > 0);\n\n\tfunction quarantine(lineNumber: number, reason: string): void {\n\t\tquarantinedLines.push({ lineNumber, reason });\n\t\terrors.push(`line ${lineNumber}: quarantined — ${reason}`);\n\t}\n\n\tfor (let index = 0; index < lines.length; index++) {\n\t\tconst lineNumber = index + 1;\n\t\tlet parsed: Record<string, unknown>;\n\t\ttry {\n\t\t\tparsed = JSON.parse(lines[index]!);\n\t\t} catch (jsonError) {\n\t\t\tquarantine(\n\t\t\t\tlineNumber,\n\t\t\t\t`malformed JSON — ${jsonError instanceof Error ? jsonError.message : String(jsonError)}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst requiredFields = [\n\t\t\t\"sequence\",\n\t\t\t\"type\",\n\t\t\t\"reducerVersion\",\n\t\t\t\"payload\",\n\t\t\t\"beforeStateHash\",\n\t\t\t\"afterStateHash\",\n\t\t\t\"prevEventHash\",\n\t\t\t\"eventHash\",\n\t\t] as const;\n\t\tconst missingFields = requiredFields.filter((field) => !(field in parsed));\n\t\tif (missingFields.length > 0) {\n\t\t\tquarantine(lineNumber, `truncated or incomplete record — missing fields: ${missingFields.join(\", \")}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof parsed.sequence !== \"number\" || !Number.isInteger(parsed.sequence) || parsed.sequence < 1) {\n\t\t\tquarantine(lineNumber, \"invalid sequence\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.eventHash !== \"string\" || !/^[a-f0-9]{64}$/.test(parsed.eventHash)) {\n\t\t\tquarantine(lineNumber, \"invalid eventHash\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.prevEventHash !== \"string\" && parsed.prevEventHash !== null) {\n\t\t\tquarantine(lineNumber, \"invalid prevEventHash\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.beforeStateHash !== \"string\") {\n\t\t\tquarantine(lineNumber, \"invalid beforeStateHash\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.afterStateHash !== \"string\") {\n\t\t\tquarantine(lineNumber, \"invalid afterStateHash\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.type !== \"string\") {\n\t\t\tquarantine(lineNumber, \"invalid type\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof parsed.reducerVersion !== \"number\" || !Number.isInteger(parsed.reducerVersion)) {\n\t\t\tquarantine(lineNumber, \"invalid reducerVersion\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst event = parsed as unknown as ReplayLedgerEvent;\n\t\tconst expectedSequence = events.length + 1;\n\t\tif (event.sequence !== expectedSequence) {\n\t\t\tquarantine(lineNumber, `sequence mismatch: expected ${expectedSequence}, got ${event.sequence}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst expectedHash = computeEventHash(stripEventHash(event));\n\t\tif (event.eventHash !== expectedHash) {\n\t\t\tquarantine(lineNumber, `eventHash mismatch at sequence ${event.sequence}`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst previous = events.at(-1);\n\t\tconst expectedPrevHash = previous?.eventHash ?? null;\n\t\tif (event.prevEventHash !== expectedPrevHash) {\n\t\t\tquarantine(lineNumber, `prevEventHash mismatch at sequence ${event.sequence}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (previous !== undefined && event.beforeStateHash !== previous.afterStateHash) {\n\t\t\tquarantine(lineNumber, `beforeStateHash mismatch at sequence ${event.sequence}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tevents.push(event);\n\t}\n\n\treturn { ok: errors.length === 0, events, errors, quarantinedLines };\n}\n\nexport function canonicalizeBaseDir(baseDir: string): string {\n\ttry {\n\t\treturn realpathSync(baseDir);\n\t} catch {\n\t\treturn path.resolve(baseDir);\n\t}\n}\n\n// Filesystem-backed resolver that follows symlinks via realpath and uses lstat to\n// detect existence without following. Symlink escapes are caught downstream by\n// verifyArtifactReference's realpath containment check.\nexport function createFsArtifactResolver(baseDir: string): ArtifactReferenceResolver {\n\treturn (artifactPath) => {\n\t\tconst resolved = path.resolve(baseDir, artifactPath);\n\t\ttry {\n\t\t\tlstatSync(resolved);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\tlet realPath: string;\n\t\ttry {\n\t\t\trealPath = realpathSync(resolved);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\tlet isFile = false;\n\t\ttry {\n\t\t\tisFile = statSync(realPath).isFile();\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn { realPath, isFile, sha256: isFile ? sha256File(realPath) : \"\" };\n\t};\n}\n\nfunction sha256File(filePath: string): string {\n\treturn createHash(\"sha256\").update(readFileSync(filePath)).digest(\"hex\");\n}\n\nfunction isPlainObject(value: object): boolean {\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction stripEventHash(event: ReplayLedgerEvent): ReplayLedgerEventInput {\n\treturn {\n\t\tsequence: event.sequence,\n\t\ttype: event.type,\n\t\treducerVersion: event.reducerVersion,\n\t\tpayload: event.payload,\n\t\tbeforeStateHash: event.beforeStateHash,\n\t\tafterStateHash: event.afterStateHash,\n\t\tprevEventHash: event.prevEventHash,\n\t};\n}\n\nfunction eventToJson(event: ReplayLedgerEventInput): { readonly [key: string]: JsonValue } {\n\treturn {\n\t\tsequence: event.sequence,\n\t\ttype: event.type,\n\t\treducerVersion: event.reducerVersion,\n\t\tpayload: event.payload,\n\t\tbeforeStateHash: event.beforeStateHash,\n\t\tafterStateHash: event.afterStateHash,\n\t\tprevEventHash: event.prevEventHash,\n\t};\n}\n\nfunction normalizePath(value: string): string {\n\treturn path.resolve(value).replace(/\\\\/g, \"/\").replace(/\\/$/, \"\");\n}\n\nfunction pathIsInside(root: string, candidate: string): boolean {\n\tconst normalizedRoot = normalizePath(root);\n\tconst normalizedCandidate = normalizePath(candidate);\n\treturn normalizedCandidate === normalizedRoot || normalizedCandidate.startsWith(`${normalizedRoot}/`);\n}\n"]}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Pure scheduler state module for the durable DAG orchestrator.
3
+ *
4
+ * This module is intentionally free of I/O: it owns the node state machine,
5
+ * the read/write conflict model, the dispatchability predicate, and the
6
+ * deterministic dispatch selection. Persistence (SQLite WAL), leases, and
7
+ * dependency readiness live in sibling modules; this is the single source of
8
+ * truth for the *rules* those modules enforce.
9
+ *
10
+ * Erasable TypeScript only (no enum/namespace/parameter properties). All time
11
+ * values are epoch milliseconds so tests can use deterministic fake clocks.
12
+ */
13
+ /** Lifecycle status of a DAG node (see foundation.md section 2.1). */
14
+ export type SchedulerNodeStatus = "queued" | "leased" | "running" | "verifying" | "completed" | "retry_wait" | "compensating" | "rolled_back" | "in_doubt" | "blocked" | "cancelled" | "failed";
15
+ /** A single resource touched by a node's read_set or write_set. */
16
+ export interface AccessSetEntry {
17
+ /** Filesystem path. Equality is exact string match (no prefix containment here). */
18
+ path: string;
19
+ /** Optional symbol list for symbol-level conflict narrowing. */
20
+ symbols?: readonly string[];
21
+ }
22
+ /** A DAG node, narrowed to the fields the pure scheduler rules consume. */
23
+ export interface SchedulerNode {
24
+ nodeId: string;
25
+ status: SchedulerNodeStatus;
26
+ /** Lower number dispatches sooner. */
27
+ priority: number;
28
+ /** false => must run alone (no siblings selected or in-flight alongside it). */
29
+ parallelizable: boolean;
30
+ readSet: readonly AccessSetEntry[];
31
+ writeSet: readonly AccessSetEntry[];
32
+ /** Epoch ms backoff deadline; consulted only when status === "retry_wait". */
33
+ retryWaitUntil?: number;
34
+ /** Upstream node ids. Not consulted by these pure functions (dependency readiness is external). */
35
+ dependsOn?: readonly string[];
36
+ }
37
+ /** Options driving a single dispatch selection pass. */
38
+ export interface DispatchSelectionOptions {
39
+ /** Epoch ms "now"; used for retry_wait backoff comparison. */
40
+ now: number;
41
+ /** Total in-flight lease ceiling. Selection stops once in-flight + selected reaches this. */
42
+ maxLeases: number;
43
+ /** Optional per-tick cap on how many nodes may be selected. */
44
+ maxParallel?: number;
45
+ /** Nodes already leased/running/verifying, counted toward maxLeases and conflict checks. */
46
+ inFlight?: readonly SchedulerNode[];
47
+ }
48
+ /** True iff moving a node from `from` to `to` is a legal direct transition. */
49
+ export declare function canTransitionNodeStatus(from: SchedulerNodeStatus, to: SchedulerNodeStatus): boolean;
50
+ /**
51
+ * Two access entries conflict iff they reference the same path. When BOTH
52
+ * entries declare (non-empty) symbols, the conflict narrows to a shared symbol;
53
+ * otherwise the conflict is path-level (conservative).
54
+ */
55
+ export declare function accessEntriesConflict(a: AccessSetEntry, b: AccessSetEntry): boolean;
56
+ /**
57
+ * A candidate node conflicts with an in-flight node on write/write,
58
+ * write/read, or read/write overlap. read/read never conflicts.
59
+ */
60
+ export declare function nodesConflict(candidate: SchedulerNode, inFlight: SchedulerNode): boolean;
61
+ /**
62
+ * A node is dispatchable iff it is `queued`, or `retry_wait` whose backoff
63
+ * deadline has elapsed (retryWaitUntil <= now). Dependencies and leases are
64
+ * checked elsewhere; this predicate only answers the time/status question.
65
+ */
66
+ export declare function isNodeDispatchable(node: SchedulerNode, now: number): boolean;
67
+ /**
68
+ * Select dispatchable nodes for a single tick, deterministically.
69
+ *
70
+ * Ordering: priority ascending, then nodeId ascending. A candidate is excluded
71
+ * if it conflicts (write/write, write/read, read/write) with any in-flight node
72
+ * or any node already selected this tick. `parallelizable: false` nodes may be
73
+ * selected only when nothing is selected and nothing is in-flight, and once one
74
+ * is selected the tick stops (serialized lane). Selection stops once
75
+ * in-flight + selected reaches `maxLeases`, or `maxParallel` is hit.
76
+ */
77
+ export declare function selectDispatchableNodes(nodes: readonly SchedulerNode[], options: DispatchSelectionOptions): SchedulerNode[];
78
+ //# sourceMappingURL=scheduler-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler-state.d.ts","sourceRoot":"","sources":["../../../src/core/orchestration/scheduler-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,sEAAsE;AACtE,MAAM,MAAM,mBAAmB,GAC5B,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,cAAc,GACd,aAAa,GACb,UAAU,GACV,SAAS,GACT,WAAW,GACX,QAAQ,CAAC;AAEZ,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC9B,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,mBAAmB,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;IACpC,8EAA8E;IAC9E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,wDAAwD;AACxD,MAAM,WAAW,wBAAwB;IACxC,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,6FAA6F;IAC7F,SAAS,EAAE,MAAM,CAAC;IAClB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACpC;AAyCD,+EAA+E;AAC/E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,EAAE,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAEnG;AAkBD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CAQnF;AAcD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAcxF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ5E;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACtC,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,wBAAwB,GAC/B,aAAa,EAAE,CAuCjB","sourcesContent":["/**\n * Pure scheduler state module for the durable DAG orchestrator.\n *\n * This module is intentionally free of I/O: it owns the node state machine,\n * the read/write conflict model, the dispatchability predicate, and the\n * deterministic dispatch selection. Persistence (SQLite WAL), leases, and\n * dependency readiness live in sibling modules; this is the single source of\n * truth for the *rules* those modules enforce.\n *\n * Erasable TypeScript only (no enum/namespace/parameter properties). All time\n * values are epoch milliseconds so tests can use deterministic fake clocks.\n */\n\n/** Lifecycle status of a DAG node (see foundation.md section 2.1). */\nexport type SchedulerNodeStatus =\n\t| \"queued\"\n\t| \"leased\"\n\t| \"running\"\n\t| \"verifying\"\n\t| \"completed\"\n\t| \"retry_wait\"\n\t| \"compensating\"\n\t| \"rolled_back\"\n\t| \"in_doubt\"\n\t| \"blocked\"\n\t| \"cancelled\"\n\t| \"failed\";\n\n/** A single resource touched by a node's read_set or write_set. */\nexport interface AccessSetEntry {\n\t/** Filesystem path. Equality is exact string match (no prefix containment here). */\n\tpath: string;\n\t/** Optional symbol list for symbol-level conflict narrowing. */\n\tsymbols?: readonly string[];\n}\n\n/** A DAG node, narrowed to the fields the pure scheduler rules consume. */\nexport interface SchedulerNode {\n\tnodeId: string;\n\tstatus: SchedulerNodeStatus;\n\t/** Lower number dispatches sooner. */\n\tpriority: number;\n\t/** false => must run alone (no siblings selected or in-flight alongside it). */\n\tparallelizable: boolean;\n\treadSet: readonly AccessSetEntry[];\n\twriteSet: readonly AccessSetEntry[];\n\t/** Epoch ms backoff deadline; consulted only when status === \"retry_wait\". */\n\tretryWaitUntil?: number;\n\t/** Upstream node ids. Not consulted by these pure functions (dependency readiness is external). */\n\tdependsOn?: readonly string[];\n}\n\n/** Options driving a single dispatch selection pass. */\nexport interface DispatchSelectionOptions {\n\t/** Epoch ms \"now\"; used for retry_wait backoff comparison. */\n\tnow: number;\n\t/** Total in-flight lease ceiling. Selection stops once in-flight + selected reaches this. */\n\tmaxLeases: number;\n\t/** Optional per-tick cap on how many nodes may be selected. */\n\tmaxParallel?: number;\n\t/** Nodes already leased/running/verifying, counted toward maxLeases and conflict checks. */\n\tinFlight?: readonly SchedulerNode[];\n}\n\n/**\n * Legal direct transitions, derived from foundation.md section 2.2.\n *\n * Terminal statuses (completed, failed, blocked, cancelled, rolled_back,\n * in_doubt) map to the empty set: once terminal, a node never moves again.\n * block/cancel are legal from every non-terminal status (\"any -> block\",\n * \"any except terminal -> cancel\"). running -> running encodes the heartbeat\n * self-update.\n */\nconst ALLOWED_TRANSITIONS: Readonly<Record<SchedulerNodeStatus, ReadonlySet<SchedulerNodeStatus>>> = {\n\tqueued: new Set<SchedulerNodeStatus>([\"leased\", \"blocked\", \"cancelled\"]),\n\tleased: new Set<SchedulerNodeStatus>([\"queued\", \"running\", \"blocked\", \"cancelled\"]),\n\trunning: new Set<SchedulerNodeStatus>([\n\t\t\"running\",\n\t\t\"verifying\",\n\t\t\"retry_wait\",\n\t\t\"failed\",\n\t\t\"compensating\",\n\t\t\"blocked\",\n\t\t\"cancelled\",\n\t]),\n\tverifying: new Set<SchedulerNodeStatus>([\n\t\t\"completed\",\n\t\t\"retry_wait\",\n\t\t\"failed\",\n\t\t\"compensating\",\n\t\t\"blocked\",\n\t\t\"cancelled\",\n\t]),\n\tcompleted: new Set<SchedulerNodeStatus>(),\n\tretry_wait: new Set<SchedulerNodeStatus>([\"queued\", \"blocked\", \"cancelled\"]),\n\tcompensating: new Set<SchedulerNodeStatus>([\"rolled_back\", \"in_doubt\", \"blocked\", \"cancelled\"]),\n\trolled_back: new Set<SchedulerNodeStatus>(),\n\tin_doubt: new Set<SchedulerNodeStatus>(),\n\tblocked: new Set<SchedulerNodeStatus>(),\n\tcancelled: new Set<SchedulerNodeStatus>(),\n\tfailed: new Set<SchedulerNodeStatus>(),\n};\n\n/** True iff moving a node from `from` to `to` is a legal direct transition. */\nexport function canTransitionNodeStatus(from: SchedulerNodeStatus, to: SchedulerNodeStatus): boolean {\n\treturn ALLOWED_TRANSITIONS[from].has(to);\n}\n\n/** True iff the entry narrows on at least one symbol (empty list counts as no narrowing). */\nfunction declaresSymbols(entry: AccessSetEntry): boolean {\n\treturn Array.isArray(entry.symbols) && entry.symbols.length > 0;\n}\n\n/** True iff two non-empty symbol lists share at least one symbol. */\nfunction sharesSymbol(a: readonly string[], b: readonly string[]): boolean {\n\tconst seen = new Set(a);\n\tfor (const symbol of b) {\n\t\tif (seen.has(symbol)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Two access entries conflict iff they reference the same path. When BOTH\n * entries declare (non-empty) symbols, the conflict narrows to a shared symbol;\n * otherwise the conflict is path-level (conservative).\n */\nexport function accessEntriesConflict(a: AccessSetEntry, b: AccessSetEntry): boolean {\n\tif (a.path !== b.path) {\n\t\treturn false;\n\t}\n\tif (declaresSymbols(a) && declaresSymbols(b)) {\n\t\treturn sharesSymbol(a.symbols as readonly string[], b.symbols as readonly string[]);\n\t}\n\treturn true;\n}\n\n/** True iff any entry in `left` conflicts with any entry in `right`. */\nfunction setsOverlap(left: readonly AccessSetEntry[], right: readonly AccessSetEntry[]): boolean {\n\tfor (const l of left) {\n\t\tfor (const r of right) {\n\t\t\tif (accessEntriesConflict(l, r)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * A candidate node conflicts with an in-flight node on write/write,\n * write/read, or read/write overlap. read/read never conflicts.\n */\nexport function nodesConflict(candidate: SchedulerNode, inFlight: SchedulerNode): boolean {\n\t// write/write\n\tif (setsOverlap(candidate.writeSet, inFlight.writeSet)) {\n\t\treturn true;\n\t}\n\t// write/read: candidate writes what in-flight reads\n\tif (setsOverlap(candidate.writeSet, inFlight.readSet)) {\n\t\treturn true;\n\t}\n\t// read/write: candidate reads what in-flight writes\n\tif (setsOverlap(candidate.readSet, inFlight.writeSet)) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * A node is dispatchable iff it is `queued`, or `retry_wait` whose backoff\n * deadline has elapsed (retryWaitUntil <= now). Dependencies and leases are\n * checked elsewhere; this predicate only answers the time/status question.\n */\nexport function isNodeDispatchable(node: SchedulerNode, now: number): boolean {\n\tif (node.status === \"queued\") {\n\t\treturn true;\n\t}\n\tif (node.status === \"retry_wait\") {\n\t\treturn node.retryWaitUntil !== undefined && node.retryWaitUntil <= now;\n\t}\n\treturn false;\n}\n\n/** Deterministic ordering: priority ascending, then nodeId ascending. */\nfunction compareDispatchOrder(a: SchedulerNode, b: SchedulerNode): number {\n\tif (a.priority !== b.priority) {\n\t\treturn a.priority - b.priority;\n\t}\n\tif (a.nodeId < b.nodeId) {\n\t\treturn -1;\n\t}\n\tif (a.nodeId > b.nodeId) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\n/**\n * Select dispatchable nodes for a single tick, deterministically.\n *\n * Ordering: priority ascending, then nodeId ascending. A candidate is excluded\n * if it conflicts (write/write, write/read, read/write) with any in-flight node\n * or any node already selected this tick. `parallelizable: false` nodes may be\n * selected only when nothing is selected and nothing is in-flight, and once one\n * is selected the tick stops (serialized lane). Selection stops once\n * in-flight + selected reaches `maxLeases`, or `maxParallel` is hit.\n */\nexport function selectDispatchableNodes(\n\tnodes: readonly SchedulerNode[],\n\toptions: DispatchSelectionOptions,\n): SchedulerNode[] {\n\tconst inFlight = options.inFlight ?? [];\n\tconst maxParallel = options.maxParallel ?? Number.POSITIVE_INFINITY;\n\n\t// Remaining lease headroom after accounting for in-flight occupancy.\n\tconst remaining = Math.max(0, options.maxLeases - inFlight.length);\n\tif (remaining === 0) {\n\t\treturn [];\n\t}\n\n\tconst candidates = nodes.filter((node) => isNodeDispatchable(node, options.now));\n\tconst ordered = [...candidates].sort(compareDispatchOrder);\n\n\tconst selected: SchedulerNode[] = [];\n\tfor (const candidate of ordered) {\n\t\tif (selected.length >= remaining || selected.length >= maxParallel) {\n\t\t\tbreak;\n\t\t}\n\t\t// Serialized lane: a non-parallelizable node needs the lane to itself.\n\t\tif (!candidate.parallelizable) {\n\t\t\tif (selected.length > 0 || inFlight.length > 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t// Exclude candidates that conflict with anything already in flight or chosen.\n\t\tconst conflictsWithBusy =\n\t\t\tinFlight.some((busy) => nodesConflict(candidate, busy)) ||\n\t\t\tselected.some((chosen) => nodesConflict(candidate, chosen));\n\t\tif (conflictsWithBusy) {\n\t\t\tcontinue;\n\t\t}\n\t\tselected.push(candidate);\n\t\t// A non-parallelizable node claims the whole lane for this tick.\n\t\tif (!candidate.parallelizable) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn selected;\n}\n"]}