open-multi-agent-kit 0.80.7 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1494) hide show
  1. package/CHANGELOG.md +5 -27
  2. package/README.md +81 -38
  3. package/dist/agents/jailbreak/index.d.ts +7 -0
  4. package/dist/agents/jailbreak/index.d.ts.map +1 -0
  5. package/dist/agents/jailbreak/index.js +7 -0
  6. package/dist/agents/jailbreak/index.js.map +1 -0
  7. package/dist/agents/jailbreak/subagent-f.d.ts +44 -0
  8. package/dist/agents/jailbreak/subagent-f.d.ts.map +1 -0
  9. package/dist/agents/jailbreak/subagent-f.js +60 -0
  10. package/dist/agents/jailbreak/subagent-f.js.map +1 -0
  11. package/dist/bun/register-bedrock.d.ts.map +1 -1
  12. package/dist/bun/register-bedrock.js +2 -2
  13. package/dist/bun/register-bedrock.js.map +1 -1
  14. package/dist/ci/verify-reporter.d.ts +22 -0
  15. package/dist/ci/verify-reporter.d.ts.map +1 -0
  16. package/dist/ci/verify-reporter.js +50 -0
  17. package/dist/ci/verify-reporter.js.map +1 -0
  18. package/dist/cli/args.d.ts +4 -1
  19. package/dist/cli/args.d.ts.map +1 -1
  20. package/dist/cli/args.js +8 -0
  21. package/dist/cli/args.js.map +1 -1
  22. package/dist/cli/config-selector.d.ts.map +1 -1
  23. package/dist/cli/config-selector.js +1 -1
  24. package/dist/cli/config-selector.js.map +1 -1
  25. package/dist/cli/file-processor.d.ts +1 -1
  26. package/dist/cli/file-processor.d.ts.map +1 -1
  27. package/dist/cli/file-processor.js.map +1 -1
  28. package/dist/cli/initial-message.d.ts +1 -1
  29. package/dist/cli/initial-message.d.ts.map +1 -1
  30. package/dist/cli/initial-message.js.map +1 -1
  31. package/dist/cli/jailbreak-args.d.ts +26 -0
  32. package/dist/cli/jailbreak-args.d.ts.map +1 -0
  33. package/dist/cli/jailbreak-args.js +86 -0
  34. package/dist/cli/jailbreak-args.js.map +1 -0
  35. package/dist/cli/list-models.d.ts.map +1 -1
  36. package/dist/cli/list-models.js +1 -1
  37. package/dist/cli/list-models.js.map +1 -1
  38. package/dist/cli/session-picker.d.ts.map +1 -1
  39. package/dist/cli/session-picker.js +1 -1
  40. package/dist/cli/session-picker.js.map +1 -1
  41. package/dist/commands/doctor-provider.d.ts +19 -0
  42. package/dist/commands/doctor-provider.d.ts.map +1 -0
  43. package/dist/commands/doctor-provider.js +123 -0
  44. package/dist/commands/doctor-provider.js.map +1 -0
  45. package/dist/commands/jailbreak.d.ts +49 -0
  46. package/dist/commands/jailbreak.d.ts.map +1 -0
  47. package/dist/commands/jailbreak.js +201 -0
  48. package/dist/commands/jailbreak.js.map +1 -0
  49. package/dist/config.d.ts +9 -5
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +33 -52
  52. package/dist/config.js.map +1 -1
  53. package/dist/core/agent-session-services.d.ts +2 -2
  54. package/dist/core/agent-session-services.d.ts.map +1 -1
  55. package/dist/core/agent-session-services.js.map +1 -1
  56. package/dist/core/agent-session.d.ts +16 -27
  57. package/dist/core/agent-session.d.ts.map +1 -1
  58. package/dist/core/agent-session.js +185 -89
  59. package/dist/core/agent-session.js.map +1 -1
  60. package/dist/core/auth-storage.d.ts +3 -6
  61. package/dist/core/auth-storage.d.ts.map +1 -1
  62. package/dist/core/auth-storage.js +7 -7
  63. package/dist/core/auth-storage.js.map +1 -1
  64. package/dist/core/automation/index.d.ts +359 -0
  65. package/dist/core/automation/index.d.ts.map +1 -0
  66. package/dist/core/automation/index.js +665 -0
  67. package/dist/core/automation/index.js.map +1 -0
  68. package/dist/core/bash-executor.d.ts +1 -0
  69. package/dist/core/bash-executor.d.ts.map +1 -1
  70. package/dist/core/bash-executor.js +1 -0
  71. package/dist/core/bash-executor.js.map +1 -1
  72. package/dist/core/browser-use.d.ts +53 -0
  73. package/dist/core/browser-use.d.ts.map +1 -0
  74. package/dist/core/browser-use.js +108 -0
  75. package/dist/core/browser-use.js.map +1 -0
  76. package/dist/core/command-safety-parser.d.ts +77 -0
  77. package/dist/core/command-safety-parser.d.ts.map +1 -0
  78. package/dist/core/command-safety-parser.js +763 -0
  79. package/dist/core/command-safety-parser.js.map +1 -0
  80. package/dist/core/command-safety.d.ts.map +1 -1
  81. package/dist/core/command-safety.js +106 -3
  82. package/dist/core/command-safety.js.map +1 -1
  83. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  84. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  85. package/dist/core/compaction/branch-summarization.js +5 -21
  86. package/dist/core/compaction/branch-summarization.js.map +1 -1
  87. package/dist/core/compaction/compaction.d.ts +3 -101
  88. package/dist/core/compaction/compaction.d.ts.map +1 -1
  89. package/dist/core/compaction/compaction.js +21 -656
  90. package/dist/core/compaction/compaction.js.map +1 -1
  91. package/dist/core/compaction/utils.d.ts +2 -2
  92. package/dist/core/compaction/utils.d.ts.map +1 -1
  93. package/dist/core/compaction/utils.js.map +1 -1
  94. package/dist/core/compactor.d.ts +42 -0
  95. package/dist/core/compactor.d.ts.map +1 -0
  96. package/dist/core/compactor.js +131 -0
  97. package/dist/core/compactor.js.map +1 -0
  98. package/dist/core/context-budget-compressors.d.ts +50 -0
  99. package/dist/core/context-budget-compressors.d.ts.map +1 -0
  100. package/dist/core/context-budget-compressors.js +166 -0
  101. package/dist/core/context-budget-compressors.js.map +1 -0
  102. package/dist/core/context-budget-governor-v2.d.ts +7 -0
  103. package/dist/core/context-budget-governor-v2.d.ts.map +1 -0
  104. package/dist/core/context-budget-governor-v2.js +7 -0
  105. package/dist/core/context-budget-governor-v2.js.map +1 -0
  106. package/dist/core/context-budget-governor.d.ts +67 -0
  107. package/dist/core/context-budget-governor.d.ts.map +1 -0
  108. package/dist/core/context-budget-governor.js +224 -0
  109. package/dist/core/context-budget-governor.js.map +1 -0
  110. package/dist/core/context-budget-headroom-candidates.d.ts +3 -0
  111. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -0
  112. package/dist/core/context-budget-headroom-candidates.js +85 -0
  113. package/dist/core/context-budget-headroom-candidates.js.map +1 -0
  114. package/dist/core/context-budget-headroom-types.d.ts +67 -0
  115. package/dist/core/context-budget-headroom-types.d.ts.map +1 -0
  116. package/dist/core/context-budget-headroom-types.js +46 -0
  117. package/dist/core/context-budget-headroom-types.js.map +1 -0
  118. package/dist/core/context-budget-headroom.d.ts +5 -0
  119. package/dist/core/context-budget-headroom.d.ts.map +1 -0
  120. package/dist/core/context-budget-headroom.js +123 -0
  121. package/dist/core/context-budget-headroom.js.map +1 -0
  122. package/dist/core/context-budget-relevance.d.ts +46 -0
  123. package/dist/core/context-budget-relevance.d.ts.map +1 -0
  124. package/dist/core/context-budget-relevance.js +329 -0
  125. package/dist/core/context-budget-relevance.js.map +1 -0
  126. package/dist/core/context-budget-system-prompt-items.d.ts +19 -0
  127. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -0
  128. package/dist/core/context-budget-system-prompt-items.js +143 -0
  129. package/dist/core/context-budget-system-prompt-items.js.map +1 -0
  130. package/dist/core/context-budget-system-prompt.d.ts +31 -0
  131. package/dist/core/context-budget-system-prompt.d.ts.map +1 -0
  132. package/dist/core/context-budget-system-prompt.js +87 -0
  133. package/dist/core/context-budget-system-prompt.js.map +1 -0
  134. package/dist/core/context-budget-token-counter.d.ts +34 -0
  135. package/dist/core/context-budget-token-counter.d.ts.map +1 -0
  136. package/dist/core/context-budget-token-counter.js +315 -0
  137. package/dist/core/context-budget-token-counter.js.map +1 -0
  138. package/dist/core/context-budget-v2-coverage.d.ts +5 -0
  139. package/dist/core/context-budget-v2-coverage.d.ts.map +1 -0
  140. package/dist/core/context-budget-v2-coverage.js +58 -0
  141. package/dist/core/context-budget-v2-coverage.js.map +1 -0
  142. package/dist/core/context-budget-v2-plan-hash.d.ts +12 -0
  143. package/dist/core/context-budget-v2-plan-hash.d.ts.map +1 -0
  144. package/dist/core/context-budget-v2-plan-hash.js +38 -0
  145. package/dist/core/context-budget-v2-plan-hash.js.map +1 -0
  146. package/dist/core/context-budget-v2-planner.d.ts +3 -0
  147. package/dist/core/context-budget-v2-planner.d.ts.map +1 -0
  148. package/dist/core/context-budget-v2-planner.js +143 -0
  149. package/dist/core/context-budget-v2-planner.js.map +1 -0
  150. package/dist/core/context-budget-v2-scoring.d.ts +14 -0
  151. package/dist/core/context-budget-v2-scoring.d.ts.map +1 -0
  152. package/dist/core/context-budget-v2-scoring.js +114 -0
  153. package/dist/core/context-budget-v2-scoring.js.map +1 -0
  154. package/dist/core/context-budget-v2-selection.d.ts +32 -0
  155. package/dist/core/context-budget-v2-selection.d.ts.map +1 -0
  156. package/dist/core/context-budget-v2-selection.js +158 -0
  157. package/dist/core/context-budget-v2-selection.js.map +1 -0
  158. package/dist/core/context-budget-v2-tiers.d.ts +15 -0
  159. package/dist/core/context-budget-v2-tiers.d.ts.map +1 -0
  160. package/dist/core/context-budget-v2-tiers.js +68 -0
  161. package/dist/core/context-budget-v2-tiers.js.map +1 -0
  162. package/dist/core/context-budget-v2-types.d.ts +92 -0
  163. package/dist/core/context-budget-v2-types.d.ts.map +1 -0
  164. package/dist/core/context-budget-v2-types.js +24 -0
  165. package/dist/core/context-budget-v2-types.js.map +1 -0
  166. package/dist/core/defaults.d.ts +1 -1
  167. package/dist/core/defaults.d.ts.map +1 -1
  168. package/dist/core/defaults.js.map +1 -1
  169. package/dist/core/diagnostics.d.ts +6 -0
  170. package/dist/core/diagnostics.d.ts.map +1 -1
  171. package/dist/core/diagnostics.js.map +1 -1
  172. package/dist/core/domain-confidence.d.ts +9 -0
  173. package/dist/core/domain-confidence.d.ts.map +1 -0
  174. package/dist/core/domain-confidence.js +39 -0
  175. package/dist/core/domain-confidence.js.map +1 -0
  176. package/dist/core/domain-dispatch.d.ts +44 -0
  177. package/dist/core/domain-dispatch.d.ts.map +1 -0
  178. package/dist/core/domain-dispatch.js +118 -0
  179. package/dist/core/domain-dispatch.js.map +1 -0
  180. package/dist/core/domain-loadouts.d.ts +76 -0
  181. package/dist/core/domain-loadouts.d.ts.map +1 -0
  182. package/dist/core/domain-loadouts.js +981 -0
  183. package/dist/core/domain-loadouts.js.map +1 -0
  184. package/dist/core/domain-registry.d.ts +7 -0
  185. package/dist/core/domain-registry.d.ts.map +1 -0
  186. package/dist/core/domain-registry.js +11 -0
  187. package/dist/core/domain-registry.js.map +1 -0
  188. package/dist/core/domain-router.d.ts +16 -0
  189. package/dist/core/domain-router.d.ts.map +1 -0
  190. package/dist/core/domain-router.js +24 -0
  191. package/dist/core/domain-router.js.map +1 -0
  192. package/dist/core/domain-score.d.ts +13 -0
  193. package/dist/core/domain-score.d.ts.map +1 -0
  194. package/dist/core/domain-score.js +48 -0
  195. package/dist/core/domain-score.js.map +1 -0
  196. package/dist/core/domain-trigger-match.d.ts +14 -0
  197. package/dist/core/domain-trigger-match.d.ts.map +1 -0
  198. package/dist/core/domain-trigger-match.js +51 -0
  199. package/dist/core/domain-trigger-match.js.map +1 -0
  200. package/dist/core/domain-types.d.ts +30 -0
  201. package/dist/core/domain-types.d.ts.map +1 -0
  202. package/dist/core/domain-types.js +2 -0
  203. package/dist/core/domain-types.js.map +1 -0
  204. package/dist/core/exact-cache-policy.d.ts +8 -0
  205. package/dist/core/exact-cache-policy.d.ts.map +1 -1
  206. package/dist/core/exact-cache-policy.js +9 -0
  207. package/dist/core/exact-cache-policy.js.map +1 -1
  208. package/dist/core/exec.d.ts +0 -2
  209. package/dist/core/exec.d.ts.map +1 -1
  210. package/dist/core/exec.js +0 -1
  211. package/dist/core/exec.js.map +1 -1
  212. package/dist/core/export-html/index.d.ts +1 -1
  213. package/dist/core/export-html/index.d.ts.map +1 -1
  214. package/dist/core/export-html/index.js.map +1 -1
  215. package/dist/core/export-html/template.js +1 -3
  216. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  217. package/dist/core/export-html/tool-renderer.js.map +1 -1
  218. package/dist/core/extensions/builtin/command-safety-gate.d.ts +3 -0
  219. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
  220. package/dist/core/extensions/builtin/command-safety-gate.js +15 -3
  221. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
  222. package/dist/core/extensions/builtin/todo-checklist.d.ts +20 -0
  223. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -0
  224. package/dist/core/extensions/builtin/todo-checklist.js +73 -0
  225. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -0
  226. package/dist/core/extensions/loader.d.ts +4 -4
  227. package/dist/core/extensions/loader.d.ts.map +1 -1
  228. package/dist/core/extensions/loader.js +57 -92
  229. package/dist/core/extensions/loader.js.map +1 -1
  230. package/dist/core/extensions/runner.d.ts +3 -3
  231. package/dist/core/extensions/runner.d.ts.map +1 -1
  232. package/dist/core/extensions/runner.js +1 -1
  233. package/dist/core/extensions/runner.js.map +1 -1
  234. package/dist/core/extensions/types.d.ts +7 -35
  235. package/dist/core/extensions/types.d.ts.map +1 -1
  236. package/dist/core/extensions/types.js.map +1 -1
  237. package/dist/core/extensions/wrapper.d.ts +1 -1
  238. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  239. package/dist/core/extensions/wrapper.js.map +1 -1
  240. package/dist/core/footer-data-provider.d.ts +3 -1
  241. package/dist/core/footer-data-provider.d.ts.map +1 -1
  242. package/dist/core/footer-data-provider.js +4 -0
  243. package/dist/core/footer-data-provider.js.map +1 -1
  244. package/dist/core/headroom.d.ts +45 -0
  245. package/dist/core/headroom.d.ts.map +1 -0
  246. package/dist/core/headroom.js +171 -0
  247. package/dist/core/headroom.js.map +1 -0
  248. package/dist/core/hook-inventory.d.ts +4 -2
  249. package/dist/core/hook-inventory.d.ts.map +1 -1
  250. package/dist/core/hook-inventory.js +80 -11
  251. package/dist/core/hook-inventory.js.map +1 -1
  252. package/dist/core/hooks/fail-closed.d.ts +4 -1
  253. package/dist/core/hooks/fail-closed.d.ts.map +1 -1
  254. package/dist/core/hooks/fail-closed.js +79 -5
  255. package/dist/core/hooks/fail-closed.js.map +1 -1
  256. package/dist/core/hooks/index.d.ts +2 -2
  257. package/dist/core/hooks/index.d.ts.map +1 -1
  258. package/dist/core/hooks/index.js +1 -1
  259. package/dist/core/hooks/index.js.map +1 -1
  260. package/dist/core/hooks/types.d.ts +9 -0
  261. package/dist/core/hooks/types.d.ts.map +1 -1
  262. package/dist/core/hooks/types.js.map +1 -1
  263. package/dist/core/keybindings.d.ts +2 -14
  264. package/dist/core/keybindings.d.ts.map +1 -1
  265. package/dist/core/keybindings.js +1 -31
  266. package/dist/core/keybindings.js.map +1 -1
  267. package/dist/core/lean-ctx.d.ts +99 -0
  268. package/dist/core/lean-ctx.d.ts.map +1 -0
  269. package/dist/core/lean-ctx.js +225 -0
  270. package/dist/core/lean-ctx.js.map +1 -0
  271. package/dist/core/loadout-compose.d.ts +53 -0
  272. package/dist/core/loadout-compose.d.ts.map +1 -0
  273. package/dist/core/loadout-compose.js +172 -0
  274. package/dist/core/loadout-compose.js.map +1 -0
  275. package/dist/core/loadout-policy-bridge.d.ts +22 -0
  276. package/dist/core/loadout-policy-bridge.d.ts.map +1 -0
  277. package/dist/core/loadout-policy-bridge.js +52 -0
  278. package/dist/core/loadout-policy-bridge.js.map +1 -0
  279. package/dist/core/loadout-runtime.d.ts +22 -0
  280. package/dist/core/loadout-runtime.d.ts.map +1 -1
  281. package/dist/core/loadout-runtime.js +41 -5
  282. package/dist/core/loadout-runtime.js.map +1 -1
  283. package/dist/core/loadout-safety.d.ts +55 -0
  284. package/dist/core/loadout-safety.d.ts.map +1 -0
  285. package/dist/core/loadout-safety.js +213 -0
  286. package/dist/core/loadout-safety.js.map +1 -0
  287. package/dist/core/loadouts.d.ts +4 -2
  288. package/dist/core/loadouts.d.ts.map +1 -1
  289. package/dist/core/loadouts.js +116 -5
  290. package/dist/core/loadouts.js.map +1 -1
  291. package/dist/core/loop-gates.d.ts +48 -0
  292. package/dist/core/loop-gates.d.ts.map +1 -0
  293. package/dist/core/loop-gates.js +352 -0
  294. package/dist/core/loop-gates.js.map +1 -0
  295. package/dist/core/loop-registry.d.ts +77 -0
  296. package/dist/core/loop-registry.d.ts.map +1 -0
  297. package/dist/core/loop-registry.js +831 -0
  298. package/dist/core/loop-registry.js.map +1 -0
  299. package/dist/core/loop-types.d.ts +194 -0
  300. package/dist/core/loop-types.d.ts.map +1 -0
  301. package/dist/core/loop-types.js +2 -0
  302. package/dist/core/loop-types.js.map +1 -0
  303. package/dist/core/mcp-inventory.d.ts +7 -0
  304. package/dist/core/mcp-inventory.d.ts.map +1 -1
  305. package/dist/core/mcp-inventory.js +5 -1
  306. package/dist/core/mcp-inventory.js.map +1 -1
  307. package/dist/core/mcp-presets.d.ts +43 -2
  308. package/dist/core/mcp-presets.d.ts.map +1 -1
  309. package/dist/core/mcp-presets.js +298 -2
  310. package/dist/core/mcp-presets.js.map +1 -1
  311. package/dist/core/messages.d.ts +3 -3
  312. package/dist/core/messages.d.ts.map +1 -1
  313. package/dist/core/messages.js.map +1 -1
  314. package/dist/core/metrics-sampler.d.ts +11 -0
  315. package/dist/core/metrics-sampler.d.ts.map +1 -1
  316. package/dist/core/metrics-sampler.js +52 -13
  317. package/dist/core/metrics-sampler.js.map +1 -1
  318. package/dist/core/model-registry.d.ts +1 -2
  319. package/dist/core/model-registry.d.ts.map +1 -1
  320. package/dist/core/model-registry.js +18 -41
  321. package/dist/core/model-registry.js.map +1 -1
  322. package/dist/core/model-resolver.d.ts +2 -2
  323. package/dist/core/model-resolver.d.ts.map +1 -1
  324. package/dist/core/model-resolver.js +2 -2
  325. package/dist/core/model-resolver.js.map +1 -1
  326. package/dist/core/package-gallery-identity.d.ts +7 -0
  327. package/dist/core/package-gallery-identity.d.ts.map +1 -0
  328. package/dist/core/package-gallery-identity.js +31 -0
  329. package/dist/core/package-gallery-identity.js.map +1 -0
  330. package/dist/core/package-gallery-install.d.ts +6 -0
  331. package/dist/core/package-gallery-install.d.ts.map +1 -0
  332. package/dist/core/package-gallery-install.js +59 -0
  333. package/dist/core/package-gallery-install.js.map +1 -0
  334. package/dist/core/package-gallery-manifest.d.ts +13 -0
  335. package/dist/core/package-gallery-manifest.d.ts.map +1 -0
  336. package/dist/core/package-gallery-manifest.js +183 -0
  337. package/dist/core/package-gallery-manifest.js.map +1 -0
  338. package/dist/core/package-gallery-trial.d.ts +4 -0
  339. package/dist/core/package-gallery-trial.d.ts.map +1 -0
  340. package/dist/core/package-gallery-trial.js +55 -0
  341. package/dist/core/package-gallery-trial.js.map +1 -0
  342. package/dist/core/package-gallery-types.d.ts +71 -0
  343. package/dist/core/package-gallery-types.d.ts.map +1 -0
  344. package/dist/core/package-gallery-types.js +2 -0
  345. package/dist/core/package-gallery-types.js.map +1 -0
  346. package/dist/core/package-gallery.d.ts +5 -123
  347. package/dist/core/package-gallery.d.ts.map +1 -1
  348. package/dist/core/package-gallery.js +5 -391
  349. package/dist/core/package-gallery.js.map +1 -1
  350. package/dist/core/package-manager.d.ts +0 -69
  351. package/dist/core/package-manager.d.ts.map +1 -1
  352. package/dist/core/package-manager.js +69 -367
  353. package/dist/core/package-manager.js.map +1 -1
  354. package/dist/core/package-procurement.d.ts +4 -4
  355. package/dist/core/package-procurement.d.ts.map +1 -1
  356. package/dist/core/package-procurement.js +29 -17
  357. package/dist/core/package-procurement.js.map +1 -1
  358. package/dist/core/pi-package-intake-candidates.d.ts +21 -0
  359. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
  360. package/dist/core/pi-package-intake-candidates.js +109 -0
  361. package/dist/core/pi-package-intake-candidates.js.map +1 -0
  362. package/dist/core/pi-package-intake.d.ts +43 -0
  363. package/dist/core/pi-package-intake.d.ts.map +1 -0
  364. package/dist/core/pi-package-intake.js +122 -0
  365. package/dist/core/pi-package-intake.js.map +1 -0
  366. package/dist/core/provider-attribution.d.ts +1 -1
  367. package/dist/core/provider-attribution.d.ts.map +1 -1
  368. package/dist/core/provider-attribution.js.map +1 -1
  369. package/dist/core/provider-display-names.d.ts.map +1 -1
  370. package/dist/core/provider-display-names.js +1 -0
  371. package/dist/core/provider-display-names.js.map +1 -1
  372. package/dist/core/read-anchors.d.ts +1 -1
  373. package/dist/core/read-anchors.d.ts.map +1 -1
  374. package/dist/core/read-anchors.js +1 -1
  375. package/dist/core/read-anchors.js.map +1 -1
  376. package/dist/core/recovery-checkpoint.d.ts +2 -2
  377. package/dist/core/recovery-checkpoint.d.ts.map +1 -1
  378. package/dist/core/recovery-checkpoint.js +2 -2
  379. package/dist/core/recovery-checkpoint.js.map +1 -1
  380. package/dist/core/resolve-config-value.d.ts +1 -1
  381. package/dist/core/resolve-config-value.d.ts.map +1 -1
  382. package/dist/core/resolve-config-value.js +2 -30
  383. package/dist/core/resolve-config-value.js.map +1 -1
  384. package/dist/core/resource-loader.d.ts +12 -20
  385. package/dist/core/resource-loader.d.ts.map +1 -1
  386. package/dist/core/resource-loader.js +67 -90
  387. package/dist/core/resource-loader.js.map +1 -1
  388. package/dist/core/sandbox-policy-v2.d.ts +49 -0
  389. package/dist/core/sandbox-policy-v2.d.ts.map +1 -0
  390. package/dist/core/sandbox-policy-v2.js +368 -0
  391. package/dist/core/sandbox-policy-v2.js.map +1 -0
  392. package/dist/core/sdk.d.ts +10 -78
  393. package/dist/core/sdk.d.ts.map +1 -1
  394. package/dist/core/sdk.js +97 -139
  395. package/dist/core/sdk.js.map +1 -1
  396. package/dist/core/semantic-cache-policy.d.ts +7 -1
  397. package/dist/core/semantic-cache-policy.d.ts.map +1 -1
  398. package/dist/core/semantic-cache-policy.js +8 -0
  399. package/dist/core/semantic-cache-policy.js.map +1 -1
  400. package/dist/core/session-manager.d.ts +2 -4
  401. package/dist/core/session-manager.d.ts.map +1 -1
  402. package/dist/core/session-manager.js +5 -6
  403. package/dist/core/session-manager.js.map +1 -1
  404. package/dist/core/settings-manager.d.ts +1 -18
  405. package/dist/core/settings-manager.d.ts.map +1 -1
  406. package/dist/core/settings-manager.js +2 -48
  407. package/dist/core/settings-manager.js.map +1 -1
  408. package/dist/core/skills.d.ts +5 -0
  409. package/dist/core/skills.d.ts.map +1 -1
  410. package/dist/core/skills.js +149 -36
  411. package/dist/core/skills.js.map +1 -1
  412. package/dist/core/slash-commands.d.ts.map +1 -1
  413. package/dist/core/slash-commands.js +0 -2
  414. package/dist/core/slash-commands.js.map +1 -1
  415. package/dist/core/subagent-orchestration.d.ts +73 -0
  416. package/dist/core/subagent-orchestration.d.ts.map +1 -0
  417. package/dist/core/subagent-orchestration.js +408 -0
  418. package/dist/core/subagent-orchestration.js.map +1 -0
  419. package/dist/core/system-prompt.d.ts +5 -4
  420. package/dist/core/system-prompt.d.ts.map +1 -1
  421. package/dist/core/system-prompt.js +57 -36
  422. package/dist/core/system-prompt.js.map +1 -1
  423. package/dist/core/timings.d.ts +0 -4
  424. package/dist/core/timings.d.ts.map +1 -1
  425. package/dist/core/timings.js +0 -4
  426. package/dist/core/timings.js.map +1 -1
  427. package/dist/core/todo-runtime-state.d.ts +5 -0
  428. package/dist/core/todo-runtime-state.d.ts.map +1 -0
  429. package/dist/core/todo-runtime-state.js +12 -0
  430. package/dist/core/todo-runtime-state.js.map +1 -0
  431. package/dist/core/todo-state.d.ts +53 -0
  432. package/dist/core/todo-state.d.ts.map +1 -0
  433. package/dist/core/todo-state.js +87 -0
  434. package/dist/core/todo-state.js.map +1 -0
  435. package/dist/core/token-optimizer.d.ts +58 -0
  436. package/dist/core/token-optimizer.d.ts.map +1 -0
  437. package/dist/core/token-optimizer.js +179 -0
  438. package/dist/core/token-optimizer.js.map +1 -0
  439. package/dist/core/tools/bash.d.ts +8 -9
  440. package/dist/core/tools/bash.d.ts.map +1 -1
  441. package/dist/core/tools/bash.js +9 -8
  442. package/dist/core/tools/bash.js.map +1 -1
  443. package/dist/core/tools/edit.d.ts +3 -14
  444. package/dist/core/tools/edit.d.ts.map +1 -1
  445. package/dist/core/tools/edit.js +4 -25
  446. package/dist/core/tools/edit.js.map +1 -1
  447. package/dist/core/tools/find.d.ts +1 -4
  448. package/dist/core/tools/find.d.ts.map +1 -1
  449. package/dist/core/tools/find.js +1 -4
  450. package/dist/core/tools/find.js.map +1 -1
  451. package/dist/core/tools/grep.d.ts +1 -4
  452. package/dist/core/tools/grep.d.ts.map +1 -1
  453. package/dist/core/tools/grep.js +2 -5
  454. package/dist/core/tools/grep.js.map +1 -1
  455. package/dist/core/tools/index.d.ts +2 -2
  456. package/dist/core/tools/index.d.ts.map +1 -1
  457. package/dist/core/tools/index.js.map +1 -1
  458. package/dist/core/tools/ls.d.ts +1 -4
  459. package/dist/core/tools/ls.d.ts.map +1 -1
  460. package/dist/core/tools/ls.js +1 -4
  461. package/dist/core/tools/ls.js.map +1 -1
  462. package/dist/core/tools/read.d.ts +2 -14
  463. package/dist/core/tools/read.d.ts.map +1 -1
  464. package/dist/core/tools/read.js +4 -28
  465. package/dist/core/tools/read.js.map +1 -1
  466. package/dist/core/tools/render-utils.d.ts +1 -1
  467. package/dist/core/tools/render-utils.d.ts.map +1 -1
  468. package/dist/core/tools/render-utils.js +1 -1
  469. package/dist/core/tools/render-utils.js.map +1 -1
  470. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  471. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  472. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  473. package/dist/core/tools/write.d.ts +2 -4
  474. package/dist/core/tools/write.d.ts.map +1 -1
  475. package/dist/core/tools/write.js +4 -4
  476. package/dist/core/tools/write.js.map +1 -1
  477. package/dist/encoding/index.d.ts +6 -0
  478. package/dist/encoding/index.d.ts.map +1 -0
  479. package/dist/encoding/index.js +6 -0
  480. package/dist/encoding/index.js.map +1 -0
  481. package/dist/encoding/l4-encoder.d.ts +96 -0
  482. package/dist/encoding/l4-encoder.d.ts.map +1 -0
  483. package/dist/encoding/l4-encoder.js +474 -0
  484. package/dist/encoding/l4-encoder.js.map +1 -0
  485. package/dist/fuzzing/index.d.ts +6 -0
  486. package/dist/fuzzing/index.d.ts.map +1 -0
  487. package/dist/fuzzing/index.js +6 -0
  488. package/dist/fuzzing/index.js.map +1 -0
  489. package/dist/fuzzing/mutation-engine.d.ts +93 -0
  490. package/dist/fuzzing/mutation-engine.d.ts.map +1 -0
  491. package/dist/fuzzing/mutation-engine.js +244 -0
  492. package/dist/fuzzing/mutation-engine.js.map +1 -0
  493. package/dist/guardrails/audit-logger.d.ts +4 -0
  494. package/dist/guardrails/audit-logger.d.ts.map +1 -0
  495. package/dist/guardrails/audit-logger.js +28 -0
  496. package/dist/guardrails/audit-logger.js.map +1 -0
  497. package/dist/guardrails/evidence-system.d.ts +61 -0
  498. package/dist/guardrails/evidence-system.d.ts.map +1 -0
  499. package/dist/guardrails/evidence-system.js +302 -0
  500. package/dist/guardrails/evidence-system.js.map +1 -0
  501. package/dist/guardrails/freedomd-adapter.d.ts +16 -0
  502. package/dist/guardrails/freedomd-adapter.d.ts.map +1 -0
  503. package/dist/guardrails/freedomd-adapter.js +87 -0
  504. package/dist/guardrails/freedomd-adapter.js.map +1 -0
  505. package/dist/index.d.ts +5 -19
  506. package/dist/index.d.ts.map +1 -1
  507. package/dist/index.js +3 -17
  508. package/dist/index.js.map +1 -1
  509. package/dist/jailbreak-extension.d.ts +48 -0
  510. package/dist/jailbreak-extension.d.ts.map +1 -0
  511. package/dist/jailbreak-extension.js +47 -0
  512. package/dist/jailbreak-extension.js.map +1 -0
  513. package/dist/main.d.ts.map +1 -1
  514. package/dist/main.js +2 -2
  515. package/dist/main.js.map +1 -1
  516. package/dist/migrations.d.ts +0 -37
  517. package/dist/migrations.d.ts.map +1 -1
  518. package/dist/migrations.js +6 -414
  519. package/dist/migrations.js.map +1 -1
  520. package/dist/modes/interactive/components/armin.d.ts +1 -1
  521. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  522. package/dist/modes/interactive/components/armin.js.map +1 -1
  523. package/dist/modes/interactive/components/assistant-message.d.ts +2 -2
  524. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  525. package/dist/modes/interactive/components/assistant-message.js +1 -1
  526. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  527. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  528. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/bash-execution.js +1 -1
  530. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  531. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  532. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/bordered-loader.js +1 -1
  534. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  535. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  536. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  537. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  538. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  539. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  540. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  541. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  542. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  543. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  544. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  545. package/dist/modes/interactive/components/config-selector.js +1 -1
  546. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  547. package/dist/modes/interactive/components/control-panel-box.d.ts +15 -0
  548. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -0
  549. package/dist/modes/interactive/components/control-panel-box.js +55 -0
  550. package/dist/modes/interactive/components/control-panel-box.js.map +1 -0
  551. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -36
  553. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  554. package/dist/modes/interactive/components/control-panel-gradient.d.ts +1 -0
  555. package/dist/modes/interactive/components/control-panel-gradient.d.ts.map +1 -1
  556. package/dist/modes/interactive/components/control-panel-gradient.js +6 -5
  557. package/dist/modes/interactive/components/control-panel-gradient.js.map +1 -1
  558. package/dist/modes/interactive/components/control-panel-layout.d.ts +30 -0
  559. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -0
  560. package/dist/modes/interactive/components/control-panel-layout.js +197 -0
  561. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -0
  562. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +6 -0
  563. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -0
  564. package/dist/modes/interactive/components/control-panel-runtime-status.js +29 -0
  565. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -0
  566. package/dist/modes/interactive/components/control-panel.d.ts +9 -31
  567. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/control-panel.js +49 -168
  569. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  570. package/dist/modes/interactive/components/countdown-timer.d.ts +1 -1
  571. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  572. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  573. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  574. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  575. package/dist/modes/interactive/components/custom-editor.js +14 -22
  576. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  577. package/dist/modes/interactive/components/custom-message.d.ts +1 -1
  578. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  579. package/dist/modes/interactive/components/custom-message.js +1 -1
  580. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  581. package/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  582. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  583. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  584. package/dist/modes/interactive/components/dynamic-border.d.ts +1 -1
  585. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  586. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  587. package/dist/modes/interactive/components/earendil-announcement.d.ts +1 -1
  588. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  589. package/dist/modes/interactive/components/earendil-announcement.js +1 -1
  590. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  591. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  592. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  593. package/dist/modes/interactive/components/extension-editor.js +1 -1
  594. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  595. package/dist/modes/interactive/components/extension-input.d.ts +1 -1
  596. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  597. package/dist/modes/interactive/components/extension-input.js +1 -1
  598. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  599. package/dist/modes/interactive/components/extension-selector.d.ts +1 -1
  600. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/extension-selector.js +1 -1
  602. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/footer.d.ts +1 -1
  604. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/footer.js +7 -9
  606. package/dist/modes/interactive/components/footer.js.map +1 -1
  607. package/dist/modes/interactive/components/index.d.ts +0 -2
  608. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  609. package/dist/modes/interactive/components/index.js +0 -2
  610. package/dist/modes/interactive/components/index.js.map +1 -1
  611. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -1
  612. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  613. package/dist/modes/interactive/components/keybinding-hints.js +1 -1
  614. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  615. package/dist/modes/interactive/components/login-dialog.d.ts +2 -2
  616. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  617. package/dist/modes/interactive/components/login-dialog.js +2 -2
  618. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  619. package/dist/modes/interactive/components/model-selector.d.ts +13 -47
  620. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/model-selector.js +118 -193
  622. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  623. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  624. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/oauth-selector.js +1 -1
  626. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  627. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  628. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  629. package/dist/modes/interactive/components/scoped-models-selector.js +1 -1
  630. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  631. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  632. package/dist/modes/interactive/components/session-selector-search.js +1 -1
  633. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  634. package/dist/modes/interactive/components/session-selector.d.ts +1 -1
  635. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  636. package/dist/modes/interactive/components/session-selector.js +1 -1
  637. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  638. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  639. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  640. package/dist/modes/interactive/components/settings-selector.js +1 -1
  641. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  642. package/dist/modes/interactive/components/show-images-selector.d.ts +1 -1
  643. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  644. package/dist/modes/interactive/components/show-images-selector.js +1 -1
  645. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  646. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  647. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  648. package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  649. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  650. package/dist/modes/interactive/components/theme-selector.d.ts +1 -2
  651. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  652. package/dist/modes/interactive/components/theme-selector.js +2 -11
  653. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  654. package/dist/modes/interactive/components/thinking-selector.d.ts +8 -7
  655. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  656. package/dist/modes/interactive/components/thinking-selector.js +48 -7
  657. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  658. package/dist/modes/interactive/components/todo-checklist.d.ts +31 -0
  659. package/dist/modes/interactive/components/todo-checklist.d.ts.map +1 -0
  660. package/dist/modes/interactive/components/todo-checklist.js +121 -0
  661. package/dist/modes/interactive/components/todo-checklist.js.map +1 -0
  662. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  663. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  664. package/dist/modes/interactive/components/tool-execution.js +1 -1
  665. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  666. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  667. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  668. package/dist/modes/interactive/components/tree-selector.js +1 -1
  669. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  670. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -1
  671. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  672. package/dist/modes/interactive/components/user-message-selector.js +1 -1
  673. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  674. package/dist/modes/interactive/components/user-message.d.ts +1 -1
  675. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  676. package/dist/modes/interactive/components/user-message.js +1 -1
  677. package/dist/modes/interactive/components/user-message.js.map +1 -1
  678. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  679. package/dist/modes/interactive/components/visual-truncate.js +1 -1
  680. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  681. package/dist/modes/interactive/interactive-mode.d.ts +3 -8
  682. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  683. package/dist/modes/interactive/interactive-mode.js +80 -232
  684. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  685. package/dist/modes/interactive/theme/omk-control-grid-dark.json +65 -77
  686. package/dist/modes/interactive/theme/omk-neon-control.json +90 -0
  687. package/dist/modes/interactive/theme/rust-forge.json +14 -24
  688. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  689. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme.js +25 -45
  691. package/dist/modes/interactive/theme/theme.js.map +1 -1
  692. package/dist/modes/print-mode.d.ts +1 -1
  693. package/dist/modes/print-mode.d.ts.map +1 -1
  694. package/dist/modes/print-mode.js.map +1 -1
  695. package/dist/modes/rpc/rpc-client.d.ts +2 -2
  696. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  697. package/dist/modes/rpc/rpc-client.js.map +1 -1
  698. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  699. package/dist/modes/rpc/rpc-mode.js +0 -4
  700. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  701. package/dist/modes/rpc/rpc-types.d.ts +2 -2
  702. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  703. package/dist/modes/rpc/rpc-types.js.map +1 -1
  704. package/dist/modules/index.d.ts +8 -0
  705. package/dist/modules/index.d.ts.map +1 -0
  706. package/dist/modules/index.js +7 -0
  707. package/dist/modules/index.js.map +1 -0
  708. package/dist/modules/lrl-bypass.d.ts +40 -0
  709. package/dist/modules/lrl-bypass.d.ts.map +1 -0
  710. package/dist/modules/lrl-bypass.js +84 -0
  711. package/dist/modules/lrl-bypass.js.map +1 -0
  712. package/dist/modules/lrl-deps.d.ts +38 -0
  713. package/dist/modules/lrl-deps.d.ts.map +1 -0
  714. package/dist/modules/lrl-deps.js +128 -0
  715. package/dist/modules/lrl-deps.js.map +1 -0
  716. package/dist/multiturn/easl-chain.d.ts +113 -0
  717. package/dist/multiturn/easl-chain.d.ts.map +1 -0
  718. package/dist/multiturn/easl-chain.js +351 -0
  719. package/dist/multiturn/easl-chain.js.map +1 -0
  720. package/dist/multiturn/index.d.ts +6 -0
  721. package/dist/multiturn/index.d.ts.map +1 -0
  722. package/dist/multiturn/index.js +6 -0
  723. package/dist/multiturn/index.js.map +1 -0
  724. package/dist/orchestration/lane-grant-auditor.d.ts +4 -0
  725. package/dist/orchestration/lane-grant-auditor.d.ts.map +1 -0
  726. package/dist/orchestration/lane-grant-auditor.js +87 -0
  727. package/dist/orchestration/lane-grant-auditor.js.map +1 -0
  728. package/dist/package-manager-cli.d.ts.map +1 -1
  729. package/dist/package-manager-cli.js +48 -113
  730. package/dist/package-manager-cli.js.map +1 -1
  731. package/dist/routing/fallback-router.d.ts +123 -0
  732. package/dist/routing/fallback-router.d.ts.map +1 -0
  733. package/dist/routing/fallback-router.js +355 -0
  734. package/dist/routing/fallback-router.js.map +1 -0
  735. package/dist/routing/index.d.ts +6 -0
  736. package/dist/routing/index.d.ts.map +1 -0
  737. package/dist/routing/index.js +6 -0
  738. package/dist/routing/index.js.map +1 -0
  739. package/dist/types/evidence.d.ts +117 -0
  740. package/dist/types/evidence.d.ts.map +1 -0
  741. package/dist/types/evidence.js +8 -0
  742. package/dist/types/evidence.js.map +1 -0
  743. package/dist/types/guardrails.d.ts +61 -0
  744. package/dist/types/guardrails.d.ts.map +1 -0
  745. package/dist/types/guardrails.js +9 -0
  746. package/dist/types/guardrails.js.map +1 -0
  747. package/dist/types/jailbreak.d.ts +246 -0
  748. package/dist/types/jailbreak.d.ts.map +1 -0
  749. package/dist/types/jailbreak.js +8 -0
  750. package/dist/types/jailbreak.js.map +1 -0
  751. package/dist/types/lane-grant.d.ts +58 -0
  752. package/dist/types/lane-grant.d.ts.map +1 -0
  753. package/dist/types/lane-grant.js +9 -0
  754. package/dist/types/lane-grant.js.map +1 -0
  755. package/dist/utils/jailbreak/common.d.ts +63 -0
  756. package/dist/utils/jailbreak/common.d.ts.map +1 -0
  757. package/dist/utils/jailbreak/common.js +130 -0
  758. package/dist/utils/jailbreak/common.js.map +1 -0
  759. package/dist/utils/jailbreak/index.d.ts +7 -0
  760. package/dist/utils/jailbreak/index.d.ts.map +1 -0
  761. package/dist/utils/jailbreak/index.js +7 -0
  762. package/dist/utils/jailbreak/index.js.map +1 -0
  763. package/dist/utils/windows-self-update.d.ts.map +1 -1
  764. package/dist/utils/windows-self-update.js +1 -1
  765. package/dist/utils/windows-self-update.js.map +1 -1
  766. package/docs/compaction.md +8 -21
  767. package/docs/custom-provider.md +2 -2
  768. package/docs/development.md +1 -1
  769. package/docs/extensions.md +11 -11
  770. package/docs/loadout-domains/README.md +70 -0
  771. package/docs/loadout-domains/ai-agent-ops.md +94 -0
  772. package/docs/loadout-domains/backend-api.md +116 -0
  773. package/docs/loadout-domains/data-science.md +100 -0
  774. package/docs/loadout-domains/devops-infra.md +85 -0
  775. package/docs/loadout-domains/docs-writing.md +92 -0
  776. package/docs/loadout-domains/frontend-ui.md +128 -0
  777. package/docs/loadout-domains/general.md +62 -0
  778. package/docs/loadout-domains/mobile.md +84 -0
  779. package/docs/loadout-domains/qa-testing.md +87 -0
  780. package/docs/loadout-domains/research.md +80 -0
  781. package/docs/loadout-domains/security-audit.md +97 -0
  782. package/docs/packages.md +7 -48
  783. package/docs/prompt-templates.md +0 -2
  784. package/docs/providers.md +12 -0
  785. package/docs/sdk.md +3 -3
  786. package/docs/security.md +145 -0
  787. package/docs/session-format.md +1 -1
  788. package/docs/themes.md +8 -7
  789. package/docs/tui.md +14 -14
  790. package/docs/usage.md +6 -16
  791. package/examples/extensions/README.md +2 -2
  792. package/examples/extensions/aside-computer-use/README.md +114 -0
  793. package/examples/extensions/aside-computer-use/action-scoring.ts +122 -0
  794. package/examples/extensions/aside-computer-use/assertions.ts +380 -0
  795. package/examples/extensions/aside-computer-use/controller.ts +491 -0
  796. package/examples/extensions/aside-computer-use/evidence.ts +229 -0
  797. package/examples/extensions/aside-computer-use/golden-trace.ts +141 -0
  798. package/examples/extensions/aside-computer-use/index.ts +76 -0
  799. package/examples/extensions/aside-computer-use/mcp-client.ts +381 -0
  800. package/examples/extensions/aside-computer-use/observation-snapshot.ts +121 -0
  801. package/examples/extensions/aside-computer-use/package.json +16 -0
  802. package/examples/extensions/aside-computer-use/policy.ts +257 -0
  803. package/examples/extensions/aside-computer-use/risk-authorize.ts +200 -0
  804. package/examples/extensions/aside-computer-use/risk-classifier.ts +205 -0
  805. package/examples/extensions/aside-computer-use/schema-fingerprint.ts +80 -0
  806. package/examples/extensions/aside-computer-use/session-binding.ts +161 -0
  807. package/examples/extensions/aside-computer-use/tools.ts +449 -0
  808. package/examples/extensions/aside-computer-use/types.ts +217 -0
  809. package/examples/extensions/aside-computer-use/url-origin.ts +132 -0
  810. package/examples/extensions/bash-spawn-hook.ts +1 -1
  811. package/examples/extensions/border-status-editor.ts +2 -2
  812. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  813. package/examples/extensions/custom-compaction.ts +1 -1
  814. package/examples/extensions/custom-footer.ts +2 -2
  815. package/examples/extensions/custom-header.ts +8 -8
  816. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  817. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  818. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  819. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  820. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  821. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  822. package/examples/extensions/doom-overlay/README.md +1 -2
  823. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  824. package/examples/extensions/doom-overlay/doom/build.sh +4 -4
  825. package/examples/extensions/doom-overlay/doom/doomgeneric_omk.c +72 -0
  826. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  827. package/examples/extensions/doom-overlay/doom-keys.ts +1 -1
  828. package/examples/extensions/git-merge-and-resolve.ts +1 -1
  829. package/examples/extensions/github-issue-autocomplete.ts +1 -6
  830. package/examples/extensions/gondolin/index.ts +1 -1
  831. package/examples/extensions/gondolin/package-lock.json +2 -2
  832. package/examples/extensions/gondolin/package.json +1 -1
  833. package/examples/extensions/handoff.ts +2 -2
  834. package/examples/extensions/hello.ts +1 -1
  835. package/examples/extensions/inline-bash.ts +1 -1
  836. package/examples/extensions/input-transform-streaming.ts +1 -1
  837. package/examples/extensions/input-transform.ts +2 -2
  838. package/examples/extensions/mac-system-theme.ts +1 -1
  839. package/examples/extensions/message-renderer.ts +1 -1
  840. package/examples/extensions/minimal-mode.ts +1 -1
  841. package/examples/extensions/modal-editor.ts +1 -1
  842. package/examples/extensions/overlay-qa-tests.ts +7 -7
  843. package/examples/extensions/overlay-test.ts +1 -1
  844. package/examples/extensions/plan-mode/index.ts +3 -3
  845. package/examples/extensions/preset.ts +4 -4
  846. package/examples/extensions/provider-payload.ts +6 -3
  847. package/examples/extensions/qna.ts +1 -1
  848. package/examples/extensions/question.ts +1 -1
  849. package/examples/extensions/questionnaire.ts +1 -1
  850. package/examples/extensions/rpc-demo.ts +1 -1
  851. package/examples/extensions/sandbox/index.ts +2 -2
  852. package/examples/extensions/sandbox/package-lock.json +2 -2
  853. package/examples/extensions/sandbox/package.json +1 -1
  854. package/examples/extensions/shutdown-command.ts +5 -5
  855. package/examples/extensions/snake.ts +1 -1
  856. package/examples/extensions/space-invaders.ts +1 -1
  857. package/examples/extensions/structured-output.ts +1 -1
  858. package/examples/extensions/subagent/agents.ts +2 -2
  859. package/examples/extensions/subagent/index.ts +19 -51
  860. package/examples/extensions/summarize.ts +2 -2
  861. package/examples/extensions/tic-tac-toe.ts +2 -2
  862. package/examples/extensions/todo.ts +2 -2
  863. package/examples/extensions/tool-override.ts +1 -1
  864. package/examples/extensions/tools.ts +1 -1
  865. package/examples/extensions/truncated-tool.ts +1 -1
  866. package/examples/extensions/with-deps/package-lock.json +2 -2
  867. package/examples/extensions/with-deps/package.json +1 -1
  868. package/examples/extensions/working-indicator.ts +3 -3
  869. package/examples/rpc-extension-ui.ts +1 -9
  870. package/examples/sdk/02-custom-model.ts +1 -1
  871. package/examples/sdk/07-context-files.ts +0 -2
  872. package/examples/sdk/12-full-control.ts +1 -1
  873. package/examples/sdk/README.md +1 -1
  874. package/npm-shrinkwrap.json +1805 -0
  875. package/package.json +10 -32
  876. package/dist/core/compaction/pruner-policy.d.ts +0 -84
  877. package/dist/core/compaction/pruner-policy.d.ts.map +0 -1
  878. package/dist/core/compaction/pruner-policy.js +0 -273
  879. package/dist/core/compaction/pruner-policy.js.map +0 -1
  880. package/dist/core/context-graph-identity-resolution.d.ts +0 -114
  881. package/dist/core/context-graph-identity-resolution.d.ts.map +0 -1
  882. package/dist/core/context-graph-identity-resolution.js +0 -127
  883. package/dist/core/context-graph-identity-resolution.js.map +0 -1
  884. package/dist/core/context-graph-memory-store.d.ts +0 -153
  885. package/dist/core/context-graph-memory-store.d.ts.map +0 -1
  886. package/dist/core/context-graph-memory-store.js +0 -377
  887. package/dist/core/context-graph-memory-store.js.map +0 -1
  888. package/dist/core/context-graph-ontology-generation.d.ts +0 -104
  889. package/dist/core/context-graph-ontology-generation.d.ts.map +0 -1
  890. package/dist/core/context-graph-ontology-generation.js +0 -135
  891. package/dist/core/context-graph-ontology-generation.js.map +0 -1
  892. package/dist/core/context-graph-ontology-registry.d.ts +0 -766
  893. package/dist/core/context-graph-ontology-registry.d.ts.map +0 -1
  894. package/dist/core/context-graph-ontology-registry.js +0 -1133
  895. package/dist/core/context-graph-ontology-registry.js.map +0 -1
  896. package/dist/core/context-graph-policy.d.ts +0 -68
  897. package/dist/core/context-graph-policy.d.ts.map +0 -1
  898. package/dist/core/context-graph-policy.js +0 -221
  899. package/dist/core/context-graph-policy.js.map +0 -1
  900. package/dist/core/context-graph-reasoning.d.ts +0 -130
  901. package/dist/core/context-graph-reasoning.d.ts.map +0 -1
  902. package/dist/core/context-graph-reasoning.js +0 -442
  903. package/dist/core/context-graph-reasoning.js.map +0 -1
  904. package/dist/core/context-graph-retrieval.d.ts +0 -120
  905. package/dist/core/context-graph-retrieval.d.ts.map +0 -1
  906. package/dist/core/context-graph-retrieval.js +0 -288
  907. package/dist/core/context-graph-retrieval.js.map +0 -1
  908. package/dist/core/contract-verification.d.ts +0 -78
  909. package/dist/core/contract-verification.d.ts.map +0 -1
  910. package/dist/core/contract-verification.js +0 -110
  911. package/dist/core/contract-verification.js.map +0 -1
  912. package/dist/core/freedom/banner.d.ts +0 -14
  913. package/dist/core/freedom/banner.d.ts.map +0 -1
  914. package/dist/core/freedom/banner.js +0 -22
  915. package/dist/core/freedom/banner.js.map +0 -1
  916. package/dist/core/freedom/config.d.ts +0 -27
  917. package/dist/core/freedom/config.d.ts.map +0 -1
  918. package/dist/core/freedom/config.js +0 -216
  919. package/dist/core/freedom/config.js.map +0 -1
  920. package/dist/core/freedom/index.d.ts +0 -23
  921. package/dist/core/freedom/index.d.ts.map +0 -1
  922. package/dist/core/freedom/index.js +0 -19
  923. package/dist/core/freedom/index.js.map +0 -1
  924. package/dist/core/freedom/policy.d.ts +0 -42
  925. package/dist/core/freedom/policy.d.ts.map +0 -1
  926. package/dist/core/freedom/policy.js +0 -47
  927. package/dist/core/freedom/policy.js.map +0 -1
  928. package/dist/core/freedom/safety-floor.d.ts +0 -73
  929. package/dist/core/freedom/safety-floor.d.ts.map +0 -1
  930. package/dist/core/freedom/safety-floor.js +0 -275
  931. package/dist/core/freedom/safety-floor.js.map +0 -1
  932. package/dist/core/harness-control-events.d.ts +0 -91
  933. package/dist/core/harness-control-events.d.ts.map +0 -1
  934. package/dist/core/harness-control-events.js +0 -514
  935. package/dist/core/harness-control-events.js.map +0 -1
  936. package/dist/core/harness-control-replay.d.ts +0 -31
  937. package/dist/core/harness-control-replay.d.ts.map +0 -1
  938. package/dist/core/harness-control-replay.js +0 -187
  939. package/dist/core/harness-control-replay.js.map +0 -1
  940. package/dist/core/headroom-middleware.d.ts +0 -35
  941. package/dist/core/headroom-middleware.d.ts.map +0 -1
  942. package/dist/core/headroom-middleware.js +0 -166
  943. package/dist/core/headroom-middleware.js.map +0 -1
  944. package/dist/core/lean-context-middleware.d.ts +0 -12
  945. package/dist/core/lean-context-middleware.d.ts.map +0 -1
  946. package/dist/core/lean-context-middleware.js +0 -87
  947. package/dist/core/lean-context-middleware.js.map +0 -1
  948. package/dist/core/lean-context-policy.d.ts +0 -45
  949. package/dist/core/lean-context-policy.d.ts.map +0 -1
  950. package/dist/core/lean-context-policy.js +0 -108
  951. package/dist/core/lean-context-policy.js.map +0 -1
  952. package/dist/core/native-adoption-benchmark.d.ts +0 -166
  953. package/dist/core/native-adoption-benchmark.d.ts.map +0 -1
  954. package/dist/core/native-adoption-benchmark.js +0 -624
  955. package/dist/core/native-adoption-benchmark.js.map +0 -1
  956. package/dist/core/observability-trace.d.ts +0 -80
  957. package/dist/core/observability-trace.d.ts.map +0 -1
  958. package/dist/core/observability-trace.js +0 -140
  959. package/dist/core/observability-trace.js.map +0 -1
  960. package/dist/core/orchestration/checkpoint.d.ts +0 -83
  961. package/dist/core/orchestration/checkpoint.d.ts.map +0 -1
  962. package/dist/core/orchestration/checkpoint.js +0 -152
  963. package/dist/core/orchestration/checkpoint.js.map +0 -1
  964. package/dist/core/orchestration/errors.d.ts +0 -74
  965. package/dist/core/orchestration/errors.d.ts.map +0 -1
  966. package/dist/core/orchestration/errors.js +0 -52
  967. package/dist/core/orchestration/errors.js.map +0 -1
  968. package/dist/core/orchestration/merge-queue.d.ts +0 -121
  969. package/dist/core/orchestration/merge-queue.d.ts.map +0 -1
  970. package/dist/core/orchestration/merge-queue.js +0 -149
  971. package/dist/core/orchestration/merge-queue.js.map +0 -1
  972. package/dist/core/orchestration/recovery.d.ts +0 -106
  973. package/dist/core/orchestration/recovery.d.ts.map +0 -1
  974. package/dist/core/orchestration/recovery.js +0 -110
  975. package/dist/core/orchestration/recovery.js.map +0 -1
  976. package/dist/core/orchestration/replay-ledger.d.ts +0 -76
  977. package/dist/core/orchestration/replay-ledger.d.ts.map +0 -1
  978. package/dist/core/orchestration/replay-ledger.js +0 -395
  979. package/dist/core/orchestration/replay-ledger.js.map +0 -1
  980. package/dist/core/orchestration/scheduler-state.d.ts +0 -78
  981. package/dist/core/orchestration/scheduler-state.d.ts.map +0 -1
  982. package/dist/core/orchestration/scheduler-state.js +0 -185
  983. package/dist/core/orchestration/scheduler-state.js.map +0 -1
  984. package/dist/core/orchestration/scheduler-store.d.ts +0 -309
  985. package/dist/core/orchestration/scheduler-store.d.ts.map +0 -1
  986. package/dist/core/orchestration/scheduler-store.js +0 -368
  987. package/dist/core/orchestration/scheduler-store.js.map +0 -1
  988. package/dist/core/orchestration/sqlite-scheduler-store.d.ts +0 -57
  989. package/dist/core/orchestration/sqlite-scheduler-store.d.ts.map +0 -1
  990. package/dist/core/orchestration/sqlite-scheduler-store.js +0 -528
  991. package/dist/core/orchestration/sqlite-scheduler-store.js.map +0 -1
  992. package/dist/core/orchestration/transaction-coordinator.d.ts +0 -217
  993. package/dist/core/orchestration/transaction-coordinator.d.ts.map +0 -1
  994. package/dist/core/orchestration/transaction-coordinator.js +0 -281
  995. package/dist/core/orchestration/transaction-coordinator.js.map +0 -1
  996. package/dist/core/orchestration/verification-contract.d.ts +0 -197
  997. package/dist/core/orchestration/verification-contract.d.ts.map +0 -1
  998. package/dist/core/orchestration/verification-contract.js +0 -145
  999. package/dist/core/orchestration/verification-contract.js.map +0 -1
  1000. package/dist/core/package-composition.d.ts +0 -68
  1001. package/dist/core/package-composition.d.ts.map +0 -1
  1002. package/dist/core/package-composition.js +0 -304
  1003. package/dist/core/package-composition.js.map +0 -1
  1004. package/dist/core/package-trial-runtime.d.ts +0 -75
  1005. package/dist/core/package-trial-runtime.d.ts.map +0 -1
  1006. package/dist/core/package-trial-runtime.js +0 -73
  1007. package/dist/core/package-trial-runtime.js.map +0 -1
  1008. package/dist/core/package-trial-sandbox.d.ts +0 -27
  1009. package/dist/core/package-trial-sandbox.d.ts.map +0 -1
  1010. package/dist/core/package-trial-sandbox.js +0 -102
  1011. package/dist/core/package-trial-sandbox.js.map +0 -1
  1012. package/dist/core/policy-overlays-runtime.d.ts +0 -141
  1013. package/dist/core/policy-overlays-runtime.d.ts.map +0 -1
  1014. package/dist/core/policy-overlays-runtime.js +0 -720
  1015. package/dist/core/policy-overlays-runtime.js.map +0 -1
  1016. package/dist/core/read-anchor-registry.d.ts +0 -27
  1017. package/dist/core/read-anchor-registry.d.ts.map +0 -1
  1018. package/dist/core/read-anchor-registry.js +0 -103
  1019. package/dist/core/read-anchor-registry.js.map +0 -1
  1020. package/dist/core/read-content-cache.d.ts +0 -22
  1021. package/dist/core/read-content-cache.d.ts.map +0 -1
  1022. package/dist/core/read-content-cache.js +0 -79
  1023. package/dist/core/read-content-cache.js.map +0 -1
  1024. package/dist/core/session-digest.d.ts +0 -57
  1025. package/dist/core/session-digest.d.ts.map +0 -1
  1026. package/dist/core/session-digest.js +0 -193
  1027. package/dist/core/session-digest.js.map +0 -1
  1028. package/dist/core/spec-kit/compiler.d.ts +0 -67
  1029. package/dist/core/spec-kit/compiler.d.ts.map +0 -1
  1030. package/dist/core/spec-kit/compiler.js +0 -268
  1031. package/dist/core/spec-kit/compiler.js.map +0 -1
  1032. package/dist/core/transaction-coordinator.d.ts +0 -30
  1033. package/dist/core/transaction-coordinator.d.ts.map +0 -1
  1034. package/dist/core/transaction-coordinator.js +0 -173
  1035. package/dist/core/transaction-coordinator.js.map +0 -1
  1036. package/dist/modes/interactive/components/mcp-selector.d.ts +0 -30
  1037. package/dist/modes/interactive/components/mcp-selector.d.ts.map +0 -1
  1038. package/dist/modes/interactive/components/mcp-selector.js +0 -155
  1039. package/dist/modes/interactive/components/mcp-selector.js.map +0 -1
  1040. package/dist/modes/interactive/components/model-selector-state.d.ts +0 -101
  1041. package/dist/modes/interactive/components/model-selector-state.d.ts.map +0 -1
  1042. package/dist/modes/interactive/components/model-selector-state.js +0 -261
  1043. package/dist/modes/interactive/components/model-selector-state.js.map +0 -1
  1044. package/dist/modes/interactive/components/skills-selector.d.ts +0 -32
  1045. package/dist/modes/interactive/components/skills-selector.d.ts.map +0 -1
  1046. package/dist/modes/interactive/components/skills-selector.js +0 -130
  1047. package/dist/modes/interactive/components/skills-selector.js.map +0 -1
  1048. package/dist/modes/interactive/theme/omk-blackboard.json +0 -91
  1049. package/dist/modes/interactive/theme/omk-freedom-grid.json +0 -91
  1050. package/dist/modes/interactive/theme/omk-neon-ops.json +0 -90
  1051. package/dist/modes/interactive/theme/omk-slate-light.json +0 -91
  1052. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +0 -72
  1053. package/node_modules/@earendil-works/omk-agent-core/README.md +0 -488
  1054. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts +0 -24
  1055. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.d.ts.map +0 -1
  1056. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js +0 -553
  1057. package/node_modules/@earendil-works/omk-agent-core/dist/agent-loop.js.map +0 -1
  1058. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts +0 -118
  1059. package/node_modules/@earendil-works/omk-agent-core/dist/agent.d.ts.map +0 -1
  1060. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js +0 -402
  1061. package/node_modules/@earendil-works/omk-agent-core/dist/agent.js.map +0 -1
  1062. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts +0 -95
  1063. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.d.ts.map +0 -1
  1064. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js +0 -996
  1065. package/node_modules/@earendil-works/omk-agent-core/dist/harness/agent-harness.js.map +0 -1
  1066. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts +0 -53
  1067. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +0 -1
  1068. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js +0 -175
  1069. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/branch-summarization.js.map +0 -1
  1070. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts +0 -117
  1071. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.d.ts.map +0 -1
  1072. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js +0 -568
  1073. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/compaction.js.map +0 -1
  1074. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts +0 -25
  1075. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.d.ts.map +0 -1
  1076. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js +0 -131
  1077. package/node_modules/@earendil-works/omk-agent-core/dist/harness/compaction/utils.js.map +0 -1
  1078. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts +0 -51
  1079. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.d.ts.map +0 -1
  1080. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js +0 -510
  1081. package/node_modules/@earendil-works/omk-agent-core/dist/harness/env/nodejs.js.map +0 -1
  1082. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts +0 -51
  1083. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.d.ts.map +0 -1
  1084. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js +0 -102
  1085. package/node_modules/@earendil-works/omk-agent-core/dist/harness/messages.js.map +0 -1
  1086. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts +0 -48
  1087. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.d.ts.map +0 -1
  1088. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js +0 -230
  1089. package/node_modules/@earendil-works/omk-agent-core/dist/harness/prompt-templates.js.map +0 -1
  1090. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts +0 -26
  1091. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.d.ts.map +0 -1
  1092. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js +0 -101
  1093. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-repo.js.map +0 -1
  1094. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts +0 -36
  1095. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.d.ts.map +0 -1
  1096. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js +0 -273
  1097. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/jsonl-storage.js.map +0 -1
  1098. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts +0 -18
  1099. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.d.ts.map +0 -1
  1100. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js +0 -42
  1101. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-repo.js.map +0 -1
  1102. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts +0 -25
  1103. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.d.ts.map +0 -1
  1104. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js +0 -114
  1105. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/memory-storage.js.map +0 -1
  1106. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts +0 -11
  1107. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.d.ts.map +0 -1
  1108. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js +0 -39
  1109. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/repo-utils.js.map +0 -1
  1110. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts +0 -33
  1111. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.d.ts.map +0 -1
  1112. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js +0 -210
  1113. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/session.js.map +0 -1
  1114. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts +0 -2
  1115. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.d.ts.map +0 -1
  1116. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js +0 -50
  1117. package/node_modules/@earendil-works/omk-agent-core/dist/harness/session/uuid.js.map +0 -1
  1118. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts +0 -44
  1119. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.d.ts.map +0 -1
  1120. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js +0 -311
  1121. package/node_modules/@earendil-works/omk-agent-core/dist/harness/skills.js.map +0 -1
  1122. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts +0 -3
  1123. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.d.ts.map +0 -1
  1124. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js +0 -30
  1125. package/node_modules/@earendil-works/omk-agent-core/dist/harness/system-prompt.js.map +0 -1
  1126. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts +0 -616
  1127. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.d.ts.map +0 -1
  1128. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js +0 -94
  1129. package/node_modules/@earendil-works/omk-agent-core/dist/harness/types.js.map +0 -1
  1130. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts +0 -14
  1131. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.d.ts.map +0 -1
  1132. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js +0 -126
  1133. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/shell-output.js.map +0 -1
  1134. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts +0 -70
  1135. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.d.ts.map +0 -1
  1136. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js +0 -297
  1137. package/node_modules/@earendil-works/omk-agent-core/dist/harness/utils/truncate.js.map +0 -1
  1138. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts +0 -20
  1139. package/node_modules/@earendil-works/omk-agent-core/dist/index.d.ts.map +0 -1
  1140. package/node_modules/@earendil-works/omk-agent-core/dist/index.js +0 -25
  1141. package/node_modules/@earendil-works/omk-agent-core/dist/index.js.map +0 -1
  1142. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts +0 -3
  1143. package/node_modules/@earendil-works/omk-agent-core/dist/node.d.ts.map +0 -1
  1144. package/node_modules/@earendil-works/omk-agent-core/dist/node.js +0 -3
  1145. package/node_modules/@earendil-works/omk-agent-core/dist/node.js.map +0 -1
  1146. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts +0 -69
  1147. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.d.ts.map +0 -1
  1148. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js +0 -278
  1149. package/node_modules/@earendil-works/omk-agent-core/dist/proxy.js.map +0 -1
  1150. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts +0 -393
  1151. package/node_modules/@earendil-works/omk-agent-core/dist/types.d.ts.map +0 -1
  1152. package/node_modules/@earendil-works/omk-agent-core/dist/types.js +0 -2
  1153. package/node_modules/@earendil-works/omk-agent-core/dist/types.js.map +0 -1
  1154. package/node_modules/@earendil-works/omk-agent-core/package.json +0 -60
  1155. package/node_modules/@earendil-works/omk-ai/README.md +0 -1389
  1156. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts +0 -20
  1157. package/node_modules/@earendil-works/omk-ai/dist/api-registry.d.ts.map +0 -1
  1158. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js +0 -44
  1159. package/node_modules/@earendil-works/omk-ai/dist/api-registry.js.map +0 -1
  1160. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts +0 -5
  1161. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.d.ts.map +0 -1
  1162. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js +0 -6
  1163. package/node_modules/@earendil-works/omk-ai/dist/bedrock-provider.js.map +0 -1
  1164. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts +0 -3
  1165. package/node_modules/@earendil-works/omk-ai/dist/cli.d.ts.map +0 -1
  1166. package/node_modules/@earendil-works/omk-ai/dist/cli.js +0 -130
  1167. package/node_modules/@earendil-works/omk-ai/dist/cli.js.map +0 -1
  1168. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts +0 -20
  1169. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.d.ts.map +0 -1
  1170. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js +0 -199
  1171. package/node_modules/@earendil-works/omk-ai/dist/env-api-keys.js.map +0 -1
  1172. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts +0 -10
  1173. package/node_modules/@earendil-works/omk-ai/dist/image-models.d.ts.map +0 -1
  1174. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts +0 -515
  1175. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.d.ts.map +0 -1
  1176. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js +0 -517
  1177. package/node_modules/@earendil-works/omk-ai/dist/image-models.generated.js.map +0 -1
  1178. package/node_modules/@earendil-works/omk-ai/dist/image-models.js +0 -23
  1179. package/node_modules/@earendil-works/omk-ai/dist/image-models.js.map +0 -1
  1180. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts +0 -14
  1181. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.d.ts.map +0 -1
  1182. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js +0 -22
  1183. package/node_modules/@earendil-works/omk-ai/dist/images-api-registry.js.map +0 -1
  1184. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts +0 -4
  1185. package/node_modules/@earendil-works/omk-ai/dist/images.d.ts.map +0 -1
  1186. package/node_modules/@earendil-works/omk-ai/dist/images.js +0 -16
  1187. package/node_modules/@earendil-works/omk-ai/dist/images.js.map +0 -1
  1188. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts +0 -33
  1189. package/node_modules/@earendil-works/omk-ai/dist/index.d.ts.map +0 -1
  1190. package/node_modules/@earendil-works/omk-ai/dist/index.js +0 -21
  1191. package/node_modules/@earendil-works/omk-ai/dist/index.js.map +0 -1
  1192. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts +0 -18
  1193. package/node_modules/@earendil-works/omk-ai/dist/models.d.ts.map +0 -1
  1194. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts +0 -18762
  1195. package/node_modules/@earendil-works/omk-ai/dist/models.generated.d.ts.map +0 -1
  1196. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js +0 -17197
  1197. package/node_modules/@earendil-works/omk-ai/dist/models.generated.js.map +0 -1
  1198. package/node_modules/@earendil-works/omk-ai/dist/models.js +0 -78
  1199. package/node_modules/@earendil-works/omk-ai/dist/models.js.map +0 -1
  1200. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts +0 -2
  1201. package/node_modules/@earendil-works/omk-ai/dist/oauth.d.ts.map +0 -1
  1202. package/node_modules/@earendil-works/omk-ai/dist/oauth.js +0 -2
  1203. package/node_modules/@earendil-works/omk-ai/dist/oauth.js.map +0 -1
  1204. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts +0 -39
  1205. package/node_modules/@earendil-works/omk-ai/dist/provider-network.d.ts.map +0 -1
  1206. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js +0 -170
  1207. package/node_modules/@earendil-works/omk-ai/dist/provider-network.js.map +0 -1
  1208. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts +0 -38
  1209. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.d.ts.map +0 -1
  1210. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js +0 -826
  1211. package/node_modules/@earendil-works/omk-ai/dist/providers/amazon-bedrock.js.map +0 -1
  1212. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts +0 -77
  1213. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.d.ts.map +0 -1
  1214. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js +0 -1123
  1215. package/node_modules/@earendil-works/omk-ai/dist/providers/anthropic.js.map +0 -1
  1216. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts +0 -15
  1217. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.d.ts.map +0 -1
  1218. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js +0 -221
  1219. package/node_modules/@earendil-works/omk-ai/dist/providers/azure-openai-responses.js.map +0 -1
  1220. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts +0 -13
  1221. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.d.ts.map +0 -1
  1222. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js +0 -26
  1223. package/node_modules/@earendil-works/omk-ai/dist/providers/cloudflare.js.map +0 -1
  1224. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts +0 -56
  1225. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.d.ts.map +0 -1
  1226. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js +0 -368
  1227. package/node_modules/@earendil-works/omk-ai/dist/providers/faux.js.map +0 -1
  1228. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts +0 -8
  1229. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.d.ts.map +0 -1
  1230. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js +0 -29
  1231. package/node_modules/@earendil-works/omk-ai/dist/providers/github-copilot-headers.js.map +0 -1
  1232. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts +0 -70
  1233. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.d.ts.map +0 -1
  1234. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js +0 -331
  1235. package/node_modules/@earendil-works/omk-ai/dist/providers/google-shared.js.map +0 -1
  1236. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts +0 -15
  1237. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.d.ts.map +0 -1
  1238. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js +0 -442
  1239. package/node_modules/@earendil-works/omk-ai/dist/providers/google-vertex.js.map +0 -1
  1240. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts +0 -13
  1241. package/node_modules/@earendil-works/omk-ai/dist/providers/google.d.ts.map +0 -1
  1242. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js +0 -402
  1243. package/node_modules/@earendil-works/omk-ai/dist/providers/google.js.map +0 -1
  1244. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts +0 -3
  1245. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.d.ts.map +0 -1
  1246. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js +0 -128
  1247. package/node_modules/@earendil-works/omk-ai/dist/providers/images/openrouter.js.map +0 -1
  1248. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts +0 -4
  1249. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.d.ts.map +0 -1
  1250. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js +0 -34
  1251. package/node_modules/@earendil-works/omk-ai/dist/providers/images/register-builtins.js.map +0 -1
  1252. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts +0 -25
  1253. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.d.ts.map +0 -1
  1254. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js +0 -534
  1255. package/node_modules/@earendil-works/omk-ai/dist/providers/mistral.js.map +0 -1
  1256. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts +0 -30
  1257. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.d.ts.map +0 -1
  1258. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js +0 -1171
  1259. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-codex-responses.js.map +0 -1
  1260. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts +0 -19
  1261. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.d.ts.map +0 -1
  1262. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js +0 -977
  1263. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-completions.js.map +0 -1
  1264. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts +0 -11
  1265. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  1266. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js +0 -22
  1267. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-prompt-cache.js.map +0 -1
  1268. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts +0 -18
  1269. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.d.ts.map +0 -1
  1270. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js +0 -496
  1271. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses-shared.js.map +0 -1
  1272. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts +0 -13
  1273. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.d.ts.map +0 -1
  1274. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js +0 -233
  1275. package/node_modules/@earendil-works/omk-ai/dist/providers/openai-responses.js.map +0 -1
  1276. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts +0 -35
  1277. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.d.ts.map +0 -1
  1278. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js +0 -254
  1279. package/node_modules/@earendil-works/omk-ai/dist/providers/register-builtins.js.map +0 -1
  1280. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts +0 -8
  1281. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.d.ts.map +0 -1
  1282. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js +0 -42
  1283. package/node_modules/@earendil-works/omk-ai/dist/providers/simple-options.js.map +0 -1
  1284. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts +0 -13
  1285. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.d.ts.map +0 -1
  1286. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js +0 -82
  1287. package/node_modules/@earendil-works/omk-ai/dist/providers/tool-schema.js.map +0 -1
  1288. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts +0 -8
  1289. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.d.ts.map +0 -1
  1290. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js +0 -184
  1291. package/node_modules/@earendil-works/omk-ai/dist/providers/transform-messages.js.map +0 -1
  1292. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts +0 -4
  1293. package/node_modules/@earendil-works/omk-ai/dist/session-resources.d.ts.map +0 -1
  1294. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js +0 -22
  1295. package/node_modules/@earendil-works/omk-ai/dist/session-resources.js.map +0 -1
  1296. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts +0 -8
  1297. package/node_modules/@earendil-works/omk-ai/dist/stream.d.ts.map +0 -1
  1298. package/node_modules/@earendil-works/omk-ai/dist/stream.js +0 -77
  1299. package/node_modules/@earendil-works/omk-ai/dist/stream.js.map +0 -1
  1300. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts +0 -570
  1301. package/node_modules/@earendil-works/omk-ai/dist/types.d.ts.map +0 -1
  1302. package/node_modules/@earendil-works/omk-ai/dist/types.js +0 -2
  1303. package/node_modules/@earendil-works/omk-ai/dist/types.js.map +0 -1
  1304. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts +0 -6
  1305. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.d.ts.map +0 -1
  1306. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js +0 -34
  1307. package/node_modules/@earendil-works/omk-ai/dist/utils/abort-signals.js.map +0 -1
  1308. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts +0 -19
  1309. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.d.ts.map +0 -1
  1310. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js +0 -25
  1311. package/node_modules/@earendil-works/omk-ai/dist/utils/diagnostics.js.map +0 -1
  1312. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts +0 -21
  1313. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.d.ts.map +0 -1
  1314. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js +0 -81
  1315. package/node_modules/@earendil-works/omk-ai/dist/utils/event-stream.js.map +0 -1
  1316. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts +0 -3
  1317. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.d.ts.map +0 -1
  1318. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js +0 -14
  1319. package/node_modules/@earendil-works/omk-ai/dist/utils/hash.js.map +0 -1
  1320. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts +0 -2
  1321. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.d.ts.map +0 -1
  1322. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js +0 -8
  1323. package/node_modules/@earendil-works/omk-ai/dist/utils/headers.js.map +0 -1
  1324. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts +0 -16
  1325. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.d.ts.map +0 -1
  1326. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js +0 -113
  1327. package/node_modules/@earendil-works/omk-ai/dist/utils/json-parse.js.map +0 -1
  1328. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts +0 -10
  1329. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.d.ts.map +0 -1
  1330. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js +0 -97
  1331. package/node_modules/@earendil-works/omk-ai/dist/utils/node-http-proxy.js.map +0 -1
  1332. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts +0 -25
  1333. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  1334. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js +0 -335
  1335. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/anthropic.js.map +0 -1
  1336. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts +0 -21
  1337. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
  1338. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js +0 -56
  1339. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/device-code.js.map +0 -1
  1340. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts +0 -30
  1341. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  1342. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js +0 -280
  1343. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/github-copilot.js.map +0 -1
  1344. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts +0 -58
  1345. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.d.ts.map +0 -1
  1346. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js +0 -122
  1347. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/index.js.map +0 -1
  1348. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts +0 -3
  1349. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  1350. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js +0 -105
  1351. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/oauth-page.js.map +0 -1
  1352. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts +0 -43
  1353. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  1354. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js +0 -487
  1355. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/openai-codex.js.map +0 -1
  1356. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts +0 -13
  1357. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
  1358. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js +0 -31
  1359. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/pkce.js.map +0 -1
  1360. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts +0 -64
  1361. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.d.ts.map +0 -1
  1362. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js +0 -2
  1363. package/node_modules/@earendil-works/omk-ai/dist/utils/oauth/types.js.map +0 -1
  1364. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts +0 -57
  1365. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.d.ts.map +0 -1
  1366. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js +0 -154
  1367. package/node_modules/@earendil-works/omk-ai/dist/utils/overflow.js.map +0 -1
  1368. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts +0 -22
  1369. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.d.ts.map +0 -1
  1370. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js +0 -26
  1371. package/node_modules/@earendil-works/omk-ai/dist/utils/sanitize-unicode.js.map +0 -1
  1372. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts +0 -17
  1373. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.d.ts.map +0 -1
  1374. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js +0 -21
  1375. package/node_modules/@earendil-works/omk-ai/dist/utils/typebox-helpers.js.map +0 -1
  1376. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts +0 -18
  1377. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.d.ts.map +0 -1
  1378. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js +0 -281
  1379. package/node_modules/@earendil-works/omk-ai/dist/utils/validation.js.map +0 -1
  1380. package/node_modules/@earendil-works/omk-ai/package.json +0 -106
  1381. package/node_modules/@earendil-works/omk-tui/README.md +0 -791
  1382. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts +0 -54
  1383. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.d.ts.map +0 -1
  1384. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js +0 -632
  1385. package/node_modules/@earendil-works/omk-tui/dist/autocomplete.js.map +0 -1
  1386. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts +0 -22
  1387. package/node_modules/@earendil-works/omk-tui/dist/components/box.d.ts.map +0 -1
  1388. package/node_modules/@earendil-works/omk-tui/dist/components/box.js +0 -104
  1389. package/node_modules/@earendil-works/omk-tui/dist/components/box.js.map +0 -1
  1390. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts +0 -22
  1391. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.d.ts.map +0 -1
  1392. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js +0 -35
  1393. package/node_modules/@earendil-works/omk-tui/dist/components/cancellable-loader.js.map +0 -1
  1394. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts +0 -249
  1395. package/node_modules/@earendil-works/omk-tui/dist/components/editor.d.ts.map +0 -1
  1396. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js +0 -1857
  1397. package/node_modules/@earendil-works/omk-tui/dist/components/editor.js.map +0 -1
  1398. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts +0 -28
  1399. package/node_modules/@earendil-works/omk-tui/dist/components/image.d.ts.map +0 -1
  1400. package/node_modules/@earendil-works/omk-tui/dist/components/image.js +0 -89
  1401. package/node_modules/@earendil-works/omk-tui/dist/components/image.js.map +0 -1
  1402. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts +0 -37
  1403. package/node_modules/@earendil-works/omk-tui/dist/components/input.d.ts.map +0 -1
  1404. package/node_modules/@earendil-works/omk-tui/dist/components/input.js +0 -378
  1405. package/node_modules/@earendil-works/omk-tui/dist/components/input.js.map +0 -1
  1406. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts +0 -31
  1407. package/node_modules/@earendil-works/omk-tui/dist/components/loader.d.ts.map +0 -1
  1408. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js +0 -69
  1409. package/node_modules/@earendil-works/omk-tui/dist/components/loader.js.map +0 -1
  1410. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts +0 -96
  1411. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.d.ts.map +0 -1
  1412. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js +0 -644
  1413. package/node_modules/@earendil-works/omk-tui/dist/components/markdown.js.map +0 -1
  1414. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts +0 -50
  1415. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.d.ts.map +0 -1
  1416. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js +0 -159
  1417. package/node_modules/@earendil-works/omk-tui/dist/components/select-list.js.map +0 -1
  1418. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts +0 -50
  1419. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.d.ts.map +0 -1
  1420. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js +0 -185
  1421. package/node_modules/@earendil-works/omk-tui/dist/components/settings-list.js.map +0 -1
  1422. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts +0 -12
  1423. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.d.ts.map +0 -1
  1424. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js +0 -23
  1425. package/node_modules/@earendil-works/omk-tui/dist/components/spacer.js.map +0 -1
  1426. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts +0 -19
  1427. package/node_modules/@earendil-works/omk-tui/dist/components/text.d.ts.map +0 -1
  1428. package/node_modules/@earendil-works/omk-tui/dist/components/text.js +0 -89
  1429. package/node_modules/@earendil-works/omk-tui/dist/components/text.js.map +0 -1
  1430. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts +0 -13
  1431. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.d.ts.map +0 -1
  1432. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js +0 -51
  1433. package/node_modules/@earendil-works/omk-tui/dist/components/truncated-text.js.map +0 -1
  1434. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts +0 -39
  1435. package/node_modules/@earendil-works/omk-tui/dist/editor-component.d.ts.map +0 -1
  1436. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js +0 -2
  1437. package/node_modules/@earendil-works/omk-tui/dist/editor-component.js.map +0 -1
  1438. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts +0 -16
  1439. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.d.ts.map +0 -1
  1440. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js +0 -110
  1441. package/node_modules/@earendil-works/omk-tui/dist/fuzzy.js.map +0 -1
  1442. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts +0 -23
  1443. package/node_modules/@earendil-works/omk-tui/dist/index.d.ts.map +0 -1
  1444. package/node_modules/@earendil-works/omk-tui/dist/index.js +0 -32
  1445. package/node_modules/@earendil-works/omk-tui/dist/index.js.map +0 -1
  1446. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts +0 -212
  1447. package/node_modules/@earendil-works/omk-tui/dist/keybindings.d.ts.map +0 -1
  1448. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js +0 -252
  1449. package/node_modules/@earendil-works/omk-tui/dist/keybindings.js.map +0 -1
  1450. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts +0 -184
  1451. package/node_modules/@earendil-works/omk-tui/dist/keys.d.ts.map +0 -1
  1452. package/node_modules/@earendil-works/omk-tui/dist/keys.js +0 -1173
  1453. package/node_modules/@earendil-works/omk-tui/dist/keys.js.map +0 -1
  1454. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts +0 -28
  1455. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.d.ts.map +0 -1
  1456. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js +0 -44
  1457. package/node_modules/@earendil-works/omk-tui/dist/kill-ring.js.map +0 -1
  1458. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts +0 -3
  1459. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.d.ts.map +0 -1
  1460. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js +0 -53
  1461. package/node_modules/@earendil-works/omk-tui/dist/native-modifiers.js.map +0 -1
  1462. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts +0 -50
  1463. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.d.ts.map +0 -1
  1464. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js +0 -361
  1465. package/node_modules/@earendil-works/omk-tui/dist/stdin-buffer.js.map +0 -1
  1466. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts +0 -90
  1467. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.d.ts.map +0 -1
  1468. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js +0 -366
  1469. package/node_modules/@earendil-works/omk-tui/dist/terminal-image.js.map +0 -1
  1470. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts +0 -113
  1471. package/node_modules/@earendil-works/omk-tui/dist/terminal.d.ts.map +0 -1
  1472. package/node_modules/@earendil-works/omk-tui/dist/terminal.js +0 -472
  1473. package/node_modules/@earendil-works/omk-tui/dist/terminal.js.map +0 -1
  1474. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts +0 -242
  1475. package/node_modules/@earendil-works/omk-tui/dist/tui.d.ts.map +0 -1
  1476. package/node_modules/@earendil-works/omk-tui/dist/tui.js +0 -1221
  1477. package/node_modules/@earendil-works/omk-tui/dist/tui.js.map +0 -1
  1478. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts +0 -17
  1479. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.d.ts.map +0 -1
  1480. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js +0 -25
  1481. package/node_modules/@earendil-works/omk-tui/dist/undo-stack.js.map +0 -1
  1482. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts +0 -84
  1483. package/node_modules/@earendil-works/omk-tui/dist/utils.d.ts.map +0 -1
  1484. package/node_modules/@earendil-works/omk-tui/dist/utils.js +0 -1032
  1485. package/node_modules/@earendil-works/omk-tui/dist/utils.js.map +0 -1
  1486. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts +0 -25
  1487. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.d.ts.map +0 -1
  1488. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js +0 -96
  1489. package/node_modules/@earendil-works/omk-tui/dist/word-navigation.js.map +0 -1
  1490. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  1491. package/node_modules/@earendil-works/omk-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  1492. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  1493. package/node_modules/@earendil-works/omk-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  1494. package/node_modules/@earendil-works/omk-tui/package.json +0 -47
