@cleocode/core 2026.6.12 → 2026.6.13

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 (385) hide show
  1. package/dist/conduit/local-transport.d.ts +12 -0
  2. package/dist/conduit/local-transport.d.ts.map +1 -1
  3. package/dist/conduit/local-transport.js +53 -23
  4. package/dist/conduit/local-transport.js.map +1 -1
  5. package/dist/crypto/credentials.d.ts +37 -0
  6. package/dist/crypto/credentials.d.ts.map +1 -1
  7. package/dist/crypto/credentials.js +110 -0
  8. package/dist/crypto/credentials.js.map +1 -1
  9. package/dist/dispatch/contracts/derive-output-contract.d.ts +86 -0
  10. package/dist/dispatch/contracts/derive-output-contract.d.ts.map +1 -0
  11. package/dist/dispatch/contracts/derive-output-contract.js +347 -0
  12. package/dist/dispatch/contracts/derive-output-contract.js.map +1 -0
  13. package/dist/dispatch/contracts/ensures-schema.d.ts +77 -0
  14. package/dist/dispatch/contracts/ensures-schema.d.ts.map +1 -0
  15. package/dist/dispatch/contracts/ensures-schema.js +91 -0
  16. package/dist/dispatch/contracts/ensures-schema.js.map +1 -0
  17. package/dist/dispatch/contracts/output-contracts.d.ts +27 -5
  18. package/dist/dispatch/contracts/output-contracts.d.ts.map +1 -1
  19. package/dist/dispatch/contracts/output-contracts.js +29 -6
  20. package/dist/dispatch/contracts/output-contracts.js.map +1 -1
  21. package/dist/docs/export-document.js +2294 -1250
  22. package/dist/docs/export-document.js.map +3 -3
  23. package/dist/go/driver.d.ts +132 -7
  24. package/dist/go/driver.d.ts.map +1 -1
  25. package/dist/go/driver.js +135 -10
  26. package/dist/go/driver.js.map +1 -1
  27. package/dist/go/index.d.ts +1 -1
  28. package/dist/go/index.d.ts.map +1 -1
  29. package/dist/go/index.js +1 -1
  30. package/dist/go/index.js.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +5 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/internal.d.ts +13 -10
  36. package/dist/internal.d.ts.map +1 -1
  37. package/dist/internal.js +11 -11
  38. package/dist/internal.js.map +1 -1
  39. package/dist/lifecycle/engine-ops.d.ts.map +1 -1
  40. package/dist/lifecycle/engine-ops.js +7 -4
  41. package/dist/lifecycle/engine-ops.js.map +1 -1
  42. package/dist/lifecycle/ivtr-loop.d.ts +108 -183
  43. package/dist/lifecycle/ivtr-loop.d.ts.map +1 -1
  44. package/dist/lifecycle/ivtr-loop.js +207 -522
  45. package/dist/lifecycle/ivtr-loop.js.map +1 -1
  46. package/dist/llm/auxiliary-fallback.js +1 -1
  47. package/dist/llm/auxiliary-fallback.js.map +1 -1
  48. package/dist/llm/cli-ops.d.ts +14 -1
  49. package/dist/llm/cli-ops.d.ts.map +1 -1
  50. package/dist/llm/cli-ops.js +41 -12
  51. package/dist/llm/cli-ops.js.map +1 -1
  52. package/dist/llm/concrete-session.d.ts.map +1 -1
  53. package/dist/llm/concrete-session.js +4 -0
  54. package/dist/llm/concrete-session.js.map +1 -1
  55. package/dist/llm/credentials.d.ts +35 -0
  56. package/dist/llm/credentials.d.ts.map +1 -1
  57. package/dist/llm/credentials.js +49 -0
  58. package/dist/llm/credentials.js.map +1 -1
  59. package/dist/llm/index.d.ts +4 -0
  60. package/dist/llm/index.d.ts.map +1 -1
  61. package/dist/llm/index.js +4 -0
  62. package/dist/llm/index.js.map +1 -1
  63. package/dist/llm/pi/gondolin-loader.d.ts +241 -0
  64. package/dist/llm/pi/gondolin-loader.d.ts.map +1 -0
  65. package/dist/llm/pi/gondolin-loader.js +195 -0
  66. package/dist/llm/pi/gondolin-loader.js.map +1 -0
  67. package/dist/llm/pi/index.d.ts +28 -0
  68. package/dist/llm/pi/index.d.ts.map +1 -0
  69. package/dist/llm/pi/index.js +27 -0
  70. package/dist/llm/pi/index.js.map +1 -0
  71. package/dist/llm/pi/pi-agent-adapter.d.ts +135 -0
  72. package/dist/llm/pi/pi-agent-adapter.d.ts.map +1 -0
  73. package/dist/llm/pi/pi-agent-adapter.js +329 -0
  74. package/dist/llm/pi/pi-agent-adapter.js.map +1 -0
  75. package/dist/llm/pi/pi-errors.d.ts +161 -0
  76. package/dist/llm/pi/pi-errors.d.ts.map +1 -0
  77. package/dist/llm/pi/pi-errors.js +296 -0
  78. package/dist/llm/pi/pi-errors.js.map +1 -0
  79. package/dist/llm/pi/pi-execution-env.d.ts +286 -0
  80. package/dist/llm/pi/pi-execution-env.d.ts.map +1 -0
  81. package/dist/llm/pi/pi-execution-env.js +406 -0
  82. package/dist/llm/pi/pi-execution-env.js.map +1 -0
  83. package/dist/llm/pi/pi-gondolin-env.d.ts +227 -0
  84. package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -0
  85. package/dist/llm/pi/pi-gondolin-env.js +541 -0
  86. package/dist/llm/pi/pi-gondolin-env.js.map +1 -0
  87. package/dist/llm/pi/pi-session-storage.d.ts +154 -0
  88. package/dist/llm/pi/pi-session-storage.d.ts.map +1 -0
  89. package/dist/llm/pi/pi-session-storage.js +314 -0
  90. package/dist/llm/pi/pi-session-storage.js.map +1 -0
  91. package/dist/llm/pi/pi-stream-fn.d.ts +124 -0
  92. package/dist/llm/pi/pi-stream-fn.d.ts.map +1 -0
  93. package/dist/llm/pi/pi-stream-fn.js +504 -0
  94. package/dist/llm/pi/pi-stream-fn.js.map +1 -0
  95. package/dist/llm/pi/pi-tool-bridge.d.ts +99 -0
  96. package/dist/llm/pi/pi-tool-bridge.d.ts.map +1 -0
  97. package/dist/llm/pi/pi-tool-bridge.js +117 -0
  98. package/dist/llm/pi/pi-tool-bridge.js.map +1 -0
  99. package/dist/llm/pi/pi-types.d.ts +56 -0
  100. package/dist/llm/pi/pi-types.d.ts.map +1 -0
  101. package/dist/llm/pi/pi-types.js +16 -0
  102. package/dist/llm/pi/pi-types.js.map +1 -0
  103. package/dist/llm/pi/resolve-execution-env.d.ts +194 -0
  104. package/dist/llm/pi/resolve-execution-env.d.ts.map +1 -0
  105. package/dist/llm/pi/resolve-execution-env.js +132 -0
  106. package/dist/llm/pi/resolve-execution-env.js.map +1 -0
  107. package/dist/llm/plugin-facade.js +2253 -1151
  108. package/dist/llm/plugin-facade.js.map +3 -3
  109. package/dist/llm/role-executor.d.ts.map +1 -1
  110. package/dist/llm/role-executor.js +8 -5
  111. package/dist/llm/role-executor.js.map +1 -1
  112. package/dist/llm/role-resolver.d.ts +46 -14
  113. package/dist/llm/role-resolver.d.ts.map +1 -1
  114. package/dist/llm/role-resolver.js +178 -20
  115. package/dist/llm/role-resolver.js.map +1 -1
  116. package/dist/llm/sealed-credential.d.ts +125 -0
  117. package/dist/llm/sealed-credential.d.ts.map +1 -0
  118. package/dist/llm/sealed-credential.js +133 -0
  119. package/dist/llm/sealed-credential.js.map +1 -0
  120. package/dist/llm/session-factory.d.ts.map +1 -1
  121. package/dist/llm/session-factory.js +6 -2
  122. package/dist/llm/session-factory.js.map +1 -1
  123. package/dist/llm/system-key.d.ts +67 -0
  124. package/dist/llm/system-key.d.ts.map +1 -0
  125. package/dist/llm/system-key.js +87 -0
  126. package/dist/llm/system-key.js.map +1 -0
  127. package/dist/llm/system-of-use-registry.d.ts +119 -0
  128. package/dist/llm/system-of-use-registry.d.ts.map +1 -0
  129. package/dist/llm/system-of-use-registry.js +200 -0
  130. package/dist/llm/system-of-use-registry.js.map +1 -0
  131. package/dist/llm/system-resolver.d.ts +32 -10
  132. package/dist/llm/system-resolver.d.ts.map +1 -1
  133. package/dist/llm/system-resolver.js +70 -18
  134. package/dist/llm/system-resolver.js.map +1 -1
  135. package/dist/memory/brain-writer-thread.d.ts.map +1 -1
  136. package/dist/memory/brain-writer-thread.js +116 -11
  137. package/dist/memory/brain-writer-thread.js.map +1 -1
  138. package/dist/memory/claude-mem-migration.d.ts.map +1 -1
  139. package/dist/memory/claude-mem-migration.js +21 -0
  140. package/dist/memory/claude-mem-migration.js.map +1 -1
  141. package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
  142. package/dist/memory/graph-memory-bridge.js +32 -25
  143. package/dist/memory/graph-memory-bridge.js.map +1 -1
  144. package/dist/memory/llm-backend-resolver.js +23 -5
  145. package/dist/memory/llm-backend-resolver.js.map +1 -1
  146. package/dist/nexus/migrations/M-split-graph.d.ts.map +1 -1
  147. package/dist/nexus/migrations/M-split-graph.js +60 -53
  148. package/dist/nexus/migrations/M-split-graph.js.map +1 -1
  149. package/dist/orchestrate/pivot.d.ts.map +1 -1
  150. package/dist/orchestrate/pivot.js +20 -2
  151. package/dist/orchestrate/pivot.js.map +1 -1
  152. package/dist/release/engine-ops.js +2 -2
  153. package/dist/release/engine-ops.js.map +1 -1
  154. package/dist/routing/capability-matrix.d.ts.map +1 -1
  155. package/dist/routing/capability-matrix.js +0 -57
  156. package/dist/routing/capability-matrix.js.map +1 -1
  157. package/dist/selfimprove/budget.d.ts +206 -0
  158. package/dist/selfimprove/budget.d.ts.map +1 -0
  159. package/dist/selfimprove/budget.js +203 -0
  160. package/dist/selfimprove/budget.js.map +1 -0
  161. package/dist/selfimprove/dhq-adapter.d.ts +105 -0
  162. package/dist/selfimprove/dhq-adapter.d.ts.map +1 -0
  163. package/dist/selfimprove/dhq-adapter.js +95 -0
  164. package/dist/selfimprove/dhq-adapter.js.map +1 -0
  165. package/dist/selfimprove/draft-pr.d.ts +129 -0
  166. package/dist/selfimprove/draft-pr.d.ts.map +1 -0
  167. package/dist/selfimprove/draft-pr.js +158 -0
  168. package/dist/selfimprove/draft-pr.js.map +1 -0
  169. package/dist/selfimprove/envelope-diff.d.ts +162 -0
  170. package/dist/selfimprove/envelope-diff.d.ts.map +1 -0
  171. package/dist/selfimprove/envelope-diff.js +321 -0
  172. package/dist/selfimprove/envelope-diff.js.map +1 -0
  173. package/dist/selfimprove/replay.d.ts +121 -0
  174. package/dist/selfimprove/replay.d.ts.map +1 -0
  175. package/dist/selfimprove/replay.js +109 -0
  176. package/dist/selfimprove/replay.js.map +1 -0
  177. package/dist/selfimprove/run-loop.d.ts +148 -0
  178. package/dist/selfimprove/run-loop.d.ts.map +1 -0
  179. package/dist/selfimprove/run-loop.js +240 -0
  180. package/dist/selfimprove/run-loop.js.map +1 -0
  181. package/dist/selfimprove/scenario.d.ts +145 -0
  182. package/dist/selfimprove/scenario.d.ts.map +1 -0
  183. package/dist/selfimprove/scenario.js +243 -0
  184. package/dist/selfimprove/scenario.js.map +1 -0
  185. package/dist/sentient/daemon-entry.js +5 -0
  186. package/dist/sentient/daemon-entry.js.map +1 -1
  187. package/dist/sentient/daemon.d.ts.map +1 -1
  188. package/dist/sentient/daemon.js +19 -0
  189. package/dist/sentient/daemon.js.map +1 -1
  190. package/dist/sentient/hygiene-scan.d.ts.map +1 -1
  191. package/dist/sentient/hygiene-scan.js +14 -6
  192. package/dist/sentient/hygiene-scan.js.map +1 -1
  193. package/dist/sessions/briefing.d.ts.map +1 -1
  194. package/dist/sessions/briefing.js +13 -9
  195. package/dist/sessions/briefing.js.map +1 -1
  196. package/dist/sessions/connection-session-handle.d.ts +161 -0
  197. package/dist/sessions/connection-session-handle.d.ts.map +1 -0
  198. package/dist/sessions/connection-session-handle.js +168 -0
  199. package/dist/sessions/connection-session-handle.js.map +1 -0
  200. package/dist/sessions/handoff.d.ts.map +1 -1
  201. package/dist/sessions/handoff.js +9 -0
  202. package/dist/sessions/handoff.js.map +1 -1
  203. package/dist/sessions/index.d.ts +4 -1
  204. package/dist/sessions/index.d.ts.map +1 -1
  205. package/dist/sessions/index.js +31 -1
  206. package/dist/sessions/index.js.map +1 -1
  207. package/dist/sessions/session-id.d.ts +34 -0
  208. package/dist/sessions/session-id.d.ts.map +1 -1
  209. package/dist/sessions/session-id.js +37 -0
  210. package/dist/sessions/session-id.js.map +1 -1
  211. package/dist/sessions/session-manifest-mirror.d.ts +115 -0
  212. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -0
  213. package/dist/sessions/session-manifest-mirror.js +250 -0
  214. package/dist/sessions/session-manifest-mirror.js.map +1 -0
  215. package/dist/sessions/session-switch.d.ts.map +1 -1
  216. package/dist/sessions/session-switch.js +5 -2
  217. package/dist/sessions/session-switch.js.map +1 -1
  218. package/dist/store/converters.d.ts.map +1 -1
  219. package/dist/store/converters.js +2 -0
  220. package/dist/store/converters.js.map +1 -1
  221. package/dist/store/db-helpers.d.ts.map +1 -1
  222. package/dist/store/db-helpers.js +2 -0
  223. package/dist/store/db-helpers.js.map +1 -1
  224. package/dist/store/dual-scope-db.d.ts.map +1 -1
  225. package/dist/store/dual-scope-db.js +87 -47
  226. package/dist/store/dual-scope-db.js.map +1 -1
  227. package/dist/store/pi-session-store.d.ts +151 -0
  228. package/dist/store/pi-session-store.d.ts.map +1 -0
  229. package/dist/store/pi-session-store.js +166 -0
  230. package/dist/store/pi-session-store.js.map +1 -0
  231. package/dist/store/safety-data-accessor.d.ts +1 -0
  232. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  233. package/dist/store/safety-data-accessor.js +5 -0
  234. package/dist/store/safety-data-accessor.js.map +1 -1
  235. package/dist/store/schema/cleo-global/accounts.d.ts +357 -0
  236. package/dist/store/schema/cleo-global/accounts.d.ts.map +1 -0
  237. package/dist/store/schema/cleo-global/accounts.js +136 -0
  238. package/dist/store/schema/cleo-global/accounts.js.map +1 -0
  239. package/dist/store/schema/cleo-global/index.d.ts +2 -0
  240. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  241. package/dist/store/schema/cleo-global/index.js +2 -0
  242. package/dist/store/schema/cleo-global/index.js.map +1 -1
  243. package/dist/store/schema/cleo-global/session-manifest.d.ts +217 -0
  244. package/dist/store/schema/cleo-global/session-manifest.d.ts.map +1 -0
  245. package/dist/store/schema/cleo-global/session-manifest.js +99 -0
  246. package/dist/store/schema/cleo-global/session-manifest.js.map +1 -0
  247. package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
  248. package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
  249. package/dist/store/schema/cleo-project/tasks-core.js +14 -0
  250. package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
  251. package/dist/store/schema/tasks.d.ts +16 -0
  252. package/dist/store/schema/tasks.d.ts.map +1 -1
  253. package/dist/store/schema/tasks.js +10 -0
  254. package/dist/store/schema/tasks.js.map +1 -1
  255. package/dist/store/selfimprove-dhq-schema.d.ts +284 -0
  256. package/dist/store/selfimprove-dhq-schema.d.ts.map +1 -0
  257. package/dist/store/selfimprove-dhq-schema.js +128 -0
  258. package/dist/store/selfimprove-dhq-schema.js.map +1 -0
  259. package/dist/store/selfimprove-dhq-store.d.ts +175 -0
  260. package/dist/store/selfimprove-dhq-store.d.ts.map +1 -0
  261. package/dist/store/selfimprove-dhq-store.js +182 -0
  262. package/dist/store/selfimprove-dhq-store.js.map +1 -0
  263. package/dist/store/session-store.d.ts +52 -13
  264. package/dist/store/session-store.d.ts.map +1 -1
  265. package/dist/store/session-store.js +71 -13
  266. package/dist/store/session-store.js.map +1 -1
  267. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  268. package/dist/store/sqlite-data-accessor.js +7 -0
  269. package/dist/store/sqlite-data-accessor.js.map +1 -1
  270. package/dist/store/umbrella-data-accessor.d.ts +1 -0
  271. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  272. package/dist/store/umbrella-data-accessor.js +5 -0
  273. package/dist/store/umbrella-data-accessor.js.map +1 -1
  274. package/dist/store/validation-schemas.d.ts +32 -0
  275. package/dist/store/validation-schemas.d.ts.map +1 -1
  276. package/dist/store/writer-lease-schema.d.ts +392 -0
  277. package/dist/store/writer-lease-schema.d.ts.map +1 -0
  278. package/dist/store/writer-lease-schema.js +142 -0
  279. package/dist/store/writer-lease-schema.js.map +1 -0
  280. package/dist/store/writer-lease.d.ts +368 -0
  281. package/dist/store/writer-lease.d.ts.map +1 -0
  282. package/dist/store/writer-lease.js +1002 -0
  283. package/dist/store/writer-lease.js.map +1 -0
  284. package/dist/tasks/backfill-child-projections.d.ts.map +1 -1
  285. package/dist/tasks/backfill-child-projections.js +14 -9
  286. package/dist/tasks/backfill-child-projections.js.map +1 -1
  287. package/dist/tasks/complete.d.ts.map +1 -1
  288. package/dist/tasks/complete.js +7 -10
  289. package/dist/tasks/complete.js.map +1 -1
  290. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  291. package/dist/tasks/duplicate-detector.js +14 -7
  292. package/dist/tasks/duplicate-detector.js.map +1 -1
  293. package/dist/telemetry/index.d.ts.map +1 -1
  294. package/dist/telemetry/index.js +10 -4
  295. package/dist/telemetry/index.js.map +1 -1
  296. package/dist/tools/agent-registry.d.ts +250 -0
  297. package/dist/tools/agent-registry.d.ts.map +1 -0
  298. package/dist/tools/agent-registry.js +292 -0
  299. package/dist/tools/agent-registry.js.map +1 -0
  300. package/dist/tools/agent-tool-families.d.ts +107 -0
  301. package/dist/tools/agent-tool-families.d.ts.map +1 -0
  302. package/dist/tools/agent-tool-families.js +527 -0
  303. package/dist/tools/agent-tool-families.js.map +1 -0
  304. package/dist/tools/browser-driver.d.ts +183 -0
  305. package/dist/tools/browser-driver.d.ts.map +1 -0
  306. package/dist/tools/browser-driver.js +242 -0
  307. package/dist/tools/browser-driver.js.map +1 -0
  308. package/dist/tools/builtin-agent-tools.d.ts +36 -0
  309. package/dist/tools/builtin-agent-tools.d.ts.map +1 -0
  310. package/dist/tools/builtin-agent-tools.js +150 -0
  311. package/dist/tools/builtin-agent-tools.js.map +1 -0
  312. package/dist/tools/dispatch.d.ts +370 -0
  313. package/dist/tools/dispatch.d.ts.map +1 -0
  314. package/dist/tools/dispatch.js +505 -0
  315. package/dist/tools/dispatch.js.map +1 -0
  316. package/dist/tools/env-scrub.d.ts +93 -0
  317. package/dist/tools/env-scrub.d.ts.map +1 -0
  318. package/dist/tools/env-scrub.js +176 -0
  319. package/dist/tools/env-scrub.js.map +1 -0
  320. package/dist/tools/fs.d.ts +30 -0
  321. package/dist/tools/fs.d.ts.map +1 -1
  322. package/dist/tools/fs.js +55 -2
  323. package/dist/tools/fs.js.map +1 -1
  324. package/dist/tools/guard.d.ts +15 -0
  325. package/dist/tools/guard.d.ts.map +1 -1
  326. package/dist/tools/guard.js +49 -12
  327. package/dist/tools/guard.js.map +1 -1
  328. package/dist/tools/index.d.ts +10 -0
  329. package/dist/tools/index.d.ts.map +1 -1
  330. package/dist/tools/index.js +37 -0
  331. package/dist/tools/index.js.map +1 -1
  332. package/dist/tools/pty.d.ts +45 -0
  333. package/dist/tools/pty.d.ts.map +1 -0
  334. package/dist/tools/pty.js +166 -0
  335. package/dist/tools/pty.js.map +1 -0
  336. package/dist/tools/schema-gen.d.ts +57 -0
  337. package/dist/tools/schema-gen.d.ts.map +1 -0
  338. package/dist/tools/schema-gen.js +52 -0
  339. package/dist/tools/schema-gen.js.map +1 -0
  340. package/dist/tools/shell.d.ts +12 -0
  341. package/dist/tools/shell.d.ts.map +1 -1
  342. package/dist/tools/shell.js +14 -1
  343. package/dist/tools/shell.js.map +1 -1
  344. package/dist/tools/web-agent-tools.d.ts +72 -0
  345. package/dist/tools/web-agent-tools.d.ts.map +1 -0
  346. package/dist/tools/web-agent-tools.js +393 -0
  347. package/dist/tools/web-agent-tools.js.map +1 -0
  348. package/dist/tools/web-search-backends.d.ts +156 -0
  349. package/dist/tools/web-search-backends.d.ts.map +1 -0
  350. package/dist/tools/web-search-backends.js +290 -0
  351. package/dist/tools/web-search-backends.js.map +1 -0
  352. package/dist/validation/ops.d.ts +1 -15
  353. package/dist/validation/ops.d.ts.map +1 -1
  354. package/dist/validation/ops.js +0 -20
  355. package/dist/validation/ops.js.map +1 -1
  356. package/migrations/drizzle-cleo-global/20260607000000_t11891-writer-leases/migration.sql +55 -0
  357. package/migrations/drizzle-cleo-global/20260607010000_t11639-session-manifest/migration.sql +43 -0
  358. package/migrations/drizzle-cleo-global/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  359. package/migrations/drizzle-cleo-global/20260608010000_t11709-accounts-credential-pool/migration.sql +72 -0
  360. package/migrations/drizzle-cleo-global/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  361. package/migrations/drizzle-cleo-project/20260607000000_t11891-writer-leases/migration.sql +55 -0
  362. package/migrations/drizzle-cleo-project/20260607010000_t11639-session-parent/migration.sql +22 -0
  363. package/migrations/drizzle-cleo-project/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  364. package/migrations/drizzle-cleo-project/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  365. package/package.json +15 -13
  366. package/dist/lifecycle/chain-composition.d.ts +0 -30
  367. package/dist/lifecycle/chain-composition.d.ts.map +0 -1
  368. package/dist/lifecycle/chain-composition.js +0 -152
  369. package/dist/lifecycle/chain-composition.js.map +0 -1
  370. package/dist/lifecycle/chain-store.d.ts +0 -70
  371. package/dist/lifecycle/chain-store.d.ts.map +0 -1
  372. package/dist/lifecycle/chain-store.js +0 -246
  373. package/dist/lifecycle/chain-store.js.map +0 -1
  374. package/dist/lifecycle/default-chain.d.ts +0 -39
  375. package/dist/lifecycle/default-chain.d.ts.map +0 -1
  376. package/dist/lifecycle/default-chain.js +0 -176
  377. package/dist/lifecycle/default-chain.js.map +0 -1
  378. package/dist/lifecycle/tessera-engine.d.ts +0 -48
  379. package/dist/lifecycle/tessera-engine.d.ts.map +0 -1
  380. package/dist/lifecycle/tessera-engine.js +0 -249
  381. package/dist/lifecycle/tessera-engine.js.map +0 -1
  382. package/dist/validation/chain-validation.d.ts +0 -43
  383. package/dist/validation/chain-validation.d.ts.map +0 -1
  384. package/dist/validation/chain-validation.js +0 -146
  385. package/dist/validation/chain-validation.js.map +0 -1
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Web + browser agent-tool FAMILY — registration (T1742 · epic T11456 · SG-TOOLS).
3
+ *
4
+ * Registers the `web` toolset into the {@link ./agent-registry.js |
5
+ * AgentToolRegistry}, on top of the terminal/file/search/git families
6
+ * ({@link ./agent-tool-families.js}):
7
+ *
8
+ * - **AC1** `web_search` — pluggable, backend-agnostic search
9
+ * ({@link ./web-search-backends.js}); graceful `unavailable` result when no
10
+ * backend can answer. NO hard paid-API dependency.
11
+ * - **AC2** `web_extract` — fetch a URL + convert HTML to markdown.
12
+ * - **AC3** `browser_navigate` — Playwright (lazily, optionally loaded).
13
+ * - **AC4** `browser_click` / `browser_type` / `browser_press`.
14
+ * - **AC5** `browser_snapshot` — accessibility tree.
15
+ * - **AC6** `browser_vision` — screenshot + AI analysis routed THROUGH the E9
16
+ * `resolveLLMForSystem` chokepoint + sealed-credential handle (never a raw
17
+ * provider call).
18
+ * - **AC7** `browser_scroll` up / down.
19
+ * - **AC8** all registered; the browser tools' `available()` returns `false`
20
+ * (with an install hint) when Playwright is absent.
21
+ *
22
+ * Browser tools share ONE lazily-launched {@link BrowserSession} per registration
23
+ * (a closure cell), so the optional Playwright load happens at most once per run.
24
+ * The web tools' network egress flows through an injectable {@link HttpFetch}; the
25
+ * vision AI call flows through the single E9 chokepoint — neither bypasses the
26
+ * resolver / credential layer. Import-time side-effect-free (NO top-level
27
+ * playwright import).
28
+ *
29
+ * @epic T11456
30
+ * @task T1742
31
+ * @see ./browser-driver.js — the optional-Playwright lazy-load backend
32
+ * @see ./web-search-backends.js — the pluggable search backends + HTML→markdown
33
+ */
34
+ import { z } from 'zod';
35
+ import { getLogger } from '../logger.js';
36
+ import { BrowserSession, PLAYWRIGHT_INSTALL_HINT } from './browser-driver.js';
37
+ import { defaultHttpFetch, fetchAndExtract, resolveSearchBackends, runSearch, } from './web-search-backends.js';
38
+ const log = getLogger('tool-web-agent');
39
+ /**
40
+ * Available only when outbound network egress is permitted. When the context
41
+ * does not declare egress (`networkEgressAllowed === undefined`) the tool is
42
+ * permitted — the registry default is permissive; a context that explicitly sets
43
+ * `false` hides it (AC5/availability).
44
+ */
45
+ const networkAvailable = (ctx) => ctx.networkEgressAllowed !== false;
46
+ /**
47
+ * Available only when the optional Playwright capability is present in the
48
+ * context. The browser tools are ALWAYS registered (AC8), but report unavailable
49
+ * — surfacing {@link PLAYWRIGHT_INSTALL_HINT} in their description — until a
50
+ * context advertises `capabilities.playwright === true`. The registration helper
51
+ * probes Playwright once and stamps that flag, so an absent optional dep simply
52
+ * leaves the browser tools hidden rather than crashing.
53
+ */
54
+ const playwrightAvailable = (ctx) => ctx.capabilities?.playwright === true && ctx.networkEgressAllowed !== false;
55
+ /**
56
+ * Run the `browser_vision` AI analysis: capture a screenshot, then resolve an
57
+ * LLM through the SINGLE E9 chokepoint (`resolveLLMForSystem`) and send the
58
+ * screenshot as a multimodal user turn. The plaintext credential is materialized
59
+ * from the sealed handle ONLY at the wire (inside `ModelRunner.build`), never
60
+ * surfaced up the stack — and there is NO raw provider/transport construction
61
+ * here (Gate-13). Returns `aiUnavailable: true` (with the screenshot still
62
+ * captured) when no credential resolves — graceful degradation, not an error.
63
+ *
64
+ * @param browser - The shared browser session.
65
+ * @param prompt - The analysis instruction.
66
+ * @param fullPage - Capture the full page rather than the viewport.
67
+ * @param projectRoot - Project root for the resolver.
68
+ * @returns The {@link BrowserVisionResult}.
69
+ */
70
+ async function runBrowserVision(browser, prompt, fullPage, projectRoot) {
71
+ const shot = await browser.screenshot(fullPage);
72
+ const base = { url: shot.url, title: shot.title };
73
+ // E9 resolution chokepoint — the ONLY route to an LLM credential. Never throws.
74
+ const { resolveLLMForSystem } = await import('../llm/system-resolver.js');
75
+ const resolved = await resolveLLMForSystem('task-executor', {
76
+ ...(projectRoot !== undefined ? { projectRoot } : {}),
77
+ });
78
+ if (!resolved.sealedCredential) {
79
+ // No credential reachable — return the screenshot-only result (graceful).
80
+ return { ...base, analysis: null, aiUnavailable: true };
81
+ }
82
+ try {
83
+ // Build the wire surfaces via the single SSoT ModelRunner (Gate-13: no raw
84
+ // transport / provider construction at this call-site). The descriptor's
85
+ // token is materialized from the sealed handle inside ModelRunner only.
86
+ const { ModelRunner } = await import('../llm/model-runner.js');
87
+ const apiKey = (await resolved.sealedCredential.fetch()).value;
88
+ const built = await ModelRunner.build({
89
+ provider: resolved.provider,
90
+ model: resolved.model,
91
+ credential: resolved.credential
92
+ ? {
93
+ provider: resolved.credential.provider,
94
+ apiKey,
95
+ source: resolved.credential.source,
96
+ authType: resolved.credential.authType,
97
+ }
98
+ : null,
99
+ source: resolved.source,
100
+ ...(resolved.credentialLabel !== undefined
101
+ ? { credentialLabel: resolved.credentialLabel }
102
+ : {}),
103
+ apiMode: resolved.apiMode,
104
+ baseUrl: resolved.baseUrl,
105
+ authType: resolved.authType,
106
+ ...(resolved.capabilities !== undefined ? { capabilities: resolved.capabilities } : {}),
107
+ });
108
+ // A single multimodal user turn: the instruction text + the screenshot as a
109
+ // native image block (transports that cannot do images degrade per imageMode).
110
+ const messages = [
111
+ {
112
+ role: 'user',
113
+ content: [
114
+ { type: 'text', text: prompt },
115
+ {
116
+ type: 'image',
117
+ source: { type: 'base64', data: shot.base64Png, mediaType: 'image/png' },
118
+ },
119
+ ],
120
+ },
121
+ ];
122
+ const response = await built.session.send(messages);
123
+ return {
124
+ ...base,
125
+ analysis: response.content,
126
+ model: resolved.model,
127
+ aiUnavailable: false,
128
+ };
129
+ }
130
+ catch (err) {
131
+ log.warn({ err }, 'browser_vision: AI analysis failed — returning screenshot-only result');
132
+ return { ...base, analysis: null, model: resolved.model, aiUnavailable: true };
133
+ }
134
+ }
135
+ /**
136
+ * Register the web + browser agent-tool family into `registry`. Pure
137
+ * registration — no network, no browser launch, no scan; side effects happen
138
+ * later through the injected {@link HttpFetch} / {@link BrowserSession}.
139
+ *
140
+ * The browser tools are registered with a `playwright`-gated availability
141
+ * predicate (AC8): present in the registry but hidden by `available()` until a
142
+ * context advertises the optional Playwright capability.
143
+ *
144
+ * @param registry - The registry to populate.
145
+ * @param options - Injectable backends (HTTP fetch, browser session, searxng URL).
146
+ */
147
+ export function registerWebAgentTools(registry, options = {}) {
148
+ const http = options.http ?? defaultHttpFetch;
149
+ // ONE browser session shared by every browser tool in this registration — the
150
+ // optional Playwright load happens at most once. Constructing it is free (no
151
+ // import until the first navigation).
152
+ const browser = options.browser ?? new BrowserSession();
153
+ const searxngUrl = options.searxngUrl ?? process.env.SEARXNG_URL;
154
+ const projectRoot = options.projectRoot;
155
+ // --- AC1: web_search (pluggable backends, graceful when unconfigured) ----
156
+ registry.register({
157
+ name: 'web_search',
158
+ class: 'net',
159
+ description: 'Search the web via a pluggable backend (DuckDuckGo / SearXNG — no API key required). ' +
160
+ 'Returns ranked results, or an `unavailable` result when no backend can answer.',
161
+ toolset: 'web',
162
+ stateless: true,
163
+ available: networkAvailable,
164
+ parameters: z.object({
165
+ query: z.string().describe('Free-text search query.'),
166
+ maxResults: z.number().int().positive().optional().describe('Max results (default 10).'),
167
+ backend: z
168
+ .enum(['duckduckgo', 'searxng', 'auto'])
169
+ .optional()
170
+ .describe("Preferred backend: 'duckduckgo', 'searxng', or 'auto' (default)."),
171
+ }),
172
+ execute: async (rawArgs) => {
173
+ const backend = rawArgs.backend === 'duckduckgo' ||
174
+ rawArgs.backend === 'searxng' ||
175
+ rawArgs.backend === 'auto'
176
+ ? rawArgs.backend
177
+ : undefined;
178
+ const input = {
179
+ query: String(rawArgs.query),
180
+ maxResults: typeof rawArgs.maxResults === 'number' ? rawArgs.maxResults : undefined,
181
+ backend,
182
+ };
183
+ const backends = resolveSearchBackends(input, searxngUrl);
184
+ if (backends.length === 0) {
185
+ return {
186
+ query: input.query,
187
+ results: [],
188
+ backend: null,
189
+ unavailable: true,
190
+ reason: 'no configured web-search backend',
191
+ };
192
+ }
193
+ const outcome = await runSearch(input, backends, http);
194
+ if (outcome === null) {
195
+ return {
196
+ query: input.query,
197
+ results: [],
198
+ backend: null,
199
+ unavailable: true,
200
+ reason: 'every web-search backend failed',
201
+ };
202
+ }
203
+ return {
204
+ query: input.query,
205
+ results: outcome.results,
206
+ backend: outcome.backend,
207
+ unavailable: false,
208
+ };
209
+ },
210
+ });
211
+ // --- AC2: web_extract (URL → markdown) ----------------------------------
212
+ registry.register({
213
+ name: 'web_extract',
214
+ class: 'net',
215
+ description: 'Fetch a URL and convert its HTML content to markdown.',
216
+ toolset: 'web',
217
+ stateless: true,
218
+ available: networkAvailable,
219
+ parameters: z.object({
220
+ url: z.string().describe('Absolute URL to fetch and convert.'),
221
+ timeoutMs: z
222
+ .number()
223
+ .int()
224
+ .positive()
225
+ .optional()
226
+ .describe('Fetch timeout in ms (default 30000).'),
227
+ maxChars: z
228
+ .number()
229
+ .int()
230
+ .positive()
231
+ .optional()
232
+ .describe('Cap on markdown length in characters (default 100000).'),
233
+ }),
234
+ execute: async (rawArgs) => {
235
+ const url = String(rawArgs.url);
236
+ return fetchAndExtract(url, http, {
237
+ timeoutMs: typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined,
238
+ maxChars: typeof rawArgs.maxChars === 'number' ? rawArgs.maxChars : undefined,
239
+ });
240
+ },
241
+ });
242
+ // --- AC3: browser_navigate ----------------------------------------------
243
+ registry.register({
244
+ name: 'browser_navigate',
245
+ class: 'shell',
246
+ description: `Navigate a headless browser to a URL (Playwright). ${PLAYWRIGHT_INSTALL_HINT}`,
247
+ toolset: 'web',
248
+ stateless: false,
249
+ available: playwrightAvailable,
250
+ parameters: z.object({
251
+ url: z.string().describe('Absolute URL to navigate to.'),
252
+ waitUntil: z
253
+ .enum(['load', 'domcontentloaded', 'networkidle'])
254
+ .optional()
255
+ .describe("When navigation is complete (default 'load')."),
256
+ timeoutMs: z
257
+ .number()
258
+ .int()
259
+ .positive()
260
+ .optional()
261
+ .describe('Navigation timeout in ms (default 30000).'),
262
+ }),
263
+ execute: async (rawArgs) => browser.navigate({
264
+ url: String(rawArgs.url),
265
+ waitUntil: rawArgs.waitUntil === 'load' ||
266
+ rawArgs.waitUntil === 'domcontentloaded' ||
267
+ rawArgs.waitUntil === 'networkidle'
268
+ ? rawArgs.waitUntil
269
+ : undefined,
270
+ timeoutMs: typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined,
271
+ }),
272
+ });
273
+ // --- AC4: browser_click / browser_type / browser_press ------------------
274
+ registry.register({
275
+ name: 'browser_click',
276
+ class: 'shell',
277
+ description: `Click an element by selector in the browser. ${PLAYWRIGHT_INSTALL_HINT}`,
278
+ toolset: 'web',
279
+ stateless: false,
280
+ available: playwrightAvailable,
281
+ parameters: z.object({
282
+ selector: z.string().describe('CSS / Playwright selector for the element to click.'),
283
+ timeoutMs: z
284
+ .number()
285
+ .int()
286
+ .positive()
287
+ .optional()
288
+ .describe('Action timeout in ms (default 15000).'),
289
+ }),
290
+ execute: async (rawArgs) => {
291
+ const state = await browser.click(String(rawArgs.selector), typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined);
292
+ return { ...state, action: 'click' };
293
+ },
294
+ });
295
+ registry.register({
296
+ name: 'browser_type',
297
+ class: 'shell',
298
+ description: `Type text into an input element by selector. ${PLAYWRIGHT_INSTALL_HINT}`,
299
+ toolset: 'web',
300
+ stateless: false,
301
+ available: playwrightAvailable,
302
+ parameters: z.object({
303
+ selector: z.string().describe('CSS / Playwright selector for the input element.'),
304
+ text: z.string().describe('Text to type into the element.'),
305
+ clear: z.boolean().optional().describe('Clear the field before typing (default true).'),
306
+ timeoutMs: z
307
+ .number()
308
+ .int()
309
+ .positive()
310
+ .optional()
311
+ .describe('Action timeout in ms (default 15000).'),
312
+ }),
313
+ execute: async (rawArgs) => {
314
+ const state = await browser.type(String(rawArgs.selector), String(rawArgs.text), typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined);
315
+ return { ...state, action: 'type' };
316
+ },
317
+ });
318
+ registry.register({
319
+ name: 'browser_press',
320
+ class: 'shell',
321
+ description: `Press a key or chord (e.g. Enter, Control+A) in the browser. ${PLAYWRIGHT_INSTALL_HINT}`,
322
+ toolset: 'web',
323
+ stateless: false,
324
+ available: playwrightAvailable,
325
+ parameters: z.object({
326
+ key: z.string().describe('Key or chord in Playwright syntax (e.g. Enter, Control+A).'),
327
+ selector: z.string().optional().describe('Optional selector to focus before pressing.'),
328
+ timeoutMs: z
329
+ .number()
330
+ .int()
331
+ .positive()
332
+ .optional()
333
+ .describe('Focus timeout in ms (default 15000).'),
334
+ }),
335
+ execute: async (rawArgs) => {
336
+ const state = await browser.press(String(rawArgs.key), rawArgs.selector === undefined ? undefined : String(rawArgs.selector), typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined);
337
+ return { ...state, action: 'press' };
338
+ },
339
+ });
340
+ // --- AC5: browser_snapshot (accessibility tree) -------------------------
341
+ registry.register({
342
+ name: 'browser_snapshot',
343
+ class: 'shell',
344
+ description: `Capture the page's accessibility tree. ${PLAYWRIGHT_INSTALL_HINT}`,
345
+ toolset: 'web',
346
+ stateless: false,
347
+ available: playwrightAvailable,
348
+ parameters: z.object({}),
349
+ execute: async () => browser.snapshot(),
350
+ });
351
+ // --- AC7: browser_scroll (up / down) ------------------------------------
352
+ registry.register({
353
+ name: 'browser_scroll',
354
+ class: 'shell',
355
+ description: `Scroll the page up or down. ${PLAYWRIGHT_INSTALL_HINT}`,
356
+ toolset: 'web',
357
+ stateless: false,
358
+ available: playwrightAvailable,
359
+ parameters: z.object({
360
+ direction: z.enum(['up', 'down']).describe('Scroll direction.'),
361
+ amountPx: z
362
+ .number()
363
+ .int()
364
+ .positive()
365
+ .optional()
366
+ .describe('Pixels to scroll (default ~one viewport).'),
367
+ }),
368
+ execute: async (rawArgs) => {
369
+ const direction = rawArgs.direction === 'up' ? 'up' : 'down';
370
+ const state = await browser.scroll(direction, typeof rawArgs.amountPx === 'number' ? rawArgs.amountPx : undefined);
371
+ return { ...state, direction };
372
+ },
373
+ });
374
+ // --- AC6: browser_vision (screenshot + AI analysis via the E9 chokepoint) -
375
+ registry.register({
376
+ name: 'browser_vision',
377
+ class: 'shell',
378
+ description: 'Screenshot the current page and analyse it with a vision model. ' +
379
+ `The AI call routes through the resolveLLMForSystem chokepoint. ${PLAYWRIGHT_INSTALL_HINT}`,
380
+ toolset: 'web',
381
+ stateless: false,
382
+ available: playwrightAvailable,
383
+ parameters: z.object({
384
+ prompt: z.string().describe('Question / instruction for the vision model about the page.'),
385
+ fullPage: z
386
+ .boolean()
387
+ .optional()
388
+ .describe('Capture the full scrollable page (default false).'),
389
+ }),
390
+ execute: async (rawArgs) => runBrowserVision(browser, String(rawArgs.prompt), rawArgs.fullPage === true, projectRoot),
391
+ });
392
+ }
393
+ //# sourceMappingURL=web-agent-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-agent-tools.js","sourceRoot":"","sources":["../../src/tools/web-agent-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Pluggable `web_search` backends + HTML→markdown extraction (T1742 · epic
3
+ * T11456 · SG-TOOLS).
4
+ *
5
+ * The `web` toolset's network backend. TWO concerns live here, both built over
6
+ * an INJECTABLE {@link HttpFetch} so unit tests mock the network and CI never
7
+ * makes a real request (AC9):
8
+ *
9
+ * - **web_search backends** — a {@link WebSearchBackend} interface with two
10
+ * keyless builtin implementations ({@link duckDuckGoBackend},
11
+ * {@link searxngBackend}). NO hard paid-API dependency: backends are resolved
12
+ * at call time and the tool degrades gracefully to an `unavailable` result
13
+ * when none answer (AC1). New backends register by satisfying the interface —
14
+ * the search tool is backend-agnostic.
15
+ * - **web_extract** — {@link htmlToMarkdown}, a dependency-free HTML→markdown
16
+ * converter (AC2), plus {@link extractTitle}.
17
+ *
18
+ * The pure helpers (parsers, the markdown converter) are exported for direct unit
19
+ * testing. Import-time side-effect-free.
20
+ *
21
+ * @epic T11456
22
+ * @task T1742
23
+ */
24
+ import type { WebExtractResult, WebSearchBackendId, WebSearchHit, WebSearchInput } from '@cleocode/contracts/tools/web-tools';
25
+ /**
26
+ * A minimal HTTP-fetch surface the web tools depend on by INJECTION. Structurally
27
+ * a subset of the global `fetch`, declared here so the executables can be driven
28
+ * by a mock in tests (no real network in CI · AC9) and so a future routing of
29
+ * web egress through a guarded `net` primitive is a one-line swap.
30
+ */
31
+ export type HttpFetch = (url: string, init?: {
32
+ readonly headers?: Record<string, string>;
33
+ readonly signal?: AbortSignal;
34
+ }) => Promise<{
35
+ readonly status: number;
36
+ text(): Promise<string>;
37
+ readonly headers: {
38
+ get(name: string): string | null;
39
+ };
40
+ }>;
41
+ /** The default {@link HttpFetch} — the platform global `fetch`. */
42
+ export declare const defaultHttpFetch: HttpFetch;
43
+ /**
44
+ * One pluggable web-search backend. A backend resolves a query into ranked
45
+ * {@link WebSearchHit}s, or throws (the resolver moves on to the next backend).
46
+ * `isConfigured()` lets a backend that needs a URL/instance opt OUT of the `auto`
47
+ * rotation when it has nothing to talk to — keeping the "graceful when
48
+ * unconfigured" contract (AC1) without a network round-trip.
49
+ */
50
+ export interface WebSearchBackend {
51
+ /** Canonical backend id. */
52
+ readonly id: WebSearchBackendId;
53
+ /** Whether this backend has everything it needs to run (e.g. an instance URL). */
54
+ isConfigured(): boolean;
55
+ /**
56
+ * Run the search.
57
+ *
58
+ * @param query - The search query.
59
+ * @param maxResults - Cap on returned hits.
60
+ * @param http - The injected fetch surface.
61
+ * @returns Ranked hits.
62
+ */
63
+ search(query: string, maxResults: number, http: HttpFetch): Promise<WebSearchHit[]>;
64
+ }
65
+ /**
66
+ * Parse DuckDuckGo's keyless HTML endpoint (`html.duckduckgo.com/html/`) into
67
+ * structured hits. Pure helper (AC9) — exported for direct unit testing against
68
+ * a captured fixture, so no network is needed.
69
+ *
70
+ * @param html - The DuckDuckGo HTML response body.
71
+ * @param maxResults - Cap on returned hits.
72
+ * @returns Parsed hits.
73
+ */
74
+ export declare function parseDuckDuckGoHtml(html: string, maxResults: number): WebSearchHit[];
75
+ /**
76
+ * The DuckDuckGo backend — keyless HTML endpoint, always "configured" (no
77
+ * instance URL needed). The canonical no-API-key default (AC1).
78
+ */
79
+ export declare const duckDuckGoBackend: WebSearchBackend;
80
+ /**
81
+ * Parse a SearXNG JSON response (`{ results: [{ title, url, content }] }`) into
82
+ * hits. Pure helper (AC9).
83
+ *
84
+ * @param json - The parsed SearXNG JSON body.
85
+ * @param maxResults - Cap on returned hits.
86
+ * @returns Parsed hits.
87
+ */
88
+ export declare function parseSearxngJson(json: unknown, maxResults: number): WebSearchHit[];
89
+ /**
90
+ * Build a SearXNG backend bound to an instance URL (from `SEARXNG_URL` env or
91
+ * config). When no instance URL is supplied it reports `isConfigured() === false`
92
+ * so the `auto` resolver skips it — preserving the "graceful when unconfigured"
93
+ * contract (AC1) with no paid dependency.
94
+ *
95
+ * @param instanceUrl - The SearXNG instance base URL (or `undefined`/empty).
96
+ * @returns A {@link WebSearchBackend}.
97
+ */
98
+ export declare function makeSearxngBackend(instanceUrl: string | undefined): WebSearchBackend;
99
+ /**
100
+ * Resolve the candidate backends for a {@link WebSearchInput}, in priority
101
+ * order. A SearXNG instance (when configured) ranks before DuckDuckGo; an
102
+ * explicit `input.backend` pins a single backend. The DuckDuckGo backend is
103
+ * always present (keyless), so the list is never empty — but a pinned backend
104
+ * that is not configured yields an empty list, which the executable surfaces as
105
+ * `unavailable` (AC1).
106
+ *
107
+ * @param input - The search input.
108
+ * @param searxngUrl - Optional SearXNG instance URL (config/env).
109
+ * @returns The ordered candidate backends.
110
+ */
111
+ export declare function resolveSearchBackends(input: WebSearchInput, searxngUrl: string | undefined): WebSearchBackend[];
112
+ /** Extract the document `<title>` text, or `''` when absent. Pure (AC9). */
113
+ export declare function extractTitle(html: string): string;
114
+ /**
115
+ * Convert an HTML document to markdown. Dependency-free (AC2) — a focused,
116
+ * deterministic transform of the structural tags an agent cares about
117
+ * (headings, links, lists, code, emphasis, paragraphs); `<script>`/`<style>`
118
+ * and remaining tags are dropped. NOT a full HTML5 parser — a pragmatic
119
+ * readability-style extraction that keeps `core` free of a heavy DOM dependency.
120
+ *
121
+ * Pure function of its input (no I/O), so it is unit-testable in isolation (AC9).
122
+ *
123
+ * @param html - The HTML document / fragment.
124
+ * @returns A markdown rendering of the body content.
125
+ */
126
+ export declare function htmlToMarkdown(html: string): string;
127
+ /**
128
+ * Fetch a URL and convert its HTML body to markdown. The single executable body
129
+ * for the `web_extract` tool — uses the INJECTED {@link HttpFetch} so CI mocks
130
+ * the network (AC9).
131
+ *
132
+ * @param url - The URL to fetch.
133
+ * @param http - The injected fetch surface.
134
+ * @param opts - Timeout + markdown length cap.
135
+ * @returns The {@link WebExtractResult}.
136
+ */
137
+ export declare function fetchAndExtract(url: string, http: HttpFetch, opts?: {
138
+ timeoutMs?: number;
139
+ maxChars?: number;
140
+ }): Promise<WebExtractResult>;
141
+ /**
142
+ * Run a {@link WebSearchInput} against the resolved backends, first-success-wins.
143
+ * Returns the hits + the answering backend id, or `null` when no backend could
144
+ * answer (every candidate failed or the list was empty) — the executable maps
145
+ * `null` onto a graceful `unavailable` result (AC1).
146
+ *
147
+ * @param input - The search input.
148
+ * @param backends - The ordered candidate backends (from {@link resolveSearchBackends}).
149
+ * @param http - The injected fetch surface.
150
+ * @returns The hits + backend, or `null` when none answered.
151
+ */
152
+ export declare function runSearch(input: WebSearchInput, backends: readonly WebSearchBackend[], http: HttpFetch): Promise<{
153
+ results: WebSearchHit[];
154
+ backend: WebSearchBackendId;
155
+ } | null>;
156
+ //# sourceMappingURL=web-search-backends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-search-backends.d.ts","sourceRoot":"","sources":["../../src/tools/web-search-backends.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACf,MAAM,qCAAqC,CAAC;AAK7C;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAChF,OAAO,CAAC;IACX,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CACxD,CAAC,CAAC;AAEH,mEAAmE;AACnE,eAAO,MAAM,gBAAgB,EAAE,SACuB,CAAC;AAMvD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAChC,kFAAkF;IAClF,YAAY,IAAI,OAAO,CAAC;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CACrF;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CA6BpF;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,gBAa/B,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAclF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAgBpF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,cAAc,EACrB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,gBAAgB,EAAE,CAQpB;AAMD,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoDnD;AAOD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,EACf,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GACnD,OAAO,CAAC,gBAAgB,CAAC,CAoB3B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,SAAS,gBAAgB,EAAE,EACrC,IAAI,EAAE,SAAS,GACd,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,GAAG,IAAI,CAAC,CAW1E"}