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,155 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createHash, randomBytes } from "node:crypto";
3
+ import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { promisify } from "node:util";
7
+ import { SpawnfileError } from "../shared/index.js";
8
+ const run = promisify(execFile);
9
+ const COMMIT = /^[a-f0-9]{40}$/u;
10
+ const fail = (message) => {
11
+ throw new SpawnfileError("validation_error", message);
12
+ };
13
+ const shellQuote = (value) => `'${value.replace(/'/g, `'"'"'`)}'`;
14
+ /** The remote ref to fetch, and the commit it must equal when the selector already names one. */
15
+ export const gitPinRefspec = (selector) => {
16
+ if (selector.kind === "branch")
17
+ return { source: `refs/heads/${selector.value}` };
18
+ if (selector.kind === "tag")
19
+ return { source: `refs/tags/${selector.value}` };
20
+ if (selector.kind === "ref")
21
+ return COMMIT.test(selector.value) ? { expected: selector.value, source: selector.value } : { source: selector.value };
22
+ return { source: "HEAD" };
23
+ };
24
+ /**
25
+ * Runs `use` with the git environment for one fetch. A key held in an env var
26
+ * is copied to a private 0600 file in a fresh temporary directory that is
27
+ * removed afterwards; the key only ever reaches git through `GIT_SSH_COMMAND`.
28
+ */
29
+ export const withGitPinEnvironment = async (auth, use, environment = process.env) => {
30
+ // Never prompt, never honour replacement refs: an object id must name its own bytes.
31
+ const base = { ...environment, GIT_NO_REPLACE_OBJECTS: "1", GIT_TERMINAL_PROMPT: "0" };
32
+ // The key reaches git and ssh only as a file path, never as an inherited variable.
33
+ if (auth?.sshKeyEnv !== undefined)
34
+ delete base[auth.sshKeyEnv];
35
+ if (auth === undefined)
36
+ return use(base);
37
+ let temporary;
38
+ try {
39
+ let keyPath;
40
+ if (auth.sshKeyEnv !== undefined) {
41
+ const material = environment[auth.sshKeyEnv];
42
+ if (!material?.trim())
43
+ fail(`git resource auth env ${auth.sshKeyEnv} is not set`);
44
+ temporary = await mkdtemp(path.join(os.tmpdir(), "spawnfile-git-key-"));
45
+ keyPath = path.join(temporary, "key");
46
+ await writeFile(keyPath, material.endsWith("\n") ? material : `${material}\n`, { mode: 0o600 });
47
+ }
48
+ else {
49
+ keyPath = auth.sshKey;
50
+ const info = await stat(keyPath).catch(() => undefined);
51
+ if (!info?.isFile())
52
+ fail(`git resource ssh_key is not a readable file: ${keyPath}`);
53
+ }
54
+ const ssh = `ssh -i ${shellQuote(keyPath)} -o IdentitiesOnly=yes -o BatchMode=yes`;
55
+ return await use({ ...base, GIT_SSH_COMMAND: ssh });
56
+ }
57
+ finally {
58
+ if (temporary !== undefined)
59
+ await rm(temporary, { force: true, recursive: true });
60
+ }
61
+ };
62
+ const git = async (repository, args, env) => {
63
+ const { stdout } = await run("git", ["-C", repository, ...args], { encoding: "utf8", env, maxBuffer: 16_777_216 });
64
+ return stdout.trim();
65
+ };
66
+ const LOCK_POLL_MS = 100;
67
+ const processAlive = (pid) => {
68
+ try {
69
+ process.kill(pid, 0);
70
+ return true;
71
+ }
72
+ catch (error) {
73
+ return error.code === "EPERM";
74
+ }
75
+ };
76
+ /**
77
+ * Serializes work on one cache repository across processes on this host: git
78
+ * keeps one repository-wide `shallow` file, so two shallow fetches into the
79
+ * same repository can fail each other. A lock whose owner process is gone is
80
+ * taken over.
81
+ */
82
+ export const withGitPinLock = async (repository, use) => {
83
+ const lock = `${repository}.lock`, owner = path.join(lock, "owner");
84
+ for (;;) {
85
+ try {
86
+ await mkdir(lock);
87
+ await writeFile(owner, `${process.pid}\n`);
88
+ break;
89
+ }
90
+ catch (error) {
91
+ if (error.code !== "EEXIST")
92
+ throw error;
93
+ const pid = Number.parseInt(await readFile(owner, "utf8").catch(() => ""), 10);
94
+ const age = Date.now() - ((await stat(lock).catch(() => undefined))?.mtimeMs ?? Date.now());
95
+ // An owner-less lock older than a few polls belongs to a process that died between mkdir and write.
96
+ if (Number.isInteger(pid) ? !processAlive(pid) : age > LOCK_POLL_MS * 50)
97
+ await rm(lock, { force: true, recursive: true });
98
+ else
99
+ await new Promise((resolve) => setTimeout(resolve, LOCK_POLL_MS));
100
+ }
101
+ }
102
+ try {
103
+ return await use();
104
+ }
105
+ finally {
106
+ await rm(lock, { force: true, recursive: true });
107
+ }
108
+ };
109
+ /** One bare object cache per remote URL. Auto-gc is off: a concurrent compile may still be reading a commit. Call under the lock. */
110
+ const ensureGitPinRepository = async (repository) => {
111
+ if (await stat(path.join(repository, "HEAD")).catch(() => undefined))
112
+ return;
113
+ await rm(repository, { force: true, recursive: true });
114
+ await run("git", ["init", "--bare", "-q", repository]);
115
+ await run("git", ["-C", repository, "config", "gc.auto", "0"]);
116
+ };
117
+ const hasCommit = (repository, commit, env) => git(repository, ["cat-file", "-e", `${commit}^{commit}`], env).then(() => true, () => false);
118
+ /**
119
+ * Resolves `selector` on `url` to one commit and fetches its objects into the
120
+ * cache, shallowly, under the repository lock. A full commit id already in the
121
+ * cache is not fetched again, so a recorded pin rebuilds offline. Any failure
122
+ * to resolve refuses the compile: a pinned resource never falls back to stale
123
+ * or empty content.
124
+ */
125
+ export const fetchGitPin = async (cacheDirectory, url, selector, env) => {
126
+ await mkdir(cacheDirectory, { mode: 0o700, recursive: true });
127
+ const repository = path.join(cacheDirectory, `${createHash("sha256").update(url).digest("hex")}.git`);
128
+ return withGitPinLock(repository, async () => {
129
+ await ensureGitPinRepository(repository);
130
+ const { expected, source } = gitPinRefspec(selector);
131
+ if (expected !== undefined && await hasCommit(repository, expected, env))
132
+ return { commit: expected, repository };
133
+ // A per-process ref, so a lock taken over from a dead owner never reads its half-written result.
134
+ const local = `refs/spawnfile/pins/${process.pid}-${randomBytes(6).toString("hex")}`;
135
+ try {
136
+ await git(repository, ["fetch", "--quiet", "--no-tags", "--depth=1", "--", url, `+${source}:${local}`], env);
137
+ const commit = await git(repository, ["rev-parse", "--verify", `${local}^{commit}`], env);
138
+ if (!COMMIT.test(commit))
139
+ fail(`git resource ${url} ${selector.kind} ${selector.value} did not resolve to a commit`);
140
+ if (expected !== undefined && commit !== expected)
141
+ fail(`git resource ${url} ref ${expected} resolved to ${commit}`);
142
+ return { commit, repository };
143
+ }
144
+ catch (error) {
145
+ if (error instanceof SpawnfileError)
146
+ throw error;
147
+ const stderr = String(error.stderr ?? "").trim().split("\n").filter(Boolean).pop();
148
+ const what = selector.kind === "none" ? "default branch" : `${selector.kind} ${selector.value}`;
149
+ return fail(`git resource ${url} ${what} could not be resolved to a commit${stderr ? `: ${stderr}` : ""}`);
150
+ }
151
+ finally {
152
+ await git(repository, ["update-ref", "-d", local], env).catch(() => undefined);
153
+ }
154
+ });
155
+ };
@@ -0,0 +1,33 @@
1
+ import type { CompileReportWorkspaceGitResource } from "../report/index.js";
2
+ import { type BundleIdentityMode } from "./workspaceBundleFiles.js";
3
+ import type { MoltnetTargetArchitecture } from "./moltnetReleaseAuthority.js";
4
+ import type { CompilePlan } from "./types.js";
5
+ import type { ResolvedWorkspaceResource } from "./workspaceResources.js";
6
+ type GitResource = Extract<ResolvedWorkspaceResource, {
7
+ kind: "git";
8
+ }>;
9
+ export interface ResolveWorkspaceGitPinsOptions {
10
+ outputDirectory: string;
11
+ architecture?: MoltnetTargetArchitecture;
12
+ /** The workspace bundle cache directory; git objects and archives live beside it under `git-resources/`. */
13
+ bundleCacheDirectory?: string;
14
+ identity?: BundleIdentityMode;
15
+ environment?: NodeJS.ProcessEnv;
16
+ }
17
+ export interface ResolvedWorkspaceGitPins {
18
+ /** Digest → archive linked into the Docker context, for `stageWorkspaceBundles`. */
19
+ built: Map<string, string>;
20
+ report: CompileReportWorkspaceGitResource[];
21
+ }
22
+ export declare const isBuildPinnedGitResource: (resource: ResolvedWorkspaceResource) => resource is GitResource;
23
+ /**
24
+ * Lowers every `fetch: build` git resource into a pinned read-only bundle:
25
+ * the declared branch, tag or ref is resolved on the host to one commit, that
26
+ * commit's tree is archived deterministically (the same writer as built
27
+ * bundles), and the agent mounts the archive exactly as it mounts a bundle.
28
+ * No credential, clone or network access reaches the container. The commit
29
+ * and archive digest are recorded in the compile report; declaring
30
+ * `ref: <commit>` reproduces the identical archive.
31
+ */
32
+ export declare const resolveWorkspaceGitPins: (plan: CompilePlan, options: ResolveWorkspaceGitPinsOptions) => Promise<ResolvedWorkspaceGitPins>;
33
+ export {};
@@ -0,0 +1,127 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
3
+ import { SpawnfileError } from "../shared/index.js";
4
+ import { linkBuiltBundle } from "./workspaceBundleArtifacts.js";
5
+ import { lookupCachedBundle, pruneBundleCache, resolveWorkspaceBundleCacheDirectory, storeBuiltBundle } from "./workspaceBundleCache.js";
6
+ import { listCommittedTree } from "./workspaceBundleGit.js";
7
+ import { compileExcludePatterns, writeBundleFiles } from "./workspaceBundleFiles.js";
8
+ import { computeWorkspaceBundleKey, resolveBundleArchitecture } from "./workspaceBundleResolve.js";
9
+ import { normalizeBundleMode } from "./workspaceBundleTar.js";
10
+ import { fetchGitPin, withGitPinEnvironment } from "./workspaceGitFetch.js";
11
+ const SYMLINK = 0o120000, GITLINK = 0o160000;
12
+ const fail = (message) => {
13
+ throw new SpawnfileError("validation_error", message);
14
+ };
15
+ export const isBuildPinnedGitResource = (resource) => resource.kind === "git" && resource.fetch === "build";
16
+ const selectorOf = (resource) => resource.branch ? { kind: "branch", value: resource.branch.trim() }
17
+ : resource.tag ? { kind: "tag", value: resource.tag.trim() }
18
+ : resource.ref ? { kind: "ref", value: resource.ref.trim() }
19
+ : { kind: "none", value: "" };
20
+ const expandPath = (value, base) => value === "~" || value.startsWith("~/") ? path.join(os.homedir(), value.slice(1)) : path.resolve(base, value);
21
+ const authOf = (resource) => {
22
+ if (!resource.auth)
23
+ return undefined;
24
+ return resource.auth.ssh_key !== undefined
25
+ ? { sshKey: expandPath(resource.auth.ssh_key, path.dirname(resource.scope.key)) }
26
+ : { sshKeyEnv: resource.auth.ssh_key_env };
27
+ };
28
+ const declarationKey = (resource) => JSON.stringify({
29
+ auth: authOf(resource) ?? null, exclude: resource.exclude ?? null, selector: selectorOf(resource), url: resource.url.trim()
30
+ });
31
+ /** The committed tree as bundle entries: blob ids and modes only, under the same safety rules as built bundles. */
32
+ const treeEntries = async (resource, repository, commit) => {
33
+ const excluded = compileExcludePatterns(resource.exclude);
34
+ const entries = [];
35
+ for (const entry of await listCommittedTree(repository, commit)) {
36
+ if (excluded(entry.path))
37
+ continue;
38
+ if (entry.mode === SYMLINK)
39
+ fail(`Workspace git resource ${resource.id} contains a symlink; exclude it: ${entry.path}`);
40
+ if (entry.mode === GITLINK)
41
+ fail(`Workspace git resource ${resource.id} contains a submodule; exclude it: ${entry.path}`);
42
+ if (entry.type !== "blob")
43
+ fail(`Workspace git resource ${resource.id} has unsupported git type ${entry.type}: ${entry.path}`);
44
+ if (!entry.path || entry.path.includes("\\") || entry.path.split("/").some((part) => !part || part === "." || part === "..")) {
45
+ fail(`Workspace git resource ${resource.id} path cannot be archived safely: ${entry.path}`);
46
+ }
47
+ entries.push({ identity: `git:${entry.objectId}`, mode: normalizeBundleMode(entry.mode), objectId: entry.objectId, path: entry.path });
48
+ }
49
+ if (entries.length === 0)
50
+ fail(`Workspace git resource ${resource.id} has no files at ${commit}`);
51
+ return entries.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));
52
+ };
53
+ /**
54
+ * Lowers every `fetch: build` git resource into a pinned read-only bundle:
55
+ * the declared branch, tag or ref is resolved on the host to one commit, that
56
+ * commit's tree is archived deterministically (the same writer as built
57
+ * bundles), and the agent mounts the archive exactly as it mounts a bundle.
58
+ * No credential, clone or network access reaches the container. The commit
59
+ * and archive digest are recorded in the compile report; declaring
60
+ * `ref: <commit>` reproduces the identical archive.
61
+ */
62
+ export const resolveWorkspaceGitPins = async (plan, options) => {
63
+ const result = { built: new Map(), report: [] };
64
+ const recording = plan.nodes.some((node) => node.kind === "agent" && node.value.training?.record !== undefined);
65
+ const pinned = plan.nodes.flatMap((node) => node.kind === "agent" ? (node.value.workspaceResources ?? []).filter(isBuildPinnedGitResource) : []);
66
+ if (pinned.length === 0)
67
+ return result;
68
+ const root = path.join(path.dirname(resolveWorkspaceBundleCacheDirectory(options.bundleCacheDirectory)), "git-resources");
69
+ const objects = path.join(root, "objects"), archives = path.join(root, "archives");
70
+ const platform = `linux/${resolveBundleArchitecture(options.architecture)}`, identity = options.identity ?? "dev";
71
+ const resolved = new Map(), usedKeys = new Set();
72
+ for (const resource of pinned) {
73
+ const memoKey = declarationKey(resource);
74
+ if (resolved.has(memoKey))
75
+ continue;
76
+ const selector = selectorOf(resource), auth = authOf(resource), url = resource.url.trim();
77
+ const { commit, repository } = await withGitPinEnvironment(auth, (env) => fetchGitPin(objects, url, selector, env), options.environment);
78
+ const entries = await treeEntries(resource, repository, commit);
79
+ const key = computeWorkspaceBundleKey({ entries }, platform);
80
+ usedKeys.add(key);
81
+ let cached = await lookupCachedBundle(archives, key), staged = cached && await linkBuiltBundle(cached.tarPath, options.outputDirectory, cached.sha256);
82
+ if (!cached || !staged) {
83
+ cached = await storeBuiltBundle(archives, key, (temporaryPath) => writeBundleFiles({ directory: repository, entries, mode: "release" }, temporaryPath));
84
+ staged = await linkBuiltBundle(cached.tarPath, options.outputDirectory, cached.sha256);
85
+ if (!staged)
86
+ throw new SpawnfileError("compile_error", `Workspace git resource archive vanished from the cache while it was staged: ${key}`);
87
+ }
88
+ result.built.set(cached.sha256, staged);
89
+ resolved.set(memoKey, {
90
+ commit,
91
+ facts: {
92
+ auth: auth === undefined ? "none" : auth.sshKey !== undefined ? "ssh_key" : "ssh_key_env",
93
+ cache_key: key, commit, content_bytes: cached.contentBytes, file_count: cached.fileCount, id: resource.id, identity,
94
+ platform, selector: selector.kind === "none" ? { kind: "default_branch" } : { kind: selector.kind, value: selector.value },
95
+ sha256: cached.sha256, url
96
+ }
97
+ });
98
+ }
99
+ for (const node of plan.nodes) {
100
+ if (node.kind !== "agent" || !node.value.workspaceResources?.some(isBuildPinnedGitResource))
101
+ continue;
102
+ node.value.workspaceResources = node.value.workspaceResources.map((resource) => {
103
+ if (!isBuildPinnedGitResource(resource))
104
+ return resource;
105
+ const { facts } = resolved.get(declarationKey(resource));
106
+ const same = (existing) => existing.id === resource.id && existing.url === facts.url && existing.commit === facts.commit && existing.sha256 === facts.sha256 && JSON.stringify(existing.selector) === JSON.stringify(facts.selector);
107
+ if (recording) {
108
+ const declared_by = plan.nodes.find((entry) => entry.value.source === resource.scope.key)?.id;
109
+ let pin = result.report.find((entry) => same(entry) && entry.declared_by === declared_by);
110
+ if (!pin) {
111
+ pin = { ...facts, id: resource.id, agent_node_ids: [], ...(declared_by ? { declared_by } : {}) };
112
+ result.report.push(pin);
113
+ }
114
+ if (!pin.agent_node_ids.includes(node.id))
115
+ pin.agent_node_ids.push(node.id);
116
+ pin.agent_node_ids.sort();
117
+ }
118
+ else if (!result.report.some(same))
119
+ result.report.push({ ...facts, id: resource.id });
120
+ // From here on it is a bundle: same staging, same identity-checked read-only mount, no auth fields.
121
+ return { id: resource.id, kind: "bundle", mode: "readonly", mount: resource.mount, scope: resource.scope, sha256: facts.sha256, sharing: "per_agent" };
122
+ });
123
+ }
124
+ await pruneBundleCache(archives, usedKeys);
125
+ result.report.sort((left, right) => left.id.localeCompare(right.id) || left.url.localeCompare(right.url) || left.commit.localeCompare(right.commit) || left.sha256.localeCompare(right.sha256));
126
+ return result;
127
+ };
@@ -1,4 +1,4 @@
1
- import type { TeamWorkspaceResource } from "../manifest/index.js";
1
+ import type { TeamWorkspaceResource, WorkspaceBundleBuild } from "../manifest/index.js";
2
2
  export type WorkspaceResourceSharing = "per_agent" | "team";
