spawnfile 0.1.17 → 0.1.18

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 (489) hide show
  1. package/README.md +1 -1
  2. package/dist/auth/importers.js +21 -5
  3. package/dist/auth/index.d.ts +1 -0
  4. package/dist/auth/index.js +1 -0
  5. package/dist/auth/profileStore.js +4 -1
  6. package/dist/auth/trainingGrokWriteback.d.ts +4 -0
  7. package/dist/auth/trainingGrokWriteback.js +119 -0
  8. package/dist/auth/trainingGrokWritebackLock.d.ts +5 -0
  9. package/dist/auth/trainingGrokWritebackLock.js +56 -0
  10. package/dist/cli/authCommands.js +9 -5
  11. package/dist/cli/compileBuildCommands.js +4 -0
  12. package/dist/cli/devCommands.js +4 -2
  13. package/dist/cli/downCommand.d.ts +2 -0
  14. package/dist/cli/downCommand.js +3 -0
  15. package/dist/cli/envFileOption.d.ts +18 -0
  16. package/dist/cli/envFileOption.js +20 -0
  17. package/dist/cli/lifecycleCommands.d.ts +1 -1
  18. package/dist/cli/lifecycleCommands.js +3 -1
  19. package/dist/cli/lifecyclePlan.d.ts +1 -0
  20. package/dist/cli/lifecyclePlan.js +2 -0
  21. package/dist/cli/paideiaDelegation.d.ts +2 -1
  22. package/dist/cli/paideiaDelegation.js +5 -4
  23. package/dist/cli/recordCommands.d.ts +17 -0
  24. package/dist/cli/recordCommands.js +43 -0
  25. package/dist/cli/releaseCommand.d.ts +6 -0
  26. package/dist/cli/releaseCommand.js +91 -0
  27. package/dist/cli/runCli.d.ts +7 -1
  28. package/dist/cli/runCli.js +11 -6
  29. package/dist/cli/runPublishCommands.js +5 -3
  30. package/dist/cli/trainCommand.js +73 -20
  31. package/dist/cli/upCommand.js +5 -1
  32. package/dist/cli/volumeCommands.d.ts +8 -0
  33. package/dist/cli/volumeCommands.js +53 -0
  34. package/dist/compiler/agentNodeMerge.js +3 -2
  35. package/dist/compiler/buildCompilePlan.js +4 -0
  36. package/dist/compiler/buildCompilePlanAgent.js +3 -1
  37. package/dist/compiler/buildCompilePlanTraversal.js +2 -0
  38. package/dist/compiler/buildCompilePlanTraversalHelpers.d.ts +2 -2
  39. package/dist/compiler/buildCompilePlanTraversalHelpers.js +4 -3
  40. package/dist/compiler/buildProject.d.ts +10 -0
  41. package/dist/compiler/buildProject.js +14 -2
  42. package/dist/compiler/cleanCompileOutput.d.ts +2 -0
  43. package/dist/compiler/cleanCompileOutput.js +14 -0
  44. package/dist/compiler/compilePlanHelpers.js +2 -0
  45. package/dist/compiler/compileProject.d.ts +10 -0
  46. package/dist/compiler/compileProject.js +29 -3
  47. package/dist/compiler/containerArtifactSummaries.js +1 -0
  48. package/dist/compiler/containerArtifacts.d.ts +4 -4
  49. package/dist/compiler/containerArtifacts.js +18 -34
  50. package/dist/compiler/containerArtifactsPlans.js +7 -0
  51. package/dist/compiler/containerArtifactsTypes.d.ts +7 -0
  52. package/dist/compiler/containerDaimonBrokerRender.d.ts +3 -1
  53. package/dist/compiler/containerDaimonBrokerRender.js +6 -3
  54. package/dist/compiler/containerDaimonGrokTaskClock.d.ts +5 -0
  55. package/dist/compiler/containerDaimonGrokTaskClock.js +29 -0
  56. package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +1 -1
  57. package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +38 -16
  58. package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +33 -8
  59. package/dist/compiler/containerDaimonGrokWorkerRender.js +18 -5
  60. package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +14 -1
  61. package/dist/compiler/containerDaimonOwnershipGuardRender.js +15 -2
  62. package/dist/compiler/containerDaimonUidEntrypointRender.js +6 -12
  63. package/dist/compiler/containerTargetResources.d.ts +10 -0
  64. package/dist/compiler/containerTargetResources.js +21 -13
  65. package/dist/compiler/containerWorkspaceResourceRender.js +4 -1
  66. package/dist/compiler/index.d.ts +2 -0
  67. package/dist/compiler/index.js +2 -0
  68. package/dist/compiler/mcpPlaceholders.d.ts +11 -0
  69. package/dist/compiler/mcpPlaceholders.js +58 -0
  70. package/dist/compiler/mcpServerInheritance.d.ts +18 -0
  71. package/dist/compiler/mcpServerInheritance.js +43 -0
  72. package/dist/compiler/moltnetArtifactTypes.d.ts +1 -0
  73. package/dist/compiler/moltnetArtifacts.js +1 -0
  74. package/dist/compiler/preflightCompilePlan.d.ts +9 -0
  75. package/dist/compiler/preflightCompilePlan.js +38 -0
  76. package/dist/compiler/recordingAgentFacts.d.ts +4 -0
  77. package/dist/compiler/recordingAgentFacts.js +35 -0
  78. package/dist/compiler/recordingCapability.d.ts +4 -0
  79. package/dist/compiler/recordingCapability.js +22 -0
  80. package/dist/compiler/recordingReport.d.ts +4 -0
  81. package/dist/compiler/recordingReport.js +18 -0
  82. package/dist/compiler/runProject.d.ts +2 -1
  83. package/dist/compiler/runProject.js +2 -0
  84. package/dist/compiler/surfaces.d.ts +1 -2
  85. package/dist/compiler/surfaces.js +0 -1
  86. package/dist/compiler/syncProjectAuth.js +2 -1
  87. package/dist/compiler/training/broker/clockProbe.d.ts +6 -0
  88. package/dist/compiler/training/broker/clockProbe.js +27 -0
  89. package/dist/compiler/training/broker/declaration.d.ts +4 -2
  90. package/dist/compiler/training/broker/declaration.js +4 -2
  91. package/dist/compiler/training/broker/entrypoint.js +33 -18
  92. package/dist/compiler/training/broker/evaluatorSecrets.d.ts +2 -0
  93. package/dist/compiler/training/broker/evaluatorSecrets.js +60 -0
  94. package/dist/compiler/training/broker/index.d.ts +3 -2
  95. package/dist/compiler/training/broker/index.js +3 -2
  96. package/dist/compiler/training/broker/main.js +1 -1
  97. package/dist/compiler/training/broker/paths.d.ts +96 -56
  98. package/dist/compiler/training/broker/paths.js +97 -89
  99. package/dist/compiler/training/broker/processes.d.ts +9 -0
  100. package/dist/compiler/training/broker/processes.js +4 -1
  101. package/dist/compiler/training/broker/projection.d.ts +3 -2
  102. package/dist/compiler/training/broker/projection.js +21 -9
  103. package/dist/compiler/training/broker/provisioning.d.ts +6 -15
  104. package/dist/compiler/training/broker/provisioning.js +71 -53
  105. package/dist/compiler/training/broker/registration.d.ts +3 -1
  106. package/dist/compiler/training/broker/registration.js +29 -21
  107. package/dist/compiler/training/broker/reset.d.ts +9 -0
  108. package/dist/compiler/training/broker/reset.js +71 -0
  109. package/dist/compiler/training/broker/runtime.d.ts +10 -13
  110. package/dist/compiler/training/broker/runtime.js +69 -115
  111. package/dist/compiler/training/broker/supervisor.d.ts +10 -11
  112. package/dist/compiler/training/broker/supervisor.js +22 -23
  113. package/dist/compiler/training/broker/taskClock.d.ts +5 -0
  114. package/dist/compiler/training/broker/taskClock.js +41 -0
  115. package/dist/compiler/training/compiledAgent.d.ts +21 -0
  116. package/dist/compiler/training/compiledAgent.js +62 -0
  117. package/dist/compiler/training/container/contract.d.ts +23 -0
  118. package/dist/compiler/training/container/contract.js +23 -5
  119. package/dist/compiler/training/container/evaluators.d.ts +48 -0
  120. package/dist/compiler/training/container/evaluators.js +50 -0
  121. package/dist/compiler/training/container/grokWriteback.d.ts +8 -0
  122. package/dist/compiler/training/container/grokWriteback.js +26 -0
  123. package/dist/compiler/training/container/index.d.ts +2 -1
  124. package/dist/compiler/training/container/index.js +2 -1
  125. package/dist/compiler/training/container/launch.d.ts +3 -0
  126. package/dist/compiler/training/container/launch.js +119 -28
  127. package/dist/compiler/training/container/nativeSlots.d.ts +14 -0
  128. package/dist/compiler/training/container/nativeSlots.js +13 -0
  129. package/dist/compiler/training/container/outputCopy.d.ts +2 -0
  130. package/dist/compiler/training/container/outputCopy.js +72 -0
  131. package/dist/compiler/training/container/outputVolume.d.ts +27 -0
  132. package/dist/compiler/training/container/outputVolume.js +161 -0
  133. package/dist/compiler/training/container/prepare.d.ts +3 -1
  134. package/dist/compiler/training/container/prepare.js +57 -12
  135. package/dist/compiler/training/container/security.d.ts +5 -3
  136. package/dist/compiler/training/container/security.js +15 -5
  137. package/dist/compiler/training/container/subjectIsolation.d.ts +5 -0
  138. package/dist/compiler/training/container/subjectIsolation.js +15 -0
  139. package/dist/compiler/training/context.d.ts +8 -0
  140. package/dist/compiler/training/context.js +12 -12
  141. package/dist/compiler/training/contract.d.ts +2 -0
  142. package/dist/compiler/training/contract.js +2 -0
  143. package/dist/compiler/training/execution.d.ts +417 -0
  144. package/dist/compiler/training/execution.js +160 -0
  145. package/dist/compiler/training/index.d.ts +8 -0
  146. package/dist/compiler/training/index.js +7 -0
  147. package/dist/compiler/training/moments.d.ts +80 -0
  148. package/dist/compiler/training/moments.js +118 -0
  149. package/dist/compiler/training/output.d.ts +2 -0
  150. package/dist/compiler/training/output.js +20 -0
  151. package/dist/compiler/training/plan/contract.d.ts +287 -0
  152. package/dist/compiler/training/plan/contract.js +49 -0
  153. package/dist/compiler/training/plan/index.d.ts +5 -0
  154. package/dist/compiler/training/plan/index.js +4 -0
  155. package/dist/compiler/training/plan/load.d.ts +9 -0
  156. package/dist/compiler/training/plan/load.js +153 -0
  157. package/dist/compiler/training/plan/references.d.ts +19 -0
  158. package/dist/compiler/training/plan/references.js +57 -0
  159. package/dist/compiler/training/plan/resolve.d.ts +4 -0
  160. package/dist/compiler/training/plan/resolve.js +73 -0
  161. package/dist/compiler/training/plan/targets.d.ts +11 -0
  162. package/dist/compiler/training/plan/targets.js +71 -0
  163. package/dist/compiler/training/plan/types.d.ts +36 -0
  164. package/dist/compiler/training/plan/types.js +1 -0
  165. package/dist/compiler/training/preparation/assets/Dockerfile +13 -2
  166. package/dist/compiler/training/preparation/assets/package-lock.json +2 -2
  167. package/dist/compiler/training/preparation/broker.d.ts +3 -3
  168. package/dist/compiler/training/preparation/broker.js +6 -4
  169. package/dist/compiler/training/preparation/contract.d.ts +27 -2
  170. package/dist/compiler/training/preparation/contract.js +23 -4
  171. package/dist/compiler/training/preparation/files.d.ts +5 -1
  172. package/dist/compiler/training/preparation/files.js +76 -15
  173. package/dist/compiler/training/preparation/image.js +9 -4
  174. package/dist/compiler/training/preparation/inputs.d.ts +1 -0
  175. package/dist/compiler/training/preparation/inputs.js +18 -10
  176. package/dist/compiler/training/preparation/prepare.d.ts +5 -0
  177. package/dist/compiler/training/preparation/prepare.js +66 -29
  178. package/dist/compiler/training/preparation/scratch.d.ts +6 -17
  179. package/dist/compiler/training/preparation/scratch.js +89 -23
  180. package/dist/compiler/training/repair/contract.d.ts +338 -4
  181. package/dist/compiler/training/repair/contract.js +2 -0
  182. package/dist/compiler/training/repair/index.d.ts +1 -1
  183. package/dist/compiler/training/repair/index.js +1 -1
  184. package/dist/compiler/training/repair/prepare.d.ts +155 -3
  185. package/dist/compiler/training/repair/prepare.js +6 -2
  186. package/dist/compiler/training/repair/witness.d.ts +152 -3
  187. package/dist/compiler/training/repair/witness.js +8 -2
  188. package/dist/compiler/training/resolution.d.ts +25 -0
  189. package/dist/compiler/training/resolution.js +69 -0
  190. package/dist/compiler/training/rewind/contract.d.ts +321 -0
  191. package/dist/compiler/training/rewind/contract.js +39 -0
  192. package/dist/compiler/training/rewind/deployedResource.d.ts +22 -0
  193. package/dist/compiler/training/rewind/deployedResource.js +19 -0
  194. package/dist/compiler/training/rewind/feed.d.ts +12 -0
  195. package/dist/compiler/training/rewind/feed.js +182 -0
  196. package/dist/compiler/training/rewind/feedContent.d.ts +6 -0
  197. package/dist/compiler/training/rewind/feedContent.js +38 -0
  198. package/dist/compiler/training/rewind/git.d.ts +8 -0
  199. package/dist/compiler/training/rewind/git.js +159 -0
  200. package/dist/compiler/training/rewind/gitArchive.d.ts +2 -0
  201. package/dist/compiler/training/rewind/gitArchive.js +7 -0
  202. package/dist/compiler/training/rewind/gitHistory.d.ts +3 -0
  203. package/dist/compiler/training/rewind/gitHistory.js +55 -0
  204. package/dist/compiler/training/rewind/gitProcess.d.ts +19 -0
  205. package/dist/compiler/training/rewind/gitProcess.js +81 -0
  206. package/dist/compiler/training/rewind/gitTree.d.ts +14 -0
  207. package/dist/compiler/training/rewind/gitTree.js +90 -0
  208. package/dist/compiler/training/rewind/history.d.ts +28 -0
  209. package/dist/compiler/training/rewind/history.js +239 -0
  210. package/dist/compiler/training/rewind/index.d.ts +18 -0
  211. package/dist/compiler/training/rewind/index.js +15 -0
  212. package/dist/compiler/training/rewind/inputs.d.ts +9 -0
  213. package/dist/compiler/training/rewind/inputs.js +67 -0
  214. package/dist/compiler/training/rewind/instant.d.ts +4 -0
  215. package/dist/compiler/training/rewind/instant.js +24 -0
  216. package/dist/compiler/training/rewind/leakCheck.d.ts +10 -0
  217. package/dist/compiler/training/rewind/leakCheck.js +56 -0
  218. package/dist/compiler/training/rewind/leakFeed.d.ts +5 -0
  219. package/dist/compiler/training/rewind/leakFeed.js +25 -0
  220. package/dist/compiler/training/rewind/leakFiles.d.ts +10 -0
  221. package/dist/compiler/training/rewind/leakFiles.js +106 -0
  222. package/dist/compiler/training/rewind/leakGit.d.ts +3 -0
  223. package/dist/compiler/training/rewind/leakGit.js +78 -0
  224. package/dist/compiler/training/rewind/leakGitPayload.d.ts +4 -0
  225. package/dist/compiler/training/rewind/leakGitPayload.js +57 -0
  226. package/dist/compiler/training/rewind/leakInputs.d.ts +7 -0
  227. package/dist/compiler/training/rewind/leakInputs.js +135 -0
  228. package/dist/compiler/training/rewind/leakLayout.d.ts +2 -0
  229. package/dist/compiler/training/rewind/leakLayout.js +17 -0
  230. package/dist/compiler/training/rewind/leakProvenance.d.ts +3 -0
  231. package/dist/compiler/training/rewind/leakProvenance.js +88 -0
  232. package/dist/compiler/training/rewind/materialize.d.ts +136 -0
  233. package/dist/compiler/training/rewind/materialize.js +212 -0
  234. package/dist/compiler/training/rewind/memory.d.ts +10 -0
  235. package/dist/compiler/training/rewind/memory.js +84 -0
  236. package/dist/compiler/training/rewind/memorySchemas.d.ts +87 -0
  237. package/dist/compiler/training/rewind/memorySchemas.js +50 -0
  238. package/dist/compiler/training/rewind/moltnet.d.ts +2 -0
  239. package/dist/compiler/training/rewind/moltnet.js +54 -0
  240. package/dist/compiler/training/rewind/moltnetJson.d.ts +13 -0
  241. package/dist/compiler/training/rewind/moltnetJson.js +180 -0
  242. package/dist/compiler/training/rewind/moltnetSchemas.d.ts +1226 -0
  243. package/dist/compiler/training/rewind/moltnetSchemas.js +75 -0
  244. package/dist/compiler/training/rewind/moltnetSqlite.d.ts +31 -0
  245. package/dist/compiler/training/rewind/moltnetSqlite.js +192 -0
  246. package/dist/compiler/training/rewind/moltnetSqliteData.d.ts +10 -0
  247. package/dist/compiler/training/rewind/moltnetSqliteData.js +113 -0
  248. package/dist/compiler/training/rewind/recordInput.d.ts +40 -0
  249. package/dist/compiler/training/rewind/recordInput.js +49 -0
  250. package/dist/compiler/training/rewind/recordedBundle.d.ts +4 -0
  251. package/dist/compiler/training/rewind/recordedBundle.js +58 -0
  252. package/dist/compiler/training/rewind/recordedCommit.d.ts +2 -0
  253. package/dist/compiler/training/rewind/recordedCommit.js +10 -0
  254. package/dist/compiler/training/rewind/select.d.ts +18 -0
  255. package/dist/compiler/training/rewind/select.js +64 -0
  256. package/dist/compiler/training/rewind/snapshotManifest.d.ts +42 -0
  257. package/dist/compiler/training/rewind/snapshotManifest.js +134 -0
  258. package/dist/compiler/training/rewind/taskClock.d.ts +12 -0
  259. package/dist/compiler/training/rewind/taskClock.js +40 -0
  260. package/dist/compiler/training/rewind/timestamps.d.ts +4 -0
  261. package/dist/compiler/training/rewind/timestamps.js +26 -0
  262. package/dist/compiler/training/rewind/types.d.ts +43 -0
  263. package/dist/compiler/training/rewind/types.js +1 -0
  264. package/dist/compiler/training/rewind/volumes.d.ts +12 -0
  265. package/dist/compiler/training/rewind/volumes.js +58 -0
  266. package/dist/compiler/training/selection.d.ts +7 -0
  267. package/dist/compiler/training/selection.js +15 -0
  268. package/dist/compiler/types.d.ts +6 -3
  269. package/dist/compiler/upProject.d.ts +1 -0
  270. package/dist/compiler/upProject.js +21 -5
  271. package/dist/compiler/workspaceBundleArtifacts.d.ts +16 -1
  272. package/dist/compiler/workspaceBundleArtifacts.js +69 -20
  273. package/dist/compiler/workspaceBundleCache.d.ts +23 -0
  274. package/dist/compiler/workspaceBundleCache.js +79 -0
  275. package/dist/compiler/workspaceBundleDependencies.d.ts +21 -0
  276. package/dist/compiler/workspaceBundleDependencies.js +122 -0
  277. package/dist/compiler/workspaceBundleFiles.d.ts +51 -0
  278. package/dist/compiler/workspaceBundleFiles.js +251 -0
  279. package/dist/compiler/workspaceBundleGenerated.d.ts +25 -0
  280. package/dist/compiler/workspaceBundleGenerated.js +103 -0
  281. package/dist/compiler/workspaceBundleGit.d.ts +64 -0
  282. package/dist/compiler/workspaceBundleGit.js +154 -0
  283. package/dist/compiler/workspaceBundleKey.d.ts +34 -0
  284. package/dist/compiler/workspaceBundleKey.js +17 -0
  285. package/dist/compiler/workspaceBundleResolve.d.ts +56 -0
  286. package/dist/compiler/workspaceBundleResolve.js +144 -0
  287. package/dist/compiler/workspaceBundleRun.d.ts +41 -0
  288. package/dist/compiler/workspaceBundleRun.js +79 -0
  289. package/dist/compiler/workspaceBundleTar.d.ts +47 -0
  290. package/dist/compiler/workspaceBundleTar.js +140 -0
  291. package/dist/compiler/workspaceBundleTree.d.ts +15 -0
  292. package/dist/compiler/workspaceBundleTree.js +58 -0
  293. package/dist/compiler/workspaceGitFetch.d.ts +41 -0
  294. package/dist/compiler/workspaceGitFetch.js +155 -0
  295. package/dist/compiler/workspaceGitPins.d.ts +33 -0
  296. package/dist/compiler/workspaceGitPins.js +127 -0
  297. package/dist/compiler/workspaceResources.d.ts +5 -1
  298. package/dist/compiler/workspaceResources.js +32 -5
  299. package/dist/deployment/activation.d.ts +3 -0
  300. package/dist/deployment/activation.js +12 -0
  301. package/dist/deployment/canaryCutover.d.ts +1 -1
  302. package/dist/deployment/candidateRecording.d.ts +8 -0
  303. package/dist/deployment/candidateRecording.js +22 -0
  304. package/dist/deployment/dockerManager.d.ts +5 -3
  305. package/dist/deployment/dockerManager.js +12 -2
  306. package/dist/deployment/downDeployment.d.ts +2 -0
  307. package/dist/deployment/downDeployment.js +6 -2
  308. package/dist/deployment/homeStore.d.ts +9 -1
  309. package/dist/deployment/homeStore.js +16 -53
  310. package/dist/deployment/index.d.ts +6 -0
  311. package/dist/deployment/index.js +6 -0
  312. package/dist/deployment/pidLock.d.ts +25 -0
  313. package/dist/deployment/pidLock.js +81 -0
  314. package/dist/deployment/record.d.ts +85 -1
  315. package/dist/deployment/record.js +11 -5
  316. package/dist/deployment/recordPublication.d.ts +15 -0
  317. package/dist/deployment/recordPublication.js +76 -0
  318. package/dist/deployment/recordedMemoryRetention.d.ts +18 -0
  319. package/dist/deployment/recordedMemoryRetention.js +27 -0
  320. package/dist/deployment/resourceLog.d.ts +140 -0
  321. package/dist/deployment/resourceLog.js +78 -0
  322. package/dist/distribution/buildDistributionReport.d.ts +3 -0
  323. package/dist/distribution/buildDistributionReport.js +5 -0
  324. package/dist/distribution/consumeImage.d.ts +3 -0
  325. package/dist/distribution/consumeImage.js +23 -31
  326. package/dist/distribution/consumeImageLifecycle.d.ts +4 -1
  327. package/dist/distribution/consumeImageLifecycle.js +14 -3
  328. package/dist/distribution/consumeImageSupport.d.ts +7 -0
  329. package/dist/distribution/consumeImageSupport.js +25 -0
  330. package/dist/distribution/distributionReportSchema.d.ts +47 -0
  331. package/dist/distribution/distributionReportSchema.js +20 -0
  332. package/dist/distribution/renderImageInterface.js +1 -1
  333. package/dist/distribution/types.d.ts +15 -0
  334. package/dist/filesystem/durableWrite.d.ts +10 -0
  335. package/dist/filesystem/durableWrite.js +87 -0
  336. package/dist/filesystem/index.d.ts +2 -0
  337. package/dist/filesystem/index.js +2 -0
  338. package/dist/filesystem/retainedJsonl.d.ts +23 -0
  339. package/dist/filesystem/retainedJsonl.js +123 -0
  340. package/dist/manifest/commandSchemas.d.ts +5 -0
  341. package/dist/manifest/commandSchemas.js +5 -0
  342. package/dist/manifest/executionSchemas.d.ts +20 -0
  343. package/dist/manifest/executionSchemas.js +13 -3
  344. package/dist/manifest/index.d.ts +2 -0
  345. package/dist/manifest/index.js +2 -0
  346. package/dist/manifest/loadManifest.js +3 -26
  347. package/dist/manifest/mcpSchemas.d.ts +61 -0
  348. package/dist/manifest/mcpSchemas.js +57 -11
  349. package/dist/manifest/memorySchemas.d.ts +1 -1
  350. package/dist/manifest/memorySchemas.js +1 -1
  351. package/dist/manifest/parseManifest.d.ts +7 -0
  352. package/dist/manifest/parseManifest.js +65 -0
  353. package/dist/manifest/renderSpawnfile.js +4 -1
  354. package/dist/manifest/renderSpawnfileWorkspace.js +6 -2
  355. package/dist/manifest/schemas.d.ts +1206 -132
  356. package/dist/manifest/schemas.js +14 -4
  357. package/dist/manifest/teamNetworkSchemas.d.ts +1 -1
  358. package/dist/manifest/trainingDataSchemas.d.ts +357 -0
  359. package/dist/manifest/trainingDataSchemas.js +31 -0
  360. package/dist/manifest/trainingSchemas.d.ts +49 -0
  361. package/dist/manifest/trainingSchemas.js +44 -0
  362. package/dist/manifest/volumeFeedSchemas.d.ts +52 -0
  363. package/dist/manifest/volumeFeedSchemas.js +104 -0
  364. package/dist/manifest/workspaceSchemas.d.ts +182 -5
  365. package/dist/manifest/workspaceSchemas.js +111 -7
  366. package/dist/recording/compose.d.ts +3 -0
  367. package/dist/recording/compose.js +93 -0
  368. package/dist/recording/deployment.d.ts +15 -0
  369. package/dist/recording/deployment.js +38 -0
  370. package/dist/recording/history.d.ts +16 -0
  371. package/dist/recording/history.js +47 -0
  372. package/dist/recording/index.d.ts +9 -0
  373. package/dist/recording/index.js +9 -0
  374. package/dist/recording/moment.d.ts +61 -0
  375. package/dist/recording/moment.js +36 -0
  376. package/dist/recording/parse.d.ts +15 -0
  377. package/dist/recording/parse.js +74 -0
  378. package/dist/recording/read.d.ts +8 -0
  379. package/dist/recording/read.js +61 -0
  380. package/dist/recording/store.d.ts +10 -0
  381. package/dist/recording/store.js +94 -0
  382. package/dist/recording/sync.d.ts +24 -0
  383. package/dist/recording/sync.js +126 -0
  384. package/dist/recording/types.d.ts +45 -0
  385. package/dist/recording/types.js +2 -0
  386. package/dist/release/drainControl.d.ts +54 -0
  387. package/dist/release/drainControl.js +137 -0
  388. package/dist/release/drainPhase.d.ts +37 -0
  389. package/dist/release/drainPhase.js +161 -0
  390. package/dist/release/index.d.ts +11 -0
  391. package/dist/release/index.js +11 -0
  392. package/dist/release/ledger.d.ts +75 -0
  393. package/dist/release/ledger.js +111 -0
  394. package/dist/release/notify.d.ts +58 -0
  395. package/dist/release/notify.js +126 -0
  396. package/dist/release/pending.d.ts +35 -0
  397. package/dist/release/pending.js +60 -0
  398. package/dist/release/postDeploy.d.ts +32 -0
  399. package/dist/release/postDeploy.js +62 -0
  400. package/dist/release/releaseDefaults.d.ts +9 -0
  401. package/dist/release/releaseDefaults.js +115 -0
  402. package/dist/release/releaseDocker.d.ts +38 -0
  403. package/dist/release/releaseDocker.js +94 -0
  404. package/dist/release/releaseTypes.d.ts +94 -0
  405. package/dist/release/releaseTypes.js +1 -0
  406. package/dist/release/runRelease.d.ts +9 -0
  407. package/dist/release/runRelease.js +218 -0
  408. package/dist/release/swap.d.ts +23 -0
  409. package/dist/release/swap.js +55 -0
  410. package/dist/release/types.d.ts +50 -0
  411. package/dist/release/types.js +29 -0
  412. package/dist/report/index.d.ts +1 -0
  413. package/dist/report/index.js +1 -0
  414. package/dist/report/recording.d.ts +57 -0
  415. package/dist/report/recording.js +26 -0
  416. package/dist/report/types.d.ts +58 -0
  417. package/dist/runtime/container.js +8 -13
  418. package/dist/runtime/daimon/adapter.js +15 -4
  419. package/dist/runtime/daimon/config.d.ts +4 -0
  420. package/dist/runtime/daimon/config.js +53 -4
  421. package/dist/runtime/daimon/contract-manifest.json +1 -0
  422. package/dist/runtime/daimon/contract-manifest.sha256 +1 -0
  423. package/dist/runtime/daimon/contractManifest.d.ts +59 -8
  424. package/dist/runtime/daimon/contractManifest.js +26 -10
  425. package/dist/runtime/daimon/grokTurnLimits.d.ts +25 -0
  426. package/dist/runtime/daimon/grokTurnLimits.js +51 -0
  427. package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +17 -0
  428. package/dist/runtime/daimon/grokWorkerConfigBytes.js +17 -0
  429. package/dist/runtime/daimon/grokWorkerContract.d.ts +5 -0
  430. package/dist/runtime/daimon/grokWorkerContract.js +13 -1
  431. package/dist/runtime/daimon/recording.d.ts +19 -0
  432. package/dist/runtime/daimon/recording.js +50 -0
  433. package/dist/runtime/daimon/scheduleAuthority.d.ts +8 -0
  434. package/dist/runtime/daimon/scheduleAuthority.js +19 -5
  435. package/dist/runtime/daimon/wakeMoments.d.ts +15 -0
  436. package/dist/runtime/daimon/wakeMoments.js +17 -0
  437. package/dist/runtime/daimonInstall.d.ts +3 -0
  438. package/dist/runtime/daimonInstall.js +25 -0
  439. package/dist/runtime/index.d.ts +1 -0
  440. package/dist/runtime/index.js +1 -0
  441. package/dist/runtime/install.d.ts +2 -0
  442. package/dist/runtime/install.js +1 -0
  443. package/dist/runtime/openclaw/adapter.js +3 -0
  444. package/dist/runtime/pi/adapter.js +3 -0
  445. package/dist/runtime/pi/containerTargets.js +6 -0
  446. package/dist/runtime/picoclaw/adapter.js +3 -0
  447. package/dist/runtime/registry.d.ts +3 -0
  448. package/dist/runtime/registry.js +13 -1
  449. package/dist/runtime/types.d.ts +15 -0
  450. package/dist/runtime/usageLedgerRead.d.ts +6 -0
  451. package/dist/runtime/usageLedgerRead.js +3 -3
  452. package/dist/shared/index.d.ts +1 -0
  453. package/dist/shared/index.js +1 -0
  454. package/dist/shared/recording.d.ts +8 -0
  455. package/dist/shared/recording.js +25 -0
  456. package/dist/target/dockerCommandExecutorCore.js +1 -1
  457. package/dist/target/dockerTargetBinding.js +2 -1
  458. package/dist/volume/feedLand.d.ts +31 -0
  459. package/dist/volume/feedLand.js +174 -0
  460. package/dist/volume/feedLandings.d.ts +45 -0
  461. package/dist/volume/feedLandings.js +111 -0
  462. package/dist/volume/feedLayout.d.ts +61 -0
  463. package/dist/volume/feedLayout.js +234 -0
  464. package/dist/volume/feedLock.d.ts +7 -0
  465. package/dist/volume/feedLock.js +131 -0
  466. package/dist/volume/feedManifest.d.ts +27 -0
  467. package/dist/volume/feedManifest.js +123 -0
  468. package/dist/volume/feedPrepare.d.ts +16 -0
  469. package/dist/volume/feedPrepare.js +228 -0
  470. package/dist/volume/feedProject.d.ts +39 -0
  471. package/dist/volume/feedProject.js +92 -0
  472. package/dist/volume/feedRecord.d.ts +55 -0
  473. package/dist/volume/feedRecord.js +148 -0
  474. package/dist/volume/feedRef.d.ts +43 -0
  475. package/dist/volume/feedRef.js +117 -0
  476. package/dist/volume/feedRefresh.d.ts +15 -0
  477. package/dist/volume/feedRefresh.js +187 -0
  478. package/dist/volume/feedSource.d.ts +66 -0
  479. package/dist/volume/feedSource.js +104 -0
  480. package/dist/volume/feedTarget.d.ts +70 -0
  481. package/dist/volume/feedTarget.js +9 -0
  482. package/dist/volume/feedTestKit.d.ts +11 -0
  483. package/dist/volume/feedTestKit.js +45 -0
  484. package/dist/volume/feedVerify.d.ts +18 -0
  485. package/dist/volume/feedVerify.js +104 -0
  486. package/dist/volume/index.d.ts +13 -0
  487. package/dist/volume/index.js +13 -0
  488. package/package.json +3 -3
  489. package/runtimes.yaml +8 -6
