@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,166 @@
1
+ /**
2
+ * Pseudo-terminal (PTY) shell runner (T1741 · epic T11456 · SG-TOOLS).
3
+ *
4
+ * The `terminal` toolset's execution backend. Runs a command under a PTY when
5
+ * the OPTIONAL `node-pty` native dependency is loadable, otherwise transparently
6
+ * degrades to a plain `child_process.spawn` (the {@link defaultShellExecutor}
7
+ * path) so the tool ALWAYS works without a heavy native dep. `node-pty` is
8
+ * loaded lazily via dynamic `import()` inside the runner — NEVER at module
9
+ * import — so this file is import-time side-effect-free (and adds no startup
10
+ * cost / hard dependency).
11
+ *
12
+ * The child runs under the SCRUBBED, explicitly-constructed environment from
13
+ * {@link scrubSubprocessEnv} (same security posture as the non-PTY path): the
14
+ * daemon's secrets are never inherited and a Pi-controlled loader hook / PATH
15
+ * can never reach the spawned process. This runner is invoked ONLY from the
16
+ * guard chokepoint ({@link ./guard.js}), so the command denylist applies before
17
+ * any process is spawned — there is no raw bypass.
18
+ *
19
+ * @epic T11456
20
+ * @task T1741
21
+ * @see ./guard.js — the deny-first chokepoint that wraps this runner
22
+ */
23
+ import { spawn } from 'node:child_process';
24
+ import { getLogger } from '../logger.js';
25
+ import { scrubSubprocessEnv } from './env-scrub.js';
26
+ const log = getLogger('tool-pty');
27
+ /** Default PTY geometry. */
28
+ const DEFAULT_COLS = 80;
29
+ const DEFAULT_ROWS = 24;
30
+ /**
31
+ * Attempt to lazily load `node-pty`. Returns `null` when the optional dep is not
32
+ * installed or fails to load (any reason), so the caller can degrade to spawn.
33
+ *
34
+ * The import specifier is held in a variable so bundlers/TS do not treat the
35
+ * missing optional dep as a hard, statically-resolved dependency.
36
+ *
37
+ * @returns The loaded module shape, or `null` when unavailable.
38
+ */
39
+ async function loadNodePty() {
40
+ const specifier = 'node-pty';
41
+ try {
42
+ const mod = await import(specifier);
43
+ const candidate = mod.default ?? mod;
44
+ if (candidate !== null &&
45
+ typeof candidate === 'object' &&
46
+ typeof candidate.spawn === 'function') {
47
+ return candidate;
48
+ }
49
+ return null;
50
+ }
51
+ catch (err) {
52
+ log.debug({ err }, 'node-pty not loadable — falling back to non-PTY spawn');
53
+ return null;
54
+ }
55
+ }
56
+ /**
57
+ * Run a command under a non-PTY `spawn`, capturing stdout/stderr/exit-code.
58
+ * This is the always-available fallback when `node-pty` is absent or `spawn`
59
+ * mode was explicitly requested.
60
+ *
61
+ * @param input - {@link RunShellInput}.
62
+ * @param ptyFellBack - Whether this spawn is a fallback from a requested PTY.
63
+ * @returns The {@link RunShellResult} (`mode: 'spawn'`).
64
+ */
65
+ function runSpawn(input, ptyFellBack) {
66
+ return new Promise((resolve, reject) => {
67
+ const child = spawn(input.command, [...(input.args ?? [])], {
68
+ cwd: input.cwd,
69
+ env: scrubSubprocessEnv({ extra: input.env }),
70
+ timeout: input.timeoutMs,
71
+ shell: false,
72
+ });
73
+ let stdout = '';
74
+ let stderr = '';
75
+ child.stdout?.on('data', (d) => {
76
+ stdout += d.toString('utf8');
77
+ });
78
+ child.stderr?.on('data', (d) => {
79
+ stderr += d.toString('utf8');
80
+ });
81
+ child.on('error', reject);
82
+ child.on('close', (code) => {
83
+ resolve({ stdout, stderr, code, mode: 'spawn', ptyFellBack });
84
+ });
85
+ });
86
+ }
87
+ /**
88
+ * Run a command under a PTY via the lazily-loaded `node-pty`. The PTY interleaves
89
+ * stdout + stderr on a single stream (as a real terminal does), so the result's
90
+ * `stderr` is empty and all output lands in `stdout`.
91
+ *
92
+ * @param pty - The loaded `node-pty` module.
93
+ * @param input - {@link RunShellInput}.
94
+ * @returns The {@link RunShellResult} (`mode: 'pty'`).
95
+ */
96
+ function runWithPty(pty, input) {
97
+ return new Promise((resolve, reject) => {
98
+ let proc;
99
+ try {
100
+ proc = pty.spawn(input.command, [...(input.args ?? [])], {
101
+ name: 'xterm-256color',
102
+ cols: input.cols ?? DEFAULT_COLS,
103
+ rows: input.rows ?? DEFAULT_ROWS,
104
+ cwd: input.cwd,
105
+ env: scrubSubprocessEnv({ extra: input.env }),
106
+ });
107
+ }
108
+ catch (err) {
109
+ reject(err instanceof Error ? err : new Error(String(err)));
110
+ return;
111
+ }
112
+ let stdout = '';
113
+ let timer;
114
+ if (typeof input.timeoutMs === 'number' && input.timeoutMs > 0) {
115
+ timer = setTimeout(() => {
116
+ proc.kill();
117
+ }, input.timeoutMs);
118
+ }
119
+ proc.onData((data) => {
120
+ stdout += data;
121
+ });
122
+ proc.onExit(({ exitCode, signal }) => {
123
+ if (timer)
124
+ clearTimeout(timer);
125
+ resolve({
126
+ stdout,
127
+ stderr: '',
128
+ code: typeof signal === 'number' && signal > 0 ? null : exitCode,
129
+ mode: 'pty',
130
+ ptyFellBack: false,
131
+ });
132
+ });
133
+ });
134
+ }
135
+ /**
136
+ * Run a command under a PTY when possible, else a non-PTY spawn.
137
+ *
138
+ * - `spawn` mode → always {@link runSpawn}.
139
+ * - `pty` / `auto` mode → attempt {@link loadNodePty}; on success {@link runWithPty},
140
+ * otherwise degrade to {@link runSpawn} with `ptyFellBack: true`.
141
+ *
142
+ * The actual process is always launched under the scrubbed subprocess env. This
143
+ * function performs NO policy decision of its own — it is the executor the guard
144
+ * chokepoint ({@link ./guard.js}) invokes AFTER its denylist check passes.
145
+ *
146
+ * @param input - {@link RunShellInput}.
147
+ * @returns The {@link RunShellResult}.
148
+ *
149
+ * @example
150
+ * ```ts
151
+ * const res = await runPty({ command: 'echo', args: ['hi'], mode: 'auto' });
152
+ * // res.mode === 'pty' when node-pty is installed, else 'spawn' (ptyFellBack: true)
153
+ * ```
154
+ */
155
+ export async function runPty(input) {
156
+ const mode = input.mode ?? 'auto';
157
+ if (mode === 'spawn') {
158
+ return runSpawn(input, false);
159
+ }
160
+ const pty = await loadNodePty();
161
+ if (pty === null) {
162
+ return runSpawn(input, true);
163
+ }
164
+ return runWithPty(pty, input);
165
+ }
166
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../../src/tools/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * OpenAI-format tool-schema generation (T1739 · AC3 · epic T11456).
3
+ *
4
+ * The SINGLE generator that turns a Cleo Zod parameter schema into the
5
+ * OpenAI / JSON-Schema {@link TransportTool} shape the ModelRunner + transport
6
+ * wire layer (and the Pi adapter) consume. Both the agent-facing
7
+ * {@link ./agent-registry.js | AgentToolRegistry} (AC3) and the Pi streamFn
8
+ * bridge (`core/src/llm/pi/pi-stream-fn.ts`) call THIS function, so there is one
9
+ * conversion doctrine and no drift (DRY).
10
+ *
11
+ * Uses Zod v4's native `z.toJSONSchema` — NO `zod-to-json-schema` dependency and
12
+ * NO typebox value-import, so the cleo↔Pi tool surface carries zero typebox
13
+ * (Gate 10). The resulting `inputSchema` is a plain JSON-Schema object the
14
+ * transport passes through verbatim after any provider-specific adaptation.
15
+ *
16
+ * @task T1739
17
+ * @epic T11456
18
+ */
19
+ import type { TransportTool } from '@cleocode/contracts/llm/normalized-response.js';
20
+ import { z } from 'zod';
21
+ /**
22
+ * A name + description + Zod-schema tool definition, in the shape the schema
23
+ * generator consumes. Both the agent registry's {@link
24
+ * ./agent-registry.js | AgentToolDescriptor} and the Pi streamFn's `PiZodTool`
25
+ * structurally satisfy this, so one generator serves both.
26
+ */
27
+ export interface ZodSchemaTool {
28
+ /** Tool name as the provider / model will see it. */
29
+ readonly name: string;
30
+ /** Human-readable description for the model. */
31
+ readonly description: string;
32
+ /** Zod schema for the tool's input parameters. */
33
+ readonly parameters: z.ZodType;
34
+ }
35
+ /**
36
+ * Convert a Cleo Zod-schema tool into the OpenAI-format JSON-Schema
37
+ * {@link TransportTool}.
38
+ *
39
+ * The conversion is purely a function of its input (no I/O, no global state), so
40
+ * it is safe to call at any time, including during a lazy
41
+ * {@link ./agent-registry.js | AgentToolRegistry} discovery pass.
42
+ *
43
+ * @param tool - The Cleo Zod tool ({@link ZodSchemaTool}).
44
+ * @returns The transport-shaped JSON-Schema tool (OpenAI function format).
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const t = zodSchemaToOpenAITool({
49
+ * name: 'read_file',
50
+ * description: 'Read a file as text',
51
+ * parameters: z.object({ path: z.string() }),
52
+ * });
53
+ * // t.inputSchema === { type: 'object', properties: { path: { type: 'string' } }, ... }
54
+ * ```
55
+ */
56
+ export declare function zodSchemaToOpenAITool(tool: ZodSchemaTool): TransportTool;
57
+ //# sourceMappingURL=schema-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gen.d.ts","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,GAAG,aAAa,CAUxE"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * OpenAI-format tool-schema generation (T1739 · AC3 · epic T11456).
3
+ *
4
+ * The SINGLE generator that turns a Cleo Zod parameter schema into the
5
+ * OpenAI / JSON-Schema {@link TransportTool} shape the ModelRunner + transport
6
+ * wire layer (and the Pi adapter) consume. Both the agent-facing
7
+ * {@link ./agent-registry.js | AgentToolRegistry} (AC3) and the Pi streamFn
8
+ * bridge (`core/src/llm/pi/pi-stream-fn.ts`) call THIS function, so there is one
9
+ * conversion doctrine and no drift (DRY).
10
+ *
11
+ * Uses Zod v4's native `z.toJSONSchema` — NO `zod-to-json-schema` dependency and
12
+ * NO typebox value-import, so the cleo↔Pi tool surface carries zero typebox
13
+ * (Gate 10). The resulting `inputSchema` is a plain JSON-Schema object the
14
+ * transport passes through verbatim after any provider-specific adaptation.
15
+ *
16
+ * @task T1739
17
+ * @epic T11456
18
+ */
19
+ import { z } from 'zod';
20
+ /**
21
+ * Convert a Cleo Zod-schema tool into the OpenAI-format JSON-Schema
22
+ * {@link TransportTool}.
23
+ *
24
+ * The conversion is purely a function of its input (no I/O, no global state), so
25
+ * it is safe to call at any time, including during a lazy
26
+ * {@link ./agent-registry.js | AgentToolRegistry} discovery pass.
27
+ *
28
+ * @param tool - The Cleo Zod tool ({@link ZodSchemaTool}).
29
+ * @returns The transport-shaped JSON-Schema tool (OpenAI function format).
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const t = zodSchemaToOpenAITool({
34
+ * name: 'read_file',
35
+ * description: 'Read a file as text',
36
+ * parameters: z.object({ path: z.string() }),
37
+ * });
38
+ * // t.inputSchema === { type: 'object', properties: { path: { type: 'string' } }, ... }
39
+ * ```
40
+ */
41
+ export function zodSchemaToOpenAITool(tool) {
42
+ // Zod v4's native `z.toJSONSchema` renders a plain JSON-Schema object — NO
43
+ // `zod-to-json-schema` dep and NO typebox value-import at this boundary, so
44
+ // every tool surface (registry + Pi bridge) carries zero typebox (Gate 10).
45
+ const inputSchema = z.toJSONSchema(tool.parameters);
46
+ return {
47
+ name: tool.name,
48
+ description: tool.description,
49
+ inputSchema,
50
+ };
51
+ }
52
+ //# sourceMappingURL=schema-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-gen.js","sourceRoot":"","sources":["../../src/tools/schema-gen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAmB;IACvD,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAA4B,CAAC;IAC/E,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -30,6 +30,18 @@ export type ShellExecutor = (input: ExecuteShellInput) => Promise<ExecuteShellRe
30
30
  * stderr and resolving `{ stdout, stderr, code }`. A `timeoutMs` kills the
