spawnfile 0.1.17 → 0.1.19

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 (490) 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/moltnet-releases.json +4 -4
  489. package/package.json +3 -3
  490. package/runtimes.yaml +8 -6
package/README.md CHANGED
@@ -98,7 +98,7 @@ Portability is capability-specific: the compiler reports each feature as **suppo
98
98
  | Plan isolated agent training | [Paideia training handoff](specs/TRAINING.md) |
99
99
  | Find a detailed contract | [Specification index](specs/INDEX.md) |
100
100
 
101
- Spawnfile is part of [Noopolis](https://github.com/noopolis). [Moltnet](https://moltnet.dev) supplies messaging; [Daimon](https://github.com/noopolis/daimon) runs individual agents; [Simfile](https://simfile.org) builds simulation worlds around organizations. You can use Spawnfile on its own.
101
+ Spawnfile is part of [Noopolis](https://github.com/noopolis). [Moltnet](https://moltnet.dev) supplies messaging; [Daimon](https://github.com/noopolis/daimon-harness) runs individual agents; [Simfile](https://simfile.org) builds simulation worlds around organizations. You can use Spawnfile on its own.
102
102
 
103
103
  ## License
104
104
 
@@ -1,8 +1,10 @@
1
1
  import path from "node:path";
2
2
  import os from "node:os";
3
- import { fileExists, readUtf8File, writePrivateUtf8File } from "../filesystem/index.js";
3
+ import { ensurePrivateDirectory, fileExists, readUtf8File, writeDurableFile, writePrivateUtf8File } from "../filesystem/index.js";
4
4
  import { SpawnfileError } from "../shared/index.js";
5
- import { registerImportedAuth, setAuthProfileEnv } from "./profileStore.js";
5
+ import { ensureAuthProfile, registerImportedAuth, setAuthProfileEnv } from "./profileStore.js";
6
+ import { resolveImportedAuthDirectory } from "./paths.js";
7
+ import { acquireTrainingGrokWritebackLock } from "./trainingGrokWritebackLock.js";
6
8
  const ENV_LINE_PATTERN = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/;
7
9
  const CLAUDE_CODE_KEYCHAIN_SERVICE = "Claude Code-credentials";
8
10
  const stripWrappedQuotes = (value) => {
@@ -92,9 +94,23 @@ export const importGrokAuth = async (profileName, sourceDirectory) => {
92
94
  if (!(await fileExists(authFilePath))) {
93
95
  throw new SpawnfileError("validation_error", `Grok auth file does not exist: ${authFilePath}`);
94
96
  }
95
- const { directory, profile } = await registerImportedAuth(profileName, "grok");
96
- await writePrivateUtf8File(path.join(directory, "auth.json"), await readUtf8File(authFilePath));
97
- return profile;
97
+ await ensureAuthProfile(profileName);
98
+ const directory = resolveImportedAuthDirectory(profileName, "grok");
99
+ await ensurePrivateDirectory(path.dirname(directory));
100
+ await ensurePrivateDirectory(directory);
101
+ const destination = path.join(directory, "auth.json");
102
+ const release = await acquireTrainingGrokWritebackLock(destination).catch(() => {
103
+ throw new SpawnfileError("validation_error", "Grok credential lock unavailable; retry import after the active writer finishes");
104
+ });
105
+ try {
106
+ const content = await readUtf8File(authFilePath);
107
+ const { profile } = await registerImportedAuth(profileName, "grok");
108
+ await writeDurableFile(destination, content);
109
+ return profile;
110
+ }
111
+ finally {
112
+ release();
113
+ }
98
114
  };
99
115
  export const importClaudeCodeAuth = async (profileName, sourceDirectory, options = {}) => {
100
116
  const resolvedSource = resolveClaudeSourceDirectory(sourceDirectory);
@@ -12,3 +12,4 @@ export * from "./targetSecretSourceLifecycle.js";
12
12
  export * from "./targetSecretSourceResolver.js";
13
13
  export { stageTrainingAuth } from "./trainingAuth.js";
14
14
  export type { TrainingAuthStageOptions, TrainingAuthProvider } from "./trainingAuth.js";
15
+ export { writeBackTrainingGrokCredential } from "./trainingGrokWriteback.js";
@@ -11,3 +11,4 @@ export * from "./credentialWorldBindings.js";
11
11
  export * from "./targetSecretSourceLifecycle.js";
12
12
  export * from "./targetSecretSourceResolver.js";
13
13
  export { stageTrainingAuth } from "./trainingAuth.js";
14
+ export { writeBackTrainingGrokCredential } from "./trainingGrokWriteback.js";
@@ -99,7 +99,10 @@ export const registerImportedAuth = async (profileName, kind) => {
99
99
  const current = (await loadAuthProfile(profileName)) ?? (await ensureAuthProfile(profileName));
100
100
  const importDirectory = resolveImportedAuthDirectory(profileName, kind);
101
101
  await ensurePrivateDirectory(path.dirname(importDirectory));
102
- await removeDirectory(importDirectory);
102
+ // Grok import and writeback share a persistent lock inside this directory.
103
+ // Removing it would let another writer lock a different inode concurrently.
104
+ if (kind !== "grok")
105
+ await removeDirectory(importDirectory);
103
106
  await ensurePrivateDirectory(importDirectory);
104
107
  const nextProfile = {
105
108
  env: { ...current.env },
@@ -0,0 +1,4 @@
1
+ /** Reads only private, bounded, canonical leaves. Errors never include credential bytes. */
2
+ export declare const readTrainingGrokLeaf: (file: string) => Promise<Buffer>;
3
+ /** A settled journal proves rotation; native expiry orders credentials across independent realms. */
4
+ export declare const writeBackTrainingGrokCredential: (profile: string, candidate: string, journalFile: string) => Promise<boolean>;
@@ -0,0 +1,119 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { lstat, open, realpath, rename, unlink } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { acquireTrainingGrokWritebackLock } from "./trainingGrokWritebackLock.js";
6
+ const failure = () => Error("Training Grok credential writeback failed");
7
+ const digest = (bytes) => createHash("sha256").update(bytes).digest("hex");
8
+ /** Reads only private, bounded, canonical leaves. Errors never include credential bytes. */
9
+ export const readTrainingGrokLeaf = async (file) => {
10
+ if (await realpath(file) !== path.resolve(file))
11
+ throw failure();
12
+ const handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
13
+ try {
14
+ const before = await handle.stat({ bigint: true });
15
+ if (!before.isFile() || before.nlink !== 1n || (before.mode & 511n) !== 384n || before.size < 2n || before.size > 65536n)
16
+ throw failure();
17
+ const bytes = Buffer.alloc(Number(before.size) + 1);
18
+ let length = 0;
19
+ while (length < bytes.length) {
20
+ const result = await handle.read(bytes, length, bytes.length - length, null);
21
+ if (!result.bytesRead)
22
+ break;
23
+ length += result.bytesRead;
24
+ }
25
+ const after = await handle.stat({ bigint: true });
26
+ if (BigInt(length) !== before.size || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
27
+ bytes.fill(0);
28
+ throw failure();
29
+ }
30
+ return bytes.subarray(0, length);
31
+ }
32
+ finally {
33
+ await handle.close();
34
+ }
35
+ };
36
+ const expiry = (bytes) => {
37
+ try {
38
+ const rows = Object.entries(JSON.parse(bytes.toString("utf8")))
39
+ .filter(([key]) => /^https:\/\/auth\.x\.ai::/u.test(key)).map(([, value]) => value);
40
+ const row = rows[0];
41
+ if (rows.length !== 1 || typeof row?.key !== "string" || !row.key.trim() || typeof row.refresh_token !== "string" || !row.refresh_token.trim() || typeof row.expires_at !== "string")
42
+ throw failure();
43
+ const value = Date.parse(row.expires_at);
44
+ if (!Number.isFinite(value))
45
+ throw failure();
46
+ return value;
47
+ }
48
+ catch {
49
+ throw failure();
50
+ }
51
+ };
52
+ /** A settled journal proves rotation; native expiry orders credentials across independent realms. */
53
+ export const writeBackTrainingGrokCredential = async (profile, candidate, journalFile) => {
54
+ const release = await acquireTrainingGrokWritebackLock(profile, 30_000).catch(() => { throw failure(); });
55
+ const temporary = path.join(path.dirname(profile), `.grok-writeback-${randomUUID()}`);
56
+ let current, renewed, journalBytes;
57
+ try {
58
+ current = await readTrainingGrokLeaf(profile);
59
+ renewed = await readTrainingGrokLeaf(candidate);
60
+ if (digest(current) === digest(renewed))
61
+ return false;
62
+ journalBytes = await readTrainingGrokLeaf(journalFile);
63
+ const journal = JSON.parse(journalBytes.toString("utf8"));
64
+ if (journal.version !== "noopolis.daimon.broker-credential-journal.v1" || journal.state !== "promoted" ||
65
+ !Number.isSafeInteger(journal.generation) || journal.generation < 1 ||
66
+ typeof journal.sourceDigest !== "string" || !/^[a-f0-9]{64}$/u.test(journal.sourceDigest) || journal.promotedDigest !== digest(renewed))
67
+ throw failure();
68
+ const renewedExpiry = expiry(renewed), currentExpiry = expiry(current);
69
+ const ancestors = journal.ancestorDigests ?? [];
70
+ if (!Array.isArray(ancestors) || ancestors.length > 900 || ancestors.some((entry) => typeof entry !== "string" || !/^[a-f0-9]{64}$/u.test(entry)))
71
+ throw failure();
72
+ if (renewedExpiry < currentExpiry || (renewedExpiry === currentExpiry && journal.sourceDigest !== digest(current) && !ancestors.includes(digest(current))))
73
+ return false;
74
+ const identity = await lstat(profile, { bigint: true });
75
+ const output = await open(temporary, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
76
+ try {
77
+ await output.writeFile(renewed);
78
+ await output.sync();
79
+ }
80
+ finally {
81
+ await output.close();
82
+ }
83
+ // Import and writeback hold the same lock through publication. This check
84
+ // also detects non-cooperating edits made before validation, not after it.
85
+ const check = await readTrainingGrokLeaf(profile);
86
+ try {
87
+ const now = await lstat(profile, { bigint: true });
88
+ if (digest(check) !== digest(current) || now.ino !== identity.ino || now.dev !== identity.dev || now.ctimeNs !== identity.ctimeNs)
89
+ throw failure();
90
+ }
91
+ finally {
92
+ check.fill(0);
93
+ }
94
+ await rename(temporary, profile);
95
+ const directory = await open(path.dirname(profile), constants.O_RDONLY);
96
+ try {
97
+ await directory.sync();
98
+ }
99
+ finally {
100
+ await directory.close();
101
+ }
102
+ return true;
103
+ }
104
+ catch {
105
+ throw failure();
106
+ }
107
+ finally {
108
+ current?.fill(0);
109
+ renewed?.fill(0);
110
+ journalBytes?.fill(0);
111
+ try {
112
+ await unlink(temporary).catch((error) => { if (error.code !== "ENOENT")
113
+ throw error; });
114
+ }
115
+ finally {
116
+ release();
117
+ }
118
+ }
119
+ };
@@ -0,0 +1,5 @@
1
+ /** A persistent, non-secret SQLite file owns the OS lock, never the directory.
2
+ * SQLite releases it on process death. Do not unlink the file/directory: another
3
+ * writer may already have the same inode open. Legacy empty lock dirs are safe.
4
+ */
5
+ export declare const acquireTrainingGrokWritebackLock: (profile: string, timeoutMs?: number) => Promise<() => void>;
@@ -0,0 +1,56 @@
1
+ import { closeSync, constants, openSync } from "node:fs";
2
+ import { lstat, mkdir, realpath } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { setTimeout } from "node:timers/promises";
5
+ /** A persistent, non-secret SQLite file owns the OS lock, never the directory.
6
+ * SQLite releases it on process death. Do not unlink the file/directory: another
7
+ * writer may already have the same inode open. Legacy empty lock dirs are safe.
8
+ */
9
+ export const acquireTrainingGrokWritebackLock = async (profile, timeoutMs = 0) => {
10
+ if (!Number.isFinite(timeoutMs) || timeoutMs < 0)
11
+ throw Error("Invalid writeback lock timeout");
12
+ const root = `${profile}.training-writeback.lock`;
13
+ await mkdir(root, { recursive: true, mode: 0o700 });
14
+ const directory = await lstat(root);
15
+ if (await realpath(root) !== path.resolve(root) || !directory.isDirectory() ||
16
+ directory.uid !== process.getuid?.() || (directory.mode & 0o777) !== 0o700)
17
+ throw Error("Unsafe writeback lock");
18
+ const file = path.join(root, "lock.sqlite");
19
+ // Closing an independently opened fd can drop this process's POSIX locks.
20
+ // Only open when creating; SQLite owns every fd for an existing lock file.
21
+ // Creation and close must not yield to another acquisition in this process.
22
+ try {
23
+ closeSync(openSync(file, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600));
24
+ }
25
+ catch (error) {
26
+ if (error.code !== "EEXIST")
27
+ throw error;
28
+ }
29
+ const entry = await lstat(file);
30
+ if (!entry.isFile() || entry.nlink !== 1 || entry.uid !== process.getuid?.() || (entry.mode & 0o777) !== 0o600)
31
+ throw Error("Unsafe writeback lock");
32
+ const { DatabaseSync } = await import("node:sqlite");
33
+ const database = new DatabaseSync(file);
34
+ const deadline = performance.now() + timeoutMs;
35
+ try {
36
+ // SQLite's synchronous busy timeout would block a same-process holder
37
+ // from finishing its async publication. Yield between acquisition attempts.
38
+ database.exec("PRAGMA busy_timeout = 0");
39
+ for (;;) {
40
+ try {
41
+ database.exec("BEGIN EXCLUSIVE");
42
+ return () => { database.close(); };
43
+ }
44
+ catch (error) {
45
+ const remaining = deadline - performance.now();
46
+ if (error.errcode !== 5 || remaining <= 0)
47
+ throw error;
48
+ await setTimeout(Math.min(25, remaining));
49
+ }
50
+ }
51
+ }
52
+ catch (error) {
53
+ database.close();
54
+ throw error;
55
+ }
56
+ };
@@ -5,6 +5,7 @@ import { createCanonicalTargetSecretSourceJson } from "../auth/targetSecretSourc
5
5
  import { renderSimfileWorldBindings } from "../compiler/worldBindings.js";
6
6
  import { MAX_TARGET_SECRET_SOURCE_SECRET_BYTES, TARGET_SECRET_SOURCE_ERROR } from "../auth/targetSecretSourceRecordCommon.js";
7
7
  import { createTargetSecretSourceReceiptBytes, readBoundedTargetSecretStdin, readTargetSecretSourceGrantRequestFile, readTargetSecretSourceRequestFile } from "./targetSecretSourceInput.js";
8
+ import { envFileAliasOption, resolveEnvFileOption, runtimeEnvFileOption } from "./envFileOption.js";
8
9
  const formatAuthProfileSummary = (profile) => {
9
10
  const envKeys = Object.keys(profile.env).sort();
10
11
  const importedKinds = Object.keys(profile.imports).sort();
@@ -112,14 +113,15 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
112
113
  .description("Provision auth material a project requires into a profile")
113
114
  .argument("[path]", "Project directory or Spawnfile path", process.cwd())
114
115
  .option("-p, --profile <name>", "Auth profile name", "default")
115
- .option("--env-file <file>", "Path to an env file with model keys and runtime secrets")
116
+ .addOption(runtimeEnvFileOption("Path to an env file with model keys and runtime secrets"))
117
+ .addOption(envFileAliasOption())
116
118
  .option("--claude-from <directory>", "Source Claude Code config directory")
117
119
  .option("--codex-from <directory>", "Source Codex config directory")
118
120
  .action(async (inputPath, options) => {
119
121
  const profile = await handlers.syncProjectAuth(inputPath, {
120
122
  claudeCodeDirectory: options.claudeFrom,
121
123
  codexDirectory: options.codexFrom,
122
- envFilePath: options.envFile,
124
+ envFilePath: resolveEnvFileOption(options),
123
125
  profileName: options.profile
124
126
  });
125
127
  emitLines(streams, formatAuthProfileSummary(profile));
@@ -136,10 +138,12 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
136
138
  .command("provision")
137
139
  .description("Provision a declarative batch of target credentials")
138
140
  .argument("<request-file>", "Secret-free credential provisioning request JSON")
139
- .option("--env-file <path>", "Create a 0600 environment file")
141
+ .addOption(runtimeEnvFileOption("Create a 0600 environment file", "path"))
142
+ .addOption(envFileAliasOption("path"))
140
143
  .option("--world-bindings <path>", "Create a resolved world-bindings artifact")
141
144
  .option("--resolved-grants <path>", "Resolved world grants used to derive world bindings")
142
145
  .action((requestFile, options) => targetSecretAction(async () => {
146
+ const envFilePath = resolveEnvFileOption(options);
143
147
  let materials;
144
148
  try {
145
149
  const request = await readCredentialProvisioningRequestFile(requestFile);
@@ -153,11 +157,11 @@ export const registerAuthCommands = (program, handlers, streams, stdin) => {
153
157
  await handlers.importCodexAuth(request.model_engine_auth.profile, request.model_engine_auth.from);
154
158
  modelEngineAuth = true;
155
159
  }
156
- const envFile = options.envFile === undefined
160
+ const envFile = envFilePath === undefined
157
161
  ? undefined
158
162
  : await writeProvisionedEnvFile({
159
163
  materials,
160
- path: options.envFile,
164
+ path: envFilePath,
161
165
  receipt: provisioned.receipt
162
166
  });
163
167
  let worldBindingsDigest;
@@ -16,8 +16,10 @@ export const registerCompileBuildCommands = (program, handlers, streams) => {
16
16
  .argument("[path]", "Project directory or Spawnfile path", process.cwd())
17
17
  .option("-o, --out <directory>", "Output directory")
18
18
  .option("--world-bindings <file>", "Path to a versioned world-bindings artifact")
19
+ .option("--release", "Build workspace bundles only from clean committed inputs")
19
20
  .action(async (inputPath, options) => {
20
21
  const result = await handlers.compileProject(inputPath, {
22
+ ...(options.release ? { bundleIdentity: "release" } : {}),
21
23
  outputDirectory: options.out,
22
24
  worldBindingsPath: options.worldBindings
23
25
  });
@@ -33,8 +35,10 @@ export const registerCompileBuildCommands = (program, handlers, streams) => {
33
35
  .option("--docker-command <command>", "Docker command")
34
36
  .option("-o, --out <directory>", "Output directory")
35
37
  .option("-t, --tag <image>", "Docker image tag")
38
+ .option("--release", "Build workspace bundles only from clean committed inputs")
36
39
  .action(async (inputPath, options) => {
37
40
  const result = await handlers.buildProject(inputPath, {
41
+ ...(options.release ? { bundleIdentity: "release" } : {}),
38
42
  dockerContext: options.context,
39
43
  dockerCommand: options.dockerCommand,
40
44
  imageTag: options.tag,
@@ -1,4 +1,5 @@
1
1
  import { InvalidArgumentError } from "commander";
2
+ import { envFileAliasOption, resolveEnvFileOption, runtimeEnvFileOption } from "./envFileOption.js";
2
3
  const parsePositiveIntegerOption = (value) => {
3
4
  if (!/^[1-9]\d*$/u.test(value)) {
4
5
  throw new InvalidArgumentError("must be a positive integer");
@@ -16,7 +17,8 @@ export const registerDevCommands = (program, handlers, streams) => {
16
17
  .option("--context <name>", "Docker context for the deployment target")
17
18
  .option("--deployment <name>", "Detached deployment record name")
18
19
  .option("--docker-command <command>", "Docker command")
19
- .option("--env-file <file>", "Path to an env file for runtime secrets")
20
+ .addOption(runtimeEnvFileOption("Path to an env file for runtime secrets"))
21
+ .addOption(envFileAliasOption())
20
22
  .option("--name <container>", "Docker container name")
21
23
  .option("-o, --out <directory>", "Dev output directory")
22
24
  .option("-t, --tag <image>", "Docker image tag")
@@ -28,7 +30,7 @@ export const registerDevCommands = (program, handlers, streams) => {
28
30
  deploymentName: options.deployment,
29
31
  dockerCommand: options.dockerCommand,
30
32
  dockerContext: options.context,
31
- envFilePath: options.envFile,
33
+ envFilePath: resolveEnvFileOption(options),
32
34
  imageTag: options.tag,
33
35
  outputDirectory: options.out
34
36
  });
@@ -4,6 +4,7 @@ import type { CliHandlers, CliStreams } from "./runCli.js";
4
4
  export interface DownOptions {
5
5
  compiled?: string;
6
6
  deployment: string;
7
+ discardRecordedMemory?: boolean;
7
8
  dockerCommand?: string;
8
9
  exportTo?: string;
9
10
  force?: boolean;
@@ -20,6 +21,7 @@ export declare const createDownLifecyclePolicy: (options: DownOptions) => {
20
21
  reader_image: string | null;
21
22
  remove_volumes: boolean;
22
23
  timeout_ms: number | null;
24
+ discard_recorded_memory?: boolean | undefined;
23
25
  };
24
26
  export declare const createDownLifecycleInvocation: (id: string, compiledOutputDirectory: string, options: DownOptions, correlation: DeploymentLifecycleCorrelation) => LifecycleInvocation;
25
27
  export declare const registerDownCommand: (program: Command, handlers: CliHandlers, streams: CliStreams) => void;
@@ -5,6 +5,7 @@ import { DEFAULT_OUTPUT_DIRECTORY, SpawnfileError } from "../shared/index.js";
5
5
  import { canonicalLifecycleJson } from "../deployment/lifecycleCompletionContracts.js";
6
6
  import { createLifecycleInvocation, requireMachineLifecycle, runMachineLifecycle, } from "./lifecycleMachine.js";
7
7
  export const createDownLifecyclePolicy = (options) => ({
8
+ ...(options.discardRecordedMemory ? { discard_recorded_memory: true } : {}),
8
9
  docker_command: options.dockerCommand ?? null,
9
10
  export_to: options.exportTo ? path.resolve(options.exportTo) : null,
10
11
  force: options.force ?? false,
@@ -52,6 +53,7 @@ export const registerDownCommand = (program, handlers, streams) => {
52
53
  .option("--docker-command <command>", "Docker command")
53
54
  .option("--export-to <directory>", "Export first, then tear down")
54
55
  .option("--force", "Discard un-exported artifacts")
56
+ .option("--discard-recorded-memory", "Allow --volumes to discard memory ledgers used by recording agents")
55
57
  .option("--reader-image <image>", "Image used to read named volumes during auto export")
56
58
  .option("--timeout <ms>", "Bound each Docker call in milliseconds")
57
59
  .option("--volumes", "Also remove this deployment's own named volumes (author-declared names are shared project state and are always skipped)")
@@ -67,6 +69,7 @@ export const registerDownCommand = (program, handlers, streams) => {
67
69
  const receipt = await handlers.downDeployment({
68
70
  compiledOutputDirectory: compiled,
69
71
  deploymentName: options.deployment,
72
+ discardRecordedMemory: options.discardRecordedMemory,
70
73
  dockerCommand: options.dockerCommand,
71
74
  exportTo: options.exportTo,
72
75
  force: options.force,
@@ -0,0 +1,18 @@
1
+ import { Option } from "commander";
2
+ /**
3
+ * Node reads `--env-file` from the WHOLE argv, script arguments included
4
+ * (verified on 22.23 and 24.21): `node dist/cli/index.js up --env-file x`
5
+ * dies with `node: x: not found` (exit 9) before Spawnfile runs when x is
6
+ * missing or unreadable, and a `NODE_OPTIONS=` line in x is applied to the
7
+ * Spawnfile process itself. `--runtime-env-file` is the spelling Node does not
8
+ * claim; `--env-file` stays as a hidden alias for existing callers.
9
+ */
10
+ export declare const RUNTIME_ENV_FILE_FLAG = "--runtime-env-file";
11
+ export interface EnvFileOptions {
12
+ envFile?: string;
13
+ runtimeEnvFile?: string;
14
+ }
15
+ export declare const runtimeEnvFileOption: (description: string, valueName?: string) => Option;
16
+ export declare const envFileAliasOption: (valueName?: string) => Option;
17
+ /** One env file: either spelling, never two different files. */
18
+ export declare const resolveEnvFileOption: (options: EnvFileOptions) => string | undefined;
@@ -0,0 +1,20 @@
1
+ import { Option } from "commander";
2
+ import { SpawnfileError } from "../shared/index.js";
3
+ /**
4
+ * Node reads `--env-file` from the WHOLE argv, script arguments included
5
+ * (verified on 22.23 and 24.21): `node dist/cli/index.js up --env-file x`
6
+ * dies with `node: x: not found` (exit 9) before Spawnfile runs when x is
7
+ * missing or unreadable, and a `NODE_OPTIONS=` line in x is applied to the
8
+ * Spawnfile process itself. `--runtime-env-file` is the spelling Node does not
9
+ * claim; `--env-file` stays as a hidden alias for existing callers.
10
+ */
11
+ export const RUNTIME_ENV_FILE_FLAG = "--runtime-env-file";
12
+ export const runtimeEnvFileOption = (description, valueName = "file") => new Option(`${RUNTIME_ENV_FILE_FLAG} <${valueName}>`, description);
13
+ export const envFileAliasOption = (valueName = "file") => new Option(`--env-file <${valueName}>`, `Alias of ${RUNTIME_ENV_FILE_FLAG}`).hideHelp();
14
+ /** One env file: either spelling, never two different files. */
15
+ export const resolveEnvFileOption = (options) => {
16
+ if (options.runtimeEnvFile !== undefined && options.envFile !== undefined && options.runtimeEnvFile !== options.envFile) {
17
+ throw new SpawnfileError("validation_error", `${RUNTIME_ENV_FILE_FLAG} and --env-file name different files; pass one`);
18
+ }
19
+ return options.runtimeEnvFile ?? options.envFile;
20
+ };
@@ -1,3 +1,3 @@
1
1
  import type { Command } from "commander";
2
2
  import type { CliHandlers, CliStreams } from "./runCli.js";
3
- export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams, stdin: AsyncIterable<unknown>) => void;
3
+ export declare const registerLifecycleCommands: (program: Command, handlers: CliHandlers, streams: CliStreams, stdin: AsyncIterable<unknown>, setExitCode?: (code: number) => void) => void;
@@ -1,12 +1,14 @@
1
1
  import { registerCompileBuildCommands } from "./compileBuildCommands.js";
2
2
  import { registerDownCommand } from "./downCommand.js";
3
3
  import { registerLifecyclePlanningCommands } from "./lifecyclePlanningCommands.js";
4
+ import { registerReleaseCommand } from "./releaseCommand.js";
4
5
  import { registerRunPublishCommands } from "./runPublishCommands.js";
5
6
  import { registerUpCommand } from "./upCommand.js";
6
- export const registerLifecycleCommands = (program, handlers, streams, stdin) => {
7
+ export const registerLifecycleCommands = (program, handlers, streams, stdin, setExitCode = () => undefined) => {
7
8
  registerLifecyclePlanningCommands(program, streams, stdin);
8
9
  registerCompileBuildCommands(program, handlers, streams);
9
10
  registerRunPublishCommands(program, handlers, streams);
10
11
  registerUpCommand(program, handlers, streams);
11
12
  registerDownCommand(program, handlers, streams);
13
+ registerReleaseCommand(program, streams, setExitCode);
12
14
  };
@@ -17,6 +17,7 @@ export declare const lifecyclePlanRequestSchema: z.ZodDiscriminatedUnion<[z.ZodO
17
17
  version: z.ZodLiteral<"spawnfile.lifecycle-plan-request.v1">;
18
18
  }, z.core.$strict>, z.ZodObject<{
19
19
  deployment: z.ZodString;
20
+ discard_recorded_memory: z.ZodOptional<z.ZodBoolean>;
20
21
  export_to: z.ZodNullable<z.ZodString>;
21
22
  force: z.ZodBoolean;
22
23
  operation: z.ZodLiteral<"down">;
@@ -35,6 +35,7 @@ export const lifecyclePlanRequestSchema = z.discriminatedUnion("operation", [
35
35
  .object({
36
36
  ...common,
37
37
  deployment: z.string().min(1).max(128),
38
+ discard_recorded_memory: z.boolean().optional(),
38
39
  export_to: z.string().min(1).max(4096).nullable(),
39
40
  force: z.boolean(),
40
41
  operation: z.literal("down"),
@@ -225,6 +226,7 @@ export const createPlannedLifecycleInvocation = async (request) => {
225
226
  const options = {
226
227
  compiled: request.compiled ?? undefined,
227
228
  deployment: request.deployment,
229
+ discardRecordedMemory: request.discard_recorded_memory,
228
230
  dockerCommand: request.docker_command ?? undefined,
229
231
  exportTo: request.export_to ?? undefined,
230
232
  force: request.force,
@@ -1,7 +1,8 @@
1
- import { type TrainingContext } from "../compiler/training/index.js";
1
+ import { type TrainingContext, type TrainingExecution } from "../compiler/training/index.js";
2
2
  import type { CliStreams } from "./runCli.js";
3
3
  export interface DelegatePaideiaTrainingOptions {
4
4
  context: TrainingContext;
5
+ execution?: TrainingExecution;
5
6
  command: string;
6
7
  args: readonly string[];
7
8
  dryRun: boolean;
@@ -171,12 +171,13 @@ export const delegatePaideiaTraining = async (options) => {
171
171
  throw failure("--repair-witness requires --repair-measurements");
172
172
  if (options.trainingConfig) {
173
173
  const config = await readBoundedJson(options.trainingConfig);
174
- // v2 and v3 are both declarative preparations; a v3 *launch* config (already lowered, with `inputs`) goes straight to Docker.
175
- if (config.version === "spawnfile.training-container.v2" || (config.version === "spawnfile.training-container.v3" && config.image !== undefined)) {
176
- if (options.trainingImage)
174
+ // Image declarations go through preparation; lowered launch configurations go straight to Docker.
175
+ if (config.version === "spawnfile.training-container.v2" || (["spawnfile.training-container.v3", "spawnfile.training-container.v4"].includes(String(config.version)) && config.image !== undefined)) {
176
+ if (options.trainingImage && !options.execution)
177
177
  throw failure("V2 owns its image declaration; --training-image is only for v1");
178
178
  const prepared = await prepareTraining({ configPath: options.trainingConfig, context: options.context, args: options.args,
179
179
  repairMeasurements: options.repairMeasurements, repairWitness: options.repairWitness,
180
+ execution: options.execution, outputOverride: options.execution?.output, imageOverride: options.execution ? options.trainingImage : undefined,
180
181
  dryRun: options.dryRun, process: runTrainingDocker, timeoutMs: options.timeoutMs, signal: options.signal, streams: options.streams });
181
182
  if (!("dryRun" in prepared))
182
183
  return launchTrainingContainer({ ...prepared,
@@ -191,7 +192,7 @@ export const delegatePaideiaTraining = async (options) => {
191
192
  if (!options.trainingImage || !options.trainingConfig)
192
193
  throw failure("Actual training requires --training-image and --training-config; host execution is disabled");
193
194
  return launchTrainingContainer({ image: options.trainingImage, configPath: options.trainingConfig,
194
- context: options.context, args: options.args, timeoutMs: options.timeoutMs, streams: options.streams, signal: options.signal });
195
+ context: options.context, args: options.args, execution: options.execution, timeoutMs: options.timeoutMs, streams: options.streams, signal: options.signal });
195
196
  }
196
197
  if (process.platform === "win32")
197
198
  throw failure("Paideia delegation requires POSIX process-group supervision");
@@ -0,0 +1,17 @@
1
+ import type { Command } from "commander";
2
+ import { type RecordingDeploymentHandlers } from "../recording/index.js";
3
+ import type { CliStreams } from "./runCli.js";
4
+ import { type UsageCommandLiveHandlers } from "./usageCommandLive.js";
5
+ export interface RecordSyncOptions {
6
+ deployment?: string;
7
+ out?: string;
8
+ dockerCommand?: string;
9
+ timeout?: string;
10
+ }
11
+ export type RecordCommandHandlers = UsageCommandLiveHandlers & RecordingDeploymentHandlers;
12
+ export declare const executeRecordSyncCommand: (inputPath: string, options: RecordSyncOptions, handlers?: RecordCommandHandlers) => Promise<{
13
+ exitCode: 0 | 1 | 2;
14
+ output?: string;
15
+ error?: string;
16
+ }>;
17
+ export declare const registerRecordCommands: (program: Command, streams: CliStreams, setExitCode: (code: 0 | 1 | 2) => void, handlers?: RecordCommandHandlers) => void;
@@ -0,0 +1,43 @@
1
+ import { resolveProjectOutputDirectory } from "../filesystem/index.js";
2
+ import { syncDeploymentMoments } from "../recording/index.js";
3
+ import { DEFAULT_OUTPUT_DIRECTORY, errorExitCode } from "../shared/index.js";
4
+ import { selectUsageDeployment } from "./usageCommandLive.js";
5
+ import { resolveUsageDeploymentSource } from "./usageDeploymentSource.js";
6
+ export const executeRecordSyncCommand = async (inputPath, options, handlers = {}) => {
7
+ try {
8
+ const timeoutMs = options.timeout === undefined ? undefined : Number(options.timeout);
9
+ if (timeoutMs !== undefined && (!Number.isFinite(timeoutMs) || timeoutMs <= 0)) {
10
+ return { exitCode: 2, error: "--timeout must be a positive number of milliseconds" };
11
+ }
12
+ const outputDirectory = resolveProjectOutputDirectory(inputPath, options.out, DEFAULT_OUTPUT_DIRECTORY);
13
+ const source = await resolveUsageDeploymentSource(inputPath, options, handlers, outputDirectory);
14
+ const records = await source.loader(source.outputDirectory);
15
+ const record = selectUsageDeployment(records, options.deployment);
16
+ if ("error" in record)
17
+ return { exitCode: 2, error: record.error.replace("spawnfile usage", "spawnfile record sync") };
18
+ const recordPath = records.find((entry) => entry.record === record).path;
19
+ const result = await syncDeploymentMoments({ record, recordPath, timeoutMs, dockerCommand: options.dockerCommand }, handlers);
20
+ return {
21
+ exitCode: result.failures.length ? 1 : 0,
22
+ output: `Records: ${result.written} written / ${result.skipped} skipped / ${result.nonExact} non-exact`,
23
+ ...((result.failures.length || result.warnings.length) ? { error: [...result.failures, ...new Set(result.warnings)].join("\n") } : {})
24
+ };
25
+ }
26
+ catch (error) {
27
+ return { exitCode: errorExitCode(error), error: error instanceof Error ? error.message : String(error) };
28
+ }
29
+ };
30
+ export const registerRecordCommands = (program, streams, setExitCode, handlers = {}) => {
31
+ program.command("record").description("Compose training moment records from deployed wake evidence")
32
+ .command("sync").argument("[path]", "Project directory or Spawnfile path", process.cwd())
33
+ .option("--deployment <name>", "Deployment record name").option("--out <dir>", "Compile output directory")
34
+ .option("--docker-command <command>", "Docker command").option("--timeout <ms>", "Bound Docker reads in milliseconds")
35
+ .action(async (inputPath, options) => {
36
+ const result = await executeRecordSyncCommand(inputPath, options, handlers);
37
+ setExitCode(result.exitCode);
38
+ if (result.error)
39
+ streams.stderr(result.error);
40
+ if (result.output)
41
+ streams.stdout(result.output);
42
+ });
43
+ };
@@ -0,0 +1,6 @@
1
+ import type { Command } from "commander";
2
+ import { type ReleaseDependencies } from "../release/index.js";
3
+ import type { CliStreams } from "./runCli.js";
4
+ /** `90s`, `30m`, `2h`, `500ms`. A bare number is refused: the unit is never guessed. */
5
+ export declare const parseReleaseDuration: (value: string, flag: string) => number;
6
+ export declare const registerReleaseCommand: (program: Command, streams: CliStreams, setExitCode: (code: number) => void, dependencies?: () => ReleaseDependencies) => void;