@@ -0,0 +1,140 @@
1
+ import { z } from "zod";
2
+ import { type RecordingReport } from "../report/index.js";
3
+ export declare const DEPLOY_RESOURCES_VERSION = "spawnfile.deploy-resources.v1";
4
+ export declare const DEPLOY_RESOURCE_LOG_FILE = "resource-log.jsonl";
5
+ export declare const deployResourcesSchema: z.ZodObject<{
6
+ version: z.ZodLiteral<"spawnfile.deploy-resources.v1">;
7
+ deployment: z.ZodString;
8
+ deployment_id: z.ZodString;
9
+ activated_at: z.ZodISODateTime;
10
+ activation_exact: z.ZodBoolean;
11
+ activation_note: z.ZodOptional<z.ZodString>;
12
+ rolled_back_at: z.ZodOptional<z.ZodISODateTime>;
13
+ exact: z.ZodOptional<z.ZodLiteral<false>>;
14
+ deployed_at: z.ZodISODateTime;
15
+ report_sha256: z.ZodString;
16
+ resources: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
17
+ id: z.ZodString;
18
+ kind: z.ZodLiteral<"git">;
19
+ commit: z.ZodString;
20
+ sha256: z.ZodString;
21
+ url: z.ZodOptional<z.ZodString>;
22
+ agent_node_ids: z.ZodArray<z.ZodString>;
23
+ declared_by: z.ZodOptional<z.ZodString>;
24
+ }, z.core.$strict>, z.ZodObject<{
25
+ id: z.ZodString;
26
+ kind: z.ZodLiteral<"bundle">;
27
+ sha256: z.ZodString;
28
+ origin: z.ZodOptional<z.ZodString>;
29
+ agent_node_ids: z.ZodArray<z.ZodString>;
30
+ declared_by: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strict>], "kind">>;
32
+ recording_agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
33
+ node_id: z.ZodString;
34
+ slug: z.ZodString;
35
+ directory: z.ZodString;
36
+ keep_ms: z.ZodNumber;
37
+ networks: z.ZodArray<z.ZodString>;
38
+ memory: z.ZodArray<z.ZodObject<{
39
+ id: z.ZodString;
40
+ declared_by: z.ZodString;
41
+ ledger_path: z.ZodNullable<z.ZodString>;
42
+ }, z.core.$strict>>;
43
+ feeds: z.ZodArray<z.ZodObject<{
44
+ id: z.ZodString;
45
+ volume_name: z.ZodString;
46
+ }, z.core.$strict>>;
47
+ resources: z.ZodArray<z.ZodObject<{
48
+ id: z.ZodString;
49
+ kind: z.ZodEnum<{
50
+ git: "git";
51
+ bundle: "bundle";
52
+ }>;
53
+ }, z.core.$strict>>;
54
+ snapshots: z.ZodArray<z.ZodString>;
55
+ }, z.core.$strict>>>;
56
+ }, z.core.$strict>;
57
+ export type DeployResources = z.infer<typeof deployResourcesSchema>;
58
+ export interface ResourceOwnership {
59
+ agent_node_ids: string[];
60
+ declared_by?: string;
61
+ }
62
+ /** Both reports carry the already-resolved pins; distribution omits private URLs. */
63
+ export interface DeployResourceReport {
64
+ recording?: RecordingReport;
65
+ workspace_git_resources?: Array<Partial<ResourceOwnership> & {
66
+ id: string;
67
+ commit: string;
68
+ sha256: string;
69
+ url?: string;
70
+ }>;
71
+ workspace_bundles?: Array<Partial<ResourceOwnership> & {
72
+ id: string;
73
+ sha256: string;
74
+ origin?: string;
75
+ }>;
76
+ }
77
+ export interface DeploymentActivation {
78
+ activated_at?: string;
79
+ activation_exact?: boolean;
80
+ activation_note?: string;
81
+ }
82
+ /** Record path is the deployment identity: project output scoped, or home scoped. */
83
+ export declare const deployResourceLogPath: (recordPath: string) => string;
84
+ export declare const createDeployResources: (recordPath: string, record: DeploymentActivation & {
85
+ name: string;
86
+ created_at: string;
87
+ }, report: DeployResourceReport, reportBytes: string) => DeployResources;
88
+ /** Invalid/legacy unowned lines are reported; never guess an agent's pin. */
89
+ export declare const readDeployResources: (recordPath: string) => import("../filesystem/retainedJsonl.js").JsonlReadResult<{
90
+ version: "spawnfile.deploy-resources.v1";
91
+ deployment: string;
92
+ deployment_id: string;
93
+ activated_at: string;
94
+ activation_exact: boolean;
95
+ deployed_at: string;
96
+ report_sha256: string;
97
+ resources: ({
98
+ id: string;
99
+ kind: "git";
100
+ commit: string;
101
+ sha256: string;
102
+ agent_node_ids: string[];
103
+ url?: string | undefined;
104
+ declared_by?: string | undefined;
105
+ } | {
106
+ id: string;
107
+ kind: "bundle";
108
+ sha256: string;
109
+ agent_node_ids: string[];
110
+ origin?: string | undefined;
111
+ declared_by?: string | undefined;
112
+ })[];
113
+ activation_note?: string | undefined;
114
+ rolled_back_at?: string | undefined;
115
+ exact?: false | undefined;
116
+ recording_agents?: {
117
+ node_id: string;
118
+ slug: string;
119
+ directory: string;
120
+ keep_ms: number;
121
+ networks: string[];
122
+ memory: {
123
+ id: string;
124
+ declared_by: string;
125
+ ledger_path: string | null;
126
+ }[];
127
+ feeds: {
128
+ id: string;
129
+ volume_name: string;
130
+ }[];
131
+ resources: {
132
+ id: string;
133
+ kind: "git" | "bundle";
134
+ }[];
135
+ snapshots: string[];
136
+ }[] | undefined;
137
+ }>;
138
+ export declare const deployResourcesAt: (entries: readonly DeployResources[], recordPath: string, instant: string | Date, agentNodeId?: string) => DeployResources | null;
139
+ /** Caller holds the publication lock. Reconcile only against the LAST entry. */
140
+ export declare const ensureDeployResources: (recordPath: string, entry: DeployResources, keepMs: number) => void;
@@ -0,0 +1,78 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { appendRetainedJsonl, entryAt, readRetainedJsonl, syncFileSync } from "../filesystem/index.js";
5
+ import { recordingAgentSchema } from "../report/index.js";
6
+ export const DEPLOY_RESOURCES_VERSION = "spawnfile.deploy-resources.v1";
7
+ export const DEPLOY_RESOURCE_LOG_FILE = "resource-log.jsonl";
8
+ const text = z.string().min(1);
9
+ const digest = text.regex(/^sha256:[a-f0-9]{64}$/u);
10
+ const ownership = { agent_node_ids: z.array(text).min(1), declared_by: text.optional() };
11
+ const resourceSchema = z.discriminatedUnion("kind", [
12
+ z.object({ ...ownership, id: text, kind: z.literal("git"), commit: text.regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u), sha256: digest, url: text.optional() }).strict(),
13
+ z.object({ ...ownership, id: text, kind: z.literal("bundle"), sha256: digest, origin: text.optional() }).strict()
14
+ ]);
15
+ export const deployResourcesSchema = z.object({
16
+ version: z.literal(DEPLOY_RESOURCES_VERSION), deployment: text,
17
+ deployment_id: text,
18
+ activated_at: z.iso.datetime({ offset: true }), activation_exact: z.boolean(), activation_note: text.optional(),
19
+ rolled_back_at: z.iso.datetime({ offset: true }).optional(), exact: z.literal(false).optional(),
20
+ deployed_at: z.iso.datetime({ offset: true }), report_sha256: digest,
21
+ resources: z.array(resourceSchema),
22
+ recording_agents: z.array(recordingAgentSchema).optional()
23
+ }).strict().refine((value) => !value.rolled_back_at || (value.exact === false && !value.activation_exact
24
+ && Date.parse(value.rolled_back_at) >= Date.parse(value.activated_at)), "Invalid candidate interval");
25
+ const isDeployResources = (value) => deployResourcesSchema.safeParse(value).success;
26
+ /** Record path is the deployment identity: project output scoped, or home scoped. */
27
+ export const deployResourceLogPath = (recordPath) => path.join(path.dirname(recordPath), path.basename(recordPath) === "record.json" ? DEPLOY_RESOURCE_LOG_FILE : `${path.basename(recordPath, ".json")}.${DEPLOY_RESOURCE_LOG_FILE}`);
28
+ export const createDeployResources = (recordPath, record, report, reportBytes) => deployResourcesSchema.parse({
29
+ version: DEPLOY_RESOURCES_VERSION, deployment: record.name, deployment_id: path.resolve(recordPath),
30
+ deployed_at: record.created_at, activated_at: record.activated_at ?? record.created_at,
31
+ activation_exact: record.activation_exact ?? false,
32
+ ...((record.activation_note || !record.activated_at) ? { activation_note: record.activation_note ?? "Activation boundary was not recorded" } : {}),
33
+ report_sha256: `sha256:${createHash("sha256").update(reportBytes).digest("hex")}`,
34
+ ...(report.recording?.agents ? { recording_agents: report.recording.agents } : {}),
35
+ resources: [
36
+ ...(report.workspace_git_resources ?? []).map(({ id, commit, sha256, url, agent_node_ids, declared_by }) => ({ id, kind: "git", commit, sha256, agent_node_ids, ...(declared_by ? { declared_by } : {}), ...(url === undefined ? {} : { url }) })),
37
+ ...(report.workspace_bundles ?? []).map(({ id, sha256, origin, agent_node_ids, declared_by }) => ({ id, kind: "bundle", sha256, agent_node_ids, ...(declared_by ? { declared_by } : {}), ...(origin === undefined ? {} : { origin }) }))
38
+ ]
39
+ });
40
+ /** Invalid/legacy unowned lines are reported; never guess an agent's pin. */
41
+ export const readDeployResources = (recordPath) => readRetainedJsonl(deployResourceLogPath(recordPath), isDeployResources);
42
+ export const deployResourcesAt = (entries, recordPath, instant, agentNodeId) => {
43
+ const scoped = entries.filter((value) => value.deployment_id === path.resolve(recordPath));
44
+ const at = instant instanceof Date ? instant.getTime() : Date.parse(instant);
45
+ const candidate = entryAt(scoped.filter((value) => value.rolled_back_at && at <= Date.parse(value.rolled_back_at)), instant, (value) => value.activated_at);
46
+ const entry = candidate ?? entryAt(activeDeployments(scoped), instant, (value) => value.activated_at);
47
+ return entry && agentNodeId !== undefined
48
+ ? { ...entry, resources: entry.resources.filter((resource) => resource.agent_node_ids.includes(agentNodeId)) }
49
+ : entry;
50
+ };
51
+ /** A published project candidate can subsequently fail readiness. Its successful-looking
52
+ * snapshot must not outlive its rollback interval, nor replace the restored predecessor. */
53
+ const activeDeployments = (entries) => {
54
+ const rolledBack = new Set(entries.filter((entry) => entry.rolled_back_at)
55
+ .map((entry) => `${entry.activated_at}:${entry.report_sha256}`));
56
+ return entries.filter((entry) => !entry.rolled_back_at && !rolledBack.has(`${entry.activated_at}:${entry.report_sha256}`));
57
+ };
58
+ const retainDeployResources = (entries, cutoff) => {
59
+ const predecessor = entryAt(activeDeployments(entries), new Date(cutoff), (entry) => entry.activated_at);
60
+ return entries.filter((entry) => entry === predecessor || Date.parse(entry.activated_at) > cutoff
61
+ || (entry.rolled_back_at !== undefined && Date.parse(entry.rolled_back_at) >= cutoff));
62
+ };
63
+ /** Caller holds the publication lock. Reconcile only against the LAST entry. */
64
+ export const ensureDeployResources = (recordPath, entry, keepMs) => {
65
+ if (entry.deployment_id !== path.resolve(recordPath))
66
+ throw new Error("Deployment history identity does not match its record path");
67
+ const history = readDeployResources(recordPath);
68
+ if (history.errors.length)
69
+ throw new Error(`Cannot reconcile deployment history: ${history.errors.join("; ")}`);
70
+ if (JSON.stringify(history.entries.at(-1)) === JSON.stringify(entry)) {
71
+ syncFileSync(deployResourceLogPath(recordPath));
72
+ return;
73
+ }
74
+ appendRetainedJsonl(deployResourceLogPath(recordPath), entry, {
75
+ keepMs, now: new Date(), timeOf: (value) => value.activated_at, isEntry: isDeployResources,
76
+ retain: retainDeployResources
77
+ });
78
+ };
@@ -15,9 +15,12 @@ export interface BuildDistributionReportInput {
15
15
  persistentMounts: DistributionPersistentMount[];
16
16
  portMappings: DistributionPortMapping[];
17
17
  publishedPorts: number[];
18
+ recording?: DistributionReport["recording"];
18
19
  resources: DistributionWorkspaceResource[];
19
20
  runtimeInstances: DistributionRuntimeInstance[];
20
21
  worldBindings?: DistributionWorldBindingsEvidence;
22
+ workspaceGitResources?: DistributionReport["workspace_git_resources"];
23
+ workspaceBundles?: DistributionReport["workspace_bundles"];
21
24
  }