31
31
  * process (code resolves to `null` on signal/timeout). Never rejects on a
32
32
  * non-zero exit — the exit code is the result, not an error.
33
+ *
34
+ * ## Environment is SCRUBBED, never inherited (T11897 · security)
35
+ *
36
+ * The child runs under a MINIMAL, explicitly-constructed environment built by
37
+ * {@link scrubSubprocessEnv} — it does NOT inherit the parent `process.env`.
38
+ * This is load-bearing: the parent (the Cleo daemon) holds resolved provider
39
+ * credentials (`ANTHROPIC_API_KEY`, vault material, OAuth headers); blindly
40
+ * forwarding the full env into a child spawned on behalf of an in-process Pi
41
+ * loop would let a single `env`/`printenv` exfiltrate them, and would forward a
42
+ * Pi-poisoned `LD_PRELOAD`/`PATH`/`NODE_OPTIONS` into the loader. The
43
+ * caller-supplied `input.env` is merged on top but itself scrubbed (forbidden
44
+ * keys dropped, `PATH` pinned). Benign vars (locale/term/home) pass through.
33
45
  */
34
46
  export declare const defaultShellExecutor: ShellExecutor;
35
47
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAoB/B,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAK7B"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEtF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,EAAE,aAoB/B,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,iBAAiB,EACxB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAE7B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,QAAQ,GAAE,aAAoC,GAC7C,OAAO,CAAC,kBAAkB,CAAC,CAK7B"}
@@ -19,16 +19,29 @@
19
19
  * @saga T11387
