@cleocode/core 2026.6.12 → 2026.6.14

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 (730) hide show
  1. package/dist/admin/ops.d.ts +4 -0
  2. package/dist/admin/ops.d.ts.map +1 -1
  3. package/dist/check/index.d.ts +12 -0
  4. package/dist/check/index.d.ts.map +1 -0
  5. package/dist/check/index.js +12 -0
  6. package/dist/check/index.js.map +1 -0
  7. package/dist/check/pr-gate.d.ts +179 -0
  8. package/dist/check/pr-gate.d.ts.map +1 -0
  9. package/dist/check/pr-gate.js +366 -0
  10. package/dist/check/pr-gate.js.map +1 -0
  11. package/dist/conduit/delivery-router.d.ts +134 -0
  12. package/dist/conduit/delivery-router.d.ts.map +1 -0
  13. package/dist/conduit/delivery-router.js +0 -0
  14. package/dist/conduit/delivery-router.js.map +1 -0
  15. package/dist/conduit/index.d.ts +5 -2
  16. package/dist/conduit/index.d.ts.map +1 -1
  17. package/dist/conduit/index.js +5 -2
  18. package/dist/conduit/index.js.map +1 -1
  19. package/dist/conduit/local-transport.d.ts +12 -0
  20. package/dist/conduit/local-transport.d.ts.map +1 -1
  21. package/dist/conduit/local-transport.js +53 -23
  22. package/dist/conduit/local-transport.js.map +1 -1
  23. package/dist/conduit/local-tui-adapter.d.ts +89 -0
  24. package/dist/conduit/local-tui-adapter.d.ts.map +1 -0
  25. package/dist/conduit/local-tui-adapter.js +225 -0
  26. package/dist/conduit/local-tui-adapter.js.map +1 -0
  27. package/dist/config/registry.d.ts +54 -0
  28. package/dist/config/registry.d.ts.map +1 -1
  29. package/dist/config/registry.js +94 -2
  30. package/dist/config/registry.js.map +1 -1
  31. package/dist/crypto/credentials.d.ts +37 -0
  32. package/dist/crypto/credentials.d.ts.map +1 -1
  33. package/dist/crypto/credentials.js +110 -0
  34. package/dist/crypto/credentials.js.map +1 -1
  35. package/dist/deriver/queue-manager.d.ts +30 -2
  36. package/dist/deriver/queue-manager.d.ts.map +1 -1
  37. package/dist/deriver/queue-manager.js +54 -9
  38. package/dist/deriver/queue-manager.js.map +1 -1
  39. package/dist/dispatch/config-domain-handler.d.ts +125 -0
  40. package/dist/dispatch/config-domain-handler.d.ts.map +1 -0
  41. package/dist/dispatch/config-domain-handler.js +160 -0
  42. package/dist/dispatch/config-domain-handler.js.map +1 -0
  43. package/dist/dispatch/contracts/derive-output-contract.d.ts +86 -0
  44. package/dist/dispatch/contracts/derive-output-contract.d.ts.map +1 -0
  45. package/dist/dispatch/contracts/derive-output-contract.js +347 -0
  46. package/dist/dispatch/contracts/derive-output-contract.js.map +1 -0
  47. package/dist/dispatch/contracts/ensures-schema.d.ts +77 -0
  48. package/dist/dispatch/contracts/ensures-schema.d.ts.map +1 -0
  49. package/dist/dispatch/contracts/ensures-schema.js +91 -0
  50. package/dist/dispatch/contracts/ensures-schema.js.map +1 -0
  51. package/dist/dispatch/contracts/input-contracts.d.ts.map +1 -1
  52. package/dist/dispatch/contracts/input-contracts.js +19 -1
  53. package/dist/dispatch/contracts/input-contracts.js.map +1 -1
  54. package/dist/dispatch/contracts/output-contracts.d.ts +27 -5
  55. package/dist/dispatch/contracts/output-contracts.d.ts.map +1 -1
  56. package/dist/dispatch/contracts/output-contracts.js +29 -6
  57. package/dist/dispatch/contracts/output-contracts.js.map +1 -1
  58. package/dist/docs/export-document.js +5413 -1345
  59. package/dist/docs/export-document.js.map +3 -3
  60. package/dist/gateway-client/client.d.ts +123 -0
  61. package/dist/gateway-client/client.d.ts.map +1 -0
  62. package/dist/gateway-client/client.js +93 -0
  63. package/dist/gateway-client/client.js.map +1 -0
  64. package/dist/gateway-client/generated/client/client.gen.d.ts +3 -0
  65. package/dist/gateway-client/generated/client/client.gen.d.ts.map +1 -0
  66. package/dist/gateway-client/generated/client/client.gen.js +217 -0
  67. package/dist/gateway-client/generated/client/client.gen.js.map +1 -0
  68. package/dist/gateway-client/generated/client/index.d.ts +11 -0
  69. package/dist/gateway-client/generated/client/index.d.ts.map +1 -0
  70. package/dist/gateway-client/generated/client/index.js +7 -0
  71. package/dist/gateway-client/generated/client/index.js.map +1 -0
  72. package/dist/gateway-client/generated/client/types.gen.d.ts +121 -0
  73. package/dist/gateway-client/generated/client/types.gen.d.ts.map +1 -0
  74. package/dist/gateway-client/generated/client/types.gen.js +3 -0
  75. package/dist/gateway-client/generated/client/types.gen.js.map +1 -0
  76. package/dist/gateway-client/generated/client/utils.gen.d.ts +38 -0
  77. package/dist/gateway-client/generated/client/utils.gen.d.ts.map +1 -0
  78. package/dist/gateway-client/generated/client/utils.gen.js +229 -0
  79. package/dist/gateway-client/generated/client/utils.gen.js.map +1 -0
  80. package/dist/gateway-client/generated/client.gen.d.ts +13 -0
  81. package/dist/gateway-client/generated/client.gen.d.ts.map +1 -0
  82. package/dist/gateway-client/generated/client.gen.js +4 -0
  83. package/dist/gateway-client/generated/client.gen.js.map +1 -0
  84. package/dist/gateway-client/generated/core/auth.gen.d.ts +26 -0
  85. package/dist/gateway-client/generated/core/auth.gen.d.ts.map +1 -0
  86. package/dist/gateway-client/generated/core/auth.gen.js +15 -0
  87. package/dist/gateway-client/generated/core/auth.gen.js.map +1 -0
  88. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts +26 -0
  89. package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts.map +1 -0
  90. package/dist/gateway-client/generated/core/bodySerializer.gen.js +58 -0
  91. package/dist/gateway-client/generated/core/bodySerializer.gen.js.map +1 -0
  92. package/dist/gateway-client/generated/core/params.gen.d.ts +44 -0
  93. package/dist/gateway-client/generated/core/params.gen.d.ts.map +1 -0
  94. package/dist/gateway-client/generated/core/params.gen.js +101 -0
  95. package/dist/gateway-client/generated/core/params.gen.js.map +1 -0
  96. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts +34 -0
  97. package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts.map +1 -0
  98. package/dist/gateway-client/generated/core/pathSerializer.gen.js +107 -0
  99. package/dist/gateway-client/generated/core/pathSerializer.gen.js.map +1 -0
  100. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts +19 -0
  101. package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
  102. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js +93 -0
  103. package/dist/gateway-client/generated/core/queryKeySerializer.gen.js.map +1 -0
  104. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts +72 -0
  105. package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts.map +1 -0
  106. package/dist/gateway-client/generated/core/serverSentEvents.gen.js +133 -0
  107. package/dist/gateway-client/generated/core/serverSentEvents.gen.js.map +1 -0
  108. package/dist/gateway-client/generated/core/types.gen.d.ts +84 -0
  109. package/dist/gateway-client/generated/core/types.gen.d.ts.map +1 -0
  110. package/dist/gateway-client/generated/core/types.gen.js +3 -0
  111. package/dist/gateway-client/generated/core/types.gen.js.map +1 -0
  112. package/dist/gateway-client/generated/core/utils.gen.d.ts +20 -0
  113. package/dist/gateway-client/generated/core/utils.gen.d.ts.map +1 -0
  114. package/dist/gateway-client/generated/core/utils.gen.js +88 -0
  115. package/dist/gateway-client/generated/core/utils.gen.js.map +1 -0
  116. package/dist/gateway-client/generated/index.d.ts +3 -0
  117. package/dist/gateway-client/generated/index.d.ts.map +1 -0
  118. package/dist/gateway-client/generated/index.js +3 -0
  119. package/dist/gateway-client/generated/index.js.map +1 -0
  120. package/dist/gateway-client/generated/namespaces.gen.d.ts +512 -0
  121. package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -0
  122. package/dist/gateway-client/generated/namespaces.gen.js +521 -0
  123. package/dist/gateway-client/generated/namespaces.gen.js.map +1 -0
  124. package/dist/gateway-client/generated/sdk.gen.d.ts +1780 -0
  125. package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -0
  126. package/dist/gateway-client/generated/sdk.gen.js +3811 -0
  127. package/dist/gateway-client/generated/sdk.gen.js.map +1 -0
  128. package/dist/gateway-client/generated/types.gen.d.ts +14681 -0
  129. package/dist/gateway-client/generated/types.gen.d.ts.map +1 -0
  130. package/dist/gateway-client/generated/types.gen.js +3 -0
  131. package/dist/gateway-client/generated/types.gen.js.map +1 -0
  132. package/dist/gateway-client/index.d.ts +27 -0
  133. package/dist/gateway-client/index.d.ts.map +1 -0
  134. package/dist/gateway-client/index.js +25 -0
  135. package/dist/gateway-client/index.js.map +1 -0
  136. package/dist/go/driver.d.ts +132 -7
  137. package/dist/go/driver.d.ts.map +1 -1
  138. package/dist/go/driver.js +135 -10
  139. package/dist/go/driver.js.map +1 -1
  140. package/dist/go/index.d.ts +1 -1
  141. package/dist/go/index.d.ts.map +1 -1
  142. package/dist/go/index.js +1 -1
  143. package/dist/go/index.js.map +1 -1
  144. package/dist/index.d.ts +11 -0
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +25 -0
  147. package/dist/index.js.map +1 -1
  148. package/dist/init.d.ts.map +1 -1
  149. package/dist/init.js +28 -0
  150. package/dist/init.js.map +1 -1
  151. package/dist/internal.d.ts +23 -11
  152. package/dist/internal.d.ts.map +1 -1
  153. package/dist/internal.js +29 -12
  154. package/dist/internal.js.map +1 -1
  155. package/dist/lifecycle/engine-ops.d.ts.map +1 -1
  156. package/dist/lifecycle/engine-ops.js +7 -4
  157. package/dist/lifecycle/engine-ops.js.map +1 -1
  158. package/dist/lifecycle/ivtr-loop.d.ts +108 -183
  159. package/dist/lifecycle/ivtr-loop.d.ts.map +1 -1
  160. package/dist/lifecycle/ivtr-loop.js +207 -522
  161. package/dist/lifecycle/ivtr-loop.js.map +1 -1
  162. package/dist/llm/auxiliary-fallback.js +1 -1
  163. package/dist/llm/auxiliary-fallback.js.map +1 -1
  164. package/dist/llm/catalog-model-resolver.d.ts +19 -0
  165. package/dist/llm/catalog-model-resolver.d.ts.map +1 -1
  166. package/dist/llm/catalog-model-resolver.js +36 -0
  167. package/dist/llm/catalog-model-resolver.js.map +1 -1
  168. package/dist/llm/catalog-resolver.d.ts +112 -0
  169. package/dist/llm/catalog-resolver.d.ts.map +1 -0
  170. package/dist/llm/catalog-resolver.js +207 -0
  171. package/dist/llm/catalog-resolver.js.map +1 -0
  172. package/dist/llm/catalog-seeder.d.ts +96 -0
  173. package/dist/llm/catalog-seeder.d.ts.map +1 -0
  174. package/dist/llm/catalog-seeder.js +189 -0
  175. package/dist/llm/catalog-seeder.js.map +1 -0
  176. package/dist/llm/cli-ops.d.ts +14 -1
  177. package/dist/llm/cli-ops.d.ts.map +1 -1
  178. package/dist/llm/cli-ops.js +46 -17
  179. package/dist/llm/cli-ops.js.map +1 -1
  180. package/dist/llm/complexity-classifier.d.ts +208 -0
  181. package/dist/llm/complexity-classifier.d.ts.map +1 -0
  182. package/dist/llm/complexity-classifier.js +359 -0
  183. package/dist/llm/complexity-classifier.js.map +1 -0
  184. package/dist/llm/concrete-session.d.ts.map +1 -1
  185. package/dist/llm/concrete-session.js +4 -0
  186. package/dist/llm/concrete-session.js.map +1 -1
  187. package/dist/llm/credential-pool.d.ts +2 -0
  188. package/dist/llm/credential-pool.d.ts.map +1 -1
  189. package/dist/llm/credential-pool.js +5 -2
  190. package/dist/llm/credential-pool.js.map +1 -1
  191. package/dist/llm/credentials-store.d.ts +10 -14
  192. package/dist/llm/credentials-store.d.ts.map +1 -1
  193. package/dist/llm/credentials-store.js.map +1 -1
  194. package/dist/llm/credentials.d.ts +35 -0
  195. package/dist/llm/credentials.d.ts.map +1 -1
  196. package/dist/llm/credentials.js +49 -0
  197. package/dist/llm/credentials.js.map +1 -1
  198. package/dist/llm/entity-ops.d.ts +299 -0
  199. package/dist/llm/entity-ops.d.ts.map +1 -0
  200. package/dist/llm/entity-ops.js +441 -0
  201. package/dist/llm/entity-ops.js.map +1 -0
  202. package/dist/llm/index.d.ts +19 -0
  203. package/dist/llm/index.d.ts.map +1 -1
  204. package/dist/llm/index.js +12 -0
  205. package/dist/llm/index.js.map +1 -1
  206. package/dist/llm/llm-queue-admit.d.ts +118 -0
  207. package/dist/llm/llm-queue-admit.d.ts.map +1 -0
  208. package/dist/llm/llm-queue-admit.js +275 -0
  209. package/dist/llm/llm-queue-admit.js.map +1 -0
  210. package/dist/llm/oauth/device-code.d.ts.map +1 -1
  211. package/dist/llm/oauth/device-code.js +2 -8
  212. package/dist/llm/oauth/device-code.js.map +1 -1
  213. package/dist/llm/oauth/google-pkce.d.ts.map +1 -1
  214. package/dist/llm/oauth/google-pkce.js +2 -18
  215. package/dist/llm/oauth/google-pkce.js.map +1 -1
  216. package/dist/llm/oauth/pkce.d.ts +70 -0
  217. package/dist/llm/oauth/pkce.d.ts.map +1 -1
  218. package/dist/llm/oauth/pkce.js +106 -29
  219. package/dist/llm/oauth/pkce.js.map +1 -1
  220. package/dist/llm/onboarding/front-door.d.ts +146 -0
  221. package/dist/llm/onboarding/front-door.d.ts.map +1 -0
  222. package/dist/llm/onboarding/front-door.js +153 -0
  223. package/dist/llm/onboarding/front-door.js.map +1 -0
  224. package/dist/llm/onboarding/login-engine.d.ts +175 -0
  225. package/dist/llm/onboarding/login-engine.d.ts.map +1 -0
  226. package/dist/llm/onboarding/login-engine.js +286 -0
  227. package/dist/llm/onboarding/login-engine.js.map +1 -0
  228. package/dist/llm/pi/gondolin-loader.d.ts +241 -0
  229. package/dist/llm/pi/gondolin-loader.d.ts.map +1 -0
  230. package/dist/llm/pi/gondolin-loader.js +195 -0
  231. package/dist/llm/pi/gondolin-loader.js.map +1 -0
  232. package/dist/llm/pi/index.d.ts +28 -0
  233. package/dist/llm/pi/index.d.ts.map +1 -0
  234. package/dist/llm/pi/index.js +27 -0
  235. package/dist/llm/pi/index.js.map +1 -0
  236. package/dist/llm/pi/pi-agent-adapter.d.ts +135 -0
  237. package/dist/llm/pi/pi-agent-adapter.d.ts.map +1 -0
  238. package/dist/llm/pi/pi-agent-adapter.js +329 -0
  239. package/dist/llm/pi/pi-agent-adapter.js.map +1 -0
  240. package/dist/llm/pi/pi-errors.d.ts +161 -0
  241. package/dist/llm/pi/pi-errors.d.ts.map +1 -0
  242. package/dist/llm/pi/pi-errors.js +296 -0
  243. package/dist/llm/pi/pi-errors.js.map +1 -0
  244. package/dist/llm/pi/pi-execution-env.d.ts +286 -0
  245. package/dist/llm/pi/pi-execution-env.d.ts.map +1 -0
  246. package/dist/llm/pi/pi-execution-env.js +406 -0
  247. package/dist/llm/pi/pi-execution-env.js.map +1 -0
  248. package/dist/llm/pi/pi-gondolin-env.d.ts +250 -0
  249. package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -0
  250. package/dist/llm/pi/pi-gondolin-env.js +541 -0
  251. package/dist/llm/pi/pi-gondolin-env.js.map +1 -0
  252. package/dist/llm/pi/pi-session-storage.d.ts +154 -0
  253. package/dist/llm/pi/pi-session-storage.d.ts.map +1 -0
  254. package/dist/llm/pi/pi-session-storage.js +314 -0
  255. package/dist/llm/pi/pi-session-storage.js.map +1 -0
  256. package/dist/llm/pi/pi-stream-fn.d.ts +124 -0
  257. package/dist/llm/pi/pi-stream-fn.d.ts.map +1 -0
  258. package/dist/llm/pi/pi-stream-fn.js +504 -0
  259. package/dist/llm/pi/pi-stream-fn.js.map +1 -0
  260. package/dist/llm/pi/pi-tool-bridge.d.ts +99 -0
  261. package/dist/llm/pi/pi-tool-bridge.d.ts.map +1 -0
  262. package/dist/llm/pi/pi-tool-bridge.js +117 -0
  263. package/dist/llm/pi/pi-tool-bridge.js.map +1 -0
  264. package/dist/llm/pi/pi-types.d.ts +56 -0
  265. package/dist/llm/pi/pi-types.d.ts.map +1 -0
  266. package/dist/llm/pi/pi-types.js +16 -0
  267. package/dist/llm/pi/pi-types.js.map +1 -0
  268. package/dist/llm/pi/resolve-execution-env.d.ts +194 -0
  269. package/dist/llm/pi/resolve-execution-env.d.ts.map +1 -0
  270. package/dist/llm/pi/resolve-execution-env.js +132 -0
  271. package/dist/llm/pi/resolve-execution-env.js.map +1 -0
  272. package/dist/llm/plugin-facade.js +5472 -1331
  273. package/dist/llm/plugin-facade.js.map +3 -3
  274. package/dist/llm/provider-registry/builtin/anthropic.d.ts.map +1 -1
  275. package/dist/llm/provider-registry/builtin/anthropic.js +23 -10
  276. package/dist/llm/provider-registry/builtin/anthropic.js.map +1 -1
  277. package/dist/llm/provider-registry/provider-alias.d.ts +62 -0
  278. package/dist/llm/provider-registry/provider-alias.d.ts.map +1 -0
  279. package/dist/llm/provider-registry/provider-alias.js +85 -0
  280. package/dist/llm/provider-registry/provider-alias.js.map +1 -0
  281. package/dist/llm/provider-registry/provider-defs.d.ts +45 -0
  282. package/dist/llm/provider-registry/provider-defs.d.ts.map +1 -0
  283. package/dist/llm/provider-registry/provider-defs.js +145 -0
  284. package/dist/llm/provider-registry/provider-defs.js.map +1 -0
  285. package/dist/llm/provider-registry/provider-seed.d.ts +78 -0
  286. package/dist/llm/provider-registry/provider-seed.d.ts.map +1 -0
  287. package/dist/llm/provider-registry/provider-seed.js +113 -0
  288. package/dist/llm/provider-registry/provider-seed.js.map +1 -0
  289. package/dist/llm/role-executor.d.ts.map +1 -1
  290. package/dist/llm/role-executor.js +44 -5
  291. package/dist/llm/role-executor.js.map +1 -1
  292. package/dist/llm/role-resolver.d.ts +46 -14
  293. package/dist/llm/role-resolver.d.ts.map +1 -1
  294. package/dist/llm/role-resolver.js +185 -20
  295. package/dist/llm/role-resolver.js.map +1 -1
  296. package/dist/llm/sealed-credential.d.ts +125 -0
  297. package/dist/llm/sealed-credential.d.ts.map +1 -0
  298. package/dist/llm/sealed-credential.js +133 -0
  299. package/dist/llm/sealed-credential.js.map +1 -0
  300. package/dist/llm/session-factory.d.ts.map +1 -1
  301. package/dist/llm/session-factory.js +6 -2
  302. package/dist/llm/session-factory.js.map +1 -1
  303. package/dist/llm/system-key.d.ts +67 -0
  304. package/dist/llm/system-key.d.ts.map +1 -0
  305. package/dist/llm/system-key.js +87 -0
  306. package/dist/llm/system-key.js.map +1 -0
  307. package/dist/llm/system-of-use-registry.d.ts +119 -0
  308. package/dist/llm/system-of-use-registry.d.ts.map +1 -0
  309. package/dist/llm/system-of-use-registry.js +200 -0
  310. package/dist/llm/system-of-use-registry.js.map +1 -0
  311. package/dist/llm/system-resolver.d.ts +32 -10
  312. package/dist/llm/system-resolver.d.ts.map +1 -1
  313. package/dist/llm/system-resolver.js +138 -35
  314. package/dist/llm/system-resolver.js.map +1 -1
  315. package/dist/memory/brain-writer-thread.d.ts.map +1 -1
  316. package/dist/memory/brain-writer-thread.js +116 -11
  317. package/dist/memory/brain-writer-thread.js.map +1 -1
  318. package/dist/memory/claude-mem-migration.d.ts.map +1 -1
  319. package/dist/memory/claude-mem-migration.js +21 -0
  320. package/dist/memory/claude-mem-migration.js.map +1 -1
  321. package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
  322. package/dist/memory/graph-memory-bridge.js +32 -25
  323. package/dist/memory/graph-memory-bridge.js.map +1 -1
  324. package/dist/memory/learnings.d.ts +4 -0
  325. package/dist/memory/learnings.d.ts.map +1 -1
  326. package/dist/memory/llm-backend-resolver.js +23 -5
  327. package/dist/memory/llm-backend-resolver.js.map +1 -1
  328. package/dist/memory/patterns.d.ts +4 -0
  329. package/dist/memory/patterns.d.ts.map +1 -1
  330. package/dist/metrics/index.d.ts +2 -0
  331. package/dist/metrics/index.d.ts.map +1 -1
  332. package/dist/metrics/index.js +1 -0
  333. package/dist/metrics/index.js.map +1 -1
  334. package/dist/nexus/migrations/M-split-graph.d.ts.map +1 -1
  335. package/dist/nexus/migrations/M-split-graph.js +60 -53
  336. package/dist/nexus/migrations/M-split-graph.js.map +1 -1
  337. package/dist/orchestrate/pivot.d.ts.map +1 -1
  338. package/dist/orchestrate/pivot.js +20 -2
  339. package/dist/orchestrate/pivot.js.map +1 -1
  340. package/dist/orchestration/spawn.d.ts +89 -0
  341. package/dist/orchestration/spawn.d.ts.map +1 -1
  342. package/dist/orchestration/spawn.js +68 -0
  343. package/dist/orchestration/spawn.js.map +1 -1
  344. package/dist/playbooks/cantbook-profile.d.ts +96 -0
  345. package/dist/playbooks/cantbook-profile.d.ts.map +1 -0
  346. package/dist/playbooks/cantbook-profile.js +97 -0
  347. package/dist/playbooks/cantbook-profile.js.map +1 -0
  348. package/dist/playbooks/guarded-deterministic-runner.d.ts +153 -0
  349. package/dist/playbooks/guarded-deterministic-runner.d.ts.map +1 -0
  350. package/dist/playbooks/guarded-deterministic-runner.js +155 -0
  351. package/dist/playbooks/guarded-deterministic-runner.js.map +1 -0
  352. package/dist/playbooks/index.d.ts +2 -0
  353. package/dist/playbooks/index.d.ts.map +1 -1
  354. package/dist/playbooks/index.js +10 -0
  355. package/dist/playbooks/index.js.map +1 -1
  356. package/dist/playbooks/pi-runner-wiring.d.ts +75 -0
  357. package/dist/playbooks/pi-runner-wiring.d.ts.map +1 -0
  358. package/dist/playbooks/pi-runner-wiring.js +82 -0
  359. package/dist/playbooks/pi-runner-wiring.js.map +1 -0
  360. package/dist/release/engine-ops.js +2 -2
  361. package/dist/release/engine-ops.js.map +1 -1
  362. package/dist/routing/capability-matrix.d.ts.map +1 -1
  363. package/dist/routing/capability-matrix.js +0 -57
  364. package/dist/routing/capability-matrix.js.map +1 -1
  365. package/dist/runtime/openapi/generate-openapi.d.ts +211 -0
  366. package/dist/runtime/openapi/generate-openapi.d.ts.map +1 -0
  367. package/dist/runtime/openapi/generate-openapi.js +300 -0
  368. package/dist/runtime/openapi/generate-openapi.js.map +1 -0
  369. package/dist/runtime/openapi/index.d.ts +16 -0
  370. package/dist/runtime/openapi/index.d.ts.map +1 -0
  371. package/dist/runtime/openapi/index.js +16 -0
  372. package/dist/runtime/openapi/index.js.map +1 -0
  373. package/dist/selfimprove/budget.d.ts +206 -0
  374. package/dist/selfimprove/budget.d.ts.map +1 -0
  375. package/dist/selfimprove/budget.js +203 -0
  376. package/dist/selfimprove/budget.js.map +1 -0
  377. package/dist/selfimprove/dhq-adapter.d.ts +105 -0
  378. package/dist/selfimprove/dhq-adapter.d.ts.map +1 -0
  379. package/dist/selfimprove/dhq-adapter.js +95 -0
  380. package/dist/selfimprove/dhq-adapter.js.map +1 -0
  381. package/dist/selfimprove/draft-pr.d.ts +129 -0
  382. package/dist/selfimprove/draft-pr.d.ts.map +1 -0
  383. package/dist/selfimprove/draft-pr.js +158 -0
  384. package/dist/selfimprove/draft-pr.js.map +1 -0
  385. package/dist/selfimprove/envelope-diff.d.ts +162 -0
  386. package/dist/selfimprove/envelope-diff.d.ts.map +1 -0
  387. package/dist/selfimprove/envelope-diff.js +321 -0
  388. package/dist/selfimprove/envelope-diff.js.map +1 -0
  389. package/dist/selfimprove/replay.d.ts +121 -0
  390. package/dist/selfimprove/replay.d.ts.map +1 -0
  391. package/dist/selfimprove/replay.js +109 -0
  392. package/dist/selfimprove/replay.js.map +1 -0
  393. package/dist/selfimprove/run-loop.d.ts +148 -0
  394. package/dist/selfimprove/run-loop.d.ts.map +1 -0
  395. package/dist/selfimprove/run-loop.js +240 -0
  396. package/dist/selfimprove/run-loop.js.map +1 -0
  397. package/dist/selfimprove/scenario.d.ts +145 -0
  398. package/dist/selfimprove/scenario.d.ts.map +1 -0
  399. package/dist/selfimprove/scenario.js +243 -0
  400. package/dist/selfimprove/scenario.js.map +1 -0
  401. package/dist/selfimprove/scenarios/dhq-replay-find/golden.json +32 -0
  402. package/dist/selfimprove/scenarios/dhq-replay-find/scenario.json +18 -0
  403. package/dist/sentient/daemon-entry.js +5 -0
  404. package/dist/sentient/daemon-entry.js.map +1 -1
  405. package/dist/sentient/daemon.d.ts.map +1 -1
  406. package/dist/sentient/daemon.js +19 -0
  407. package/dist/sentient/daemon.js.map +1 -1
  408. package/dist/sentient/hygiene-scan.d.ts.map +1 -1
  409. package/dist/sentient/hygiene-scan.js +14 -6
  410. package/dist/sentient/hygiene-scan.js.map +1 -1
  411. package/dist/sessions/briefing.d.ts.map +1 -1
  412. package/dist/sessions/briefing.js +13 -9
  413. package/dist/sessions/briefing.js.map +1 -1
  414. package/dist/sessions/connection-session-handle.d.ts +161 -0
  415. package/dist/sessions/connection-session-handle.d.ts.map +1 -0
  416. package/dist/sessions/connection-session-handle.js +168 -0
  417. package/dist/sessions/connection-session-handle.js.map +1 -0
  418. package/dist/sessions/handoff.d.ts.map +1 -1
  419. package/dist/sessions/handoff.js +9 -0
  420. package/dist/sessions/handoff.js.map +1 -1
  421. package/dist/sessions/index.d.ts +4 -1
  422. package/dist/sessions/index.d.ts.map +1 -1
  423. package/dist/sessions/index.js +31 -1
  424. package/dist/sessions/index.js.map +1 -1
  425. package/dist/sessions/session-id.d.ts +34 -0
  426. package/dist/sessions/session-id.d.ts.map +1 -1
  427. package/dist/sessions/session-id.js +37 -0
  428. package/dist/sessions/session-id.js.map +1 -1
  429. package/dist/sessions/session-manifest-mirror.d.ts +115 -0
  430. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -0
  431. package/dist/sessions/session-manifest-mirror.js +250 -0
  432. package/dist/sessions/session-manifest-mirror.js.map +1 -0
  433. package/dist/sessions/session-switch.d.ts.map +1 -1
  434. package/dist/sessions/session-switch.js +5 -2
  435. package/dist/sessions/session-switch.js.map +1 -1
  436. package/dist/setup/config-json-merge.d.ts.map +1 -1
  437. package/dist/setup/config-json-merge.js +14 -0
  438. package/dist/setup/config-json-merge.js.map +1 -1
  439. package/dist/setup/index.d.ts +23 -11
  440. package/dist/setup/index.d.ts.map +1 -1
  441. package/dist/setup/index.js +25 -12
  442. package/dist/setup/index.js.map +1 -1
  443. package/dist/setup/sections/llm.d.ts +28 -1
  444. package/dist/setup/sections/llm.d.ts.map +1 -1
  445. package/dist/setup/sections/llm.js +27 -6
  446. package/dist/setup/sections/llm.js.map +1 -1
  447. package/dist/setup/sections/models-roles.d.ts +40 -0
  448. package/dist/setup/sections/models-roles.d.ts.map +1 -0
  449. package/dist/setup/sections/models-roles.js +219 -0
  450. package/dist/setup/sections/models-roles.js.map +1 -0
  451. package/dist/setup/wizard.d.ts +19 -1
  452. package/dist/setup/wizard.d.ts.map +1 -1
  453. package/dist/setup/wizard.js.map +1 -1
  454. package/dist/store/converters.d.ts.map +1 -1
  455. package/dist/store/converters.js +2 -0
  456. package/dist/store/converters.js.map +1 -1
  457. package/dist/store/db-helpers.d.ts.map +1 -1
  458. package/dist/store/db-helpers.js +2 -0
  459. package/dist/store/db-helpers.js.map +1 -1
  460. package/dist/store/dual-scope-db.d.ts.map +1 -1
  461. package/dist/store/dual-scope-db.js +87 -47
  462. package/dist/store/dual-scope-db.js.map +1 -1
  463. package/dist/store/pi-session-store.d.ts +151 -0
  464. package/dist/store/pi-session-store.d.ts.map +1 -0
  465. package/dist/store/pi-session-store.js +166 -0
  466. package/dist/store/pi-session-store.js.map +1 -0
  467. package/dist/store/safety-data-accessor.d.ts +1 -0
  468. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  469. package/dist/store/safety-data-accessor.js +5 -0
  470. package/dist/store/safety-data-accessor.js.map +1 -1
  471. package/dist/store/schedule-schema.d.ts +195 -0
  472. package/dist/store/schedule-schema.d.ts.map +1 -0
  473. package/dist/store/schedule-schema.js +84 -0
  474. package/dist/store/schedule-schema.js.map +1 -0
  475. package/dist/store/schedule-store.d.ts +144 -0
  476. package/dist/store/schedule-store.d.ts.map +1 -0
  477. package/dist/store/schedule-store.js +162 -0
  478. package/dist/store/schedule-store.js.map +1 -0
  479. package/dist/store/schema/attachments.d.ts +1 -1
  480. package/dist/store/schema/cleo-global/accounts.d.ts +357 -0
  481. package/dist/store/schema/cleo-global/accounts.d.ts.map +1 -0
  482. package/dist/store/schema/cleo-global/accounts.js +136 -0
  483. package/dist/store/schema/cleo-global/accounts.js.map +1 -0
  484. package/dist/store/schema/cleo-global/index.d.ts +5 -0
  485. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  486. package/dist/store/schema/cleo-global/index.js +7 -0
  487. package/dist/store/schema/cleo-global/index.js.map +1 -1
  488. package/dist/store/schema/cleo-global/models-catalog.d.ts +359 -0
  489. package/dist/store/schema/cleo-global/models-catalog.d.ts.map +1 -0
  490. package/dist/store/schema/cleo-global/models-catalog.js +114 -0
  491. package/dist/store/schema/cleo-global/models-catalog.js.map +1 -0
  492. package/dist/store/schema/cleo-global/providers.d.ts +279 -0
  493. package/dist/store/schema/cleo-global/providers.d.ts.map +1 -0
  494. package/dist/store/schema/cleo-global/providers.js +94 -0
  495. package/dist/store/schema/cleo-global/providers.js.map +1 -0
  496. package/dist/store/schema/cleo-global/services.d.ts +493 -0
  497. package/dist/store/schema/cleo-global/services.d.ts.map +1 -0
  498. package/dist/store/schema/cleo-global/services.js +200 -0
  499. package/dist/store/schema/cleo-global/services.js.map +1 -0
  500. package/dist/store/schema/cleo-global/session-manifest.d.ts +217 -0
  501. package/dist/store/schema/cleo-global/session-manifest.d.ts.map +1 -0
  502. package/dist/store/schema/cleo-global/session-manifest.js +99 -0
  503. package/dist/store/schema/cleo-global/session-manifest.js.map +1 -0
  504. package/dist/store/schema/cleo-project/docs.d.ts +1 -1
  505. package/dist/store/schema/cleo-project/provenance-rest.d.ts +1 -1
  506. package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
  507. package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
  508. package/dist/store/schema/cleo-project/tasks-core.js +14 -0
  509. package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
  510. package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
  511. package/dist/store/schema/memory-schema.d.ts +182 -2
  512. package/dist/store/schema/memory-schema.d.ts.map +1 -1
  513. package/dist/store/schema/memory-schema.js +111 -2
  514. package/dist/store/schema/memory-schema.js.map +1 -1
  515. package/dist/store/schema/provenance/releases.d.ts +1 -1
  516. package/dist/store/schema/tasks.d.ts +16 -0
  517. package/dist/store/schema/tasks.d.ts.map +1 -1
  518. package/dist/store/schema/tasks.js +10 -0
  519. package/dist/store/schema/tasks.js.map +1 -1
  520. package/dist/store/selfimprove-dhq-schema.d.ts +284 -0
  521. package/dist/store/selfimprove-dhq-schema.d.ts.map +1 -0
  522. package/dist/store/selfimprove-dhq-schema.js +128 -0
  523. package/dist/store/selfimprove-dhq-schema.js.map +1 -0
  524. package/dist/store/selfimprove-dhq-store.d.ts +175 -0
  525. package/dist/store/selfimprove-dhq-store.d.ts.map +1 -0
  526. package/dist/store/selfimprove-dhq-store.js +182 -0
  527. package/dist/store/selfimprove-dhq-store.js.map +1 -0
  528. package/dist/store/service-connections-accessor.d.ts +313 -0
  529. package/dist/store/service-connections-accessor.d.ts.map +1 -0
  530. package/dist/store/service-connections-accessor.js +464 -0
  531. package/dist/store/service-connections-accessor.js.map +1 -0
  532. package/dist/store/service-host-matcher.d.ts +70 -0
  533. package/dist/store/service-host-matcher.d.ts.map +1 -0
  534. package/dist/store/service-host-matcher.js +127 -0
  535. package/dist/store/service-host-matcher.js.map +1 -0
  536. package/dist/store/service-injection.d.ts +152 -0
  537. package/dist/store/service-injection.d.ts.map +1 -0
  538. package/dist/store/service-injection.js +225 -0
  539. package/dist/store/service-injection.js.map +1 -0
  540. package/dist/store/service-oauth.d.ts +287 -0
  541. package/dist/store/service-oauth.d.ts.map +1 -0
  542. package/dist/store/service-oauth.js +524 -0
  543. package/dist/store/service-oauth.js.map +1 -0
  544. package/dist/store/service-trust-gate.d.ts +164 -0
  545. package/dist/store/service-trust-gate.d.ts.map +1 -0
  546. package/dist/store/service-trust-gate.js +122 -0
  547. package/dist/store/service-trust-gate.js.map +1 -0
  548. package/dist/store/session-store.d.ts +52 -13
  549. package/dist/store/session-store.d.ts.map +1 -1
  550. package/dist/store/session-store.js +71 -13
  551. package/dist/store/session-store.js.map +1 -1
  552. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  553. package/dist/store/sqlite-data-accessor.js +7 -0
  554. package/dist/store/sqlite-data-accessor.js.map +1 -1
  555. package/dist/store/umbrella-data-accessor.d.ts +1 -0
  556. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  557. package/dist/store/umbrella-data-accessor.js +5 -0
  558. package/dist/store/umbrella-data-accessor.js.map +1 -1
  559. package/dist/store/validation-schemas.d.ts +36 -4
  560. package/dist/store/validation-schemas.d.ts.map +1 -1
  561. package/dist/store/writer-lease-schema.d.ts +392 -0
  562. package/dist/store/writer-lease-schema.d.ts.map +1 -0
  563. package/dist/store/writer-lease-schema.js +142 -0
  564. package/dist/store/writer-lease-schema.js.map +1 -0
  565. package/dist/store/writer-lease.d.ts +368 -0
  566. package/dist/store/writer-lease.d.ts.map +1 -0
  567. package/dist/store/writer-lease.js +1002 -0
  568. package/dist/store/writer-lease.js.map +1 -0
  569. package/dist/tasks/agent-lifecycle-lane.d.ts +175 -0
  570. package/dist/tasks/agent-lifecycle-lane.d.ts.map +1 -0
  571. package/dist/tasks/agent-lifecycle-lane.js +176 -0
  572. package/dist/tasks/agent-lifecycle-lane.js.map +1 -0
  573. package/dist/tasks/backfill-child-projections.d.ts.map +1 -1
  574. package/dist/tasks/backfill-child-projections.js +14 -9
  575. package/dist/tasks/backfill-child-projections.js.map +1 -1
  576. package/dist/tasks/complete.d.ts +17 -0
  577. package/dist/tasks/complete.d.ts.map +1 -1
  578. package/dist/tasks/complete.js +60 -20
  579. package/dist/tasks/complete.js.map +1 -1
  580. package/dist/tasks/depends-waiver-audit.d.ts +52 -0
  581. package/dist/tasks/depends-waiver-audit.d.ts.map +1 -0
  582. package/dist/tasks/depends-waiver-audit.js +36 -0
  583. package/dist/tasks/depends-waiver-audit.js.map +1 -0
  584. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  585. package/dist/tasks/duplicate-detector.js +14 -7
  586. package/dist/tasks/duplicate-detector.js.map +1 -1
  587. package/dist/tasks/engine-wrap.d.ts +36 -2
  588. package/dist/tasks/engine-wrap.d.ts.map +1 -1
  589. package/dist/tasks/engine-wrap.js +44 -2
  590. package/dist/tasks/engine-wrap.js.map +1 -1
  591. package/dist/tasks/index.d.ts +1 -0
  592. package/dist/tasks/index.d.ts.map +1 -1
  593. package/dist/tasks/index.js +1 -0
  594. package/dist/tasks/index.js.map +1 -1
  595. package/dist/tasks/ops.d.ts +3 -0
  596. package/dist/tasks/ops.d.ts.map +1 -1
  597. package/dist/tasks/task-ops.d.ts +1 -1
  598. package/dist/tasks/task-ops.d.ts.map +1 -1
  599. package/dist/tasks/task-ops.js +3 -1
  600. package/dist/tasks/task-ops.js.map +1 -1
  601. package/dist/tasks/task-reparent.d.ts +90 -0
  602. package/dist/tasks/task-reparent.d.ts.map +1 -1
  603. package/dist/tasks/task-reparent.js +171 -0
  604. package/dist/tasks/task-reparent.js.map +1 -1
  605. package/dist/telemetry/index.d.ts.map +1 -1
  606. package/dist/telemetry/index.js +10 -4
  607. package/dist/telemetry/index.js.map +1 -1
  608. package/dist/tools/agent-registry.d.ts +250 -0
  609. package/dist/tools/agent-registry.d.ts.map +1 -0
  610. package/dist/tools/agent-registry.js +292 -0
  611. package/dist/tools/agent-registry.js.map +1 -0
  612. package/dist/tools/agent-tool-families.d.ts +107 -0
  613. package/dist/tools/agent-tool-families.d.ts.map +1 -0
  614. package/dist/tools/agent-tool-families.js +527 -0
  615. package/dist/tools/agent-tool-families.js.map +1 -0
  616. package/dist/tools/browser-driver.d.ts +183 -0
  617. package/dist/tools/browser-driver.d.ts.map +1 -0
  618. package/dist/tools/browser-driver.js +242 -0
  619. package/dist/tools/browser-driver.js.map +1 -0
  620. package/dist/tools/builtin-agent-tools.d.ts +36 -0
  621. package/dist/tools/builtin-agent-tools.d.ts.map +1 -0
  622. package/dist/tools/builtin-agent-tools.js +191 -0
  623. package/dist/tools/builtin-agent-tools.js.map +1 -0
  624. package/dist/tools/dispatch.d.ts +370 -0
  625. package/dist/tools/dispatch.d.ts.map +1 -0
  626. package/dist/tools/dispatch.js +505 -0
  627. package/dist/tools/dispatch.js.map +1 -0
  628. package/dist/tools/env-scrub.d.ts +93 -0
  629. package/dist/tools/env-scrub.d.ts.map +1 -0
  630. package/dist/tools/env-scrub.js +176 -0
  631. package/dist/tools/env-scrub.js.map +1 -0
  632. package/dist/tools/exec-code-agent-tool.d.ts +179 -0
  633. package/dist/tools/exec-code-agent-tool.d.ts.map +1 -0
  634. package/dist/tools/exec-code-agent-tool.js +239 -0
  635. package/dist/tools/exec-code-agent-tool.js.map +1 -0
  636. package/dist/tools/fs.d.ts +30 -0
  637. package/dist/tools/fs.d.ts.map +1 -1
  638. package/dist/tools/fs.js +55 -2
  639. package/dist/tools/fs.js.map +1 -1
  640. package/dist/tools/guard.d.ts +15 -0
  641. package/dist/tools/guard.d.ts.map +1 -1
  642. package/dist/tools/guard.js +49 -12
  643. package/dist/tools/guard.js.map +1 -1
  644. package/dist/tools/index.d.ts +16 -0
  645. package/dist/tools/index.d.ts.map +1 -1
  646. package/dist/tools/index.js +52 -0
  647. package/dist/tools/index.js.map +1 -1
  648. package/dist/tools/mcp-agent-tool.d.ts +189 -0
  649. package/dist/tools/mcp-agent-tool.d.ts.map +1 -0
  650. package/dist/tools/mcp-agent-tool.js +243 -0
  651. package/dist/tools/mcp-agent-tool.js.map +1 -0
  652. package/dist/tools/media-agent-tools.d.ts +105 -0
  653. package/dist/tools/media-agent-tools.d.ts.map +1 -0
  654. package/dist/tools/media-agent-tools.js +255 -0
  655. package/dist/tools/media-agent-tools.js.map +1 -0
  656. package/dist/tools/memory-agent-tools.d.ts +99 -0
  657. package/dist/tools/memory-agent-tools.d.ts.map +1 -0
  658. package/dist/tools/memory-agent-tools.js +190 -0
  659. package/dist/tools/memory-agent-tools.js.map +1 -0
  660. package/dist/tools/pty.d.ts +45 -0
  661. package/dist/tools/pty.d.ts.map +1 -0
  662. package/dist/tools/pty.js +166 -0
  663. package/dist/tools/pty.js.map +1 -0
  664. package/dist/tools/schedule-agent-tools.d.ts +151 -0
  665. package/dist/tools/schedule-agent-tools.d.ts.map +1 -0
  666. package/dist/tools/schedule-agent-tools.js +238 -0
  667. package/dist/tools/schedule-agent-tools.js.map +1 -0
  668. package/dist/tools/schema-gen.d.ts +57 -0
  669. package/dist/tools/schema-gen.d.ts.map +1 -0
  670. package/dist/tools/schema-gen.js +52 -0
  671. package/dist/tools/schema-gen.js.map +1 -0
  672. package/dist/tools/shell.d.ts +12 -0
  673. package/dist/tools/shell.d.ts.map +1 -1
  674. package/dist/tools/shell.js +14 -1
  675. package/dist/tools/shell.js.map +1 -1
  676. package/dist/tools/skill-agent-tool.d.ts +108 -0
  677. package/dist/tools/skill-agent-tool.d.ts.map +1 -0
  678. package/dist/tools/skill-agent-tool.js +135 -0
  679. package/dist/tools/skill-agent-tool.js.map +1 -0
  680. package/dist/tools/web-agent-tools.d.ts +72 -0
  681. package/dist/tools/web-agent-tools.d.ts.map +1 -0
  682. package/dist/tools/web-agent-tools.js +393 -0
  683. package/dist/tools/web-agent-tools.js.map +1 -0
  684. package/dist/tools/web-search-backends.d.ts +156 -0
  685. package/dist/tools/web-search-backends.d.ts.map +1 -0
  686. package/dist/tools/web-search-backends.js +290 -0
  687. package/dist/tools/web-search-backends.js.map +1 -0
  688. package/dist/validation/engine-ops.d.ts.map +1 -1
  689. package/dist/validation/engine-ops.js +17 -1
  690. package/dist/validation/engine-ops.js.map +1 -1
  691. package/dist/validation/ops.d.ts +1 -15
  692. package/dist/validation/ops.d.ts.map +1 -1
  693. package/dist/validation/ops.js +0 -20
  694. package/dist/validation/ops.js.map +1 -1
  695. package/migrations/drizzle-brain/20260610000001_t10405-bitemporal-network-columns/migration.sql +71 -0
  696. package/migrations/drizzle-cleo-global/20260607000000_t11891-writer-leases/migration.sql +55 -0
  697. package/migrations/drizzle-cleo-global/20260607010000_t11639-session-manifest/migration.sql +43 -0
  698. package/migrations/drizzle-cleo-global/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  699. package/migrations/drizzle-cleo-global/20260608010000_t11709-accounts-credential-pool/migration.sql +72 -0
  700. package/migrations/drizzle-cleo-global/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  701. package/migrations/drizzle-cleo-global/20260609000000_t11937-service-vault/migration.sql +93 -0
  702. package/migrations/drizzle-cleo-global/20260609010000_t11733-models-catalog/migration.sql +65 -0
  703. package/migrations/drizzle-cleo-global/20260609020000_t11703-providers/migration.sql +52 -0
  704. package/migrations/drizzle-cleo-global/20260610000000_t11962-schedules/migration.sql +48 -0
  705. package/migrations/drizzle-cleo-project/20260607000000_t11891-writer-leases/migration.sql +55 -0
  706. package/migrations/drizzle-cleo-project/20260607010000_t11639-session-parent/migration.sql +22 -0
  707. package/migrations/drizzle-cleo-project/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  708. package/migrations/drizzle-cleo-project/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  709. package/migrations/drizzle-cleo-project/20260610000000_t11962-schedules/migration.sql +48 -0
  710. package/package.json +26 -14
  711. package/dist/lifecycle/chain-composition.d.ts +0 -30
  712. package/dist/lifecycle/chain-composition.d.ts.map +0 -1
  713. package/dist/lifecycle/chain-composition.js +0 -152
  714. package/dist/lifecycle/chain-composition.js.map +0 -1
  715. package/dist/lifecycle/chain-store.d.ts +0 -70
  716. package/dist/lifecycle/chain-store.d.ts.map +0 -1
  717. package/dist/lifecycle/chain-store.js +0 -246
  718. package/dist/lifecycle/chain-store.js.map +0 -1
  719. package/dist/lifecycle/default-chain.d.ts +0 -39
  720. package/dist/lifecycle/default-chain.d.ts.map +0 -1
  721. package/dist/lifecycle/default-chain.js +0 -176
  722. package/dist/lifecycle/default-chain.js.map +0 -1
  723. package/dist/lifecycle/tessera-engine.d.ts +0 -48
  724. package/dist/lifecycle/tessera-engine.d.ts.map +0 -1
  725. package/dist/lifecycle/tessera-engine.js +0 -249
  726. package/dist/lifecycle/tessera-engine.js.map +0 -1
  727. package/dist/validation/chain-validation.d.ts +0 -43
  728. package/dist/validation/chain-validation.d.ts.map +0 -1
  729. package/dist/validation/chain-validation.js +0 -146
  730. package/dist/validation/chain-validation.js.map +0 -1
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Subprocess environment scrubbing (T11897 · S1 · security hardening).
3
+ *
4
+ * Building the environment a child process inherits is a SECURITY boundary, not
5
+ * a convenience. Two distinct threats are closed here:
6
+ *
7
+ * 1. **Sandbox escape via Pi-controlled env** — a model-driven loop that can
8
+ * set `LD_PRELOAD`, `NODE_OPTIONS`, `GIT_SSH_COMMAND`, `DYLD_*`, or a custom
9
+ * `PATH` gains arbitrary native code execution outside any command allowlist
10
+ * (the OS loader / Node honour them) and can satisfy a basename denylist with
11
+ * a workspace-resident impostor on a hijacked `PATH`. The scrubber NEVER
12
+ * forwards any of these dangerous variables and PINS `PATH` to a trusted
13
+ * absolute value.
14
+ * 2. **Daemon-secret exfiltration** — the daemon's own `process.env` carries
15
+ * resolved provider credentials (`ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, …),
16
+ * OAuth headers, and vault material (`CLEO_VAULT_*`). Inheriting the full
17
+ * parent env into a Pi-spawned child means a single `env`/`printenv`/log line
18
+ * exfiltrates them. The scrubber builds a MINIMAL, explicitly-constructed env
19
+ * instead of inheriting `process.env`.
20
+ *
21
+ * The doctrine is **allowlist, not denylist**: the scrubbed env starts EMPTY and
22
+ * only a small set of benign, named variables are copied through from the parent
23
+ * (locale, terminal, home/user, tmp). Everything else — including every secret,
24
+ * every loader hook, and `PATH` itself — is reconstructed from trusted inputs.
25
+ *
26
+ * Pure function of input — no global/session coupling, import-time side-effect
27
+ * free (S1).
28
+ *
29
+ * @epic T10403
30
+ * @task T11761
31
+ * @task T11897
32
+ * @saga T11387
33
+ */
34
+ import { delimiter } from 'node:path';
35
+ /**
36
+ * The trusted, absolute `PATH` a scrubbed subprocess runs under. A fixed list of
37
+ * standard system binary directories — NEVER the caller's (possibly Pi-poisoned)
38
+ * `PATH`. Pinning this defeats the "workspace-resident impostor on a hijacked
39
+ * PATH satisfies an allowed basename" escape: the workspace is not on it.
40
+ */
41
+ export const TRUSTED_PATH = [
42
+ '/usr/local/sbin',
43
+ '/usr/local/bin',
44
+ '/usr/sbin',
45
+ '/usr/bin',
46
+ '/sbin',
47
+ '/bin',
48
+ ].join(delimiter);
49
+ /**
50
+ * Benign environment variables copied through from the parent when present.
51
+ * These carry NO secrets and NO code-execution surface — locale, terminal type,
52
+ * timezone, home/user identity, and the tmp dir. `PATH` is deliberately ABSENT
53
+ * (it is pinned to {@link TRUSTED_PATH}); every `*_API_KEY`, `*_TOKEN`,
54
+ * `LD_*`, `DYLD_*`, `NODE_OPTIONS`, and `GIT_SSH_COMMAND` is deliberately ABSENT.
55
+ */
56
+ const PASSTHROUGH_KEYS = [
57
+ 'HOME',
58
+ 'USER',
59
+ 'LOGNAME',
60
+ 'LANG',
61
+ 'LC_ALL',
62
+ 'LC_CTYPE',
63
+ 'TZ',
64
+ 'TERM',
65
+ 'TMPDIR',
66
+ 'SHELL',
67
+ ];
68
+ /**
69
+ * Variable-name prefixes that are NEVER forwarded into a scrubbed subprocess.
70
+ * These either grant arbitrary code execution to the child (loader/runtime
71
+ * hooks) or carry credentials. Matched case-INsensitively as a prefix so e.g.
72
+ * `LD_PRELOAD`, `LD_LIBRARY_PATH`, `DYLD_INSERT_LIBRARIES`, `ANTHROPIC_API_KEY`,
73
+ * `OPENAI_API_KEY`, `CLEO_VAULT_SECRET`, and `AWS_SECRET_ACCESS_KEY` are all
74
+ * caught. Used to filter the caller-supplied `extra` map.
75
+ */
76
+ const FORBIDDEN_PREFIXES = [
77
+ 'LD_',
78
+ 'DYLD_',
79
+ 'NODE_OPTIONS',
80
+ 'NODE_REPL_EXTERNAL_MODULE',
81
+ 'GIT_SSH',
82
+ 'GIT_PROXY',
83
+ 'BASH_ENV',
84
+ 'ENV',
85
+ 'CDPATH',
86
+ ];
87
+ /**
88
+ * Exact variable names that are NEVER forwarded (in addition to
89
+ * {@link FORBIDDEN_PREFIXES}). `PATH` is pinned separately, so a caller cannot
90
+ * override it via `extra`.
91
+ */
92
+ const FORBIDDEN_EXACT = new Set(['PATH', 'IFS']);
93
+ /**
94
+ * Substrings whose presence in a variable NAME marks it as a credential that is
95
+ * NEVER forwarded. Matched case-INsensitively. Catches `*_API_KEY`, `*_TOKEN`,
96
+ * `*_SECRET`, `*PASSWORD*`, OAuth material, and the vault namespace.
97
+ */
98
+ const SECRET_NAME_SUBSTRINGS = [
99
+ 'API_KEY',
100
+ 'APIKEY',
101
+ 'SECRET',
102
+ 'TOKEN',
103
+ 'PASSWORD',
104
+ 'PASSWD',
105
+ 'CREDENTIAL',
106
+ 'PRIVATE_KEY',
107
+ 'ACCESS_KEY',
108
+ 'AUTH',
109
+ 'VAULT',
110
+ 'SESSION_KEY',
111
+ ];
112
+ /**
113
+ * Whether a variable NAME is forbidden in a scrubbed subprocess env (a loader
114
+ * hook, `PATH`, or a credential).
115
+ *
116
+ * @param name - The environment variable name.
117
+ * @returns `true` when the variable must NOT be forwarded.
118
+ */
119
+ export function isForbiddenEnvName(name) {
120
+ const upper = name.toUpperCase();
121
+ if (FORBIDDEN_EXACT.has(upper))
122
+ return true;
123
+ if (FORBIDDEN_PREFIXES.some((p) => upper.startsWith(p)))
124
+ return true;
125
+ if (SECRET_NAME_SUBSTRINGS.some((s) => upper.includes(s)))
126
+ return true;
127
+ return false;
128
+ }
129
+ /**
130
+ * Build a MINIMAL, explicitly-constructed subprocess environment.
131
+ *
132
+ * The result starts EMPTY; only the benign {@link PASSTHROUGH_KEYS} present in
133
+ * `parentEnv` are copied, `PATH` is pinned to a trusted absolute value, and any
134
+ * caller-supplied `extra` is merged ON TOP after being filtered through
135
+ * {@link isForbiddenEnvName}. The daemon's secrets and any loader hooks in the
136
+ * parent environment are therefore NEVER visible to the child, and an untrusted
137
+ * caller cannot reintroduce an escape via `extra`.
138
+ *
139
+ * @param options - {@link ScrubEnvOptions}.
140
+ * @returns A fresh `Record<string, string>` safe to hand to `spawn(..., { env })`.
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * // A Pi-supplied env that tries to inject a loader hook + hijack PATH:
145
+ * const env = scrubSubprocessEnv({
146
+ * extra: { LD_PRELOAD: '/tmp/evil.so', PATH: '/workspace', SAFE: '1' },
147
+ * });
148
+ * // env has no LD_PRELOAD, PATH is the pinned TRUSTED_PATH, only SAFE survives.
149
+ * ```
150
+ */
151
+ export function scrubSubprocessEnv(options = {}) {
152
+ const parentEnv = options.parentEnv ?? process.env;
153
+ const scrubbed = {};
154
+ for (const key of PASSTHROUGH_KEYS) {
155
+ const value = parentEnv[key];
156
+ if (typeof value === 'string' && value.length > 0 && !isForbiddenEnvName(key)) {
157
+ scrubbed[key] = value;
158
+ }
159
+ }
160
+ // Pin PATH to a trusted absolute value — never the inbound/parent PATH.
161
+ scrubbed.PATH = options.path ?? TRUSTED_PATH;
162
+ // Merge caller-supplied extras ON TOP, but drop any dangerous key so an
163
+ // untrusted caller (Pi) cannot reintroduce a loader hook, secret, or PATH
164
+ // override through this channel.
165
+ if (options.extra) {
166
+ for (const [key, value] of Object.entries(options.extra)) {
167
+ if (typeof value !== 'string')
168
+ continue;
169
+ if (isForbiddenEnvName(key))
170
+ continue;
171
+ scrubbed[key] = value;
172
+ }
173
+ }
174
+ return scrubbed;
175
+ }
176
+ //# sourceMappingURL=env-scrub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-scrub.js","sourceRoot":"","sources":["../../src/tools/env-scrub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * `execute_code` agent tool — guarded code execution via a {@link PiExecutionEnv}
3
+ * (T11946 · M7 · epic T11456 · SG-TOOLS).
4
+ *
5
+ * The first M7 catalog increment: the ONE capability the existing ~18-tool set
6
+ * lacks — running a supplied code snippet. It adds NO new execution mechanism of
7
+ * its own; it routes EVERY run through the EXISTING per-run execution-env selector
8
+ * {@link import('../llm/pi/resolve-execution-env.js').resolveExecutionEnv}, which
9
+ * prefers the Gondolin micro-VM (`backend: 'gondolin'`) when the optional
10
+ * `@earendil-works/gondolin` package + `/dev/kvm` + QEMU are present, and SILENTLY
11
+ * DEGRADES to the always-available in-process deny-first
12
+ * {@link import('../llm/pi/pi-execution-env.js').GuardedExecutionEnv} otherwise.
13
+ * The snippet runs via `env.exec(...)` — NEVER a raw `child_process`.
14
+ *
15
+ * ## Why the selector, not a new primitive (Gate-11 + D11142)
16
+ *
17
+ * `resolveExecutionEnv` already owns the backend choice + the optional-dep
18
+ * degradation. Reusing it means:
19
+ * - **Optional-dep safety (D11142):** this module has NO `import type` from
20
+ * `@earendil-works/gondolin`; the selector loads that package lazily and ONLY
21
+ * when the VM is chosen. `core` builds + runs + tests with gondolin ABSENT —
22
+ * the in-process env runs. This module is import-time side-effect-free.
23
+ * - **Gate-11 (Tools-vs-Skills):** the tool is DEFINED here under
24
+ * `packages/core/src/tools`; it constructs NO new atomic primitive — it
25
+ * consumes the existing `ExecutionEnv` seam + the existing `ToolGuard`.
26
+ * - **Gate-13 (LLM chokepoint):** `execute_code` runs CODE, not an LLM call. It
27
+ * constructs NO transport / client and reads no API key — there is no
28
+ * chokepoint concern.
29
+ *
30
+ * ## Availability (mirrors `browser_*`)
31
+ *
32
+ * The tool is ALWAYS registered but its {@link AvailabilityCheck} returns `false`
33
+ * unless the run context advertises `capabilities.codeExec === true`. This mirrors
34
+ * the Playwright-gated `browser_*` family: registered-but-hidden until the host
35
+ * opts code execution in, so a loop that never enables it cannot invoke arbitrary
36
+ * code. (The in-process env is itself ALWAYS constructible — Gondolin is the
37
+ * preferred-but-optional upgrade — so the gate is a host POLICY switch, not an
38
+ * infra probe.)
39
+ *
40
+ * ## Egress denylist (AC2)
41
+ *
42
+ * Before a command reaches `env.exec`, the tool rejects a real-egress verb
43
+ * ({@link import('../llm/pi/pi-gondolin-env.js').DENIED_EXEC_PREFIXES} — `gh` /
44
+ * `git push` / `git remote` / `npm publish` / `cleo`) via the shared
45
+ * {@link import('../llm/pi/pi-gondolin-env.js').deniedEgressVerb} predicate. The
46
+ * Gondolin backend enforces this denylist itself; applying it HERE gives the
47
+ * in-process fallback the SAME egress posture (the guarded env's command denylist
48
+ * is policy-configured and may not include these verbs).
49
+ *
50
+ * @epic T11456
51
+ * @task T11946
52
+ * @see ../llm/pi/resolve-execution-env.js — the backend selector this tool reuses
53
+ * @see ../llm/pi/pi-execution-env.js — the in-process guarded `ExecutionEnv` fallback
54
+ * @see ./web-agent-tools.js — the `browser_*` optional-dep + capability-gated pattern mirrored here
55
+ */
56
+ import type { PiExecutionEnv } from '../llm/pi/pi-execution-env.js';
57
+ import { type ExecutionEnvBackend, type ResolveExecutionEnvOptions, type ResolveExecutionEnvSeams } from '../llm/pi/resolve-execution-env.js';
58
+ import { type ToolGuard } from '../tools/guard.js';
59
+ import type { AgentToolRegistry, AvailabilityCheck } from './agent-registry.js';
60
+ /** The languages `execute_code` knows how to invoke (AC2). */
61
+ export declare const EXEC_CODE_LANGUAGES: readonly ["python", "node", "bash", "sh"];
62
+ /** One supported {@link EXEC_CODE_LANGUAGES} value. */
63
+ export type ExecCodeLanguage = (typeof EXEC_CODE_LANGUAGES)[number];
64
+ /**
65
+ * Available ONLY when the run context opts code execution in
66
+ * (`capabilities.codeExec === true`). Mirrors the `browser_*` family's
67
+ * `playwright`-gated predicate: the tool is ALWAYS registered (so the catalog is
68
+ * stable) but hidden by `available()` until the host advertises the capability, so
69
+ * a loop that never enables it cannot run arbitrary code.
70
+ */
71
+ export declare const codeExecAvailable: AvailabilityCheck;
72
+ /**
73
+ * Result of an {@link registerExecCodeAgentTool | execute_code} run — the captured
74
+ * process output plus the resolved language and backend, for the LLM and for
75
+ * structured logging. `exitCode` is `null` when the process was killed by a
76
+ * signal/timeout (the {@link PiExecResult} contract).
77
+ */
78
+ export interface ExecCodeResult {
79
+ /** The language the snippet was run as. */
80
+ readonly language: ExecCodeLanguage;
81
+ /** Captured standard output. */
82
+ readonly stdout: string;
83
+ /** Captured standard error. */
84
+ readonly stderr: string;
85
+ /** Process exit code, or `null` when killed by signal/timeout. */
86
+ readonly exitCode: number | null;
87
+ /** The confinement backend that ran the snippet (`gondolin` or `in-process`). */
88
+ readonly backend: ExecutionEnvBackend;
89
+ /** Whether the run completed without a denial/transport error (`exec` returned ok). */
90
+ readonly ok: boolean;
91
+ /**
92
+ * Present only when `ok === false`: a stable code + message for why the run did
93
+ * not produce a process result (e.g. a denied egress verb, or the selected
94
+ * env's `exec` returned `Result.err`). NEVER carries a raw secret.
95
+ */
96
+ readonly error?: {
97
+ readonly code: string;
98
+ readonly message: string;
99
+ };
100
+ }
101
+ /**
102
+ * The selector seam {@link registerExecCodeAgentTool} resolves a
103
+ * {@link PiExecutionEnv} through. Defaults to the real
104
+ * {@link import('../llm/pi/resolve-execution-env.js').resolveExecutionEnv}.
105
+ *
106
+ * EXPORTED so the unit test can inject a fake selector that returns a fake
107
+ * `PiExecutionEnv` — asserting the selector IS called and its `exec` output is
108
+ * captured, WITHOUT a real Gondolin VM, QEMU, or subprocess. In production the
109
+ * default is the real selector (Gondolin when available, in-process guarded env
110
+ * otherwise — gondolin ABSENT in CI).
111
+ */
112
+ export type ExecutionEnvResolver = (opts: ResolveExecutionEnvOptions, seams?: ResolveExecutionEnvSeams) => Promise<PiExecutionEnv>;
113
+ /** Options for {@link registerExecCodeAgentTool} — all injectable for testing. */
114
+ export interface ExecCodeAgentToolOptions {
115
+ /**
116
+ * The env selector. Defaults to the real
117
+ * {@link import('../llm/pi/resolve-execution-env.js').resolveExecutionEnv}. The
118
+ * test injects a fake that returns a fake `PiExecutionEnv` (no real VM/subprocess).
119
+ */
120
+ readonly resolveEnv?: ExecutionEnvResolver;
121
+ /**
122
+ * The confinement backend to PREFER. `'gondolin'` boots the micro-VM when the
123
+ * optional package + `/dev/kvm` + QEMU are present and DEGRADES to the in-process
124
+ * env otherwise (the CI / most-developer-machines path); `'in-process'` always
125
+ * resolves to the guarded env without probing the host. Defaults to `'gondolin'`
126
+ * — prefer the strongest available confinement, degrade silently.
127
+ */
128
+ readonly backend?: ExecutionEnvBackend;
129
+ /**
130
+ * The enforce-mode {@link ToolGuard} backing the in-process fallback. Defaults to
131
+ * a fresh `createToolGuard({ mode: 'enforce' })` per run. Injectable so a host
132
+ * can supply a guard with a project path allowlist + command denylist.
133
+ */
134
+ readonly guard?: ToolGuard;
135
+ /**
136
+ * The absolute workspace root the in-process fallback confines fs paths under.
137
+ * Defaults to the resolved project root (`resolveOrCwd(undefined)`, T9584 — never
138
+ * a bare `process.cwd()`). The VM backend confines to its own `/workspace`.
139
+ */
140
+ readonly workspaceRoot?: string;
141
+ /**
142
+ * The disposable seeded-copy host dir mounted RW at the VM's `/workspace`.
143
+ * REQUIRED only when a real Gondolin VM actually boots (`backend: 'gondolin'` AND
144
+ * available) — MUST be a `VACUUM INTO` snapshot dir, NEVER the live `.cleo` DBs.
145
+ * Ignored by the in-process fallback (the CI path).
146
+ */
147
+ readonly seededCopyDir?: string;
148
+ }
149
+ /**
150
+ * Build the command line for a `language` + `code` pair. Each interpreter runs the
151
+ * snippet from its inline-code flag (`python -c`, `node -e`, `bash -c`, `sh -c`)
152
+ * with the code passed as ONE single-quoted argument — no further shell expansion
153
+ * of the model's code into the command shape.
154
+ *
155
+ * @param language - The interpreter to run.
156
+ * @param code - The model-supplied snippet.
157
+ * @returns The command string handed to `env.exec`.
158
+ */
159
+ export declare function buildExecCommand(language: ExecCodeLanguage, code: string): string;
160
+ /**
161
+ * Register the `execute_code` tool into `registry`. Pure registration — no env is
162
+ * resolved, no VM is booted, no code runs here; all of that happens later inside
163
+ * the tool's `execute` through the injected (or default) selector. Import-time
164
+ * side-effect-free + optional-dep-safe (D11142).
165
+ *
166
+ * @param registry - The registry to populate.
167
+ * @param options - Injectable selector / backend / guard / workspace (for testing).
168
+ */
169
+ export declare function registerExecCodeAgentTool(registry: AgentToolRegistry, options?: ExecCodeAgentToolOptions): void;
170
+ /**
171
+ * Self-registration marker (AC1) — the identifier the
172
+ * {@link AgentToolRegistry.discover} bounded source scan greps for. Aliases
173
+ * {@link registerExecCodeAgentTool} so a future scan-dir discovery (or the
174
+ * built-in aggregator) can call it uniformly with the other agent-tool modules.
175
+ *
176
+ * @param registry - The registry to populate.
177
+ */
178
+ export declare function registerAgentTools(registry: AgentToolRegistry): void;
179
+ //# sourceMappingURL=exec-code-agent-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-code-agent-tool.d.ts","sourceRoot":"","sources":["../../src/tools/exec-code-agent-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAE9B,MAAM,oCAAoC,CAAC;AAG5C,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIhF,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,2CAA4C,CAAC;AAE7E,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,EAAE,iBAAgE,CAAC;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,uFAAuF;IACvF,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,IAAI,EAAE,0BAA0B,EAChC,KAAK,CAAC,EAAE,wBAAwB,KAC7B,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,kFAAkF;AAClF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAeD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYjF;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,wBAA6B,GACrC,IAAI,CAkHN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * `execute_code` agent tool — guarded code execution via a {@link PiExecutionEnv}
3
+ * (T11946 · M7 · epic T11456 · SG-TOOLS).
4
+ *
5
+ * The first M7 catalog increment: the ONE capability the existing ~18-tool set
6
+ * lacks — running a supplied code snippet. It adds NO new execution mechanism of
7
+ * its own; it routes EVERY run through the EXISTING per-run execution-env selector
8
+ * {@link import('../llm/pi/resolve-execution-env.js').resolveExecutionEnv}, which
9
+ * prefers the Gondolin micro-VM (`backend: 'gondolin'`) when the optional
10
+ * `@earendil-works/gondolin` package + `/dev/kvm` + QEMU are present, and SILENTLY
11
+ * DEGRADES to the always-available in-process deny-first
12
+ * {@link import('../llm/pi/pi-execution-env.js').GuardedExecutionEnv} otherwise.
13
+ * The snippet runs via `env.exec(...)` — NEVER a raw `child_process`.
14
+ *
15
+ * ## Why the selector, not a new primitive (Gate-11 + D11142)
16
+ *
17
+ * `resolveExecutionEnv` already owns the backend choice + the optional-dep
18
+ * degradation. Reusing it means:
19
+ * - **Optional-dep safety (D11142):** this module has NO `import type` from
20
+ * `@earendil-works/gondolin`; the selector loads that package lazily and ONLY
21
+ * when the VM is chosen. `core` builds + runs + tests with gondolin ABSENT —
22
+ * the in-process env runs. This module is import-time side-effect-free.
23
+ * - **Gate-11 (Tools-vs-Skills):** the tool is DEFINED here under
24
+ * `packages/core/src/tools`; it constructs NO new atomic primitive — it
25
+ * consumes the existing `ExecutionEnv` seam + the existing `ToolGuard`.
26
+ * - **Gate-13 (LLM chokepoint):** `execute_code` runs CODE, not an LLM call. It
27
+ * constructs NO transport / client and reads no API key — there is no
28
+ * chokepoint concern.
29
+ *
30
+ * ## Availability (mirrors `browser_*`)
31
+ *
32
+ * The tool is ALWAYS registered but its {@link AvailabilityCheck} returns `false`
33
+ * unless the run context advertises `capabilities.codeExec === true`. This mirrors
34
+ * the Playwright-gated `browser_*` family: registered-but-hidden until the host
35
+ * opts code execution in, so a loop that never enables it cannot invoke arbitrary
36
+ * code. (The in-process env is itself ALWAYS constructible — Gondolin is the
37
+ * preferred-but-optional upgrade — so the gate is a host POLICY switch, not an
38
+ * infra probe.)
39
+ *
40
+ * ## Egress denylist (AC2)
41
+ *
42
+ * Before a command reaches `env.exec`, the tool rejects a real-egress verb
43
+ * ({@link import('../llm/pi/pi-gondolin-env.js').DENIED_EXEC_PREFIXES} — `gh` /
44
+ * `git push` / `git remote` / `npm publish` / `cleo`) via the shared
45
+ * {@link import('../llm/pi/pi-gondolin-env.js').deniedEgressVerb} predicate. The
46
+ * Gondolin backend enforces this denylist itself; applying it HERE gives the
47
+ * in-process fallback the SAME egress posture (the guarded env's command denylist
48
+ * is policy-configured and may not include these verbs).
49
+ *
50
+ * @epic T11456
51
+ * @task T11946
52
+ * @see ../llm/pi/resolve-execution-env.js — the backend selector this tool reuses
53
+ * @see ../llm/pi/pi-execution-env.js — the in-process guarded `ExecutionEnv` fallback
54
+ * @see ./web-agent-tools.js — the `browser_*` optional-dep + capability-gated pattern mirrored here
55
+ */
56
+ import { z } from 'zod';
57
+ import { DENIED_EXEC_PREFIXES, deniedEgressVerb } from '../llm/pi/pi-gondolin-env.js';
58
+ import { resolveExecutionEnv as realResolveExecutionEnv, } from '../llm/pi/resolve-execution-env.js';
59
+ import { getLogger } from '../logger.js';
60
+ import { resolveOrCwd } from '../paths.js';
61
+ import { createToolGuard } from '../tools/guard.js';
62
+ const log = getLogger('tool-exec-code');
63
+ /** The languages `execute_code` knows how to invoke (AC2). */
64
+ export const EXEC_CODE_LANGUAGES = ['python', 'node', 'bash', 'sh'];
65
+ /**
66
+ * Available ONLY when the run context opts code execution in
67
+ * (`capabilities.codeExec === true`). Mirrors the `browser_*` family's
68
+ * `playwright`-gated predicate: the tool is ALWAYS registered (so the catalog is
69
+ * stable) but hidden by `available()` until the host advertises the capability, so
70
+ * a loop that never enables it cannot run arbitrary code.
71
+ */
72
+ export const codeExecAvailable = (ctx) => ctx.capabilities?.codeExec === true;
73
+ /**
74
+ * Shell-quote a single argument for a POSIX `sh -c` / interpreter `-c`/`-e`
75
+ * invocation: wrap in single quotes and escape embedded single quotes. The code
76
+ * is UNTRUSTED model input, so it is passed as ONE quoted argument to the
77
+ * interpreter's `-c`/`-e` flag rather than interpolated into the command shape.
78
+ *
79
+ * @param value - The raw argument (the model-supplied code).
80
+ * @returns The single-quoted, shell-safe token.
81
+ */
82
+ function singleQuote(value) {
83
+ return `'${value.replace(/'/g, `'\\''`)}'`;
84
+ }
85
+ /**
86
+ * Build the command line for a `language` + `code` pair. Each interpreter runs the
87
+ * snippet from its inline-code flag (`python -c`, `node -e`, `bash -c`, `sh -c`)
88
+ * with the code passed as ONE single-quoted argument — no further shell expansion
89
+ * of the model's code into the command shape.
90
+ *
91
+ * @param language - The interpreter to run.
92
+ * @param code - The model-supplied snippet.
93
+ * @returns The command string handed to `env.exec`.
94
+ */
95
+ export function buildExecCommand(language, code) {
96
+ const quoted = singleQuote(code);
97
+ switch (language) {
98
+ case 'python':
99
+ return `python -c ${quoted}`;
100
+ case 'node':
101
+ return `node -e ${quoted}`;
102
+ case 'bash':
103
+ return `bash -c ${quoted}`;
104
+ case 'sh':
105
+ return `sh -c ${quoted}`;
106
+ }
107
+ }
108
+ /**
109
+ * Register the `execute_code` tool into `registry`. Pure registration — no env is
110
+ * resolved, no VM is booted, no code runs here; all of that happens later inside
111
+ * the tool's `execute` through the injected (or default) selector. Import-time
112
+ * side-effect-free + optional-dep-safe (D11142).
113
+ *
114
+ * @param registry - The registry to populate.
115
+ * @param options - Injectable selector / backend / guard / workspace (for testing).
116
+ */
117
+ export function registerExecCodeAgentTool(registry, options = {}) {
118
+ const resolveEnv = options.resolveEnv ?? realResolveExecutionEnv;
119
+ const backend = options.backend ?? 'gondolin';
120
+ registry.register({
121
+ name: 'execute_code',
122
+ // 'shell' — the run is a process invocation (its strongest side-effect surface).
123
+ class: 'shell',
124
+ description: 'Execute a code snippet in a guarded execution environment (Gondolin micro-VM ' +
125
+ 'when available, in-process guarded sandbox otherwise) and capture its ' +
126
+ 'stdout / stderr / exit code. Real-egress verbs (gh, git push, npm publish, ' +
127
+ 'cleo) are denied. Available only when the run enables code execution.',
128
+ toolset: 'agent',
129
+ stateless: true,
130
+ available: codeExecAvailable,
131
+ parameters: z.object({
132
+ language: z
133
+ .enum(EXEC_CODE_LANGUAGES)
134
+ .describe('Interpreter to run the snippet with: python, node, bash, or sh.'),
135
+ code: z.string().describe('The source code / script to execute.'),
136
+ timeoutMs: z
137
+ .number()
138
+ .int()
139
+ .positive()
140
+ .optional()
141
+ .describe('Hard wall-time ceiling for the run, in milliseconds.'),
142
+ }),
143
+ execute: async (rawArgs) => {
144
+ // `rawArgs` is the schema-validated argument object (the dispatch engine
145
+ // re-validates against `parameters` before calling). Narrow defensively.
146
+ const language = rawArgs.language;
147
+ const code = String(rawArgs.code);
148
+ const timeoutMs = typeof rawArgs.timeoutMs === 'number' ? rawArgs.timeoutMs : undefined;
149
+ // AC2: deny a real-egress verb BEFORE the env runs it — same posture on the
150
+ // in-process fallback as on the Gondolin backend (whose own denylist is the
151
+ // shared DENIED_EXEC_PREFIXES list). The check runs against the SNIPPET
152
+ // itself (the leading verb the user wants to run), NOT the wrapped
153
+ // `bash -c '<snippet>'` command — whose argv-0 is always a benign
154
+ // interpreter (`bash`/`sh`/`python`/`node`). For a shell snippet (`bash`/`sh`)
155
+ // the code IS the command line, so `gh …`/`git push …`/`npm publish …` is
156
+ // caught; for `python`/`node` the same scan is a harmless extra net.
157
+ const denied = deniedEgressVerb(code);
158
+ if (denied !== null) {
159
+ return {
160
+ language,
161
+ stdout: '',
162
+ stderr: '',
163
+ exitCode: null,
164
+ backend,
165
+ ok: false,
166
+ error: {
167
+ code: 'E_EXEC_CODE_EGRESS_DENIED',
168
+ message: `egress verb "${denied}" is denied (one of: ${DENIED_EXEC_PREFIXES.join(', ')})`,
169
+ },
170
+ };
171
+ }
172
+ // Shape the interpreter command line (the snippet passed as ONE quoted
173
+ // argument to the interpreter's inline-code flag — no shell expansion of the
174
+ // model's code into the command shape).
175
+ const command = buildExecCommand(language, code);
176
+ // Resolve the per-run env through the SELECTOR (Gondolin if present, else the
177
+ // in-process guarded env). The selector owns the optional-dep degradation —
178
+ // this call works with gondolin ABSENT.
179
+ const guard = options.guard ?? createToolGuard({ mode: 'enforce' });
180
+ // `resolveOrCwd` resolves to the supplied root, else the project root (T9584
181
+ // — never a bare `process.cwd()` in core).
182
+ const workspaceRoot = resolveOrCwd(options.workspaceRoot);
183
+ const env = await resolveEnv({
184
+ backend,
185
+ guard,
186
+ workspaceRoot,
187
+ ...(options.seededCopyDir !== undefined ? { seededCopyDir: options.seededCopyDir } : {}),
188
+ });
189
+ try {
190
+ const result = await env.exec(command, {
191
+ ...(timeoutMs !== undefined ? { timeout: timeoutMs } : {}),
192
+ });
193
+ if (!result.ok) {
194
+ // `exec` never throws — a denial / failure is a typed Result.err. Surface
195
+ // it as a non-ok run rather than a thrown executable error.
196
+ return {
197
+ language,
198
+ stdout: '',
199
+ stderr: '',
200
+ exitCode: null,
201
+ backend,
202
+ ok: false,
203
+ error: { code: result.error.code, message: result.error.message },
204
+ };
205
+ }
206
+ return {
207
+ language,
208
+ stdout: result.value.stdout,
209
+ stderr: result.value.stderr,
210
+ exitCode: result.value.exitCode,
211
+ backend,
212
+ ok: true,
213
+ };
214
+ }
215
+ finally {
216
+ // Best-effort teardown — the env (VM or guarded) may own resources; cleanup
217
+ // never throws (the PiExecutionEnv contract).
218
+ try {
219
+ await env.cleanup();
220
+ }
221
+ catch (err) {
222
+ log.debug({ err }, 'execute_code: env cleanup failed (ignored)');
223
+ }
224
+ }
225
+ },
226
+ });
227
+ }
228
+ /**
229
+ * Self-registration marker (AC1) — the identifier the
230
+ * {@link AgentToolRegistry.discover} bounded source scan greps for. Aliases
231
+ * {@link registerExecCodeAgentTool} so a future scan-dir discovery (or the
232
+ * built-in aggregator) can call it uniformly with the other agent-tool modules.
233
+ *
234
+ * @param registry - The registry to populate.
235
+ */
236
+ export function registerAgentTools(registry) {
237
+ registerExecCodeAgentTool(registry);
238
+ }
239
+ //# sourceMappingURL=exec-code-agent-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-code-agent-tool.js","sourceRoot":"","sources":["../../src/tools/exec-code-agent-tool.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,36 @@
19
19
  * @saga T11387
20
20
  */
21
21
  import type { PathExistsInput, PathExistsResult, ReadFileInput, ReadFileResult, WriteFileInput, WriteFileResult } from '@cleocode/contracts/tools/atomic';
22
+ /**
23
+ * Symlink-resolving canonicalization of a (possibly not-yet-existing) path.
24
+ *
25
+ * A purely LEXICAL path check (`resolve` + `relative`) is symlink-BLIND: a
26
+ * symlink planted inside an allowed root can point anywhere on the host, so the
27
+ * lexical path stays "inside" while the real target is outside. This is the
28
+ * classic symlink/TOCTOU escape. {@link canonicalizePath} resolves the REAL
29
+ * filesystem location so a containment check can be made against it:
30
+ *
31
+ * - If the path EXISTS, its own realpath is returned (every symlink component,
32
+ * including the final one, is followed to its real target).
33
+ * - If the path does NOT exist (a fresh write target), the nearest existing
34
+ * ANCESTOR directory is realpath'd and the not-yet-existing tail segments are
35
+ * re-appended. This prevents a symlinked PARENT directory from redirecting a
36
+ * write outside the boundary while still allowing legitimate new files.
37
+ *
38
+ * The returned path is always absolute. Containment MUST be re-checked against
39
+ * THIS value, not the lexical one.
40
+ *
41
+ * @param path - The path to canonicalize (absolute or relative to `process.cwd()`).
42
+ * @returns The symlink-resolved absolute path.
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * // root/innocent.txt -> /tmp/secret ⇒ canonicalizePath('root/innocent.txt')
47
+ * // returns '/tmp/secret', revealing the escape to the containment check.
48
+ * const real = await canonicalizePath(join(root, 'innocent.txt'));
49
+ * ```
50
+ */
51
+ export declare function canonicalizePath(path: string): Promise<string>;
22
52
  /**
23
53
  * Read a file as text.
24
54
  *
@@ -1 +1 @@
1
- {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAGhF;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG1D;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAUrF;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQlF"}
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBpE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAGhF;AAED;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAG1D;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAUrF;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQlF"}