22
25
  export declare const buildDistributionReport: (input: BuildDistributionReportInput) => DistributionReport;
23
26
  export declare const createDistributionImageLabels: (projectSlug: string, compileFingerprint: string) => DistributionImageLabels;
@@ -36,6 +36,11 @@ export const buildDistributionReport = (input) => {
36
36
  runtime_instances: [...input.runtimeInstances].sort((left, right) => left.id.localeCompare(right.id)),
37
37
  secrets: createSecretCategoryMap(input.envVariables),
38
38
  version: DISTRIBUTION_REPORT_VERSION,
39
+ ...(input.recording ? {
40
+ recording: input.recording,
41
+ workspace_git_resources: input.workspaceGitResources ?? [],
42
+ workspace_bundles: input.workspaceBundles ?? []
43
+ } : {}),
39
44
  ...(input.worldBindings ? { world_bindings: input.worldBindings } : {})
40
45
  };
41
46
  return {
@@ -8,6 +8,8 @@ export interface ConsumeImageUpOptions {
8
8
  daimonContainerCredentialUid?: number;
9
9
  authProfileName?: string | null;
10
10
  deploymentName?: string;
11
+ /** Caller owns the home lock across drain and swap; never set this without holding it. */
12
+ deploymentLockHeld?: boolean;
11
13
  dockerCommand?: string;
12
14
  dockerContext?: string;
13
15
  dockerHost?: string;
@@ -15,6 +17,7 @@ export interface ConsumeImageUpOptions {
15
17
  envFilePath?: string | null;
16
18
  pull?: boolean;
17
19
  runDocker?: DockerCommandRunner;
20
+ now?: () => Date;
18
21
  }
19
22
  export interface ConsumeImageUpResult {
20
23
  containerName: string;
@@ -1,9 +1,9 @@
1
1
  import os from "node:os";
2
2
  import path from "node:path";
3
3
  import { mkdtemp, rm, writeFile } from "node:fs/promises";
4
- import { acquireHomeDeploymentLock, captureCandidateDiagnostics, createDockerDeploymentLabels, homeDeploymentExists, normalizeDeploymentName, readHomeDeploymentRecord, resolveDockerDeploymentTarget, sanitizeCandidateDiagnostic, verifyDockerDeploymentTarget, writeHomeDeployment } from "../deployment/index.js";
4
+ import { acquireHomeDeploymentLock, activationBeforeStart, captureCandidateDiagnostics, createDockerDeploymentLabels, listHomeDeploymentRecords, HomeDeploymentRecordingError, normalizeDeploymentName, sanitizeCandidateDiagnostic, recordDeploymentRollback, resolveHomeRecordPath, writeHomeDeployment } from "../deployment/index.js";
5
5
  import { SpawnfileError } from "../shared/index.js";
6
- import { deriveDeploymentName, derivePersistentMountVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
6
+ import { readPreviousSource, resolveExistingOrNewTarget, deriveDeploymentName, derivePersistentMountVolumeName, renderEnvFileContent, resolveImageEnvironment } from "./consumeImageSupport.js";
7
7
  import { acquireExclusiveVolumeReservations, assertCandidateContainerReady, assertContainerStopped, inspectContainerSnapshot, restorePreviousContainer, rollbackCandidateContainer } from "./consumeImageLifecycle.js";
8
8
  import { createConsumerDockerRunner } from "./dockerRunner.js";
9
9
  import { resolveDaimonDockerSecurityArgsForImage } from "./consumeImageDaimonDocker.js";
@@ -67,7 +67,9 @@ export const consumeImageUp = async (imageRef, options = {}) => {
67
67
  const isExplicitName = Boolean(options.deploymentName);
68
68
  // Hold an exclusive lock for the whole operation so a concurrent `up` for the
69
69
  // same deployment cannot race on the record or orphan a container.
70
- const releaseLock = await acquireHomeDeploymentLock(deploymentName);
70
+ const releaseLock = options.deploymentLockHeld
71
+ ? async () => undefined
72
+ : await acquireHomeDeploymentLock(deploymentName);
71
73
  try {
72
74
  return await consumeImageUpLocked(imageRef, parsedRef, deploymentName, isExplicitName, options);
73
75
  }
@@ -77,7 +79,8 @@ export const consumeImageUp = async (imageRef, options = {}) => {
77
79
  };
78
80
  const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExplicitName, options) => {
79
81
  void parsedRef;
80
- const alreadyExists = await homeDeploymentExists(deploymentName);
82
+ const previousRecord = (await listHomeDeploymentRecords()).find((entry) => entry.record.name === deploymentName)?.record;
83
+ const alreadyExists = previousRecord !== undefined;
81
84
  if (alreadyExists && !isExplicitName) {
82
85
  throw new SpawnfileError("validation_error", `Deployment "${deploymentName}" already exists (derived from image ${imageRef}). ` +
83
86
  `To redeploy it, re-run with --deployment ${deploymentName}; ` +
@@ -143,11 +146,15 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
143
146
  const daimonDockerSecurityArgs = await resolveDaimonDockerSecurityArgsForImage(imageRef, report, runDocker, workDir);
144
147
  volumeReservation = await acquireExclusiveVolumeReservations(report, deploymentName, containerName, imageRef, runDocker);
145
148
  const previousContainer = await inspectContainerSnapshot(runDocker, containerName);
149
+ const now = options.now ?? (() => new Date());
150
+ let stoppedAt;
146
151
  if (previousContainer !== null) {
147
152
  await runDocker(["rename", containerName, backupName]);
148
153
  try {
149
154
  await runDocker(["stop", backupName]);
150
155
  await assertContainerStopped(runDocker, backupName, previousContainer.id);
156
+ if (report.recording)
157
+ stoppedAt = now().getTime();
151
158
  }
152
159
  catch (error) {
153
160
  try {
@@ -181,7 +188,9 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
181
188
  }
182
189
  runArgs.push(imageRef);
183
190
  let candidateId;
191
+ let activation = {};
184
192
  try {
193
+ activation = report.recording ? await activationBeforeStart(stoppedAt, now) : {};
185
194
  const runOutput = (await runDocker(runArgs)).toString("utf8").trim();
186
195
  const observedId = runOutput.split("\n").pop()?.trim();
187
196
  if (!observedId || !/^[a-f0-9]{64}$/u.test(observedId)) {
@@ -194,7 +203,9 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
194
203
  const record = {
195
204
  auth_profile: options.authProfileName ?? null,
196
205
  compile_fingerprint: inspection.compileFingerprint,
197
- created_at: new Date().toISOString(),
206
+ created_at: now().toISOString(),
207
+ ...activation,
208
+ ...(report.recording ? { recording: report.recording } : {}),
198
209
  ...(options.envFilePath ? { env_file: path.resolve(options.envFilePath) } : {}),
199
210
  manager: "docker",
200
211
  name: deploymentName,
@@ -215,7 +226,7 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
215
226
  ],
216
227
  version: "spawnfile.deployment.v2"
217
228
  };
218
- const written = await writeHomeDeployment(record, report);
229
+ const written = await writeHomeDeployment(record, report, previousRecord);
219
230
  if (previousContainer !== null) {
220
231
  await runDocker(["rm", "-f", previousContainer.id]).catch(() => undefined);
221
232
  }
@@ -229,6 +240,11 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
229
240
  };
230
241
  }
231
242
  catch (error) {
243
+ if (error instanceof HomeDeploymentRecordingError) {
244
+ if (previousContainer !== null)
245
+ await runDocker(["rm", "-f", previousContainer.id]).catch(() => undefined);
246
+ throw error;
247
+ }
232
248
  const diagnostics = candidateId ? await captureCandidateDiagnostics({
233
249
  candidateId, deploymentName, runDocker, secretValues: Object.values(env)
234
250
  }) : null;
@@ -236,7 +252,7 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
236
252
  ? `private diagnostics: ${diagnostics.path}` : "private diagnostics unavailable"}` : "";
237
253
  const failure = (cause) => new SpawnfileError("runtime_error", sanitizeCandidateDiagnostic(cause instanceof Error ? cause.message : String(cause), Object.values(env)) + detail);
238
254
  try {
239
- await rollbackCandidateContainer(runDocker, candidateId, containerName, previousContainer, backupName);
255
+ await rollbackCandidateContainer(runDocker, candidateId, containerName, previousContainer, backupName, report.recording && activation.activated_at ? () => recordDeploymentRollback(resolveHomeRecordPath(deploymentName), { name: deploymentName, created_at: activation.activated_at, ...activation }, report, `${JSON.stringify(report, null, 2)}\n`, now().toISOString()) : undefined);
240
256
  }
241
257
  catch (rollbackError) {
242
258
  throw failure(rollbackError);
@@ -253,27 +269,3 @@ const consumeImageUpLocked = async (imageRef, parsedRef, deploymentName, isExpli
253
269
  }
254
270
  }
255
271
  };
256
- const readPreviousSource = async (deploymentName) => {
257
- try {
258
- const existing = await readHomeDeploymentRecord(deploymentName);
259
- if (existing.source.kind !== "image") {
260
- return null;
261
- }
262
- return { digest: existing.source.digest, ref: existing.source.ref };
263
- }
264
- catch {
265
- return null;
266
- }
267
- };
268
- const resolveExistingOrNewTarget = async (deploymentName, alreadyExists, options) => {
269
- if (alreadyExists && !options.dockerContext && !options.dockerHost) {
270
- const existing = await readHomeDeploymentRecord(deploymentName);
271
- await verifyDockerDeploymentTarget(existing.target, { dockerCommand: options.dockerCommand });
272
- return existing.target;
273
- }
274
- return resolveDockerDeploymentTarget({
275
- context: options.dockerContext ?? null,
276
- dockerCommand: options.dockerCommand,
277
- dockerHost: options.dockerHost ?? null
278
- });
279
- };
@@ -11,7 +11,10 @@ export interface ExclusiveVolumeReservation {
11
11
  export declare const inspectContainerSnapshot: (runDocker: DockerCommandRunner, reference: string) => Promise<ContainerSnapshot | null>;
12
12
  export declare const assertExclusiveVolumesAvailable: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, runDocker: DockerCommandRunner) => Promise<void>;
13
13
  export declare const acquireExclusiveVolumeReservations: (report: DistributionReport, deploymentLineage: string, deploymentContainerName: string, imageReference: string, runDocker: DockerCommandRunner) => Promise<ExclusiveVolumeReservation>;
14
+ export declare const defaultCandidateReadinessTimeoutMs = 600000;
15
+ export declare const candidateReadinessTimeoutEnv = "SPAWNFILE_CANDIDATE_READINESS_TIMEOUT_MS";
16
+ export declare const resolveCandidateReadinessTimeoutMs: (env?: NodeJS.ProcessEnv) => number;
14
17
  export declare const assertCandidateContainerReady: (runDocker: DockerCommandRunner, candidateId: string, expectedName: string) => Promise<void>;
15
18
  export declare const assertContainerStopped: (runDocker: DockerCommandRunner, reference: string, expectedId: string) => Promise<void>;
16
19
  export declare const restorePreviousContainer: (runDocker: DockerCommandRunner, previous: ContainerSnapshot, backupName: string, deploymentName: string) => Promise<void>;
17
- export declare const rollbackCandidateContainer: (runDocker: DockerCommandRunner, candidateId: string | undefined, candidateName: string, previous: ContainerSnapshot | null, backupName: string) => Promise<void>;
20
+ export declare const rollbackCandidateContainer: (runDocker: DockerCommandRunner, candidateId: string | undefined, candidateName: string, previous: ContainerSnapshot | null, backupName: string, onCandidateRemoved?: () => Promise<void>) => Promise<void>;
@@ -154,12 +154,22 @@ const parseCandidateState = (raw) => {
154
154
  throw new SpawnfileError("runtime_error", "Candidate container returned invalid readiness state");
155
155
  }
156
156
  };
157
- const candidateReadinessTimeoutMs = 120_000;
157
+ export const defaultCandidateReadinessTimeoutMs = 600_000;
158
+ export const candidateReadinessTimeoutEnv = "SPAWNFILE_CANDIDATE_READINESS_TIMEOUT_MS";
159
+ // Large orgs can take minutes to boot; the budget is overridable per host.
160
+ // Anything other than a positive integer falls back to the default.
161
+ export const resolveCandidateReadinessTimeoutMs = (env = process.env) => {
162
+ const raw = env[candidateReadinessTimeoutEnv]?.trim();
163
+ if (!raw || !/^[0-9]+$/u.test(raw))
164
+ return defaultCandidateReadinessTimeoutMs;
165
+ const value = Number(raw);
166
+ return Number.isSafeInteger(value) && value > 0 ? value : defaultCandidateReadinessTimeoutMs;
167
+ };
158
168
  const candidateReadinessPollMs = 1_000;
159
169
  export const assertCandidateContainerReady = async (runDocker, candidateId, expectedName) => {
160
170
  if (!dockerId.test(candidateId))
161
171
  throw new SpawnfileError("runtime_error", "Candidate container returned invalid identity");
162
- const deadline = Date.now() + candidateReadinessTimeoutMs;
172
+ const deadline = Date.now() + resolveCandidateReadinessTimeoutMs();
163
173
  for (;;) {
164
174
  const { snapshot, state } = parseCandidateState(await runDocker([
165
175
  "container", "inspect", "--format", "{{json .Id}}\n{{json .Name}}\n{{json .State}}", candidateId
@@ -202,7 +212,7 @@ export const restorePreviousContainer = async (runDocker, previous, backupName,
202
212
  throw new SpawnfileError("runtime_error", "Prior container rollback state could not be verified");
203
213
  }
204
214
  };
205
- export const rollbackCandidateContainer = async (runDocker, candidateId, candidateName, previous, backupName) => {
215
+ export const rollbackCandidateContainer = async (runDocker, candidateId, candidateName, previous, backupName, onCandidateRemoved) => {
206
216
  const failed = [];
207
217
  if (candidateId !== undefined) {
208
218
  try {
@@ -212,6 +222,7 @@ export const rollbackCandidateContainer = async (runDocker, candidateId, candida
212
222
  throw new Error("identity");
213
223
  await runDocker(["rm", "-f", candidateId]);
214
224
  }
225
+ await onCandidateRemoved?.();
215
226
  }
216
227
  catch {
217
228
  failed.push("candidate cleanup");
@@ -1,3 +1,5 @@
1
+ import { type DockerDeploymentTarget } from "../deployment/index.js";
2
+ import type { ConsumeImageUpOptions } from "./consumeImage.js";
1
3
  import type { ParsedImageReference } from "./imageRef.js";
2
4
  import type { DistributionReport } from "./types.js";
3
5
  import type { DistributionPersistentMount } from "./types.js";
@@ -28,3 +30,8 @@ export interface ResolveImageEnvironmentInput {
28
30
  */
29
31
  export declare const resolveImageEnvironment: (input: ResolveImageEnvironmentInput) => Record<string, string>;
30
32
  export declare const renderEnvFileContent: (env: Record<string, string>) => string;
33
+ export declare const readPreviousSource: (deploymentName: string) => Promise<{
34
+ digest: string | null;
35
+ ref: string;
36
+ } | null>;
37
+ export declare const resolveExistingOrNewTarget: (deploymentName: string, alreadyExists: boolean, options: ConsumeImageUpOptions) => Promise<DockerDeploymentTarget>;
@@ -1,3 +1,4 @@
1
+ import { readHomeDeploymentRecord, resolveDockerDeploymentTarget, verifyDockerDeploymentTarget } from "../deployment/index.js";
1
2
  import { randomBytes } from "node:crypto";
2
3
  import { createExclusiveReattachVolumeName } from "../shared/index.js";
3
4
  const GENERATED_RUNTIME_SECRET_NAMES = new Set([
@@ -76,3 +77,27 @@ export const renderEnvFileContent = (env) => Object.entries(env)
76
77
  .sort(([left], [right]) => left.localeCompare(right))
77
78
  .map(([name, value]) => `${name}=${value}`)
78
79
  .join("\n") + "\n";
80
+ export const readPreviousSource = async (deploymentName) => {
81
+ try {
82
+ const existing = await readHomeDeploymentRecord(deploymentName);
83
+ if (existing.source.kind !== "image") {
84
+ return null;
85
+ }
86
+ return { digest: existing.source.digest, ref: existing.source.ref };
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ };
92
+ export const resolveExistingOrNewTarget = async (deploymentName, alreadyExists, options) => {
93
+ if (alreadyExists && !options.dockerContext && !options.dockerHost) {
94
+ const existing = await readHomeDeploymentRecord(deploymentName);
95
+ await verifyDockerDeploymentTarget(existing.target, { dockerCommand: options.dockerCommand });
96
+ return existing.target;
97
+ }
98
+ return resolveDockerDeploymentTarget({
99
+ context: options.dockerContext ?? null,
100
+ dockerCommand: options.dockerCommand,
101
+ dockerHost: options.dockerHost ?? null
102
+ });
103
+ };
@@ -39,6 +39,35 @@ export declare const distributionReportSchema: z.ZodObject<{
39
39
  published_port: z.ZodNumber;
40
40
  }, z.core.$strict>>;
41
41
  ports: z.ZodArray<z.ZodNumber>;
42
+ recording: z.ZodOptional<z.ZodObject<{
43
+ keep_ms: z.ZodNumber;
44
+ memory_mount_ids: z.ZodArray<z.ZodString>;
45
+ recording_mount_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
46
+ agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
47
+ node_id: z.ZodString;
48
+ slug: z.ZodString;
49
+ directory: z.ZodString;
50
+ keep_ms: z.ZodNumber;
51
+ networks: z.ZodArray<z.ZodString>;
52
+ memory: z.ZodArray<z.ZodObject<{
53
+ id: z.ZodString;
54
+ declared_by: z.ZodString;
55
+ ledger_path: z.ZodNullable<z.ZodString>;
56
+ }, z.core.$strict>>;
57
+ feeds: z.ZodArray<z.ZodObject<{
58
+ id: z.ZodString;
59
+ volume_name: z.ZodString;
60
+ }, z.core.$strict>>;
61
+ resources: z.ZodArray<z.ZodObject<{
62
+ id: z.ZodString;
63
+ kind: z.ZodEnum<{
64
+ git: "git";
65
+ bundle: "bundle";
66
+ }>;
67
+ }, z.core.$strict>>;
68
+ snapshots: z.ZodArray<z.ZodString>;
69
+ }, z.core.$strict>>>;
70
+ }, z.core.$strict>>;
42
71
  resources: z.ZodArray<z.ZodObject<{
43
72
  id: z.ZodString;
44
73
  kind: z.ZodUnion<readonly [z.ZodLiteral<"bundle">, z.ZodLiteral<"git">, z.ZodLiteral<"volume">]>;
@@ -65,6 +94,7 @@ export declare const distributionReportSchema: z.ZodObject<{
65
94
  node_ids: z.ZodArray<z.ZodString>;
66
95
  published_port: z.ZodNullable<z.ZodNumber>;
67
96
  runtime: z.ZodString;
97
+ telemetry_mount_ids: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
68
98
  workspace_path: z.ZodString;
69
99
  }, z.core.$strict>>;
70
100
  secrets: z.ZodObject<{
@@ -90,6 +120,23 @@ export declare const distributionReportSchema: z.ZodObject<{
90
120
  }, z.core.$strict>>;
91
121
  }, z.core.$strict>;
92
122
  version: z.ZodLiteral<"spawnfile.distribution-report.v1">;
123
+ workspace_git_resources: z.ZodOptional<z.ZodArray<z.ZodObject<{
124
+ agent_node_ids: z.ZodArray<z.ZodString>;
125
+ declared_by: z.ZodOptional<z.ZodString>;
126
+ id: z.ZodString;
127
+ commit: z.ZodString;
128
+ sha256: z.ZodString;
129
+ }, z.core.$strict>>>;
130
+ workspace_bundles: z.ZodOptional<z.ZodArray<z.ZodObject<{
131
+ agent_node_ids: z.ZodArray<z.ZodString>;
132
+ declared_by: z.ZodOptional<z.ZodString>;
133
+ id: z.ZodString;
134
+ sha256: z.ZodString;
135
+ origin: z.ZodOptional<z.ZodEnum<{
136
+ built: "built";
137
+ prebuilt: "prebuilt";
138
+ }>>;
139
+ }, z.core.$strict>>>;
93
140
  world_bindings: z.ZodOptional<z.ZodObject<{
94
141
  artifact_path: z.ZodLiteral<"/spawnfile/world-bindings.json">;
95
142
  digest: z.ZodString;
@@ -1,5 +1,6 @@
1
1
  import { z } from "zod";
2
2
  import { SpawnfileError } from "../shared/index.js";
3
+ import { recordingReportSchema } from "../report/index.js";
3
4
  import { DISTRIBUTION_ENGINE_KINDS, DISTRIBUTION_REPORT_VERSION, WORLD_BINDINGS_IMAGE_PATH } from "./types.js";
4
5
  const secretEntrySchema = z.object({
5
6
  generated: z.boolean(),
@@ -41,6 +42,10 @@ const runtimeInstanceSchema = z.object({
41
42
  node_ids: z.array(z.string()),
42
43
  published_port: portSchema.nullable(),
43
44
  runtime: z.string().min(1),
45
+ // node id -> persistent mount id for per-agent telemetry; every pi/Daimon
46
+ // image this compiler builds carries it, so a strict schema without it
47
+ // refused image-mode `up` of the compiler's own output.
48
+ telemetry_mount_ids: z.record(z.string().min(1), instanceIdSchema).optional(),
44
49
  workspace_path: containerPathSchema
45
50
  }).strict();
46
51
  export const distributionReportSchema = z.object({
@@ -94,6 +99,7 @@ export const distributionReportSchema = z.object({
94
99
  published_port: portSchema
95
100
  }).strict()),
96
101
  ports: z.array(portSchema),
102
+ recording: recordingReportSchema.optional(),
97
103
  resources: z.array(z.object({
98
104
  id: z.string().min(1),
99
105
  kind: z.union([z.literal("bundle"), z.literal("git"), z.literal("volume")]),
@@ -110,6 +116,20 @@ export const distributionReportSchema = z.object({
110
116
  surface: z.array(secretEntrySchema)
111
117
  }).strict(),
112
118
  version: z.literal(DISTRIBUTION_REPORT_VERSION),
119
+ workspace_git_resources: z.array(z.object({
120
+ agent_node_ids: z.array(z.string().min(1)).min(1),
121
+ declared_by: z.string().min(1).optional(),
122
+ id: z.string().min(1),
123
+ commit: z.string().regex(/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/u),
124
+ sha256: z.string().regex(/^sha256:[a-f0-9]{64}$/u)
125
+ }).strict()).optional(),
126
+ workspace_bundles: z.array(z.object({
127
+ agent_node_ids: z.array(z.string().min(1)).min(1),
128
+ declared_by: z.string().min(1).optional(),
129
+ id: z.string().min(1),
130
+ sha256: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
131
+ origin: z.enum(["built", "prebuilt"]).optional()
132
+ }).strict()).optional(),
113
133
  world_bindings: z.object({
114
134
  artifact_path: z.literal(WORLD_BINDINGS_IMAGE_PATH),
115
135
  digest: z.string().regex(/^sha256:[a-f0-9]{64}$/u),
@@ -80,7 +80,7 @@ export const renderImageInterface = (report, options) => {
80
80
  lines.push("");
81
81
  lines.push(`next: spawnfile up ${summary.imageRef} --auth-profile <profile>`);
82
82
  if (summary.requiredSecrets.length > 0) {
83
- lines.push(" supply the required secrets above via that profile or --env-file");
83
+ lines.push(" supply the required secrets above via that profile or --runtime-env-file");
84
84
  }
85
85
  return lines.join("\n");
86
86
  };
@@ -1,4 +1,5 @@
1
1
  import type { ModelAuthMethod } from "../shared/index.js";
2
+ import type { RecordingReport, WorkspaceResourceOwnership } from "../report/index.js";
2
3
  export type DistributionSecretCategory = "model" | "project" | "runtime" | "surface";
3
4
  export interface DistributionSecretEntry {
4
5
  generated: boolean;
@@ -56,6 +57,7 @@ export interface DistributionRuntimeInstance {
56
57
  node_ids: string[];
57
58
  published_port: number | null;
58
59
  runtime: string;
60
+ telemetry_mount_ids?: Record<string, string>;
59
61
  workspace_path: string;
60
62
  }
61
63
  export declare const DISTRIBUTION_ENGINE_KINDS: readonly ["agy", "claude", "codex", "grok", "pi", "scripted"];
@@ -86,10 +88,23 @@ export interface DistributionReport {
86
88
  persistent_mounts: DistributionPersistentMount[];
87
89
  port_mappings: DistributionPortMapping[];
88
90
  ports: number[];
91
+ recording?: RecordingReport;
89
92
  resources: DistributionWorkspaceResource[];
90
93
  runtime_instances: DistributionRuntimeInstance[];
91
94
  secrets: Record<DistributionSecretCategory, DistributionSecretEntry[]>;
92
95
  version: "spawnfile.distribution-report.v1";
96
+ /** Recording-only pins; ids are workspace resource ids, never scoped report keys. */
97
+ workspace_git_resources?: Array<WorkspaceResourceOwnership & {
98
+ id: string;
99
+ commit: string;
100
+ sha256: string;
101
+ }>;
102
+ /** Recording-only bundle identity; no creator-host paths or URLs are published. */
103
+ workspace_bundles?: Array<WorkspaceResourceOwnership & {
104
+ id: string;
105
+ sha256: string;
106
+ origin?: string;
107
+ }>;
93
108
  world_bindings?: DistributionWorldBindingsEvidence;
94
109
  }
95
110
  export declare const DISTRIBUTION_REPORT_VERSION = "spawnfile.distribution-report.v1";