20
20
  */
21
21
  import { spawn } from 'node:child_process';
22
+ import { scrubSubprocessEnv } from './env-scrub.js';
22
23
  /**
23
24
  * Default executor: `spawn(command, args)` with no shell, capturing stdout +
24
25
  * stderr and resolving `{ stdout, stderr, code }`. A `timeoutMs` kills the
25
26
  * process (code resolves to `null` on signal/timeout). Never rejects on a
26
27
  * non-zero exit — the exit code is the result, not an error.
28
+ *
29
+ * ## Environment is SCRUBBED, never inherited (T11897 · security)
30
+ *
31
+ * The child runs under a MINIMAL, explicitly-constructed environment built by
32
+ * {@link scrubSubprocessEnv} — it does NOT inherit the parent `process.env`.
33
+ * This is load-bearing: the parent (the Cleo daemon) holds resolved provider
34
+ * credentials (`ANTHROPIC_API_KEY`, vault material, OAuth headers); blindly
35
+ * forwarding the full env into a child spawned on behalf of an in-process Pi
36
+ * loop would let a single `env`/`printenv` exfiltrate them, and would forward a
37
+ * Pi-poisoned `LD_PRELOAD`/`PATH`/`NODE_OPTIONS` into the loader. The
38
+ * caller-supplied `input.env` is merged on top but itself scrubbed (forbidden
39
+ * keys dropped, `PATH` pinned). Benign vars (locale/term/home) pass through.
27
40
  */