3
3
  export interface WorkspaceResourceScope {
4
4
  kind: "agent" | "team";
@@ -26,6 +26,10 @@ export interface WorkspaceResourcePlan {
26
26
  tag?: string;
27
27
  url?: string;
28
28
  }
29
+ /** Multi-agent runtime targets retain one resource identity per source agent. */
30
+ export declare const workspaceResourceTargetId: (targetId: string, sourceId: string, sourceCount: number) => string;
31
+ /** A bundle build declaration with every relative path resolved against the declaring manifest's directory. */
32
+ export declare const resolveBundleBuildPaths: (build: WorkspaceBundleBuild, base: string) => WorkspaceBundleBuild;
29
33
  export declare const mergeWorkspaceResources: (inherited: ResolvedWorkspaceResource[] | undefined, local: TeamWorkspaceResource[] | undefined, ownerName: string, ownerScope: WorkspaceResourceScope) => ResolvedWorkspaceResource[];
30
34
  export declare const toWorkspaceResourcePlan: (resource: ResolvedWorkspaceResource, context: {
31
35
  targetId: string;
@@ -1,6 +1,8 @@
1
1
  import path from "node:path";
2
2
  import { SpawnfileError } from "../shared/index.js";
3
3
  import { createShortHash, slugify } from "./helpers.js";
4
+ /** Multi-agent runtime targets retain one resource identity per source agent. */
5
+ export const workspaceResourceTargetId = (targetId, sourceId, sourceCount) => sourceCount > 1 ? `${targetId}:${sourceId}` : targetId;
4
6
  const normalizeMount = (value) => {
5
7
  const trimmed = value.trim();
6
8
  const workspaceRelative = trimmed.startsWith("${workspace}/")
@@ -13,12 +15,29 @@ const normalizeMount = (value) => {
13
15
  }
14
16
  return collapsed.length > 1 ? collapsed.replace(/\/+$/u, "") : "/";
15
17
  };
18
+ /** A bundle build declaration with every relative path resolved against the declaring manifest's directory. */
19
+ export const resolveBundleBuildPaths = (build, base) => {
20
+ const files = (input) => ({ ...input, root: path.resolve(base, input.root) });
21
+ if (build.files)
22
+ return { files: files(build.files) };
23
+ if (build.dependencies)
24
+ return { dependencies: { ...build.dependencies, directory: path.resolve(base, build.dependencies.directory) } };
25
+ const generated = build.generated;
26
+ return { generated: { ...generated, cwd: path.resolve(base, generated.cwd ?? "."), inputs: generated.inputs.map(files) } };
27
+ };
16
28
  const normalizeResourceIdentity = (resource) => {
17
- if (resource.kind === "bundle")
18
- return JSON.stringify({ kind: resource.kind, mode: resource.mode, mount: normalizeMount(resource.mount), sha256: resource.sha256, source: resource.source, sharing: resource.sharing });
29
+ if (resource.kind === "bundle") {
30
+ // Relative paths compare as resolved against their declaring manifest: the same text in two directories is two inputs.
31
+ const base = path.dirname(resource.scope.key);
32
+ const build = resource.build && resolveBundleBuildPaths(resource.build, base);
33
+ return JSON.stringify({ build: build ?? null, kind: resource.kind, mode: resource.mode, mount: normalizeMount(resource.mount), sha256: resource.sha256 ?? null, source: resource.source === undefined ? null : path.resolve(base, resource.source), sharing: resource.sharing });
34
+ }
19
35
  if (resource.kind === "git") {
20
36
  return JSON.stringify({
37
+ auth: resource.auth ?? null,
21
38
  branch: resource.branch?.trim() ?? "",
39
+ exclude: resource.exclude ?? null,
40
+ fetch: resource.fetch ?? "start",
22
41
  kind: "git",
23
42
  mode: resource.mode,
24
43
  mount: normalizeMount(resource.mount),
@@ -29,6 +48,8 @@ const normalizeResourceIdentity = (resource) => {
29
48
  });
30
49
  }
31
50
  return JSON.stringify({
51
+ // Feed paths resolve against the declaring manifest, like bundle inputs.
52
+ ...(resource.feed ? { feed: { ...resource.feed, base: path.dirname(resource.scope.key) } } : {}),
32
53
  kind: "volume",
33
54
  mode: resource.mode,
34
55
  mount: normalizeMount(resource.mount),
@@ -88,6 +109,12 @@ export const mergeWorkspaceResources = (inherited = [], local = [], ownerName, o
88
109
  }
89
110
  return merged.sort((left, right) => left.id.localeCompare(right.id));
90
111
  };
112
+ /** A bundle's digest exists only after `resolveWorkspaceBundles` built or hashed it. */
113
+ const resolvedBundleDigest = (resource) => {
114
+ if (resource.sha256 === undefined)
115
+ throw new SpawnfileError("compile_error", `Workspace bundle ${resource.id} has not been built`);
116
+ return resource.sha256;
117
+ };
91
118
  export const toWorkspaceResourcePlan = (resource, context) => resource.kind === "git"
92
119
  ? {
93
120
  backingPath: resolveBackingPath(resource, context.targetId),
@@ -103,11 +130,11 @@ export const toWorkspaceResourcePlan = (resource, context) => resource.kind ===
103
130
  url: resource.url
104
131
  }
105
132
  : resource.kind === "bundle" ? {
106
- archivePath: `/opt/spawnfile/workspace-bundles/${resource.sha256.slice(7)}.tar`,
133
+ archivePath: `/opt/spawnfile/workspace-bundles/${resolvedBundleDigest(resource).slice(7)}.tar`,
107
134
  backingPath: resolveBackingPath(resource, context.targetId), id: resource.id, kind: "bundle",
108
135
  linkPath: resolveLinkPath(normalizeMount(resource.mount), context.workspacePath), mode: resource.mode,
109
- mount: normalizeMount(resource.mount), sharing: resource.sharing, sha256: resource.sha256,
110
- source: path.resolve(path.dirname(resource.scope.key), resource.source)
136
+ mount: normalizeMount(resource.mount), sharing: resource.sharing, sha256: resolvedBundleDigest(resource),
137
+ ...(resource.source !== undefined ? { source: path.resolve(path.dirname(resource.scope.key), resource.source) } : {})
111
138
  } : {
112
139
  backingPath: resolveBackingPath(resource, context.targetId),
113
140
  id: resource.id,
@@ -0,0 +1,3 @@
1
+ import type { DeploymentActivation } from "./resourceLog.js";
2
+ /** Strictly later than the stopped observation, even at millisecond clock resolution. */
3
+ export declare const activationBeforeStart: (stoppedAt: number | undefined, now?: () => Date) => Promise<DeploymentActivation>;
@@ -0,0 +1,12 @@
1
+ import { setTimeout } from "node:timers/promises";
2
+ /** Strictly later than the stopped observation, even at millisecond clock resolution. */
3
+ export const activationBeforeStart = async (stoppedAt, now = () => new Date()) => {
4
+ for (let attempt = 0; attempt < 1_000; attempt += 1) {
5
+ const instant = now();
6
+ if (stoppedAt === undefined || instant.getTime() > stoppedAt) {
7
+ return { activated_at: instant.toISOString(), activation_exact: true };
8
+ }
9
+ await setTimeout(1);
10
+ }
11
+ throw new Error("Host clock did not advance after the previous container stopped");
12
+ };
@@ -5,8 +5,8 @@ export declare const deploymentIdentitySchema: z.ZodObject<{
5
5
  fingerprint: z.ZodString;
6
6
  deployment_name: z.ZodString;
7
7
  deployment_mode: z.ZodEnum<{
8
- project: "project";
9
8
  image: "image";
9
+ project: "project";
10
10
  }>;
11
11
  image_id: z.ZodString;
12
12
  organization_unit_id: z.ZodString;
@@ -0,0 +1,8 @@
1
+ import { type DeploymentActivation, type DeployResourceReport, type DeployResources } from "./resourceLog.js";
2
+ /** A candidate may execute turns before failing readiness/publication. Preserve its pins
3
+ * after rollback, without replacing the still-authoritative predecessor's record. */
4
+ export declare const recordDeploymentRollback: (recordPath: string, record: DeploymentActivation & {
5
+ name: string;
6
+ created_at: string;
7
+ resource_snapshot?: DeployResources;
8
+ }, report: DeployResourceReport, reportBytes: string, rolledBackAt: string) => Promise<void>;
@@ -0,0 +1,22 @@
1
+ import path from "node:path";
2
+ import { ensureDirectory } from "../filesystem/index.js";
3
+ import { acquirePidLock } from "./pidLock.js";
4
+ import { createDeployResources, ensureDeployResources } from "./resourceLog.js";
5
+ /** A candidate may execute turns before failing readiness/publication. Preserve its pins
6
+ * after rollback, without replacing the still-authoritative predecessor's record. */
7
+ export const recordDeploymentRollback = async (recordPath, record, report, reportBytes, rolledBackAt) => {
8
+ if (!report.recording)
9
+ return;
10
+ await ensureDirectory(path.dirname(recordPath));
11
+ const release = await acquirePidLock(`${recordPath}.resource-log.lock`);
12
+ try {
13
+ ensureDeployResources(recordPath, {
14
+ ...(record.resource_snapshot ?? createDeployResources(recordPath, record, report, reportBytes)),
15
+ rolled_back_at: rolledBackAt, activation_exact: false, exact: false,
16
+ activation_note: "Candidate ran before rollback; its turns cannot be distinguished from predecessor turns"
17
+ }, report.recording.keep_ms);
18
+ }
19
+ finally {
20
+ await release();
21
+ }
22
+ };
@@ -1,5 +1,6 @@
1
1
  import type { DeploymentRecordSource } from "./record.js";
2
2
  import type { OrganizationReadinessEvidence } from "../compiler/organizationReadyEvidence.js";
3
+ import type { DeploymentActivation, DeployResourceReport } from "./resourceLog.js";
3
4
  import { type DockerProbeExecFile } from "./dockerProbeGateway.js";
4
5
  import { type OrganizationReadiness } from "./organizationReady.js";
5
6
  import { type DockerDeploymentTarget, type DockerTargetExecFile } from "./target.js";
@@ -22,7 +23,7 @@ export interface DockerDeploymentRunInvocationInput {
22
23
  dockerContext?: string | null;
23
24
  dockerHost?: string | null;
24
25
  }
25
- export interface DockerDeploymentReportInput {
26
+ export interface DockerDeploymentReportInput extends DeployResourceReport {
26
27
  compile_fingerprint?: string;
27
28
  container?: {
28
29
  moltnet?: {
@@ -38,7 +39,7 @@ export interface DockerDeploymentReportInput {
38
39
  nodes: DockerDeploymentNodeInput[];
39
40
  root: string;
40
41
  }
41
- export interface WriteDockerDeploymentRecordInput {
42
+ export interface WriteDockerDeploymentRecordInput extends DeploymentActivation {
42
43
  authProfileName: string | null;
43
44
  compileFingerprint: string;
44
45
  containerName: string | null;
@@ -82,7 +83,8 @@ export declare const createDockerDeploymentUnitId: (deploymentName: string) => s
82
83
  export declare const createDockerDeploymentRecord: (input: WriteDockerDeploymentRecordInput) => DeploymentRecord;
83
84
  export declare const createDockerProjectLabel: (projectRoot: string, projectName?: string) => string;
84
85
  export declare const writeDockerDeploymentRecord: (input: WriteDockerDeploymentRecordInput) => Promise<string>;
85
- export declare const writeDockerDeploymentRecordForRun: (input: {
86
+ export declare const writeDockerDeploymentRecordForRun: (input: DeploymentActivation & {
87
+ previousRecord?: DeploymentRecord;
86
88
  authProfileName: string | null;
87
89
  envFilePath?: string;
88
90
  imageTag: string;
@@ -3,7 +3,10 @@ import { normalizeProjectLabelSlug } from "../distribution/index.js";
3
3
  import { resolveNoopolisRunId } from "../runtime/index.js";
4
4
  import { SpawnfileError } from "../shared/index.js";
5
5
  import { inspectDockerDeployment } from "./dockerInspect.js";
6
- import { normalizeDeploymentName } from "./names.js";
6
+ import { bindDeploymentRecording } from "./recordPublication.js";
7
+ import { readUtf8File } from "../filesystem/index.js";
8
+ import { REPORT_FILENAME } from "../shared/index.js";
9
+ import { normalizeDeploymentName, resolveDeploymentRecordPath } from "./names.js";
7
10
  import { createDockerProbeGateway } from "./dockerProbeGateway.js";
8
11
  import { organizationReadinessFromProbeError, reconcileOrganizationReadiness } from "./organizationReady.js";
9
12
  import { resolveDockerDeploymentTarget } from "./target.js";
@@ -40,6 +43,7 @@ export const createDockerDeploymentRecord = (input) => {
40
43
  auth_profile: input.authProfileName,
41
44
  compile_fingerprint: input.compileFingerprint,
42
45
  created_at: new Date().toISOString(),
46
+ ...(input.activated_at ? { activated_at: input.activated_at, activation_exact: input.activation_exact, activation_note: input.activation_note } : {}),
43
47
  ...(input.envFilePath ? { env_file: path.resolve(input.envFilePath) } : {}),
44
48
  manager: "docker",
45
49
  name,
@@ -85,7 +89,8 @@ export const writeDockerDeploymentRecordForRun = async (input) => {
85
89
  if (!input.invocation.detach || !input.invocation.deploymentName) {
86
90
  return null;
87
91
  }
88
- return writeDockerDeploymentRecord({
92
+ const record = createDockerDeploymentRecord({
93
+ activated_at: input.activated_at, activation_exact: input.activation_exact, activation_note: input.activation_note,
89
94
  authProfileName: input.authProfileName,
90
95
  compileFingerprint: requireCompileFingerprint(input.report.compile_fingerprint),
91
96
  containerName: input.invocation.containerName,
@@ -116,6 +121,11 @@ export const writeDockerDeploymentRecordForRun = async (input) => {
116
121
  timeoutMs: input.targetTimeoutMs
117
122
  })
118
123
  });
124
+ const recordPath = resolveDeploymentRecordPath(input.outputDirectory, record.name);
125
+ const bound = input.report.recording
126
+ ? bindDeploymentRecording(recordPath, record, input.report, await readUtf8File(path.join(input.outputDirectory, REPORT_FILENAME)))
127
+ : record;
128
+ return writeDeploymentRecord(input.outputDirectory, bound, input.previousRecord);
119
129
  };
120
130
  const recordCorrelation = (record) => ({
121
131
  compileFingerprint: record.compile_fingerprint,
@@ -21,6 +21,8 @@ export interface DownDeploymentOptions {
21
21
  * folder rule — this is the only reversible-by-default lifecycle boundary spawnfile
22
22
  * has: containers are cheap to recreate, the durable stores are not). */
23
23
  removeVolumes?: boolean;
24
+ /** Explicitly permits deleting memory ledgers used by recording agents. */
25
+ discardRecordedMemory?: boolean;
24
26
  expectedLifecycleCorrelation?: DeploymentLifecycleCorrelation;
25
27
  timeoutMs?: number;
26
28
  }
@@ -8,6 +8,7 @@ import { defaultDockerTeardownExecFile, removeDockerContainer, removeDockerVolum
8
8
  import { DOWN_RECEIPT_VERSION } from "./downReceiptTypes.js";
9
9
  import { initializeOrganizationHandoffAuthorityStore, } from "./organizationHandoffAuthorityStore.js";
10
10
  import { readDeploymentRecordFromOutput } from "./record.js";
11
+ import { assertRecordedMemoryRetention, recordedMemoryForDeletion } from "./recordedMemoryRetention.js";
11
12
  import { readHomeDeploymentRecord, readHomeDeploymentReport, resolveHomeRecordPath } from "./homeStore.js";
12
13
  import { resolveDeploymentRecordPath } from "./names.js";
13
14
  import { dockerContextNameForTarget } from "./target.js";
@@ -70,6 +71,7 @@ const imageDown = async (record, options, runner) => {
70
71
  if (report.compile_fingerprint !== record.compile_fingerprint)
71
72
  throw new SpawnfileError("runtime_error", "Cached image distribution report does not match its deployment record");
72
73
  const { owned, skipped } = partitionDeclaredVolumes(report.persistent_mounts, (mount) => derivePersistentMountVolumeName(record.name, mount));
74
+ assertRecordedMemoryRetention(recordedMemoryForDeletion(record, report, report.persistent_mounts, options), report.persistent_mounts, owned, (mount) => derivePersistentMountVolumeName(record.name, mount), options);
73
75
  const volumes = [...owned, ...skipped].sort();
74
76
  const removed = await removeDockerContainer(record.target, unit.container_id, runner);
75
77
  if (!removed.removed)
@@ -198,6 +200,10 @@ export const downDeployment = async (options) => {
198
200
  const runnerOptions = { dockerCommand, execFile: execFileImpl, timeoutMs };
199
201
  if (resolved.mode === "image")
200
202
  return imageDown(initialRecord, options, runnerOptions);
203
+ const report = await readCompileReport(compiledOutputDirectory);
204
+ const mounts = report?.container?.persistent_mounts ?? [];
205
+ const { owned, skipped } = partitionDeclaredVolumes(mounts, (mount) => mount.volume_name);
206
+ assertRecordedMemoryRetention(recordedMemoryForDeletion(initialRecord, report, mounts, options), mounts, owned, (mount) => mount.volume_name, options);
201
207
  const record = await ensureExported(initialRecord, {
202
208
  ...options,
203
209
  compiledOutputDirectory,
@@ -220,8 +226,6 @@ export const downDeployment = async (options) => {
220
226
  errors.push(`unable to remove container ${containerRef} (unit ${unit.id}): ${outcome.error}`);
221
227
  }
222
228
  }
223
- const report = await readCompileReport(compiledOutputDirectory);
224
- const { owned, skipped } = partitionDeclaredVolumes(report?.container?.persistent_mounts ?? [], (mount) => mount.volume_name);
225
229
  // Declared volumes are retained unconditionally: they are shared project
226
230
  // state, not this deployment's, so `--volumes` must never destroy them.
227
231
  const retainedVolumes = [...skipped];
@@ -1,12 +1,20 @@
1
1
  import type { DistributionReport } from "../distribution/index.js";
2
2
  import { type DeploymentRecord } from "./record.js";
3
+ export { HomeDeploymentRecordingError } from "./recordPublication.js";
3
4
  export declare const resolveHomeDeploymentsDirectory: () => string;
4
5
  export declare const resolveHomeDeploymentDirectory: (deploymentName: string) => string;
5
6
  export declare const resolveHomeRecordPath: (deploymentName: string) => string;
6
7
  export declare const resolveHomeReportPath: (deploymentName: string) => string;
8
+ /**
9
+ * Acquires an exclusive lock for a home deployment so concurrent `up`
10
+ * invocations (and a drained release holding it across its swap) cannot race
11
+ * on the same record or orphan each other's containers. Returns a release
12
+ * function. Throws if a live operation holds the lock; a lock left by a
13
+ * process that is gone is reclaimed. See `pidLock.ts`.
14
+ */
7
15
  export declare const acquireHomeDeploymentLock: (deploymentName: string) => Promise<() => Promise<void>>;
8
16
  /** Writes the record and the cached distribution report together, record last. */
9
- export declare const writeHomeDeployment: (record: DeploymentRecord, report: DistributionReport) => Promise<{
17
+ export declare const writeHomeDeployment: (record: DeploymentRecord, report: DistributionReport, previous?: DeploymentRecord | null) => Promise<{
10
18
  recordPath: string;
11
19
  reportPath: string;
12
20
  }>;