@@ -1,10 +1,6 @@
1
- import type { AgentTool } from "@earendil-works/omk-agent-core";
1
+ import type { AgentTool } from "omk-agent-core";
2
2
  import { type Static, Type } from "typebox";
3
3
  import type { ToolDefinition } from "../extensions/types.ts";
4
- import { type LoadoutAccessGuard } from "../loadout-access-policy.ts";
5
- import type { ReadAnchorRegistry } from "../read-anchor-registry.ts";
6
- import { type ReadAnchor } from "../read-anchors.ts";
7
- import type { ReadContentCache } from "../read-content-cache.ts";
8
4
  import { type TruncationResult } from "./truncate.ts";
9
5
  declare const readSchema: Type.TObject<{
10
6
  path: Type.TString;
@@ -14,7 +10,6 @@ declare const readSchema: Type.TObject<{
14
10
  export type ReadToolInput = Static<typeof readSchema>;
15
11
  export interface ReadToolDetails {
16
12
  truncation?: TruncationResult;
17
- readAnchors?: readonly ReadAnchor[];
18
13
  }
19
14
  /**
20
15
  * Pluggable operations for the read tool.
@@ -33,14 +28,7 @@ export interface ReadToolOptions {
33
28
  autoResizeImages?: boolean;
34
29
  /** Custom operations for file reading. Default: local filesystem */
35
30
  operations?: ReadOperations;
36
- /** Optional per-session read-anchor registry for stale-edit protection. */
37
- anchorRegistry?: ReadAnchorRegistry;
38
- /** Optional deterministic read id factory. */
39
- readIdFactory?: () => string;
40
- /** Optional per-session content cache keyed by read-anchor file hash. */
41
- contentCache?: ReadContentCache;
42
- /** Optional loadout access guard for scoped filesystem reads. */
43
- accessGuard?: LoadoutAccessGuard;
31
+ canReadPath?: (absolutePath: string) => boolean;
44
32
  }
45
33
  export declare function createReadToolDefinition(cwd: string, options?: ReadToolOptions): ToolDefinition<typeof readSchema, ReadToolDetails | undefined>;
46
34
  export declare function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAKhE,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CACpC;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,MAAM,CAAC;IAC7B,yEAAyE;IACzE,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,iEAAiE;IACjE,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAgJD,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA+KhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/omk-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@earendil-works/omk-ai\";\nimport { Text } from \"@earendil-works/omk-tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { assertLoadoutAccess, type LoadoutAccessGuard } from \"../loadout-access-policy.ts\";\nimport type { ReadAnchorRegistry } from \"../read-anchor-registry.ts\";\nimport { createReadAnchor, type ReadAnchor } from \"../read-anchors.ts\";\nimport type { ReadContentCache } from \"../read-content-cache.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { getTextOutput, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n\treadAnchors?: readonly ReadAnchor[];\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n\t/** Optional per-session read-anchor registry for stale-edit protection. */\n\tanchorRegistry?: ReadAnchorRegistry;\n\t/** Optional deterministic read id factory. */\n\treadIdFactory?: () => string;\n\t/** Optional per-session content cache keyed by read-anchor file hash. */\n\tcontentCache?: ReadContentCache;\n\t/** Optional loadout access guard for scoped filesystem reads. */\n\taccessGuard?: LoadoutAccessGuard;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme, cwd: string): string {\n\tconst pathDisplay = renderToolPath(str(args?.file_path ?? args?.path), theme, cwd);\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction normalizeReadAnchorContent(content: string): string {\n\treturn content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getOmkDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getOmkDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\n\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\tconst anchorRegistry = options?.anchorRegistry;\n\tconst readIdFactory = options?.readIdFactory;\n\tconst contentCache = options?.contentCache;\n\tconst accessGuard = options?.accessGuard;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst readAnchors: ReadAnchor[] = [];\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(path, cwd);\n\t\t\t\t\t\t\tassertLoadoutAccess(accessGuard, { operation: \"read\", toolName: \"read\", path: absolutePath });\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\t// Check if file exists and is readable.\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage(buffer, mimeType);\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: buffer.toString(\"base64\"), mimeType },\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tif (anchorRegistry) {\n\t\t\t\t\t\t\t\t\tconst normalizedContent = normalizeReadAnchorContent(textContent);\n\t\t\t\t\t\t\t\t\tconst anchor = createReadAnchor({\n\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\t\t\toffset,\n\t\t\t\t\t\t\t\t\t\tlimit,\n\t\t\t\t\t\t\t\t\t\treadId: readIdFactory?.(),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tanchorRegistry.register(anchor, normalizedContent);\n\t\t\t\t\t\t\t\t\tcontentCache?.set(anchor.fileSha256, normalizedContent, absolutePath);\n\t\t\t\t\t\t\t\t\treadAnchors.push(anchor);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (readAnchors.length > 0) {\n\t\t\t\t\t\t\t\tdetails = { ...details, readAnchors };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details });\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification\n\t\t\t\t\t? formatCompactReadCall(classification, args, theme)\n\t\t\t\t\t: formatReadCall(args, theme, context.cwd),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAO5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAItF,OAAO,EAAoD,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAEtH,QAAA,MAAM,UAAU;;;;EAId,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AASD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,+CAA+C;IAC/C,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,sEAAsE;IACtE,mBAAmB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CACnF;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AA4ID,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA2JhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport type { AgentTool } from \"omk-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"omk-ai\";\nimport { Text } from \"omk-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { getTextOutput, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n\tcanReadPath?: (absolutePath: string) => boolean;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme, cwd: string): string {\n\tconst pathDisplay = renderToolPath(str(args?.file_path ?? args?.path), theme, cwd);\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getOmkDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getOmkDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\n\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(path, cwd);\n\t\t\t\t\t\t\tif (options?.canReadPath && !options.canReadPath(absolutePath)) {\n\t\t\t\t\t\t\t\tthrow new Error(`Read blocked by active loadout policy: ${path}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\t// Check if file exists and is readable.\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage(buffer, mimeType);\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: buffer.toString(\"base64\"), mimeType },\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details });\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification\n\t\t\t\t\t? formatCompactReadCall(classification, args, theme)\n\t\t\t\t\t: formatReadCall(args, theme, context.cwd),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from "node:path";
2
- import { Text } from "@earendil-works/omk-tui";
3
2
  import { constants } from "fs";
4
3
  import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
4
+ import { Text } from "omk-tui";
5
5
  import { Type } from "typebox";
6
6
  import { getReadmePath } from "../../config.js";
7
7
  import { keyHint, keyText } from "../../modes/interactive/components/keybinding-hints.js";
@@ -9,8 +9,6 @@ import { getLanguageFromPath, highlightCode } from "../../modes/interactive/them
9
9
  import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
10
10
  import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
11
11
  import { formatPathRelativeToCwdOrAbsolute } from "../../utils/paths.js";
12
- import { assertLoadoutAccess } from "../loadout-access-policy.js";
13
- import { createReadAnchor } from "../read-anchors.js";
14
12
  import { resolveReadPathAsync, resolveToCwd } from "./path-utils.js";
15
13
  import { getTextOutput, renderToolPath, replaceTabs, str } from "./render-utils.js";
16
14
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
@@ -44,9 +42,6 @@ function trimTrailingEmptyLines(lines) {
44
42
  }
45
43
  return lines.slice(0, end);
46
44
  }
