@cleocode/core 2026.6.11 → 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 (414) 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 +2309 -1262
  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/release/plan.d.ts +4 -6
  155. package/dist/release/plan.d.ts.map +1 -1
  156. package/dist/release/plan.js +10 -23
  157. package/dist/release/plan.js.map +1 -1
  158. package/dist/release/reconcile.d.ts +0 -2
  159. package/dist/release/reconcile.d.ts.map +1 -1
  160. package/dist/release/reconcile.js +43 -50
  161. package/dist/release/reconcile.js.map +1 -1
  162. package/dist/release/release-manifest.d.ts.map +1 -1
  163. package/dist/release/release-manifest.js +4 -1
  164. package/dist/release/release-manifest.js.map +1 -1
  165. package/dist/release/verify-provenance.js +20 -20
  166. package/dist/release/verify-provenance.js.map +1 -1
  167. package/dist/routing/capability-matrix.d.ts.map +1 -1
  168. package/dist/routing/capability-matrix.js +0 -57
  169. package/dist/routing/capability-matrix.js.map +1 -1
  170. package/dist/selfimprove/budget.d.ts +206 -0
  171. package/dist/selfimprove/budget.d.ts.map +1 -0
  172. package/dist/selfimprove/budget.js +203 -0
  173. package/dist/selfimprove/budget.js.map +1 -0
  174. package/dist/selfimprove/dhq-adapter.d.ts +105 -0
  175. package/dist/selfimprove/dhq-adapter.d.ts.map +1 -0
  176. package/dist/selfimprove/dhq-adapter.js +95 -0
  177. package/dist/selfimprove/dhq-adapter.js.map +1 -0
  178. package/dist/selfimprove/draft-pr.d.ts +129 -0
  179. package/dist/selfimprove/draft-pr.d.ts.map +1 -0
  180. package/dist/selfimprove/draft-pr.js +158 -0
  181. package/dist/selfimprove/draft-pr.js.map +1 -0
  182. package/dist/selfimprove/envelope-diff.d.ts +162 -0
  183. package/dist/selfimprove/envelope-diff.d.ts.map +1 -0
  184. package/dist/selfimprove/envelope-diff.js +321 -0
  185. package/dist/selfimprove/envelope-diff.js.map +1 -0
  186. package/dist/selfimprove/replay.d.ts +121 -0
  187. package/dist/selfimprove/replay.d.ts.map +1 -0
  188. package/dist/selfimprove/replay.js +109 -0
  189. package/dist/selfimprove/replay.js.map +1 -0
  190. package/dist/selfimprove/run-loop.d.ts +148 -0
  191. package/dist/selfimprove/run-loop.d.ts.map +1 -0
  192. package/dist/selfimprove/run-loop.js +240 -0
  193. package/dist/selfimprove/run-loop.js.map +1 -0
  194. package/dist/selfimprove/scenario.d.ts +145 -0
  195. package/dist/selfimprove/scenario.d.ts.map +1 -0
  196. package/dist/selfimprove/scenario.js +243 -0
  197. package/dist/selfimprove/scenario.js.map +1 -0
  198. package/dist/sentient/daemon-entry.js +5 -0
  199. package/dist/sentient/daemon-entry.js.map +1 -1
  200. package/dist/sentient/daemon.d.ts.map +1 -1
  201. package/dist/sentient/daemon.js +19 -0
  202. package/dist/sentient/daemon.js.map +1 -1
  203. package/dist/sentient/hygiene-scan.d.ts.map +1 -1
  204. package/dist/sentient/hygiene-scan.js +14 -6
  205. package/dist/sentient/hygiene-scan.js.map +1 -1
  206. package/dist/sessions/briefing.d.ts.map +1 -1
  207. package/dist/sessions/briefing.js +13 -9
  208. package/dist/sessions/briefing.js.map +1 -1
  209. package/dist/sessions/connection-session-handle.d.ts +161 -0
  210. package/dist/sessions/connection-session-handle.d.ts.map +1 -0
  211. package/dist/sessions/connection-session-handle.js +168 -0
  212. package/dist/sessions/connection-session-handle.js.map +1 -0
  213. package/dist/sessions/handoff.d.ts.map +1 -1
  214. package/dist/sessions/handoff.js +9 -0
  215. package/dist/sessions/handoff.js.map +1 -1
  216. package/dist/sessions/index.d.ts +4 -1
  217. package/dist/sessions/index.d.ts.map +1 -1
  218. package/dist/sessions/index.js +31 -1
  219. package/dist/sessions/index.js.map +1 -1
  220. package/dist/sessions/session-id.d.ts +34 -0
  221. package/dist/sessions/session-id.d.ts.map +1 -1
  222. package/dist/sessions/session-id.js +37 -0
  223. package/dist/sessions/session-id.js.map +1 -1
  224. package/dist/sessions/session-manifest-mirror.d.ts +115 -0
  225. package/dist/sessions/session-manifest-mirror.d.ts.map +1 -0
  226. package/dist/sessions/session-manifest-mirror.js +250 -0
  227. package/dist/sessions/session-manifest-mirror.js.map +1 -0
  228. package/dist/sessions/session-switch.d.ts.map +1 -1
  229. package/dist/sessions/session-switch.js +5 -2
  230. package/dist/sessions/session-switch.js.map +1 -1
  231. package/dist/store/converters.d.ts.map +1 -1
  232. package/dist/store/converters.js +2 -0
  233. package/dist/store/converters.js.map +1 -1
  234. package/dist/store/db-helpers.d.ts.map +1 -1
  235. package/dist/store/db-helpers.js +2 -0
  236. package/dist/store/db-helpers.js.map +1 -1
  237. package/dist/store/dual-scope-db.d.ts.map +1 -1
  238. package/dist/store/dual-scope-db.js +87 -47
  239. package/dist/store/dual-scope-db.js.map +1 -1
  240. package/dist/store/pi-session-store.d.ts +151 -0
  241. package/dist/store/pi-session-store.d.ts.map +1 -0
  242. package/dist/store/pi-session-store.js +166 -0
  243. package/dist/store/pi-session-store.js.map +1 -0
  244. package/dist/store/safety-data-accessor.d.ts +1 -0
  245. package/dist/store/safety-data-accessor.d.ts.map +1 -1
  246. package/dist/store/safety-data-accessor.js +5 -0
  247. package/dist/store/safety-data-accessor.js.map +1 -1
  248. package/dist/store/schema/cleo-global/accounts.d.ts +357 -0
  249. package/dist/store/schema/cleo-global/accounts.d.ts.map +1 -0
  250. package/dist/store/schema/cleo-global/accounts.js +136 -0
  251. package/dist/store/schema/cleo-global/accounts.js.map +1 -0
  252. package/dist/store/schema/cleo-global/index.d.ts +2 -0
  253. package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
  254. package/dist/store/schema/cleo-global/index.js +2 -0
  255. package/dist/store/schema/cleo-global/index.js.map +1 -1
  256. package/dist/store/schema/cleo-global/session-manifest.d.ts +217 -0
  257. package/dist/store/schema/cleo-global/session-manifest.d.ts.map +1 -0
  258. package/dist/store/schema/cleo-global/session-manifest.js +99 -0
  259. package/dist/store/schema/cleo-global/session-manifest.js.map +1 -0
  260. package/dist/store/schema/cleo-project/tasks-core.d.ts +16 -0
  261. package/dist/store/schema/cleo-project/tasks-core.d.ts.map +1 -1
  262. package/dist/store/schema/cleo-project/tasks-core.js +14 -0
  263. package/dist/store/schema/cleo-project/tasks-core.js.map +1 -1
  264. package/dist/store/schema/tasks.d.ts +16 -0
  265. package/dist/store/schema/tasks.d.ts.map +1 -1
  266. package/dist/store/schema/tasks.js +10 -0
  267. package/dist/store/schema/tasks.js.map +1 -1
  268. package/dist/store/selfimprove-dhq-schema.d.ts +284 -0
  269. package/dist/store/selfimprove-dhq-schema.d.ts.map +1 -0
  270. package/dist/store/selfimprove-dhq-schema.js +128 -0
  271. package/dist/store/selfimprove-dhq-schema.js.map +1 -0
  272. package/dist/store/selfimprove-dhq-store.d.ts +175 -0
  273. package/dist/store/selfimprove-dhq-store.d.ts.map +1 -0
  274. package/dist/store/selfimprove-dhq-store.js +182 -0
  275. package/dist/store/selfimprove-dhq-store.js.map +1 -0
  276. package/dist/store/session-store.d.ts +52 -13
  277. package/dist/store/session-store.d.ts.map +1 -1
  278. package/dist/store/session-store.js +71 -13
  279. package/dist/store/session-store.js.map +1 -1
  280. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  281. package/dist/store/sqlite-data-accessor.js +7 -0
  282. package/dist/store/sqlite-data-accessor.js.map +1 -1
  283. package/dist/store/tasks-schema.d.ts +4 -0
  284. package/dist/store/tasks-schema.d.ts.map +1 -1
  285. package/dist/store/tasks-schema.js +14 -0
  286. package/dist/store/tasks-schema.js.map +1 -1
  287. package/dist/store/umbrella-data-accessor.d.ts +1 -0
  288. package/dist/store/umbrella-data-accessor.d.ts.map +1 -1
  289. package/dist/store/umbrella-data-accessor.js +5 -0
  290. package/dist/store/umbrella-data-accessor.js.map +1 -1
  291. package/dist/store/validation-schemas.d.ts +94 -62
  292. package/dist/store/validation-schemas.d.ts.map +1 -1
  293. package/dist/store/writer-lease-schema.d.ts +392 -0
  294. package/dist/store/writer-lease-schema.d.ts.map +1 -0
  295. package/dist/store/writer-lease-schema.js +142 -0
  296. package/dist/store/writer-lease-schema.js.map +1 -0
  297. package/dist/store/writer-lease.d.ts +368 -0
  298. package/dist/store/writer-lease.d.ts.map +1 -0
  299. package/dist/store/writer-lease.js +1002 -0
  300. package/dist/store/writer-lease.js.map +1 -0
  301. package/dist/task-tools/describe-schema.d.ts +4 -2
  302. package/dist/task-tools/describe-schema.d.ts.map +1 -1
  303. package/dist/task-tools/describe-schema.js +9 -3
  304. package/dist/task-tools/describe-schema.js.map +1 -1
  305. package/dist/tasks/backfill-child-projections.d.ts.map +1 -1
  306. package/dist/tasks/backfill-child-projections.js +14 -9
  307. package/dist/tasks/backfill-child-projections.js.map +1 -1
  308. package/dist/tasks/complete.d.ts.map +1 -1
  309. package/dist/tasks/complete.js +7 -10
  310. package/dist/tasks/complete.js.map +1 -1
  311. package/dist/tasks/duplicate-detector.d.ts.map +1 -1
  312. package/dist/tasks/duplicate-detector.js +14 -7
  313. package/dist/tasks/duplicate-detector.js.map +1 -1
  314. package/dist/telemetry/index.d.ts.map +1 -1
  315. package/dist/telemetry/index.js +10 -4
  316. package/dist/telemetry/index.js.map +1 -1
  317. package/dist/tools/agent-registry.d.ts +250 -0
  318. package/dist/tools/agent-registry.d.ts.map +1 -0
  319. package/dist/tools/agent-registry.js +292 -0
  320. package/dist/tools/agent-registry.js.map +1 -0
  321. package/dist/tools/agent-tool-families.d.ts +107 -0
  322. package/dist/tools/agent-tool-families.d.ts.map +1 -0
  323. package/dist/tools/agent-tool-families.js +527 -0
  324. package/dist/tools/agent-tool-families.js.map +1 -0
  325. package/dist/tools/browser-driver.d.ts +183 -0
  326. package/dist/tools/browser-driver.d.ts.map +1 -0
  327. package/dist/tools/browser-driver.js +242 -0
  328. package/dist/tools/browser-driver.js.map +1 -0
  329. package/dist/tools/builtin-agent-tools.d.ts +36 -0
  330. package/dist/tools/builtin-agent-tools.d.ts.map +1 -0
  331. package/dist/tools/builtin-agent-tools.js +150 -0
  332. package/dist/tools/builtin-agent-tools.js.map +1 -0
  333. package/dist/tools/dispatch.d.ts +370 -0
  334. package/dist/tools/dispatch.d.ts.map +1 -0
  335. package/dist/tools/dispatch.js +505 -0
  336. package/dist/tools/dispatch.js.map +1 -0
  337. package/dist/tools/env-scrub.d.ts +93 -0
  338. package/dist/tools/env-scrub.d.ts.map +1 -0
  339. package/dist/tools/env-scrub.js +176 -0
  340. package/dist/tools/env-scrub.js.map +1 -0
  341. package/dist/tools/fs.d.ts +30 -0
  342. package/dist/tools/fs.d.ts.map +1 -1
  343. package/dist/tools/fs.js +55 -2
  344. package/dist/tools/fs.js.map +1 -1
  345. package/dist/tools/guard.d.ts +15 -0
  346. package/dist/tools/guard.d.ts.map +1 -1
  347. package/dist/tools/guard.js +49 -12
  348. package/dist/tools/guard.js.map +1 -1
  349. package/dist/tools/index.d.ts +10 -0
  350. package/dist/tools/index.d.ts.map +1 -1
  351. package/dist/tools/index.js +37 -0
  352. package/dist/tools/index.js.map +1 -1
  353. package/dist/tools/pty.d.ts +45 -0
  354. package/dist/tools/pty.d.ts.map +1 -0
  355. package/dist/tools/pty.js +166 -0
  356. package/dist/tools/pty.js.map +1 -0
  357. package/dist/tools/schema-gen.d.ts +57 -0
  358. package/dist/tools/schema-gen.d.ts.map +1 -0
  359. package/dist/tools/schema-gen.js +52 -0
  360. package/dist/tools/schema-gen.js.map +1 -0
  361. package/dist/tools/shell.d.ts +12 -0
  362. package/dist/tools/shell.d.ts.map +1 -1
  363. package/dist/tools/shell.js +14 -1
  364. package/dist/tools/shell.js.map +1 -1
  365. package/dist/tools/web-agent-tools.d.ts +72 -0
  366. package/dist/tools/web-agent-tools.d.ts.map +1 -0
  367. package/dist/tools/web-agent-tools.js +393 -0
  368. package/dist/tools/web-agent-tools.js.map +1 -0
  369. package/dist/tools/web-search-backends.d.ts +156 -0
  370. package/dist/tools/web-search-backends.d.ts.map +1 -0
  371. package/dist/tools/web-search-backends.js +290 -0
  372. package/dist/tools/web-search-backends.js.map +1 -0
  373. package/dist/validation/ops.d.ts +1 -15
  374. package/dist/validation/ops.d.ts.map +1 -1
  375. package/dist/validation/ops.js +0 -20
  376. package/dist/validation/ops.js.map +1 -1
  377. package/migrations/drizzle-cleo-global/20260607000000_t11891-writer-leases/migration.sql +55 -0
  378. package/migrations/drizzle-cleo-global/20260607010000_t11639-session-manifest/migration.sql +43 -0
  379. package/migrations/drizzle-cleo-global/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  380. package/migrations/drizzle-cleo-global/20260608010000_t11709-accounts-credential-pool/migration.sql +72 -0
  381. package/migrations/drizzle-cleo-global/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  382. package/migrations/drizzle-cleo-project/20260606000000_t11884-restore-prefixed-task-triggers/migration.sql +272 -0
  383. package/migrations/drizzle-cleo-project/20260606000000_t11884-restore-prefixed-task-triggers/revert.sql +29 -0
  384. package/migrations/drizzle-cleo-project/20260606000100_t11883-tasks-releases-version-unique/migration.sql +21 -0
  385. package/migrations/drizzle-cleo-project/20260606000100_t11883-tasks-releases-version-unique/revert.sql +4 -0
  386. package/migrations/drizzle-cleo-project/20260607000000_t11891-writer-leases/migration.sql +55 -0
  387. package/migrations/drizzle-cleo-project/20260607010000_t11639-session-parent/migration.sql +22 -0
  388. package/migrations/drizzle-cleo-project/20260608000000_t11899-pi-session-tree/migration.sql +52 -0
  389. package/migrations/drizzle-cleo-project/20260608020000_t11889-selfimprove-dhq/migration.sql +64 -0
  390. package/package.json +15 -13
  391. package/dist/lifecycle/chain-composition.d.ts +0 -30
  392. package/dist/lifecycle/chain-composition.d.ts.map +0 -1
  393. package/dist/lifecycle/chain-composition.js +0 -152
  394. package/dist/lifecycle/chain-composition.js.map +0 -1
  395. package/dist/lifecycle/chain-store.d.ts +0 -70
  396. package/dist/lifecycle/chain-store.d.ts.map +0 -1
  397. package/dist/lifecycle/chain-store.js +0 -246
  398. package/dist/lifecycle/chain-store.js.map +0 -1
  399. package/dist/lifecycle/default-chain.d.ts +0 -39
  400. package/dist/lifecycle/default-chain.d.ts.map +0 -1
  401. package/dist/lifecycle/default-chain.js +0 -176
  402. package/dist/lifecycle/default-chain.js.map +0 -1
  403. package/dist/lifecycle/tessera-engine.d.ts +0 -48
  404. package/dist/lifecycle/tessera-engine.d.ts.map +0 -1
  405. package/dist/lifecycle/tessera-engine.js +0 -249
  406. package/dist/lifecycle/tessera-engine.js.map +0 -1
  407. package/dist/release/provenance-fk.d.ts +0 -74
  408. package/dist/release/provenance-fk.d.ts.map +0 -1
  409. package/dist/release/provenance-fk.js +0 -122
  410. package/dist/release/provenance-fk.js.map +0 -1
  411. package/dist/validation/chain-validation.d.ts +0 -43
  412. package/dist/validation/chain-validation.d.ts.map +0 -1
  413. package/dist/validation/chain-validation.js +0 -146
  414. package/dist/validation/chain-validation.js.map +0 -1
