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
@@ -1,84 +1,47 @@
1
1
  import path from "node:path";
2
- import { open, readdir, rename, rm, writeFile } from "node:fs/promises";
2
+ import { readdir } from "node:fs/promises";
3
3
  import { resolveSpawnfileHome } from "../auth/index.js";
4
- import { ensureDirectory, readUtf8File } from "../filesystem/index.js";
4
+ import { ensureDirectory, readUtf8File, writeDurableFile } from "../filesystem/index.js";
5
5
  import { SpawnfileError } from "../shared/index.js";
6
6
  import { normalizeDeploymentName } from "./names.js";
7
+ import { acquirePidLock, PidLockBusyError } from "./pidLock.js";
7
8
  import { parseDeploymentRecord } from "./record.js";
9
+ import { bindDeploymentRecording, publishDeploymentRecord, writeAtomicDeploymentFile } from "./recordPublication.js";
10
+ export { HomeDeploymentRecordingError } from "./recordPublication.js";
8
11
  export const resolveHomeDeploymentsDirectory = () => path.join(resolveSpawnfileHome(), "deployments");
9
12
  export const resolveHomeDeploymentDirectory = (deploymentName) => path.join(resolveHomeDeploymentsDirectory(), normalizeDeploymentName(deploymentName));
10
13
  export const resolveHomeRecordPath = (deploymentName) => path.join(resolveHomeDeploymentDirectory(deploymentName), "record.json");
11
14
  export const resolveHomeReportPath = (deploymentName) => path.join(resolveHomeDeploymentDirectory(deploymentName), "spawnfile-report.json");
12
15
  /**
13
16
  * Acquires an exclusive lock for a home deployment so concurrent `up`
14
- * invocations cannot race on the same record (and orphan each other's
15
- * containers). Returns a release function. Throws if the deployment is already
16
- * locked by another in-flight operation.
17
+ * invocations (and a drained release holding it across its swap) cannot race
18
+ * on the same record or orphan each other's containers. Returns a release
19
+ * function. Throws if a live operation holds the lock; a lock left by a
20
+ * process that is gone is reclaimed. See `pidLock.ts`.
17
21
  */