47
- function normalizeReadAnchorContent(content) {
48
- return content.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
49
- }
50
45
  function getNonVisionImageNote(model) {
51
46
  if (!model || model.input.includes("image")) {
52
47
  return undefined;
@@ -135,10 +130,6 @@ function formatReadResult(args, result, options, theme, showImages, _cwd, isErro
135
130
  export function createReadToolDefinition(cwd, options) {
136
131
  const autoResizeImages = options?.autoResizeImages ?? true;
137
132
  const ops = options?.operations ?? defaultReadOperations;
138
- const anchorRegistry = options?.anchorRegistry;
139
- const readIdFactory = options?.readIdFactory;
140
- const contentCache = options?.contentCache;
141
- const accessGuard = options?.accessGuard;
142
133
  return {
143
134
  name: "read",
144
135
  label: "read",
@@ -160,9 +151,10 @@ export function createReadToolDefinition(cwd, options) {
160
151
  signal?.addEventListener("abort", onAbort, { once: true });
161
152
  (async () => {
162
153
  try {
163
- const readAnchors = [];
164
154
  const absolutePath = await resolveReadPathAsync(path, cwd);
165
- assertLoadoutAccess(accessGuard, { operation: "read", toolName: "read", path: absolutePath });
155
+ if (options?.canReadPath && !options.canReadPath(absolutePath)) {
156
+ throw new Error(`Read blocked by active loadout policy: ${path}`);
157
+ }
166
158
  if (aborted)
167
159
  return;
168
160
  // Check if file exists and is readable.
@@ -212,19 +204,6 @@ export function createReadToolDefinition(cwd, options) {
212
204
  // Read text content.
213
205
  const buffer = await ops.readFile(absolutePath);
214
206
  const textContent = buffer.toString("utf-8");
215
- if (anchorRegistry) {
216
- const normalizedContent = normalizeReadAnchorContent(textContent);
217
- const anchor = createReadAnchor({
218
- path: absolutePath,
219
- content: textContent,
220
- offset,
221
- limit,
222
- readId: readIdFactory?.(),
223
- });
224
- anchorRegistry.register(anchor, normalizedContent);
225
- contentCache?.set(anchor.fileSha256, normalizedContent, absolutePath);
226
- readAnchors.push(anchor);
227
- }
228
207
  const allLines = textContent.split("\n");
229
208
  const totalFileLines = allLines.length;
230
209
  // Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.
@@ -279,9 +258,6 @@ export function createReadToolDefinition(cwd, options) {
279
258
  }
280
259
  content = [{ type: "text", text: outputText }];
281
260
  }
282
- if (readAnchors.length > 0) {
283
- details = { ...details, readAnchors };
284
- }
285
261
  if (aborted)
286
262
  return;
287
263
  signal?.removeEventListener("abort", onAbort);
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/omk-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@earendil-works/omk-ai\";\nimport { Text } from \"@earendil-works/omk-tui\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { assertLoadoutAccess, type LoadoutAccessGuard } from \"../loadout-access-policy.ts\";\nimport type { ReadAnchorRegistry } from \"../read-anchor-registry.ts\";\nimport { createReadAnchor, type ReadAnchor } from \"../read-anchors.ts\";\nimport type { ReadContentCache } from \"../read-content-cache.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { getTextOutput, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n\treadAnchors?: readonly ReadAnchor[];\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n\t/** Optional per-session read-anchor registry for stale-edit protection. */\n\tanchorRegistry?: ReadAnchorRegistry;\n\t/** Optional deterministic read id factory. */\n\treadIdFactory?: () => string;\n\t/** Optional per-session content cache keyed by read-anchor file hash. */\n\tcontentCache?: ReadContentCache;\n\t/** Optional loadout access guard for scoped filesystem reads. */\n\taccessGuard?: LoadoutAccessGuard;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme, cwd: string): string {\n\tconst pathDisplay = renderToolPath(str(args?.file_path ?? args?.path), theme, cwd);\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction normalizeReadAnchorContent(content: string): string {\n\treturn content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getOmkDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getOmkDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\n\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\tconst anchorRegistry = options?.anchorRegistry;\n\tconst readIdFactory = options?.readIdFactory;\n\tconst contentCache = options?.contentCache;\n\tconst accessGuard = options?.accessGuard;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst readAnchors: ReadAnchor[] = [];\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(path, cwd);\n\t\t\t\t\t\t\tassertLoadoutAccess(accessGuard, { operation: \"read\", toolName: \"read\", path: absolutePath });\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\t// Check if file exists and is readable.\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage(buffer, mimeType);\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: buffer.toString(\"base64\"), mimeType },\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tif (anchorRegistry) {\n\t\t\t\t\t\t\t\t\tconst normalizedContent = normalizeReadAnchorContent(textContent);\n\t\t\t\t\t\t\t\t\tconst anchor = createReadAnchor({\n\t\t\t\t\t\t\t\t\t\tpath: absolutePath,\n\t\t\t\t\t\t\t\t\t\tcontent: textContent,\n\t\t\t\t\t\t\t\t\t\toffset,\n\t\t\t\t\t\t\t\t\t\tlimit,\n\t\t\t\t\t\t\t\t\t\treadId: readIdFactory?.(),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tanchorRegistry.register(anchor, normalizedContent);\n\t\t\t\t\t\t\t\t\tcontentCache?.set(anchor.fileSha256, normalizedContent, absolutePath);\n\t\t\t\t\t\t\t\t\treadAnchors.push(anchor);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (readAnchors.length > 0) {\n\t\t\t\t\t\t\t\tdetails = { ...details, readAnchors };\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details });\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification\n\t\t\t\t\t? formatCompactReadCall(classification, args, theme)\n\t\t\t\t\t: formatReadCall(args, theme, context.cwd),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/core/tools/read.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve as resolvePath, sep } from \"node:path\";\nimport { constants } from \"fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"fs/promises\";\nimport type { AgentTool } from \"omk-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"omk-ai\";\nimport { Text } from \"omk-tui\";\nimport { type Static, Type } from \"typebox\";\nimport { getReadmePath } from \"../../config.ts\";\nimport { keyHint, keyText } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { formatDimensionNote, resizeImage } from \"../../utils/image-resize.ts\";\nimport { detectSupportedImageMimeTypeFromFile } from \"../../utils/mime.ts\";\nimport { formatPathRelativeToCwdOrAbsolute } from \"../../utils/paths.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { resolveReadPathAsync, resolveToCwd } from \"./path-utils.ts\";\nimport { getTextOutput, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\nimport { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from \"./truncate.ts\";\n\nconst readSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to read (relative or absolute)\" }),\n\toffset: Type.Optional(Type.Number({ description: \"Line number to start reading from (1-indexed)\" })),\n\tlimit: Type.Optional(Type.Number({ description: \"Maximum number of lines to read\" })),\n});\n\nexport type ReadToolInput = Static<typeof readSchema>;\n\nexport interface ReadToolDetails {\n\ttruncation?: TruncationResult;\n}\n\ninterface CompactReadClassification {\n\tkind: \"docs\" | \"resource\" | \"skill\";\n\tlabel: string;\n}\n\nconst COMPACT_RESOURCE_FILE_NAMES = new Set([\"AGENTS.md\", \"AGENTS.MD\", \"CLAUDE.md\", \"CLAUDE.MD\"]);\n\n/**\n * Pluggable operations for the read tool.\n * Override these to delegate file reading to remote systems (for example SSH).\n */\nexport interface ReadOperations {\n\t/** Read file contents as a Buffer */\n\treadFile: (absolutePath: string) => Promise<Buffer>;\n\t/** Check if file is readable (throw if not) */\n\taccess: (absolutePath: string) => Promise<void>;\n\t/** Detect image MIME type, return null or undefined for non-images */\n\tdetectImageMimeType?: (absolutePath: string) => Promise<string | null | undefined>;\n}\n\nconst defaultReadOperations: ReadOperations = {\n\treadFile: (path) => fsReadFile(path),\n\taccess: (path) => fsAccess(path, constants.R_OK),\n\tdetectImageMimeType: detectSupportedImageMimeTypeFromFile,\n};\n\nexport interface ReadToolOptions {\n\t/** Whether to auto-resize images to 2000x2000 max. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Custom operations for file reading. Default: local filesystem */\n\toperations?: ReadOperations;\n\tcanReadPath?: (absolutePath: string) => boolean;\n}\n\ntype ReadRenderArgs = { path?: string; file_path?: string; offset?: number; limit?: number };\n\nfunction formatReadLineRange(args: ReadRenderArgs | undefined, theme: Theme): string {\n\tif (args?.offset === undefined && args?.limit === undefined) return \"\";\n\tconst startLine = args.offset ?? 1;\n\tconst endLine = args.limit !== undefined ? startLine + args.limit - 1 : \"\";\n\treturn theme.fg(\"warning\", `:${startLine}${endLine ? `-${endLine}` : \"\"}`);\n}\n\nfunction formatReadCall(args: ReadRenderArgs | undefined, theme: Theme, cwd: string): string {\n\tconst pathDisplay = renderToolPath(str(args?.file_path ?? args?.path), theme, cwd);\n\treturn `${theme.fg(\"toolTitle\", theme.bold(\"read\"))} ${pathDisplay}${formatReadLineRange(args, theme)}`;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction getNonVisionImageNote(model: Model<Api> | undefined): string | undefined {\n\tif (!model || model.input.includes(\"image\")) {\n\t\treturn undefined;\n\t}\n\treturn \"[Current model does not support images. The image will be omitted from this request.]\";\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction getOmkDocsClassification(absolutePath: string): CompactReadClassification | undefined {\n\tconst packageRoot = dirname(getReadmePath());\n\tconst relativePath = relative(resolvePath(packageRoot), resolvePath(absolutePath));\n\tif (\n\t\trelativePath === \"\" ||\n\t\trelativePath === \"..\" ||\n\t\trelativePath.startsWith(`..${sep}`) ||\n\t\tisAbsolute(relativePath)\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst label = toPosixPath(relativePath);\n\tif (label === \"README.md\" || label.startsWith(\"docs/\") || label.startsWith(\"examples/\")) {\n\t\treturn { kind: \"docs\", label };\n\t}\n\treturn undefined;\n}\n\nfunction getCompactReadClassification(\n\targs: ReadRenderArgs | undefined,\n\tcwd: string,\n): CompactReadClassification | undefined {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tif (!rawPath) return undefined;\n\n\tconst absolutePath = resolveToCwd(rawPath, cwd);\n\tconst fileName = basename(absolutePath);\n\tif (fileName === \"SKILL.md\") {\n\t\treturn { kind: \"skill\", label: basename(dirname(absolutePath)) || fileName };\n\t}\n\n\tconst docsClassification = getOmkDocsClassification(absolutePath);\n\tif (docsClassification) return docsClassification;\n\n\tif (COMPACT_RESOURCE_FILE_NAMES.has(fileName)) {\n\t\treturn { kind: \"resource\", label: formatPathRelativeToCwdOrAbsolute(absolutePath, cwd) };\n\t}\n\n\treturn undefined;\n}\n\nfunction formatCompactReadCall(\n\tclassification: CompactReadClassification,\n\targs: ReadRenderArgs | undefined,\n\ttheme: Theme,\n): string {\n\tconst expandHint = theme.fg(\"dim\", ` (${keyText(\"app.tools.expand\")} to expand)`);\n\tif (classification.kind === \"skill\") {\n\t\treturn (\n\t\t\ttheme.fg(\"customMessageLabel\", `\\x1b[1m[skill]\\x1b[22m `) +\n\t\t\ttheme.fg(\"customMessageText\", classification.label) +\n\t\t\tformatReadLineRange(args, theme) +\n\t\t\texpandHint\n\t\t);\n\t}\n\n\treturn (\n\t\ttheme.fg(\"toolTitle\", theme.bold(`read ${classification.kind}`)) +\n\t\t\" \" +\n\t\ttheme.fg(\"accent\", classification.label) +\n\t\tformatReadLineRange(args, theme) +\n\t\texpandHint\n\t);\n}\n\nfunction formatReadResult(\n\targs: ReadRenderArgs | undefined,\n\tresult: { content: (TextContent | ImageContent)[]; details?: ReadToolDetails },\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tshowImages: boolean,\n\t_cwd: string,\n\tisError: boolean,\n): string {\n\tif (!options.expanded && !isError) {\n\t\treturn \"\";\n\t}\n\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst output = getTextOutput(result, showImages);\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tconst renderedLines = lang ? highlightCode(replaceTabs(output), lang) : output.split(\"\\n\");\n\tconst lines = trimTrailingEmptyLines(renderedLines);\n\tconst maxLines = options.expanded ? lines.length : 10;\n\tconst displayLines = lines.slice(0, maxLines);\n\tconst remaining = lines.length - maxLines;\n\tlet text = `\\n${displayLines.map((line) => (lang ? replaceTabs(line) : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\tif (remaining > 0) {\n\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t}\n\n\tconst truncation = result.details?.truncation;\n\tif (truncation?.truncated) {\n\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[First line exceeds ${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit]`)}`;\n\t\t} else if (truncation.truncatedBy === \"lines\") {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines (${truncation.maxLines ?? DEFAULT_MAX_LINES} line limit)]`)}`;\n\t\t} else {\n\t\t\ttext += `\\n${theme.fg(\"warning\", `[Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)]`)}`;\n\t\t}\n\t}\n\treturn text;\n}\n\nexport function createReadToolDefinition(\n\tcwd: string,\n\toptions?: ReadToolOptions,\n): ToolDefinition<typeof readSchema, ReadToolDetails | undefined> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst ops = options?.operations ?? defaultReadOperations;\n\treturn {\n\t\tname: \"read\",\n\t\tlabel: \"read\",\n\t\tdescription: `Read the contents of a file. Supports text files and images (jpg, png, gif, webp). Images are sent as attachments. For text files, output is truncated to ${DEFAULT_MAX_LINES} lines or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Use offset/limit for large files. When you need the full file, continue with offset until complete.`,\n\t\tpromptSnippet: \"Read file contents\",\n\t\tpromptGuidelines: [\"Use read to examine files instead of cat or sed.\"],\n\t\tparameters: readSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, offset, limit }: { path: string; offset?: number; limit?: number },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\tctx?,\n\t\t) {\n\t\t\treturn new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(\n\t\t\t\t(resolve, reject) => {\n\t\t\t\t\tif (signal?.aborted) {\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet aborted = false;\n\t\t\t\t\tconst onAbort = () => {\n\t\t\t\t\t\taborted = true;\n\t\t\t\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\t\t\t};\n\t\t\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\t\t\t(async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst absolutePath = await resolveReadPathAsync(path, cwd);\n\t\t\t\t\t\t\tif (options?.canReadPath && !options.canReadPath(absolutePath)) {\n\t\t\t\t\t\t\t\tthrow new Error(`Read blocked by active loadout policy: ${path}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\t// Check if file exists and is readable.\n\t\t\t\t\t\t\tawait ops.access(absolutePath);\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tconst mimeType = ops.detectImageMimeType ? await ops.detectImageMimeType(absolutePath) : undefined;\n\t\t\t\t\t\t\tlet content: (TextContent | ImageContent)[];\n\t\t\t\t\t\t\tlet details: ReadToolDetails | undefined;\n\t\t\t\t\t\t\tconst nonVisionImageNote = getNonVisionImageNote(ctx?.model);\n\t\t\t\t\t\t\tif (mimeType) {\n\t\t\t\t\t\t\t\t// Read image as binary.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tif (autoResizeImages) {\n\t\t\t\t\t\t\t\t\t// Resize image if needed before sending it back to the model.\n\t\t\t\t\t\t\t\t\tconst resized = await resizeImage(buffer, mimeType);\n\t\t\t\t\t\t\t\t\tif (!resized) {\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]\\n[Image omitted: could not be resized below the inline image size limit.]`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: textNote }];\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${resized.mimeType}]`;\n\t\t\t\t\t\t\t\t\t\tif (dimensionNote) textNote += `\\n${dimensionNote}`;\n\t\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: resized.data, mimeType: resized.mimeType },\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tlet textNote = `Read image file [${mimeType}]`;\n\t\t\t\t\t\t\t\t\tif (nonVisionImageNote) textNote += `\\n${nonVisionImageNote}`;\n\t\t\t\t\t\t\t\t\tcontent = [\n\t\t\t\t\t\t\t\t\t\t{ type: \"text\", text: textNote },\n\t\t\t\t\t\t\t\t\t\t{ type: \"image\", data: buffer.toString(\"base64\"), mimeType },\n\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Read text content.\n\t\t\t\t\t\t\t\tconst buffer = await ops.readFile(absolutePath);\n\t\t\t\t\t\t\t\tconst textContent = buffer.toString(\"utf-8\");\n\t\t\t\t\t\t\t\tconst allLines = textContent.split(\"\\n\");\n\t\t\t\t\t\t\t\tconst totalFileLines = allLines.length;\n\t\t\t\t\t\t\t\t// Apply offset if specified. Convert from 1-indexed input to 0-indexed array access.\n\t\t\t\t\t\t\t\tconst startLine = offset ? Math.max(0, offset - 1) : 0;\n\t\t\t\t\t\t\t\tconst startLineDisplay = startLine + 1;\n\t\t\t\t\t\t\t\t// Check if offset is out of bounds.\n\t\t\t\t\t\t\t\tif (startLine >= allLines.length) {\n\t\t\t\t\t\t\t\t\tthrow new Error(`Offset ${offset} is beyond end of file (${allLines.length} lines total)`);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet selectedContent: string;\n\t\t\t\t\t\t\t\tlet userLimitedLines: number | undefined;\n\t\t\t\t\t\t\t\t// If limit is specified by the user, honor it first. Otherwise truncateHead decides.\n\t\t\t\t\t\t\t\tif (limit !== undefined) {\n\t\t\t\t\t\t\t\t\tconst endLine = Math.min(startLine + limit, allLines.length);\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine, endLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t\tuserLimitedLines = endLine - startLine;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tselectedContent = allLines.slice(startLine).join(\"\\n\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Apply truncation, respecting both line and byte limits.\n\t\t\t\t\t\t\t\tconst truncation = truncateHead(selectedContent);\n\t\t\t\t\t\t\t\tlet outputText: string;\n\t\t\t\t\t\t\t\tif (truncation.firstLineExceedsLimit) {\n\t\t\t\t\t\t\t\t\t// First line alone exceeds the byte limit. Point the model at a bash fallback.\n\t\t\t\t\t\t\t\t\tconst firstLineSize = formatSize(Buffer.byteLength(allLines[startLine], \"utf-8\"));\n\t\t\t\t\t\t\t\t\toutputText = `[Line ${startLineDisplay} is ${firstLineSize}, exceeds ${formatSize(DEFAULT_MAX_BYTES)} limit. Use bash: sed -n '${startLineDisplay}p' ${path} | head -c ${DEFAULT_MAX_BYTES}]`;\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (truncation.truncated) {\n\t\t\t\t\t\t\t\t\t// Truncation occurred. Build an actionable continuation notice.\n\t\t\t\t\t\t\t\t\tconst endLineDisplay = startLineDisplay + truncation.outputLines - 1;\n\t\t\t\t\t\t\t\t\tconst nextOffset = endLineDisplay + 1;\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t\tif (truncation.truncatedBy === \"lines\") {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines}. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\toutputText += `\\n\\n[Showing lines ${startLineDisplay}-${endLineDisplay} of ${totalFileLines} (${formatSize(DEFAULT_MAX_BYTES)} limit). Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdetails = { truncation };\n\t\t\t\t\t\t\t\t} else if (userLimitedLines !== undefined && startLine + userLimitedLines < allLines.length) {\n\t\t\t\t\t\t\t\t\t// User-specified limit stopped early, but the file still has more content.\n\t\t\t\t\t\t\t\t\tconst remaining = allLines.length - (startLine + userLimitedLines);\n\t\t\t\t\t\t\t\t\tconst nextOffset = startLine + userLimitedLines + 1;\n\t\t\t\t\t\t\t\t\toutputText = `${truncation.content}\\n\\n[${remaining} more lines in file. Use offset=${nextOffset} to continue.]`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// No truncation and no remaining user-limited content.\n\t\t\t\t\t\t\t\t\toutputText = truncation.content;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tcontent = [{ type: \"text\", text: outputText }];\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (aborted) return;\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tresolve({ content, details });\n\t\t\t\t\t\t} catch (error: any) {\n\t\t\t\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\t\t\t\tif (!aborted) reject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t);\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\tconst classification = !context.expanded ? getCompactReadClassification(args, context.cwd) : undefined;\n\t\t\ttext.setText(\n\t\t\t\tclassification\n\t\t\t\t\t? formatCompactReadCall(classification, args, theme)\n\t\t\t\t\t: formatReadCall(args, theme, context.cwd),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(\n\t\t\t\tformatReadResult(context.args, result, options, theme, context.showImages, context.cwd, context.isError),\n\t\t\t);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createReadTool(cwd: string, options?: ReadToolOptions): AgentTool<typeof readSchema> {\n\treturn wrapToolDefinition(createReadToolDefinition(cwd, options));\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ImageContent, TextContent } from "@earendil-works/omk-ai";
1
+ import type { ImageContent, TextContent } from "omk-ai";
2
2
  import type { Theme } from "../../modes/interactive/theme/theme.ts";
3
3
  export declare function shortenPath(path: unknown): string;
4
4
  export declare function linkPath(styledText: string, rawPath: string, cwd: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAExE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAKpE,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAC5B,MAAM,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,SAAS,EACzG,UAAU,EAAE,OAAO,GACjB,MAAM,CAsBR;AAED,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IAC5C,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD;AAED,wBAAgB,cAAc,CAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CAKR","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"@earendil-works/omk-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"@earendil-works/omk-tui\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n"]}
1
+ {"version":3,"file":"render-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAKpE,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOjD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,aAAa,CAC5B,MAAM,EAAE;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,SAAS,EACzG,UAAU,EAAE,OAAO,GACjB,MAAM,CAsBR;AAED,MAAM,MAAM,oBAAoB,CAAC,QAAQ,IAAI;IAC5C,OAAO,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACxC,OAAO,EAAE,QAAQ,CAAC;CAClB,CAAC;AAEF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAEnD;AAED,wBAAgB,cAAc,CAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC,MAAM,CAKR","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"omk-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"omk-tui\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import * as os from "node:os";
2
2
  import { pathToFileURL } from "node:url";
3
- import { getCapabilities, getImageDimensions, hyperlink, imageFallback } from "@earendil-works/omk-tui";
3
+ import { getCapabilities, getImageDimensions, hyperlink, imageFallback } from "omk-tui";
4
4
  import { stripAnsi } from "../../utils/ansi.js";
5
5
  import { resolvePath } from "../../utils/paths.js";
6
6
  import { sanitizeBinaryOutput } from "../../utils/shell.js";
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"@earendil-works/omk-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"@earendil-works/omk-tui\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n"]}
1
+ {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"omk-ai\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"omk-tui\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { stripAnsi } from \"../../utils/ansi.ts\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: Theme): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: Theme,\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { AgentTool } from "@earendil-works/omk-agent-core";
1
+ import type { AgentTool } from "omk-agent-core";
2
2
  import type { ExtensionContext, ToolDefinition } from "../extensions/types.ts";
3
3
  /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
4
4
  export declare function wrapToolDefinition<TDetails = unknown>(definition: ToolDefinition<any, TDetails>, ctxFactory?: () => ExtensionContext): AgentTool<any, TDetails>;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACpD,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAW1B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACvC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,CAAC,EAAE,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAUpG","sourcesContent":["import type { AgentTool } from \"@earendil-works/omk-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE/E,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,QAAQ,GAAG,OAAO,EACpD,UAAU,EAAE,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,EACzC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAW1B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACvC,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,GAAG,CAAC,EAAE,CAElB;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAUpG","sourcesContent":["import type { AgentTool } from \"omk-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAAyC,EACzC,UAAmC,EACR;IAC3B,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CACjD,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAsB,CAAC;KAC7F,CAAC;AAAA,CACF;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAAuC,EACvC,UAAmC,EAChB;IACnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,CACnF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB,EAAgC;IACrG,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAiB;QAClC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3G,CAAC;AAAA,CACF","sourcesContent":["import type { AgentTool } from \"@earendil-works/omk-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAGA,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAAyC,EACzC,UAAmC,EACR;IAC3B,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CACjD,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAsB,CAAC;KAC7F,CAAC;AAAA,CACF;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAAuC,EACvC,UAAmC,EAChB;IACnB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AAAA,CACnF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,IAAoB,EAAgC;IACrG,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAiB;QAClC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;KAC3G,CAAC;AAAA,CACF","sourcesContent":["import type { AgentTool } from \"omk-agent-core\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TDetails = unknown>(\n\tdefinition: ToolDefinition<any, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\tprepareArguments: definition.prepareArguments,\n\t\texecutionMode: definition.executionMode,\n\t\texecute: (toolCallId, params, signal, onUpdate) =>\n\t\t\tdefinition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<any, any>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<any>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool(tool: AgentTool<any>): ToolDefinition<any, unknown> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters as any,\n\t\tprepareArguments: tool.prepareArguments,\n\t\texecutionMode: tool.executionMode,\n\t\texecute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate),\n\t};\n}\n"]}
@@ -1,7 +1,6 @@
1
- import type { AgentTool } from "@earendil-works/omk-agent-core";
1
+ import type { AgentTool } from "omk-agent-core";
2
2
  import { type Static, Type } from "typebox";
3
3
  import type { ToolDefinition } from "../extensions/types.ts";
4
- import { type LoadoutAccessGuard } from "../loadout-access-policy.ts";
5
4
  declare const writeSchema: Type.TObject<{
6
5
  path: Type.TString;
7
6
  content: Type.TString;
@@ -20,8 +19,7 @@ export interface WriteOperations {
20
19
  export interface WriteToolOptions {
21
20
  /** Custom operations for file writing. Default: local filesystem */
22
21
  operations?: WriteOperations;
23
- /** Optional loadout access guard for scoped filesystem writes. */
24
- accessGuard?: LoadoutAccessGuard;
22
+ canWritePath?: (absolutePath: string) => boolean;
25
23
  }
26
24
  export declare function createWriteToolDefinition(cwd: string, options?: WriteToolOptions): ToolDefinition<typeof writeSchema, undefined>;
27
25
  export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAIhE,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAM3F,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,mCAAmC;IACnC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAOD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,kEAAkE;IAClE,WAAW,CAAC,EAAE,kBAAkB,CAAC;CACjC;AA6ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,SAAS,CAAC,CAiF/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG","sourcesContent":["import type { AgentTool } from \"@earendil-works/omk-agent-core\";\nimport { Container, Text } from \"@earendil-works/omk-tui\";\nimport { mkdir as fsMkdir, writeFile as fsWriteFile } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { assertLoadoutAccess, type LoadoutAccessGuard } from \"../loadout-access-policy.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst writeSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\n\tcontent: Type.String({ description: \"Content to write to the file\" }),\n});\n\nexport type WriteToolInput = Static<typeof writeSchema>;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n\t/** Write content to a file */\n\twriteFile: (absolutePath: string, content: string) => Promise<void>;\n\t/** Create directory recursively */\n\tmkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n\twriteFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n\t/** Custom operations for file writing. Default: local filesystem */\n\toperations?: WriteOperations;\n\t/** Optional loadout access guard for scoped filesystem writes. */\n\taccessGuard?: LoadoutAccessGuard;\n}\n\ntype WriteHighlightCache = {\n\trawPath: string | null;\n\tlang: string;\n\trawContent: string;\n\tnormalizedLines: string[];\n\thighlightedLines: string[];\n};\n\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\n\nconst WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;\n\nfunction highlightSingleLine(line: string, lang: string): string {\n\tconst highlighted = highlightCode(line, lang);\n\treturn highlighted[0] ?? \"\";\n}\n\nfunction refreshWriteHighlightPrefix(cache: WriteHighlightCache): void {\n\tconst prefixCount = Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES, cache.normalizedLines.length);\n\tif (prefixCount === 0) return;\n\tconst prefixSource = cache.normalizedLines.slice(0, prefixCount).join(\"\\n\");\n\tconst prefixHighlighted = highlightCode(prefixSource, cache.lang);\n\tfor (let i = 0; i < prefixCount; i++) {\n\t\tcache.highlightedLines[i] =\n\t\t\tprefixHighlighted[i] ?? highlightSingleLine(cache.normalizedLines[i] ?? \"\", cache.lang);\n\t}\n}\n\nfunction rebuildWriteHighlightCacheFull(rawPath: string | null, fileContent: string): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tconst displayContent = normalizeDisplayText(fileContent);\n\tconst normalized = replaceTabs(displayContent);\n\treturn {\n\t\trawPath,\n\t\tlang,\n\t\trawContent: fileContent,\n\t\tnormalizedLines: normalized.split(\"\\n\"),\n\t\thighlightedLines: highlightCode(normalized, lang),\n\t};\n}\n\nfunction updateWriteHighlightCacheIncremental(\n\tcache: WriteHighlightCache | undefined,\n\trawPath: string | null,\n\tfileContent: string,\n): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tif (!cache) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (cache.lang !== lang || cache.rawPath !== rawPath) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (!fileContent.startsWith(cache.rawContent)) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (fileContent.length === cache.rawContent.length) return cache;\n\n\tconst deltaRaw = fileContent.slice(cache.rawContent.length);\n\tconst deltaDisplay = normalizeDisplayText(deltaRaw);\n\tconst deltaNormalized = replaceTabs(deltaDisplay);\n\tcache.rawContent = fileContent;\n\tif (cache.normalizedLines.length === 0) {\n\t\tcache.normalizedLines.push(\"\");\n\t\tcache.highlightedLines.push(\"\");\n\t}\n\n\tconst segments = deltaNormalized.split(\"\\n\");\n\tconst lastIndex = cache.normalizedLines.length - 1;\n\tcache.normalizedLines[lastIndex] += segments[0];\n\tcache.highlightedLines[lastIndex] = highlightSingleLine(cache.normalizedLines[lastIndex], cache.lang);\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tcache.normalizedLines.push(segments[i]);\n\t\tcache.highlightedLines.push(highlightSingleLine(segments[i], cache.lang));\n\t}\n\trefreshWriteHighlightPrefix(cache);\n\treturn cache;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (fileContent === null) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst renderedLines = lang\n\t\t\t? (cache?.highlightedLines ?? highlightCode(replaceTabs(normalizeDisplayText(fileContent)), lang))\n\t\t\t: normalizeDisplayText(fileContent).split(\"\\n\");\n\t\tconst lines = trimTrailingEmptyLines(renderedLines);\n\t\tconst totalLines = lines.length;\n\t\tconst maxLines = options.expanded ? lines.length : 10;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${totalLines} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\treturn text;\n}\n\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport function createWriteToolDefinition(\n\tcwd: string,\n\toptions?: WriteToolOptions,\n): ToolDefinition<typeof writeSchema, undefined> {\n\tconst ops = options?.operations ?? defaultWriteOperations;\n\tconst accessGuard = options?.accessGuard;\n\treturn {\n\t\tname: \"write\",\n\t\tlabel: \"write\",\n\t\tdescription:\n\t\t\t\"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\n\t\tpromptSnippet: \"Create or overwrite files\",\n\t\tpromptGuidelines: [\"Use write only for new files or complete rewrites.\"],\n\t\tparameters: writeSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, content }: { path: string; content: string },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t) {\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\n\t\t\tassertLoadoutAccess(accessGuard, { operation: \"write\", toolName: \"write\", path: absolutePath });\n\t\t\tconst dir = dirname(absolutePath);\n\t\t\treturn withFileMutationQueue(absolutePath, async () => {\n\t\t\t\t// Do not reject from an abort event listener here: that would release the\n\t\t\t\t// mutation queue while an in-flight filesystem operation may still finish.\n\t\t\t\t// Checking signal.aborted after each await observes the same aborts while\n\t\t\t\t// keeping the queue locked until the current operation has settled.\n\t\t\t\tconst throwIfAborted = (): void => {\n\t\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\t};\n\n\t\t\t\tthrowIfAborted();\n\t\t\t\t// Create parent directories if needed.\n\t\t\t\tawait ops.mkdir(dir);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\t// Write the file contents.\n\t\t\t\tawait ops.writeFile(absolutePath, content);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Successfully wrote ${content.length} bytes to ${path}` }],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst renderArgs = args as { path?: string; file_path?: string; content?: string } | undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst fileContent = str(renderArgs?.content);\n\t\t\tconst component =\n\t\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\t\tif (fileContent !== null) {\n\t\t\t\tcomponent.cache = context.argsComplete\n\t\t\t\t\t? rebuildWriteHighlightCacheFull(rawPath, fileContent)\n\t\t\t\t\t: updateWriteHighlightCacheIncremental(component.cache, rawPath, fileContent);\n\t\t\t} else {\n\t\t\t\tcomponent.cache = undefined;\n\t\t\t}\n\t\t\tcomponent.setText(\n\t\t\t\tformatWriteCall(\n\t\t\t\t\trenderArgs,\n\t\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\t\ttheme,\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn component;\n\t\t},\n\t\trenderResult(result, _options, theme, context) {\n\t\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\t\tif (!output) {\n\t\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\t\tcomponent.clear();\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(output);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\n\treturn wrapToolDefinition(createWriteToolDefinition(cwd, options));\n}\n"]}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/core/tools/write.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,wBAAwB,CAAC;AAMtF,QAAA,MAAM,WAAW;;;EAGf,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AAExD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,SAAS,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,mCAAmC;IACnC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAOD,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AA6ID,wBAAgB,yBAAyB,CACxC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,gBAAgB,GACxB,cAAc,CAAC,OAAO,WAAW,EAAE,SAAS,CAAC,CAkF/C;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,OAAO,WAAW,CAAC,CAEtG","sourcesContent":["import { mkdir as fsMkdir, writeFile as fsWriteFile } from \"fs/promises\";\nimport type { AgentTool } from \"omk-agent-core\";\nimport { Container, Text } from \"omk-tui\";\nimport { dirname } from \"path\";\nimport { type Static, Type } from \"typebox\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport { getLanguageFromPath, highlightCode, type Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport type { ToolDefinition, ToolRenderResultOptions } from \"../extensions/types.ts\";\nimport { withFileMutationQueue } from \"./file-mutation-queue.ts\";\nimport { resolveToCwd } from \"./path-utils.ts\";\nimport { normalizeDisplayText, renderToolPath, replaceTabs, str } from \"./render-utils.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst writeSchema = Type.Object({\n\tpath: Type.String({ description: \"Path to the file to write (relative or absolute)\" }),\n\tcontent: Type.String({ description: \"Content to write to the file\" }),\n});\n\nexport type WriteToolInput = Static<typeof writeSchema>;\n\n/**\n * Pluggable operations for the write tool.\n * Override these to delegate file writing to remote systems (for example SSH).\n */\nexport interface WriteOperations {\n\t/** Write content to a file */\n\twriteFile: (absolutePath: string, content: string) => Promise<void>;\n\t/** Create directory recursively */\n\tmkdir: (dir: string) => Promise<void>;\n}\n\nconst defaultWriteOperations: WriteOperations = {\n\twriteFile: (path, content) => fsWriteFile(path, content, \"utf-8\"),\n\tmkdir: (dir) => fsMkdir(dir, { recursive: true }).then(() => {}),\n};\n\nexport interface WriteToolOptions {\n\t/** Custom operations for file writing. Default: local filesystem */\n\toperations?: WriteOperations;\n\tcanWritePath?: (absolutePath: string) => boolean;\n}\n\ntype WriteHighlightCache = {\n\trawPath: string | null;\n\tlang: string;\n\trawContent: string;\n\tnormalizedLines: string[];\n\thighlightedLines: string[];\n};\n\nclass WriteCallRenderComponent extends Text {\n\tcache?: WriteHighlightCache;\n\n\tconstructor() {\n\t\tsuper(\"\", 0, 0);\n\t}\n}\n\nconst WRITE_PARTIAL_FULL_HIGHLIGHT_LINES = 50;\n\nfunction highlightSingleLine(line: string, lang: string): string {\n\tconst highlighted = highlightCode(line, lang);\n\treturn highlighted[0] ?? \"\";\n}\n\nfunction refreshWriteHighlightPrefix(cache: WriteHighlightCache): void {\n\tconst prefixCount = Math.min(WRITE_PARTIAL_FULL_HIGHLIGHT_LINES, cache.normalizedLines.length);\n\tif (prefixCount === 0) return;\n\tconst prefixSource = cache.normalizedLines.slice(0, prefixCount).join(\"\\n\");\n\tconst prefixHighlighted = highlightCode(prefixSource, cache.lang);\n\tfor (let i = 0; i < prefixCount; i++) {\n\t\tcache.highlightedLines[i] =\n\t\t\tprefixHighlighted[i] ?? highlightSingleLine(cache.normalizedLines[i] ?? \"\", cache.lang);\n\t}\n}\n\nfunction rebuildWriteHighlightCacheFull(rawPath: string | null, fileContent: string): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tconst displayContent = normalizeDisplayText(fileContent);\n\tconst normalized = replaceTabs(displayContent);\n\treturn {\n\t\trawPath,\n\t\tlang,\n\t\trawContent: fileContent,\n\t\tnormalizedLines: normalized.split(\"\\n\"),\n\t\thighlightedLines: highlightCode(normalized, lang),\n\t};\n}\n\nfunction updateWriteHighlightCacheIncremental(\n\tcache: WriteHighlightCache | undefined,\n\trawPath: string | null,\n\tfileContent: string,\n): WriteHighlightCache | undefined {\n\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\tif (!lang) return undefined;\n\tif (!cache) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (cache.lang !== lang || cache.rawPath !== rawPath) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (!fileContent.startsWith(cache.rawContent)) return rebuildWriteHighlightCacheFull(rawPath, fileContent);\n\tif (fileContent.length === cache.rawContent.length) return cache;\n\n\tconst deltaRaw = fileContent.slice(cache.rawContent.length);\n\tconst deltaDisplay = normalizeDisplayText(deltaRaw);\n\tconst deltaNormalized = replaceTabs(deltaDisplay);\n\tcache.rawContent = fileContent;\n\tif (cache.normalizedLines.length === 0) {\n\t\tcache.normalizedLines.push(\"\");\n\t\tcache.highlightedLines.push(\"\");\n\t}\n\n\tconst segments = deltaNormalized.split(\"\\n\");\n\tconst lastIndex = cache.normalizedLines.length - 1;\n\tcache.normalizedLines[lastIndex] += segments[0];\n\tcache.highlightedLines[lastIndex] = highlightSingleLine(cache.normalizedLines[lastIndex], cache.lang);\n\tfor (let i = 1; i < segments.length; i++) {\n\t\tcache.normalizedLines.push(segments[i]);\n\t\tcache.highlightedLines.push(highlightSingleLine(segments[i], cache.lang));\n\t}\n\trefreshWriteHighlightPrefix(cache);\n\treturn cache;\n}\n\nfunction trimTrailingEmptyLines(lines: string[]): string[] {\n\tlet end = lines.length;\n\twhile (end > 0 && lines[end - 1] === \"\") {\n\t\tend--;\n\t}\n\treturn lines.slice(0, end);\n}\n\nfunction formatWriteCall(\n\targs: { path?: string; file_path?: string; content?: string } | undefined,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcache: WriteHighlightCache | undefined,\n\tcwd: string,\n): string {\n\tconst rawPath = str(args?.file_path ?? args?.path);\n\tconst fileContent = str(args?.content);\n\tconst pathDisplay = renderToolPath(rawPath, theme, cwd);\n\tlet text = `${theme.fg(\"toolTitle\", theme.bold(\"write\"))} ${pathDisplay}`;\n\n\tif (fileContent === null) {\n\t\ttext += `\\n\\n${theme.fg(\"error\", \"[invalid content arg - expected string]\")}`;\n\t} else if (fileContent) {\n\t\tconst lang = rawPath ? getLanguageFromPath(rawPath) : undefined;\n\t\tconst renderedLines = lang\n\t\t\t? (cache?.highlightedLines ?? highlightCode(replaceTabs(normalizeDisplayText(fileContent)), lang))\n\t\t\t: normalizeDisplayText(fileContent).split(\"\\n\");\n\t\tconst lines = trimTrailingEmptyLines(renderedLines);\n\t\tconst totalLines = lines.length;\n\t\tconst maxLines = options.expanded ? lines.length : 10;\n\t\tconst displayLines = lines.slice(0, maxLines);\n\t\tconst remaining = lines.length - maxLines;\n\t\ttext += `\\n\\n${displayLines.map((line) => (lang ? line : theme.fg(\"toolOutput\", replaceTabs(line)))).join(\"\\n\")}`;\n\t\tif (remaining > 0) {\n\t\t\ttext += `${theme.fg(\"muted\", `\\n... (${remaining} more lines, ${totalLines} total,`)} ${keyHint(\"app.tools.expand\", \"to expand\")})`;\n\t\t}\n\t}\n\n\treturn text;\n}\n\nfunction formatWriteResult(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }>; isError?: boolean },\n\ttheme: Theme,\n): string | undefined {\n\tif (!result.isError) {\n\t\treturn undefined;\n\t}\n\tconst output = result.content\n\t\t.filter((c) => c.type === \"text\")\n\t\t.map((c) => c.text || \"\")\n\t\t.join(\"\\n\");\n\tif (!output) {\n\t\treturn undefined;\n\t}\n\treturn `\\n${theme.fg(\"error\", output)}`;\n}\n\nexport function createWriteToolDefinition(\n\tcwd: string,\n\toptions?: WriteToolOptions,\n): ToolDefinition<typeof writeSchema, undefined> {\n\tconst ops = options?.operations ?? defaultWriteOperations;\n\treturn {\n\t\tname: \"write\",\n\t\tlabel: \"write\",\n\t\tdescription:\n\t\t\t\"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Automatically creates parent directories.\",\n\t\tpromptSnippet: \"Create or overwrite files\",\n\t\tpromptGuidelines: [\"Use write only for new files or complete rewrites.\"],\n\t\tparameters: writeSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ path, content }: { path: string; content: string },\n\t\t\tsignal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t) {\n\t\t\tconst absolutePath = resolveToCwd(path, cwd);\n\t\t\tif (options?.canWritePath && !options.canWritePath(absolutePath)) {\n\t\t\t\tthrow new Error(`Write blocked by active loadout policy: ${path}`);\n\t\t\t}\n\t\t\tconst dir = dirname(absolutePath);\n\t\t\treturn withFileMutationQueue(absolutePath, async () => {\n\t\t\t\t// Do not reject from an abort event listener here: that would release the\n\t\t\t\t// mutation queue while an in-flight filesystem operation may still finish.\n\t\t\t\t// Checking signal.aborted after each await observes the same aborts while\n\t\t\t\t// keeping the queue locked until the current operation has settled.\n\t\t\t\tconst throwIfAborted = (): void => {\n\t\t\t\t\tif (signal?.aborted) throw new Error(\"Operation aborted\");\n\t\t\t\t};\n\n\t\t\t\tthrowIfAborted();\n\t\t\t\t// Create parent directories if needed.\n\t\t\t\tawait ops.mkdir(dir);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\t// Write the file contents.\n\t\t\t\tawait ops.writeFile(absolutePath, content);\n\t\t\t\tthrowIfAborted();\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Successfully wrote ${content.length} bytes to ${path}` }],\n\t\t\t\t\tdetails: undefined,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\trenderCall(args, theme, context) {\n\t\t\tconst renderArgs = args as { path?: string; file_path?: string; content?: string } | undefined;\n\t\t\tconst rawPath = str(renderArgs?.file_path ?? renderArgs?.path);\n\t\t\tconst fileContent = str(renderArgs?.content);\n\t\t\tconst component =\n\t\t\t\t(context.lastComponent as WriteCallRenderComponent | undefined) ?? new WriteCallRenderComponent();\n\t\t\tif (fileContent !== null) {\n\t\t\t\tcomponent.cache = context.argsComplete\n\t\t\t\t\t? rebuildWriteHighlightCacheFull(rawPath, fileContent)\n\t\t\t\t\t: updateWriteHighlightCacheIncremental(component.cache, rawPath, fileContent);\n\t\t\t} else {\n\t\t\t\tcomponent.cache = undefined;\n\t\t\t}\n\t\t\tcomponent.setText(\n\t\t\t\tformatWriteCall(\n\t\t\t\t\trenderArgs,\n\t\t\t\t\t{ expanded: context.expanded, isPartial: context.isPartial },\n\t\t\t\t\ttheme,\n\t\t\t\t\tcomponent.cache,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn component;\n\t\t},\n\t\trenderResult(result, _options, theme, context) {\n\t\t\tconst output = formatWriteResult({ ...result, isError: context.isError }, theme);\n\t\t\tif (!output) {\n\t\t\t\tconst component = (context.lastComponent as Container | undefined) ?? new Container();\n\t\t\t\tcomponent.clear();\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\tconst text = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\t\ttext.setText(output);\n\t\t\treturn text;\n\t\t},\n\t};\n}\n\nexport function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema> {\n\treturn wrapToolDefinition(createWriteToolDefinition(cwd, options));\n}\n"]}
@@ -1,10 +1,9 @@
1
- import { Container, Text } from "@earendil-works/omk-tui";
2
1
  import { mkdir as fsMkdir, writeFile as fsWriteFile } from "fs/promises";
2
+ import { Container, Text } from "omk-tui";
3
3
  import { dirname } from "path";
4
4
  import { Type } from "typebox";
5
5
  import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
6
6
  import { getLanguageFromPath, highlightCode } from "../../modes/interactive/theme/theme.js";
7
- import { assertLoadoutAccess } from "../loadout-access-policy.js";
8
7
  import { withFileMutationQueue } from "./file-mutation-queue.js";
9
8
  import { resolveToCwd } from "./path-utils.js";
10
9
  import { normalizeDisplayText, renderToolPath, replaceTabs, str } from "./render-utils.js";
@@ -131,7 +130,6 @@ function formatWriteResult(result, theme) {
131
130
  }
132
131
  export function createWriteToolDefinition(cwd, options) {
133
132
  const ops = options?.operations ?? defaultWriteOperations;
134
- const accessGuard = options?.accessGuard;
135
133
  return {
136
134
  name: "write",
137
135
  label: "write",
@@ -141,7 +139,9 @@ export function createWriteToolDefinition(cwd, options) {
141
139
  parameters: writeSchema,
142
140
  async execute(_toolCallId, { path, content }, signal, _onUpdate, _ctx) {
143
141
  const absolutePath = resolveToCwd(path, cwd);
144
- assertLoadoutAccess(accessGuard, { operation: "write", toolName: "write", path: absolutePath });
142
+ if (options?.canWritePath && !options.canWritePath(absolutePath)) {
143
+ throw new Error(`Write blocked by active loadout policy: ${path}`);
144
+ }
145
145
  const dir = dirname(absolutePath);
146
146
  return withFileMutationQueue(absolutePath, async () => {
147
147
  // Do not reject from an abort event listener here: that would release the