@@ -0,0 +1,541 @@
1
+ /**
2
+ * Gondolin micro-VM Pi `ExecutionEnv` — the SECOND backend of the
3
+ * {@link PiExecutionEnv} seam (T11909 · T11888-B · P5 Gondolin · epic T11599).
4
+ *
5
+ * Where the in-process {@link import('./pi-execution-env.js').GuardedExecutionEnv}
6
+ * (S1 · T11761 · T11897) confines Pi with a deny-first `ToolGuard` + workspace
7
+ * boundary INSIDE the host process, this backend's confinement is the
8
+ * **micro-VM boundary itself**. Guest code runs with:
9
+ *
10
+ * - **ZERO host authority** — no `cleo.db` handle, no writer-lease IPC socket, no
11
+ * host `process.env` secrets, no host filesystem outside the single RW
12
+ * `/workspace` mount. The guest is a different kernel; it cannot reach the
13
+ * daemon, the lease arbiter, or BRAIN even if Pi-driven code tries.
14
+ * - **Egress only via the credential-injection proxy** — `createHttpHooks` is
15
+ * constructed with `allowedHosts: []` (present-and-empty = DENY ALL per the
16
+ * gondolin docs; OMITTING it = allow-all — the egress footgun this guards) and
17
+ * host-side secret PLACEHOLDERS, so the guest only ever sees the `placeholder`
18
+ * bytes, never the real token. The loop appends specific hosts per run.
19
+ * - **Live DBs NEVER mounted** — `.cleo/tasks.db` / `.cleo/brain.db` are NOT in
20
+ * the VFS mount set. A replay operates on a DISPOSABLE seeded copy
21
+ * (`VACUUM INTO` snapshot), so the T5158 data-loss vector (git overwrites the
22
+ * live WAL-backed DB) is structurally impossible: there is no live handle
23
+ * inside the VM to corrupt.
24
+ *
25
+ * This is strictly stronger than S1's env-scrub: S1 protects against an in-process
26
+ * Pi escape via the guard allowlist; Gondolin protects via kernel + VFS + network
27
+ * namespace separation. A thin in-guest deny layer (lexical `/workspace`
28
+ * confinement + a command denylist for real egress verbs) is kept as DEFENSE IN
29
+ * DEPTH — the boundary is the VM, but a Pi escape that runs a binary still cannot
30
+ * do damage that survives the run.
31
+ *
32
+ * Optional-dep discipline (D11142): `@earendil-works/gondolin` is loaded ONLY via
33
+ * the {@link import('./gondolin-loader.js').loadGondolin} dynamic import — it is
34
+ * in NEITHER `dependencies` NOR `optionalDependencies`, and this module declares
35
+ * NO `import type` from the package (the consumed structural shapes come from the
36
+ * loader's LOCAL types). `core` builds + all non-gondolin tests pass with gondolin
37
+ * ABSENT, and this module is import-time side-effect-free (no top-level VM boot).
38
+ *
39
+ * Never-throw discipline: every `vm.fs.*` / `vm.exec` call is wrapped exactly as
40
+ * S1's `#toFsErr` / `execErr` — a thrown gondolin/guest error becomes a
41
+ * {@link PiResult} `err` with `E_PI_FS_*` / `E_PI_EXEC_*` codes. The
42
+ * `PiResult<T, E>` contract is byte-for-byte identical to S1, so the Pi loop
43
+ * cannot tell the two backends apart.
44
+ *
45
+ * @epic T11599
46
+ * @task T11909
47
+ * @see ./pi-execution-env.js — the S1 `GuardedExecutionEnv` this mirrors over a VM
48
+ * @see ./gondolin-loader.js — the optional-dep loader supplying the structural types
49
+ */
50
+ import { isAbsolute as posixIsAbsolute, join as posixJoin } from 'node:path/posix';
51
+ import { getLogger } from '../../logger.js';
52
+ import { loadGondolin, } from './gondolin-loader.js';
53
+ const log = getLogger('pi-gondolin-env');
54
+ /** The single RW mount point inside the guest — the ONLY writable location. */
55
+ export const GONDOLIN_WORKSPACE_ROOT = '/workspace';
56
+ /** Where in-guest temp dirs/files are created (under the workspace mount). */
57
+ const GONDOLIN_TMP_DIR = `${GONDOLIN_WORKSPACE_ROOT}/.tmp`;
58
+ /** Default guest memory bound — set explicitly so we never rely on gondolin's default. */
59
+ const DEFAULT_GUEST_MEMORY = '1G';
60
+ // ---------------------------------------------------------------------------
61
+ // Result constructors (byte-for-byte identical to S1's, so the Pi loop cannot
62
+ // tell the backends apart).
63
+ // ---------------------------------------------------------------------------
64
+ /** Build a successful {@link PiResult}. */
65
+ function ok(value) {
66
+ return { ok: true, value };
67
+ }
68
+ /** Build a failed {@link PiResult} with a {@link PiFileError}. */
69
+ function fsErr(code, message, path) {
70
+ return { ok: false, error: { code, message, ...(path !== undefined ? { path } : {}) } };
71
+ }
72
+ /** Build a failed {@link PiResult} with a {@link PiExecutionError}. */
73
+ function execErr(code, message) {
74
+ return { ok: false, error: { code, message } };
75
+ }
76
+ /**
77
+ * The real egress verbs the guest is NEVER allowed to run. Sandbox output is a
78
+ * DRAFT PR opened HOST-side by the loop's egress step (never from inside the
79
+ * guest). The guest may run `git diff`/`git apply`/`git status` to PRODUCE a
80
+ * patch, but pushing/publishing is a host-only, budget-gated action. `cleo` is
81
+ * denied for completeness (no daemon is reachable from the guest anyway).
82
+ *
83
+ * Each entry is matched against the command's argv-0 basename, plus the
84
+ * two-token forms `git push` / `git remote` so a `git`-rooted egress is caught
85
+ * even though `git`'s OWN basename is allowed (for `git diff` etc.).
86
+ */
87
+ const DENIED_EXEC_PREFIXES = [
88
+ 'gh',
89
+ 'npm publish',
90
+ 'cleo',
91
+ 'git push',
92
+ 'git remote',
93
+ ];
94
+ /**
95
+ * Whether `command` (string or argv) is a denied real-egress verb. Deny-first:
96
+ * checked BEFORE the command ever reaches `vm.exec`. Comparison is on the
97
+ * normalized leading tokens (argv-0 basename + a possible second subcommand
98
+ * token), so `git push origin main`, `/usr/bin/gh pr create`, and
99
+ * `npm publish --tag x` are all rejected, while `git diff` / `git status` pass.
100
+ *
101
+ * @param command - The string command or argv array the env received.
102
+ * @returns The matched denied prefix, or `null` when the command is allowed.
103
+ */
104
+ function deniedEgressVerb(command) {
105
+ const tokens = Array.isArray(command)
106
+ ? [...command]
107
+ : String(command)
108
+ .trim()
109
+ .split(/\s+/)
110
+ .filter((t) => t.length > 0);
111
+ if (tokens.length === 0)
112
+ return null;
113
+ const base0 = basenameOf(tokens[0] ?? '');
114
+ const base1 = tokens.length > 1 ? basenameOf(tokens[1] ?? '') : '';
115
+ const one = base0;
116
+ const two = base1 ? `${base0} ${base1}` : '';
117
+ for (const denied of DENIED_EXEC_PREFIXES) {
118
+ if (denied === one)
119
+ return denied;
120
+ if (two !== '' && denied === two)
121
+ return denied;
122
+ }
123
+ return null;
124
+ }
125
+ /** POSIX basename of a token (strips any path prefix, e.g. `/usr/bin/gh` → `gh`). */
126
+ function basenameOf(token) {
127
+ const slash = token.lastIndexOf('/');
128
+ return slash === -1 ? token : token.slice(slash + 1);
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // GondolinExecutionEnv
132
+ // ---------------------------------------------------------------------------
133
+ /**
134
+ * A {@link PiExecutionEnv} whose confinement is a gondolin micro-VM. Owns exactly
135
+ * ONE {@link VM} and releases it in {@link cleanup} via `vm.close()`.
136
+ *
137
+ * Every fs op maps to `vm.fs.*`; `exec` maps to `vm.exec`. Each call is wrapped
138
+ * try/catch → {@link PiResult} `err`, so no method ever throws. A thin in-guest
139
+ * deny layer (lexical `/workspace` confinement + the {@link DENIED_EXEC_PREFIXES}
140
+ * command denylist) is the defense-in-depth net BEHIND the VM boundary.
141
+ *
142
+ * Unlike the stateless {@link import('./pi-execution-env.js').GuardedExecutionEnv}
143
+ * (whose `cleanup()` is a no-op), this env OWNS the VM and MUST release it.
144
+ * `cleanup()` is idempotent (guarded by a `#closed` flag).
145
+ */
146
+ export class GondolinExecutionEnv {
147
+ #vm;
148
+ #closed = false;
149
+ /**
150
+ * @param vm - The booted gondolin VM this env owns. Construct via
151
+ * {@link createGondolinExecutionEnv}, not directly — the factory wires the
152
+ * deny-by-default egress hooks + seeded-copy-only mount set.
153
+ */
154
+ constructor(vm) {
155
+ this.#vm = vm;
156
+ }
157
+ // --- pure path arithmetic (no VM round-trip) -----------------------------
158
+ /** The guest workspace root — the in-VM Pi run's working directory. */
159
+ cwd() {
160
+ return GONDOLIN_WORKSPACE_ROOT;
161
+ }
162
+ /** Resolve `path` to a guest-absolute path anchored at `/workspace`. */
163
+ absolutePath(path) {
164
+ return posixIsAbsolute(path) ? posixJoin(path) : posixJoin(GONDOLIN_WORKSPACE_ROOT, path);
165
+ }
166
+ /** Join path segments (pure POSIX) anchored at the guest workspace root. */
167
+ joinPath(...segments) {
168
+ return posixJoin(GONDOLIN_WORKSPACE_ROOT, ...segments);
169
+ }
170
+ /**
171
+ * Lexically confine a (possibly relative) guest path under `/workspace`. The
172
+ * guest cannot see host paths at all (separate VFS), so there is no
173
+ * symlink-to-host vector to resolve — a lexical check is sufficient here. A
174
+ * `../` climb or an absolute path outside `/workspace` returns `null`.
175
+ *
176
+ * @returns the normalized guest-absolute path, or `null` on an escape.
177
+ */
178
+ #confine(path) {
179
+ const abs = posixIsAbsolute(path) ? posixJoin(path) : posixJoin(GONDOLIN_WORKSPACE_ROOT, path);
180
+ if (abs === GONDOLIN_WORKSPACE_ROOT || abs.startsWith(`${GONDOLIN_WORKSPACE_ROOT}/`)) {
181
+ return abs;
182
+ }
183
+ return null;
184
+ }
185
+ // --- file reads ----------------------------------------------------------
186
+ /** Read a file's text from the guest workspace. */
187
+ async readTextFile(path) {
188
+ const abs = this.#confine(path);
189
+ if (abs === null)
190
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
191
+ try {
192
+ const content = await this.#vm.fs.readFile(abs, { encoding: 'utf-8' });
193
+ return ok(content);
194
+ }
195
+ catch (err) {
196
+ return this.#toFsErr(err, abs);
197
+ }
198
+ }
199
+ /** Read a file's text as an array of lines. */
200
+ async readTextLines(path) {
201
+ const res = await this.readTextFile(path);
202
+ return res.ok ? ok(res.value.split(/\r?\n/)) : res;
203
+ }
204
+ /**
205
+ * Binary read — FILLS S1's v0 denial. The guest VFS supports binary reads
206
+ * directly via `vm.fs.readFile(p)` (returns a `Uint8Array`).
207
+ */
208
+ async readBinaryFile(path) {
209
+ const abs = this.#confine(path);
210
+ if (abs === null)
211
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
212
+ try {
213
+ const bytes = await this.#vm.fs.readFile(abs);
214
+ return ok(bytes);
215
+ }
216
+ catch (err) {
217
+ return this.#toFsErr(err, abs);
218
+ }
219
+ }
220
+ // --- file writes ---------------------------------------------------------
221
+ /** Write a file to the guest workspace. */
222
+ async writeFile(path, content) {
223
+ const abs = this.#confine(path);
224
+ if (abs === null)
225
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
226
+ try {
227
+ await this.#vm.fs.writeFile(abs, content);
228
+ return ok(undefined);
229
+ }
230
+ catch (err) {
231
+ return this.#toFsErr(err, abs);
232
+ }
233
+ }
234
+ /**
235
+ * Append to a file. The guest fs surface offers only whole-file writes, so this
236
+ * reads-then-writes the concatenation (still confined). A missing file is
237
+ * treated as empty (append-creates).
238
+ */
239
+ async appendFile(path, content) {
240
+ const abs = this.#confine(path);
241
+ if (abs === null)
242
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
243
+ let prefix = '';
244
+ try {
245
+ prefix = await this.#vm.fs.readFile(abs, { encoding: 'utf-8' });
246
+ }
247
+ catch (err) {
248
+ // A missing file is the only non-fatal case (append-creates). Any other
249
+ // failure (permission, …) propagates as the Pi error.
250
+ if (!isMissingFileError(err))
251
+ return this.#toFsErr(err, abs);
252
+ }
253
+ try {
254
+ await this.#vm.fs.writeFile(abs, prefix + content);
255
+ return ok(undefined);
256
+ }
257
+ catch (err) {
258
+ return this.#toFsErr(err, abs);
259
+ }
260
+ }
261
+ // --- metadata ------------------------------------------------------------
262
+ /** Report whether a guest path is a file or directory. */
263
+ async fileInfo(path) {
264
+ const abs = this.#confine(path);
265
+ if (abs === null)
266
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
267
+ try {
268
+ const stat = await this.#vm.fs.stat(abs);
269
+ return ok({ isFile: stat.isFile(), isDirectory: stat.isDirectory() });
270
+ }
271
+ catch (err) {
272
+ return this.#toFsErr(err, abs);
273
+ }
274
+ }
275
+ /** Whether a guest path exists. */
276
+ async exists(path) {
277
+ const abs = this.#confine(path);
278
+ if (abs === null)
279
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
280
+ try {
281
+ await this.#vm.fs.access(abs);
282
+ return ok(true);
283
+ }
284
+ catch {
285
+ // `access` rejects for a missing path — that is a definitive "does not
286
+ // exist", NOT an error to surface. (A denied path was already rejected
287
+ // above by `#confine`.)
288
+ return ok(false);
289
+ }
290
+ }
291
+ /**
292
+ * Canonicalize a guest path via `realpath` inside the guest. Runs the binary in
293
+ * ARRAY form (no `$PATH` / shell expansion) so the path argument cannot be
294
+ * reinterpreted as shell.
295
+ */
296
+ async canonicalPath(path) {
297
+ const abs = this.#confine(path);
298
+ if (abs === null)
299
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
300
+ try {
301
+ const res = await this.#vm.exec(['/bin/realpath', abs]);
302
+ const resolved = res.stdout.trim();
303
+ if (res.exitCode !== 0 || resolved === '') {
304
+ return fsErr('E_PI_FS_FAILED', res.stderr.trim() || 'realpath failed', abs);
305
+ }
306
+ return ok(resolved);
307
+ }
308
+ catch (err) {
309
+ return this.#toFsErr(err, abs);
310
+ }
311
+ }
312
+ // --- fs-mutating / listing ops (FILL S1's v0 denials) --------------------
313
+ /** List a guest directory — FILLS S1's v0 denial. */
314
+ async listDir(path) {
315
+ const abs = this.#confine(path);
316
+ if (abs === null)
317
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
318
+ try {
319
+ const entries = await this.#vm.fs.listDir(abs);
320
+ return ok(entries);
321
+ }
322
+ catch (err) {
323
+ return this.#toFsErr(err, abs);
324
+ }
325
+ }
326
+ /** Create a guest directory (recursive) — FILLS S1's v0 denial. */
327
+ async createDir(path) {
328
+ const abs = this.#confine(path);
329
+ if (abs === null)
330
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
331
+ try {
332
+ await this.#vm.fs.mkdir(abs, { recursive: true });
333
+ return ok(undefined);
334
+ }
335
+ catch (err) {
336
+ return this.#toFsErr(err, abs);
337
+ }
338
+ }
339
+ /** Remove a guest path (recursive, force) — FILLS S1's v0 denial. */
340
+ async remove(path) {
341
+ const abs = this.#confine(path);
342
+ if (abs === null)
343
+ return fsErr('E_PI_FS_DENIED', 'path escapes workspace boundary', path);
344
+ try {
345
+ await this.#vm.fs.deleteFile(abs, { recursive: true, force: true });
346
+ return ok(undefined);
347
+ }
348
+ catch (err) {
349
+ return this.#toFsErr(err, abs);
350
+ }
351
+ }
352
+ /**
353
+ * Create a temp directory under `/workspace/.tmp` — FILLS S1's v0 denial. Runs
354
+ * `mktemp -d` in ARRAY form (no `$PATH` / shell expansion).
355
+ */
356
+ async createTempDir(prefix) {
357
+ return this.#mktemp(['-d'], prefix);
358
+ }
359
+ /**
360
+ * Create a temp file under `/workspace/.tmp` — FILLS S1's v0 denial. Runs
361
+ * `mktemp` in ARRAY form (no `$PATH` / shell expansion).
362
+ */
363
+ async createTempFile(prefix) {
364
+ return this.#mktemp([], prefix);
365
+ }
366
+ /**
367
+ * Shared `mktemp` helper for {@link createTempDir} / {@link createTempFile}.
368
+ * The template lives UNDER the `/workspace` mount, so the created path is
369
+ * inside the only writable location and is confined by construction.
370
+ */
371
+ async #mktemp(flags, prefix) {
372
+ const safePrefix = (prefix ?? 'pi-').replace(/[^A-Za-z0-9._-]/g, '');
373
+ const template = `${GONDOLIN_TMP_DIR}/${safePrefix}XXXXXX`;
374
+ try {
375
+ // Ensure the parent .tmp dir exists (idempotent) before mktemp runs.
376
+ await this.#vm.fs.mkdir(GONDOLIN_TMP_DIR, { recursive: true });
377
+ const res = await this.#vm.exec(['/bin/mktemp', ...flags, template]);
378
+ const created = res.stdout.trim();
379
+ if (res.exitCode !== 0 || created === '') {
380
+ return fsErr('E_PI_FS_FAILED', res.stderr.trim() || 'mktemp failed', template);
381
+ }
382
+ return ok(created);
383
+ }
384
+ catch (err) {
385
+ return this.#toFsErr(err, template);
386
+ }
387
+ }
388
+ // --- shell ---------------------------------------------------------------
389
+ /**
390
+ * Execute a command in the guest via `vm.exec`. Deny-first: a real-egress verb
391
+ * ({@link DENIED_EXEC_PREFIXES} — `gh` / `git push` / `npm publish` / `cleo` /
392
+ * `git remote`) is rejected BEFORE reaching the VM, even though the VM itself
393
+ * has no egress (the network namespace is deny-by-default). `cwd` is confined
394
+ * to the workspace; the host `AbortSignal` is forwarded only when supplied.
395
+ *
396
+ * ## exitCode mapping
397
+ *
398
+ * gondolin's `ExecResult.exitCode` is `number` (NON-nullable) with a SEPARATE
399
+ * optional `signal` field; Pi's `PiExecResult.exitCode` is `number | null`
400
+ * ("null when killed by signal"). So a signal-kill is mapped to `null`, NOT
401
+ * the raw `exitCode`.
402
+ */
403
+ async exec(command, options) {
404
+ const denied = deniedEgressVerb(command);
405
+ if (denied !== null) {
406
+ return execErr('E_PI_EXEC_DENIED', `egress verb "${denied}" is denied inside the sandbox`);
407
+ }
408
+ const cwd = options?.cwd !== undefined ? this.#confine(options.cwd) : GONDOLIN_WORKSPACE_ROOT;
409
+ if (cwd === null) {
410
+ return execErr('E_PI_EXEC_DENIED', 'cwd escapes workspace boundary');
411
+ }
412
+ const execOptions = {
413
+ cwd,
414
+ ...(options?.env !== undefined ? { env: options.env } : {}),
415
+ ...(options?.timeout !== undefined ? { timeout: options.timeout } : {}),
416
+ };
417
+ try {
418
+ const res = await this.#vm.exec(command, execOptions);
419
+ const exitCode = res.signal !== undefined ? null : res.exitCode;
420
+ return ok({ stdout: res.stdout, stderr: res.stderr, exitCode });
421
+ }
422
+ catch (err) {
423
+ const message = err instanceof Error ? err.message : String(err);
424
+ return execErr('E_PI_EXEC_FAILED', message);
425
+ }
426
+ }
427
+ // --- cleanup (idempotent — owns the VM) ----------------------------------
428
+ /**
429
+ * Tear down the owned VM (`vm.close()`). Idempotent: a second call is a no-op.
430
+ * Best-effort and never throws (a close failure is logged, not propagated) so
431
+ * the Pi contract — `cleanup()` must not throw — holds.
432
+ */
433
+ async cleanup() {
434
+ if (this.#closed)
435
+ return;
436
+ this.#closed = true;
437
+ try {
438
+ await this.#vm.close();
439
+ }
440
+ catch (err) {
441
+ log.debug({ err }, 'gondolin VM close failed during cleanup (ignored)');
442
+ }
443
+ }
444
+ // --- error mapping -------------------------------------------------------
445
+ /** Convert a thrown error from a `vm.fs.*` call into a Pi `Result.err`. */
446
+ #toFsErr(err, path) {
447
+ const code = typeof err === 'object' && err !== null && 'code' in err
448
+ ? String(err.code)
449
+ : 'E_PI_FS_FAILED';
450
+ const message = err instanceof Error ? err.message : String(err);
451
+ return fsErr(code, message, path);
452
+ }
453
+ }
454
+ /**
455
+ * Whether `err` is a "file does not exist" failure (`ENOENT`). Used by
456
+ * {@link GondolinExecutionEnv.appendFile} to treat append-to-missing as
457
+ * append-creates while still propagating every OTHER failure.
458
+ */
459
+ function isMissingFileError(err) {
460
+ return (typeof err === 'object' &&
461
+ err !== null &&
462
+ 'code' in err &&
463
+ err.code === 'ENOENT');
464
+ }
465
+ // ---------------------------------------------------------------------------
466
+ // Factory
467
+ // ---------------------------------------------------------------------------
468
+ /**
469
+ * Thrown by {@link createGondolinExecutionEnv} when the optional
470
+ * `@earendil-works/gondolin` package (or its QEMU/KVM host infra) is not
471
+ * available, so a VM cannot be booted. Callers that want graceful degradation
472
+ * should check `isGondolinAvailable()` first (the selector
473
+ * {@link import('./resolve-execution-env.js')} does this) and fall back to the
474
+ * in-process {@link import('./pi-execution-env.js').GuardedExecutionEnv}.
475
+ */
476
+ export class GondolinUnavailableError extends Error {
477
+ /** Machine-readable code. */
478
+ code = 'E_GONDOLIN_UNAVAILABLE';
479
+ constructor(message) {
480
+ super(message);
481
+ this.name = 'GondolinUnavailableError';
482
+ }
483
+ }
484
+ /**
485
+ * Boot a gondolin micro-VM and wrap it in a {@link GondolinExecutionEnv}.
486
+ *
487
+ * The VM is configured for ZERO host authority:
488
+ * - **mount set** = ONLY `{ '/workspace': new RealFSProvider(seededCopyDir) }`.
489
+ * The disposable seeded copy is the single RW mount; live `tasks.db`/`brain.db`
490
+ * are structurally absent from the guest VFS (T5158 impossible in-VM).
491
+ * - **egress** = `createHttpHooks({ allowedHosts, secrets })` with `allowedHosts`
492
+ * defaulting to `[]` (DENY ALL — the footgun guard) and host-side secret
493
+ * PLACEHOLDERS (the guest never sees real token bytes).
494
+ * - **env** = ONLY `opts.env` (host `process.env` is NEVER inherited).
495
+ * - **memory** = `opts.memory` (default `"1G"`), set EXPLICITLY.
496
+ *
497
+ * Import-time side-effect-free: the gondolin module is loaded lazily HERE (not at
498
+ * module top-level) via the injectable {@link GondolinLoader} (tests pass a fake
499
+ * → a MOCK VM, so NO real QEMU boots).
500
+ *
501
+ * @param opts - The seeded-copy mount dir + egress allowlist/secrets + guest env.
502
+ * @returns A {@link PiExecutionEnv} backed by the booted VM.
503
+ * @throws {GondolinUnavailableError} When the optional package cannot be loaded.
504
+ *
505
+ * @example
506
+ * ```ts
507
+ * const env = await createGondolinExecutionEnv({ seededCopyDir: snapshotDir });
508
+ * // ... drive Pi's loop over `env` ...
509
+ * await env.cleanup(); // releases the VM
510
+ * ```
511
+ */
512
+ export async function createGondolinExecutionEnv(opts) {
513
+ const load = opts.load ?? loadGondolin;
514
+ const mod = await load();
515
+ if (mod === null) {
516
+ throw new GondolinUnavailableError('gondolin is not available (package absent or host infra missing); ' +
517
+ 'check isGondolinAvailable() and fall back to the in-process GuardedExecutionEnv');
518
+ }
519
+ // The ONLY RW mount is the disposable seeded copy at /workspace. Live DBs are
520
+ // structurally absent — there is no live handle inside the VM to corrupt.
521
+ const mounts = {
522
+ [GONDOLIN_WORKSPACE_ROOT]: new mod.RealFSProvider(opts.seededCopyDir),
523
+ };
524
+ // Egress deny-by-default: `allowedHosts` MUST be PRESENT-and-empty `[]` (the
525
+ // footgun — OMITTING it = allow-all per the gondolin docs). The loop appends
526
+ // specific hosts per run; secret bytes are injected host-side (guest sees only
527
+ // each `placeholder`).
528
+ const createHooks = mod.createHttpHooks;
529
+ const httpHooks = createHooks({
530
+ allowedHosts: opts.allowedHosts ?? [],
531
+ ...(opts.vaultSecrets !== undefined ? { secrets: opts.vaultSecrets } : {}),
532
+ });
533
+ const vm = await mod.VM.create({
534
+ memory: opts.memory ?? DEFAULT_GUEST_MEMORY,
535
+ env: opts.env ?? {},
536
+ vfs: { mounts },
537
+ httpHooks,
538
+ });
539
+ return new GondolinExecutionEnv(vm);
540
+ }
541
+ //# sourceMappingURL=pi-gondolin-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-gondolin-env.js","sourceRoot":"","sources":["../../../src/llm/pi/pi-gondolin-env.ts"],"names":[],"mappings":"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"}