18
- const isProcessAlive = (pid) => {
19
- try {
20
- process.kill(pid, 0);
21
- return true;
22
- }
23
- catch (error) {
24
- // ESRCH means no such process (stale); EPERM means it exists but is ours to
25
- // not signal — treat as alive to stay safe.
26
- return error.code === "EPERM";
27
- }
28
- };
29
22
  export const acquireHomeDeploymentLock = async (deploymentName) => {
30
23
  const directory = resolveHomeDeploymentDirectory(deploymentName);
31
24
  await ensureDirectory(directory);
32
- const lockPath = path.join(directory, ".lock");
33
- const write = async () => {
34
- const handle = await open(lockPath, "wx");
35
- try {
36
- await handle.write(JSON.stringify({ pid: process.pid }));
37
- }
38
- finally {
39
- await handle.close();
40
- }
41
- };
42
25
  try {
43
- await write();
26
+ return await acquirePidLock(path.join(directory, ".lock"));
44
27
  }
45
28
  catch (error) {
46
- if (error.code !== "EEXIST") {
47
- throw error;
48
- }
49
- // A lock exists. Reclaim it only if the owning process is gone (a crashed
50
- // deploy must not lock the deployment forever); otherwise it is genuinely busy.
51
- let ownerPid = null;
52
- try {
53
- ownerPid = JSON.parse(await readUtf8File(lockPath)).pid ?? null;
54
- }
55
- catch {
56
- ownerPid = null;
57
- }
58
- if (ownerPid !== null && isProcessAlive(ownerPid)) {
29
+ if (error instanceof PidLockBusyError) {
59
30
  throw new SpawnfileError("runtime_error", `Deployment "${normalizeDeploymentName(deploymentName)}" is already being modified by another operation`);
60
31
  }
61
- await rm(lockPath, { force: true });
62
- await write();
32
+ throw error;
63
33
  }
64
- return async () => {
65
- await rm(lockPath, { force: true });
66
- };
67
- };
68
- const writeAtomic = async (filePath, content) => {
69
- const temporaryPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${process.pid}.${Date.now()}.tmp`);
70
- await writeFile(temporaryPath, content, "utf8");
71
- await rename(temporaryPath, filePath);
72
34
  };
73
35
  /** Writes the record and the cached distribution report together, record last. */
74
- export const writeHomeDeployment = async (record, report) => {
36
+ export const writeHomeDeployment = async (record, report, previous) => {
75
37
  const parsed = parseDeploymentRecord(record);
76
38
  const directory = resolveHomeDeploymentDirectory(parsed.name);
77
39
  await ensureDirectory(directory);
78
40
  const reportPath = resolveHomeReportPath(parsed.name);
79
41
  const recordPath = resolveHomeRecordPath(parsed.name);
80
- await writeAtomic(reportPath, `${JSON.stringify(report, null, 2)}\n`);
81
- await writeAtomic(recordPath, `${JSON.stringify(parsed, null, 2)}\n`);
42
+ const reportBytes = `${JSON.stringify(report, null, 2)}\n`;
43
+ const bound = parseDeploymentRecord(bindDeploymentRecording(recordPath, parsed, report, reportBytes));
44
+ await publishDeploymentRecord(recordPath, bound, (durable) => (durable ? writeDurableFile : writeAtomicDeploymentFile)(reportPath, reportBytes), previous);
82
45
  return { recordPath, reportPath };
83
46
  };
84
47
  export const readHomeDeploymentRecord = async (deploymentName) => {
@@ -5,6 +5,7 @@ export * from "./artifactsExportTypes.js";
5
5
  export * from "./privateArtifactsExport.js";
6
6
  export * from "./buildImageCacheStore.js";
7
7
  export * from "./candidateDiagnostics.js";
8
+ export * from "./candidateRecording.js";
8
9
  export * from "./dockerLabels.js";
9
10
  export * from "./dockerInspect.js";
10
11
  export * from "./dockerLogs.js";
@@ -23,8 +24,13 @@ export * from "./organizationHandoffTypes.js";
23
24
  export * from "./organizationHandoffAuthorityTypes.js";
24
25
  export * from "./organizationHandoffAuthorityStore.js";
25
26
  export * from "./organizationReady.js";
27
+ export * from "./pidLock.js";
26
28
  export * from "./canaryCutover.js";
27
29
  export * from "./productStateClone.js";
28
30
  export * from "./record.js";
31
+ export * from "./recordedMemoryRetention.js";
29
32
  export * from "./target.js";
30
33
  export * from "./upReceiptTypes.js";
34
+ export * from "./resourceLog.js";
35
+ export * from "./activation.js";
36
+ export { bindDeploymentRecording, reconcileDeploymentResources } from "./recordPublication.js";
@@ -5,6 +5,7 @@ export * from "./artifactsExportTypes.js";
5
5
  export * from "./privateArtifactsExport.js";
6
6
  export * from "./buildImageCacheStore.js";
7
7
  export * from "./candidateDiagnostics.js";
8
+ export * from "./candidateRecording.js";
8
9
  export * from "./dockerLabels.js";
9
10
  export * from "./dockerInspect.js";
10
11
  export * from "./dockerLogs.js";
@@ -23,9 +24,14 @@ export * from "./organizationHandoffTypes.js";
23
24
  export * from "./organizationHandoffAuthorityTypes.js";
24
25
  export * from "./organizationHandoffAuthorityStore.js";
25
26
  export * from "./organizationReady.js";
27
+ export * from "./pidLock.js";
26
28
  export * from "./canaryCutover.js";
27
29
  export * from "./productStateClone.js";
28
30
  export * from "./record.js";
31
+ export * from "./recordedMemoryRetention.js";
29
32
  // Compatibility target exports remain available from this legacy deployment barrel.
30
33
  export * from "./target.js";
31
34
  export * from "./upReceiptTypes.js";
35
+ export * from "./resourceLog.js";
36
+ export * from "./activation.js";
37
+ export { bindDeploymentRecording, reconcileDeploymentResources } from "./recordPublication.js";
@@ -0,0 +1,25 @@
1
+ /** Thrown when a live process holds the lock (or won a race for it). */
2
+ export declare class PidLockBusyError extends Error {
3
+ readonly ownerPid: number | null;
4
+ constructor(ownerPid: number | null);
5
+ }
6
+ export interface PidLockHooks {
7
+ /** Test seam: runs between reading a stale lock and moving it aside. */
8
+ afterStaleRead?: () => Promise<void>;
9
+ }
10
+ /**
11
+ * An exclusive lock file that names its owner from the instant it exists:
12
+ * the content is written aside and hard-linked into place, and `link` fails
13
+ * when the path exists, so no reader ever sees an empty lock and calls it
14
+ * stale. A lock whose owner process is gone is moved aside under a unique
15
+ * name and checked: if what was moved is not the stale lock that was read,
16
+ * another process replaced it in between, and it is put back.
17
+ *
18
+ * Residual: pid locks cannot be made race-free for stale reclamation without
19
+ * kernel locks. Three contenders arriving within microseconds of each other,
20
+ * all after a crashed owner, can still overlap. Run unattended jobs through a
21
+ * scheduler that does not overlap them.
22
+ *
23
+ * Release removes the lock only while it still carries this owner's token.
24
+ */
25
+ export declare const acquirePidLock: (lockPath: string, hooks?: PidLockHooks) => Promise<() => Promise<void>>;
@@ -0,0 +1,81 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { link, readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ /** Thrown when a live process holds the lock (or won a race for it). */
4
+ export class PidLockBusyError extends Error {
5
+ ownerPid;
6
+ constructor(ownerPid) {
7
+ super(ownerPid === null ? "the lock was taken by another process" : `the lock is held by pid ${ownerPid}`);
8
+ this.ownerPid = ownerPid;
9
+ this.name = "PidLockBusyError";
10
+ }
11
+ }
12
+ const isProcessAlive = (pid) => {
13
+ try {
14
+ process.kill(pid, 0);
15
+ return true;
16
+ }
17
+ catch (error) {
18
+ // ESRCH: no such process (stale). EPERM: it exists but is not ours to signal.
19
+ return error.code === "EPERM";
20
+ }
21
+ };
22
+ /**
23
+ * An exclusive lock file that names its owner from the instant it exists:
24
+ * the content is written aside and hard-linked into place, and `link` fails
25
+ * when the path exists, so no reader ever sees an empty lock and calls it
26
+ * stale. A lock whose owner process is gone is moved aside under a unique
27
+ * name and checked: if what was moved is not the stale lock that was read,
28
+ * another process replaced it in between, and it is put back.
29
+ *
30
+ * Residual: pid locks cannot be made race-free for stale reclamation without
31
+ * kernel locks. Three contenders arriving within microseconds of each other,
32
+ * all after a crashed owner, can still overlap. Run unattended jobs through a
33
+ * scheduler that does not overlap them.
34
+ *
35
+ * Release removes the lock only while it still carries this owner's token.
36
+ */
37
+ export const acquirePidLock = async (lockPath, hooks = {}) => {
38
+ const token = `${process.pid}.${randomUUID()}`;
39
+ const staged = `${lockPath}.${token}`;
40
+ await writeFile(staged, JSON.stringify({ pid: process.pid, token }), { mode: 0o600 });
41
+ try {
42
+ for (let attempt = 0; attempt < 2; attempt += 1) {
43
+ try {
44
+ await link(staged, lockPath);
45
+ return async () => {
46
+ const current = await readFile(lockPath, "utf8").catch(() => "");
47
+ if (current.includes(token))
48
+ await rm(lockPath, { force: true });
49
+ };
50
+ }
51
+ catch (error) {
52
+ if (error.code !== "EEXIST")
53
+ throw error;
54
+ }
55
+ const seen = await readFile(lockPath, "utf8").catch(() => "");
56
+ let owner = null;
57
+ try {
58
+ owner = JSON.parse(seen).pid ?? null;
59
+ }
60
+ catch {
61
+ owner = null;
62
+ }
63
+ if (owner !== null && isProcessAlive(owner))
64
+ throw new PidLockBusyError(owner);
65
+ await hooks.afterStaleRead?.();
66
+ const tombstone = `${lockPath}.stale.${token}`;
67
+ await rename(lockPath, tombstone).catch(() => undefined);
68
+ const moved = await readFile(tombstone, "utf8").catch(() => null);
69
+ if (moved !== null && moved !== seen) {
70
+ await link(tombstone, lockPath).catch(() => undefined);
71
+ await rm(tombstone, { force: true });
72
+ throw new PidLockBusyError(null);
73
+ }
74
+ await rm(tombstone, { force: true });
75
+ }
76
+ throw new PidLockBusyError(null);
77
+ }
78
+ finally {
79
+ await rm(staged, { force: true });
80
+ }
81
+ };
@@ -12,6 +12,90 @@ declare const recordSourceSchema: z.ZodUnion<readonly [z.ZodObject<{
12
12
  }, z.core.$strict>]>;
13
13
  export type DeploymentRecordSource = z.infer<typeof recordSourceSchema>;
14
14
  export declare const deploymentRecordSchema: z.ZodObject<{
15
+ activated_at: z.ZodOptional<z.ZodISODateTime>;
16
+ activation_exact: z.ZodOptional<z.ZodBoolean>;
17
+ activation_note: z.ZodOptional<z.ZodString>;
18
+ recording: z.ZodOptional<z.ZodObject<{
19
+ keep_ms: z.ZodNumber;
20
+ memory_mount_ids: z.ZodArray<z.ZodString>;
21
+ recording_mount_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
23
+ node_id: z.ZodString;
24
+ slug: z.ZodString;
25
+ directory: z.ZodString;
26
+ keep_ms: z.ZodNumber;
27
+ networks: z.ZodArray<z.ZodString>;
28
+ memory: z.ZodArray<z.ZodObject<{
29
+ id: z.ZodString;
30
+ declared_by: z.ZodString;
31
+ ledger_path: z.ZodNullable<z.ZodString>;
32
+ }, z.core.$strict>>;
33
+ feeds: z.ZodArray<z.ZodObject<{
34
+ id: z.ZodString;
35
+ volume_name: z.ZodString;
36
+ }, z.core.$strict>>;
37
+ resources: z.ZodArray<z.ZodObject<{
38
+ id: z.ZodString;
39
+ kind: z.ZodEnum<{
40
+ git: "git";
41
+ bundle: "bundle";
42
+ }>;
43
+ }, z.core.$strict>>;
44
+ snapshots: z.ZodArray<z.ZodString>;
45
+ }, z.core.$strict>>>;
46
+ }, z.core.$strict>>;
47
+ resource_snapshot: z.ZodOptional<z.ZodObject<{
48
+ version: z.ZodLiteral<"spawnfile.deploy-resources.v1">;
49
+ deployment: z.ZodString;
50
+ deployment_id: z.ZodString;
51
+ activated_at: z.ZodISODateTime;
52
+ activation_exact: z.ZodBoolean;
53
+ activation_note: z.ZodOptional<z.ZodString>;
54
+ rolled_back_at: z.ZodOptional<z.ZodISODateTime>;
55
+ exact: z.ZodOptional<z.ZodLiteral<false>>;
56
+ deployed_at: z.ZodISODateTime;
57
+ report_sha256: z.ZodString;
58
+ resources: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
59
+ id: z.ZodString;
60
+ kind: z.ZodLiteral<"git">;
61
+ commit: z.ZodString;
62
+ sha256: z.ZodString;
63
+ url: z.ZodOptional<z.ZodString>;
64
+ agent_node_ids: z.ZodArray<z.ZodString>;
65
+ declared_by: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strict>, z.ZodObject<{
67
+ id: z.ZodString;
68
+ kind: z.ZodLiteral<"bundle">;
69
+ sha256: z.ZodString;
70
+ origin: z.ZodOptional<z.ZodString>;
71
+ agent_node_ids: z.ZodArray<z.ZodString>;
72
+ declared_by: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strict>], "kind">>;
74
+ recording_agents: z.ZodOptional<z.ZodArray<z.ZodObject<{
75
+ node_id: z.ZodString;
76
+ slug: z.ZodString;
77
+ directory: z.ZodString;
78
+ keep_ms: z.ZodNumber;
79
+ networks: z.ZodArray<z.ZodString>;
80
+ memory: z.ZodArray<z.ZodObject<{
81
+ id: z.ZodString;
82
+ declared_by: z.ZodString;
83
+ ledger_path: z.ZodNullable<z.ZodString>;
84
+ }, z.core.$strict>>;
85
+ feeds: z.ZodArray<z.ZodObject<{
86
+ id: z.ZodString;
87
+ volume_name: z.ZodString;
88
+ }, z.core.$strict>>;
89
+ resources: z.ZodArray<z.ZodObject<{
90
+ id: z.ZodString;
91
+ kind: z.ZodEnum<{
92
+ git: "git";
93
+ bundle: "bundle";
94
+ }>;
95
+ }, z.core.$strict>>;
96
+ snapshots: z.ZodArray<z.ZodString>;
97
+ }, z.core.$strict>>>;
98
+ }, z.core.$strict>>;
15
99
  auth_profile: z.ZodNullable<z.ZodString>;
16
100
  compile_fingerprint: z.ZodString;
17
101
  created_at: z.ZodString;
@@ -97,5 +181,5 @@ export declare const listDeploymentRecords: (outputDirectory: string) => Promise
97
181
  path: string;
98
182
  record: DeploymentRecord;
99
183
  }>>;
100
- export declare const writeDeploymentRecord: (outputDirectory: string, record: DeploymentRecord) => Promise<string>;
184
+ export declare const writeDeploymentRecord: (outputDirectory: string, record: DeploymentRecord, previous?: DeploymentRecord | null) => Promise<string>;
101
185
  export {};
@@ -1,8 +1,11 @@
1
1
  import path from "node:path";
2
- import { readdir, rename, writeFile } from "node:fs/promises";
2
+ import { readdir } from "node:fs/promises";
3
3
  import { z } from "zod";
4
4
  import { ensureDirectory, readUtf8File } from "../filesystem/index.js";
5
+ import { deployResourcesSchema } from "./resourceLog.js";
6
+ import { publishDeploymentRecord } from "./recordPublication.js";
5
7
  import { SpawnfileError } from "../shared/index.js";
8
+ import { recordingReportSchema } from "../report/index.js";
6
9
  import { parseOrganizationHandoff } from "./organizationHandoffTypes.js";
7
10
  import { parseOpaqueTargetHandle } from "../target/index.js";
8
11
  import { normalizeDeploymentName, resolveDeploymentRecordPath, resolveDeploymentRecordsDirectory } from "./names.js";
@@ -79,6 +82,11 @@ const deploymentRecordV1Schema = z.object({
79
82
  version: z.literal("spawnfile.deployment.v1")
80
83
  }).strict();
81
84
  export const deploymentRecordSchema = z.object({
85
+ activated_at: z.iso.datetime({ offset: true }).optional(),
86
+ activation_exact: z.boolean().optional(),
87
+ activation_note: z.string().min(1).optional(),
88
+ recording: recordingReportSchema.optional(),
89
+ resource_snapshot: deployResourcesSchema.optional(),
82
90
  auth_profile: z.string().min(1).nullable(),
83
91
  compile_fingerprint: z.string().min(1),
84
92
  created_at: z.string().min(1),
@@ -208,12 +216,10 @@ export const listDeploymentRecords = async (outputDirectory) => {
208
216
  }));
209
217
  return records.sort((left, right) => left.record.name.localeCompare(right.record.name));
210
218
  };
211
- export const writeDeploymentRecord = async (outputDirectory, record) => {
219
+ export const writeDeploymentRecord = async (outputDirectory, record, previous) => {
212
220
  const parsed = parseDeploymentRecord(record);
213
221
  const recordPath = resolveDeploymentRecordPath(outputDirectory, parsed.name);
214
222
  await ensureDirectory(path.dirname(recordPath));
215
- const temporaryPath = path.join(path.dirname(recordPath), `.${path.basename(recordPath)}.${process.pid}.${Date.now()}.tmp`);
216
- await writeFile(temporaryPath, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
217
- await rename(temporaryPath, recordPath);
223
+ await publishDeploymentRecord(recordPath, parsed, undefined, previous);
218
224
  return recordPath;
219
225
  };
@@ -0,0 +1,15 @@
1
+ import { SpawnfileError } from "../shared/index.js";
2
+ import { type DeploymentRecord } from "./record.js";
3
+ import { type DeployResourceReport } from "./resourceLog.js";
4
+ /** Publication succeeded: callers must not roll back its named container. */
5
+ export declare class HomeDeploymentRecordingError extends SpawnfileError {
6
+ constructor(deployment: string, cause: unknown);
7
+ }
8
+ export declare const bindDeploymentRecording: (recordPath: string, record: DeploymentRecord, report: DeployResourceReport, reportBytes: string) => DeploymentRecord;
9
+ /** Caller holds the publication lock; recover a published snapshot before using its history. */
10
+ export declare const reconcileDeploymentResources: (recordPath: string) => Promise<void>;
11
+ /** The original non-recording publication sequence, including its temporary name and permissions. */
12
+ export declare const writeAtomicDeploymentFile: (file: string, bytes: string) => Promise<void>;
13
+ /** Callers create the directory and pass the predecessor from their existing lifecycle read.
14
+ * Recording replacements re-read under the lock; off never probes for recording state. */
15
+ export declare const publishDeploymentRecord: (recordPath: string, record: DeploymentRecord, publishReport?: (durable: boolean) => Promise<void>, previous?: DeploymentRecord | null) => Promise<void>;
@@ -0,0 +1,76 @@
1
+ import path from "node:path";
2
+ import { readFile, rename, writeFile } from "node:fs/promises";
3
+ import { PublishedFileSyncError, syncFile, writeDurableFile } from "../filesystem/index.js";
4
+ import { SpawnfileError } from "../shared/index.js";
5
+ import { acquirePidLock } from "./pidLock.js";
6
+ import { parseDeploymentRecord } from "./record.js";
7
+ import { createDeployResources, ensureDeployResources } from "./resourceLog.js";
8
+ /** Publication succeeded: callers must not roll back its named container. */
9
+ export class HomeDeploymentRecordingError extends SpawnfileError {
10
+ constructor(deployment, cause) {
11
+ super("io_error", `Deployment ${deployment} is published, but recording failed: ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
12
+ }
13
+ }
14
+ export const bindDeploymentRecording = (recordPath, record, report, reportBytes) => {
15
+ const { recording: _recording, resource_snapshot: _snapshot, ...base } = record;
16
+ return report.recording ? { ...base, recording: report.recording,
17
+ resource_snapshot: createDeployResources(recordPath, record, report, reportBytes) } : base;
18
+ };
19
+ const priorRecord = async (recordPath) => {
20
+ let bytes;
21
+ try {
22
+ bytes = await readFile(recordPath, "utf8");
23
+ }
24
+ catch (error) {
25
+ if (error.code === "ENOENT")
26
+ return null;
27
+ throw error;
28
+ }
29
+ return parseDeploymentRecord(JSON.parse(bytes), recordPath);
30
+ };
31
+ /** Caller holds the publication lock; recover a published snapshot before using its history. */
32
+ export const reconcileDeploymentResources = async (recordPath) => {
33
+ const previous = await priorRecord(recordPath);
34
+ if (previous?.resource_snapshot && previous.recording) {
35
+ await syncFile(recordPath);
36
+ ensureDeployResources(recordPath, previous.resource_snapshot, previous.recording.keep_ms);
37
+ }
38
+ };
39
+ /** The original non-recording publication sequence, including its temporary name and permissions. */
40
+ export const writeAtomicDeploymentFile = async (file, bytes) => {
41
+ const temporary = path.join(path.dirname(file), `.${path.basename(file)}.${process.pid}.${Date.now()}.tmp`);
42
+ await writeFile(temporary, bytes, "utf8");
43
+ await rename(temporary, file);
44
+ };
45
+ /** Callers create the directory and pass the predecessor from their existing lifecycle read.
46
+ * Recording replacements re-read under the lock; off never probes for recording state. */
47
+ export const publishDeploymentRecord = async (recordPath, record, publishReport, previous) => {
48
+ if (!record.recording && !previous?.recording) {
49
+ await publishReport?.(false);
50
+ await writeAtomicDeploymentFile(recordPath, `${JSON.stringify(record, null, 2)}\n`);
51
+ return;
52
+ }
53
+ const release = await acquirePidLock(`${recordPath}.resource-log.lock`);
54
+ try {
55
+ await reconcileDeploymentResources(recordPath);
56
+ await publishReport?.(true);
57
+ try {
58
+ await writeDurableFile(recordPath, `${JSON.stringify(record, null, 2)}\n`);
59
+ }
60
+ catch (cause) {
61
+ if (cause instanceof PublishedFileSyncError)
62
+ throw new HomeDeploymentRecordingError(record.name, cause);
63
+ throw cause;
64
+ }
65
+ try {
66
+ if (record.resource_snapshot && record.recording)
67
+ ensureDeployResources(recordPath, record.resource_snapshot, record.recording.keep_ms);
68
+ }
69
+ catch (cause) {
70
+ throw new HomeDeploymentRecordingError(record.name, cause);
71
+ }
72
+ }
73
+ finally {
74
+ await release();
75
+ }
76
+ };
@@ -0,0 +1,18 @@
1
+ import type { RecordingReport } from "../report/index.js";
2
+ import type { DeploymentRecord } from "./record.js";
3
+ export interface RecordedMemoryDeletionOptions {
4
+ discardRecordedMemory?: boolean;
5
+ removeVolumes?: boolean;
6
+ }
7
+ /** A recompile cannot revoke deployed protection or change the mount-name mapping. */
8
+ export declare const recordedMemoryForDeletion: (record: Pick<DeploymentRecord, "recording" | "compile_fingerprint">, report: {
9
+ compile_fingerprint?: string;
10
+ recording?: RecordingReport;
11
+ } | null, mounts: readonly {
12
+ id: string;
13
+ }[], options: RecordedMemoryDeletionOptions) => RecordingReport | undefined;
14
+ /** The recording report lists mount ids; deletion operates on resolved names.
15
+ * Compare names after mapping so aliases cannot bypass the retention guard. */
16
+ export declare const assertRecordedMemoryRetention: <T extends {
17
+ id: string;
18
+ }>(recording: RecordingReport | undefined, mounts: readonly T[], deleting: readonly string[], nameOf: (mount: T) => string, options: RecordedMemoryDeletionOptions, remedy?: string) => void;
@@ -0,0 +1,27 @@
1
+ import { SpawnfileError } from "../shared/index.js";
2
+ const protectedMountIds = (recording) => [...recording.memory_mount_ids, ...(recording.recording_mount_ids ?? [])];
3
+ /** A recompile cannot revoke deployed protection or change the mount-name mapping. */
4
+ export const recordedMemoryForDeletion = (record, report, mounts, options) => {
5
+ if (options.removeVolumes && !options.discardRecordedMemory) {
6
+ const deployed = record.recording;
7
+ const mismatch = report?.compile_fingerprint !== record.compile_fingerprint;
8
+ const weakened = deployed && (!report?.recording || report.recording.keep_ms < deployed.keep_ms
9
+ || protectedMountIds(deployed).some((id) => !protectedMountIds(report.recording).includes(id) || !mounts.some((mount) => mount.id === id)));
10
+ if ((deployed && mismatch) || weakened || (report?.recording && mismatch)) {
11
+ throw new SpawnfileError("runtime_error", "Deployment record and report disagree; recording protection cannot be weakened. Restore the deployed report or pass --discard-recorded-memory with --volumes");
12
+ }
13
+ }
14
+ return record.recording ?? report?.recording;
15
+ };
16
+ /** The recording report lists mount ids; deletion operates on resolved names.
17
+ * Compare names after mapping so aliases cannot bypass the retention guard. */
18
+ export const assertRecordedMemoryRetention = (recording, mounts, deleting, nameOf, options, remedy = "pass --discard-recorded-memory with --volumes to deliberately discard them") => {
19
+ if (!recording || !options.removeVolumes || options.discardRecordedMemory)
20
+ return;
21
+ const protectedIds = new Set(protectedMountIds(recording));
22
+ const protectedNames = new Set(mounts.filter((mount) => protectedIds.has(mount.id)).map(nameOf));
23
+ const protectedDeletions = [...new Set(deleting.filter((name) => protectedNames.has(name)))].sort();
24
+ if (protectedDeletions.length > 0) {
25
+ throw new SpawnfileError("runtime_error", `Recording retains memory ledgers and recording stores in ${protectedDeletions.join(", ")}; ${remedy}`);
26
+ }
27
+ };