28
41
  export const defaultShellExecutor = (input) => new Promise((resolve, reject) => {
29
42
  const child = spawn(input.command, [...(input.args ?? [])], {
30
43
  cwd: input.cwd,
31
- env: input.env ? { ...process.env, ...input.env } : process.env,
44
+ env: scrubSubprocessEnv({ extra: input.env }),
32
45
  timeout: input.timeoutMs,
33
46
  shell: false,
34
47
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAc3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB,CAAC,KAAK,EAAE,EAAE,CAC3D,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1D,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;QAC/D,OAAO,EAAE,KAAK,CAAC,SAAS;QACxB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,WAA0B,oBAAoB;IAE9C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CACpB,KAAkB,EAClB,WAA0B,oBAAoB;IAE9C,OAAO,YAAY,CACjB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAChF,QAAQ,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAM3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AASpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAkB,CAAC,KAAK,EAAE,EAAE,CAC3D,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1D,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,EAAE,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,CAAC,SAAS;QACxB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACrC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,WAA0B,oBAAoB;IAE9C,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CACpB,KAAkB,EAClB,WAA0B,oBAAoB;IAE9C,OAAO,YAAY,CACjB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAChF,QAAQ,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,72 @@
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 type { AgentToolRegistry } from './agent-registry.js';
35
+ import { BrowserSession } from './browser-driver.js';
36
+ import { type HttpFetch } from './web-search-backends.js';
37
+ /**
38
+ * Options for {@link registerWebAgentTools} — all injectable so tests run with
39
+ * NO real network and NO real browser launch (AC9).
40
+ */
41
+ export interface WebAgentToolOptions {
42
+ /** Injected HTTP fetch (defaults to the platform `fetch`). */
43
+ readonly http?: HttpFetch;
44
+ /** Injected browser session (defaults to a real lazy-Playwright session). */
45
+ readonly browser?: BrowserSession;
46
+ /**
47
+ * SearXNG instance URL for the `searxng` backend. When omitted, the SearXNG
48
+ * backend reports unconfigured and only DuckDuckGo answers — preserving the
49
+ * "graceful when unconfigured" contract (AC1). Read from `SEARXNG_URL` env when
50
+ * not supplied.
51
+ */
52
+ readonly searxngUrl?: string;
53
+ /**
54
+ * Project root threaded into the E9 `resolveLLMForSystem` chokepoint for
55
+ * `browser_vision` (defaults to the resolver's own `process.cwd()` fallback).
56
+ */
57
+ readonly projectRoot?: string;
58
+ }
59
+ /**
60
+ * Register the web + browser agent-tool family into `registry`. Pure
61
+ * registration — no network, no browser launch, no scan; side effects happen
62
+ * later through the injected {@link HttpFetch} / {@link BrowserSession}.
63
+ *
64
+ * The browser tools are registered with a `playwright`-gated availability
65
+ * predicate (AC8): present in the registry but hidden by `available()` until a
66
+ * context advertises the optional Playwright capability.
67
+ *
68
+ * @param registry - The registry to populate.
69
+ * @param options - Injectable backends (HTTP fetch, browser session, searxng URL).
70
+ */
71
+ export declare function registerWebAgentTools(registry: AgentToolRegistry, options?: WebAgentToolOptions): void;
72
+ //# sourceMappingURL=web-agent-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-agent-tools.d.ts","sourceRoot":"","sources":["../../src/tools/web-agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAWH,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,0BAA0B,CAAC;AAuBlC;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA0FD;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAkRN"}