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
@@ -0,0 +1,64 @@
1
+ import { compareInstants, normalizeInstant } from "./instant.js";
2
+ import { hasRecordPin, recordActivationErrors, recordForInput, recordPins } from "./recordInput.js";
3
+ /** Shared targets referencing the same role/dataset/example are one trial. */
4
+ export const selectTrainingExample = (plan, selector) => {
5
+ const match = /^(train|validation|test):(.*)$/u.exec(selector);
6
+ const role = match?.[1], id = match?.[2] ?? selector;
7
+ const candidates = new Map();
8
+ for (const target of plan.targets)
9
+ for (const candidateRole of ["train", "validation", "test"]) {
10
+ const dataset = target.datasets[candidateRole];
11
+ if (!dataset || (role && candidateRole !== role))
12
+ continue;
13
+ for (const example of dataset.examples) {
14
+ if (example.id !== id)
15
+ continue;
16
+ const candidate = { id, role: candidateRole, dataset: dataset.path, sourcePath: dataset.sourcePath, example };
17
+ candidates.set(JSON.stringify([candidateRole, dataset.sourcePath, id]), candidate);
18
+ }
19
+ }
20
+ const found = [...candidates.values()];
21
+ if (found.length !== 1)
22
+ throw new Error(found.length === 0
23
+ ? `No training example matches ${selector}`
24
+ : `Ambiguous training example ${selector}; candidates: ${found.map((item) => `${item.role}:${id} (${item.dataset})`).sort().join(", ")}`);
25
+ return found[0];
26
+ };
27
+ const canonical = (value) => JSON.stringify(value, (_key, item) => item && typeof item === "object" && !Array.isArray(item)
28
+ ? Object.fromEntries(Object.entries(item).sort(([a], [b]) => a.localeCompare(b))) : item);
29
+ export const matchingMomentRecords = (records, agent, at) => records.filter((record) => record.agent === agent && compareInstants(record.wake.at, at) === 0);
30
+ /** Replays can share executionId AND startedAt. Keep every earliest tie for per-input agreement. */
31
+ export const originalMomentRecords = (records) => {
32
+ const first = records.reduce((earliest, entry) => !earliest || compareInstants(entry.wake.startedAt, earliest.wake.startedAt) < 0 ? entry : earliest, null);
33
+ return first ? records.filter((entry) => compareInstants(entry.wake.startedAt, first.wake.startedAt) === 0) : [];
34
+ };
35
+ /** Capture time and wake payload are not used to materialize data. Normalize actual used instants. */
36
+ export const selectMomentRecord = (records, agent, at, inputs) => {
37
+ const matches = originalMomentRecords(matchingMomentRecords(records, agent, at));
38
+ if (!matches.length)
39
+ return null;
40
+ const identities = inputs ?? matches.flatMap((record) => [
41
+ ...[...record.resources, ...record.feeds, ...record.volumes].map(({ id }) => ({ section: "resources", id, declaredBy: agent })),
42
+ ...record.memory.map(({ id, declaredBy }) => ({ section: "memory", id, declaredBy })),
43
+ ...record.moltnet.map(({ network }) => ({ section: "networks", id: network, declaredBy: agent }))
44
+ ]);
45
+ for (const input of identities) {
46
+ if ("overridden" in input && input.overridden)
47
+ continue;
48
+ const declaredPin = "declaration" in input && input.section === "resources" && input.declaration.kind === "git"
49
+ && /^(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})$/u.test(input.declaration.ref ?? "");
50
+ const decision = (record) => {
51
+ const usable = recordForInput(record, input);
52
+ const pins = recordPins(usable, input).map((pin) => "landedAt" in pin ? { ...pin, landedAt: normalizeInstant(pin.landedAt) }
53
+ : "cursor" in pin ? { ...pin, cursor: normalizeInstant(pin.cursor) } : pin);
54
+ return canonical({ pin: declaredPin ? "declared-pin" : pins.sort((a, b) => canonical(a).localeCompare(canonical(b))),
55
+ approximateActivation: !declaredPin && pins.some((pin) => "kind" in pin && ["git", "bundle"].includes(pin.kind))
56
+ && recordActivationErrors(usable).length > 0,
57
+ approximateFallback: !record.exact && !hasRecordPin(usable, input) });
58
+ };
59
+ if (matches.some((record) => decision(record) !== decision(matches[0]))) {
60
+ throw new Error(`Conflicting moment records for ${agent} at ${normalizeInstant(at)}: ${input.section} ${input.declaredBy}/${input.id} has different effective pin/fallback decisions`);
61
+ }
62
+ }
63
+ return matches[0];
64
+ };
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ import { type History } from "./history.js";
3
+ /** Daimon's manifest records source identity, not the identity of retained/copied inodes. */
4
+ export declare const snapshotManifestSchema: z.ZodObject<{
5
+ version: z.ZodLiteral<"noopolis.daimon.wake-moment.v1">;
6
+ id: z.ZodString;
7
+ snapshot: z.ZodString;
8
+ started_at: z.ZodISODateTime;
9
+ sourcePath: z.ZodString;
10
+ entries: z.ZodRecord<z.ZodString, z.ZodObject<{
11
+ type: z.ZodEnum<{
12
+ file: "file";
13
+ directory: "directory";
14
+ symlink: "symlink";
15
+ }>;
16
+ mode: z.ZodNumber;
17
+ size: z.ZodString;
18
+ source: z.ZodObject<{
19
+ dev: z.ZodString;
20
+ ino: z.ZodString;
21
+ size: z.ZodString;
22
+ mtimeNs: z.ZodString;
23
+ ctimeNs: z.ZodString;
24
+ mode: z.ZodNumber;
25
+ }, z.core.$strict>;
26
+ target: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strict>>;
28
+ }, z.core.$strict>;
29
+ export type SnapshotManifest = z.infer<typeof snapshotManifestSchema>;
30
+ export declare const snapshotHistoryPath: (agentSlug: string, id: string, snapshot: string) => string;
31
+ export declare const readSnapshotManifest: (history: History, relative: string, id: string, snapshot: string) => Promise<SnapshotManifest | null>;
32
+ interface TreeInspection {
33
+ retained?: boolean;
34
+ readBytes?: (relative: string) => Promise<Buffer>;
35
+ expectedBytes?: (relative: string) => Promise<Buffer>;
36
+ }
37
+ /** No symlink traversal. A separate call inspects the copied tree, independently of the producer. */
38
+ export declare const snapshotTreeFindings: (root: string, manifest: SnapshotManifest, options?: TreeInspection) => Promise<string[]>;
39
+ export declare const snapshotBytes: (history: History, relative: string, name: string) => Promise<Buffer>;
40
+ /** Retained files may be hard-linked to each other; bundle files are always new copies. */
41
+ export declare const copySnapshotTree: (history: History, relative: string, destination: string, manifest: SnapshotManifest) => Promise<void>;
42
+ export {};
@@ -0,0 +1,134 @@
1
+ import { createHash } from "node:crypto";
2
+ import { chmod, lstat, mkdir, readFile, readdir, readlink, symlink, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ import { trainingInstantSchema } from "../../../manifest/index.js";
6
+ import { inside, safeSegment } from "./history.js";
7
+ const unsigned = z.string().regex(/^(?:0|[1-9][0-9]*)$/u);
8
+ const nanos = z.string().regex(/^-?(?:0|[1-9][0-9]*)$/u);
9
+ const mode = z.number().int().min(0).max(0xffff);
10
+ const relativePath = z.string().min(1).refine((value) => !value.includes("\\") && !value.includes("\0")
11
+ && !path.posix.isAbsolute(value) && !value.split("/").some((part) => !part || part === "." || part === ".."), "Snapshot paths must be normalized relative POSIX paths");
12
+ const sourceIdentity = z.object({ dev: unsigned, ino: unsigned, size: unsigned, mtimeNs: nanos, ctimeNs: nanos, mode }).strict();
13
+ const entrySchema = z.object({ type: z.enum(["file", "directory", "symlink"]), mode, size: unsigned,
14
+ source: sourceIdentity, target: z.string().refine((value) => !value.includes("\0")).optional() }).strict().superRefine((entry, ctx) => {
15
+ if ((entry.type === "symlink") !== (entry.target !== undefined))
16
+ ctx.addIssue({ code: "custom", message: "Only snapshot symlinks require a target" });
17
+ if (entry.mode !== entry.source.mode || entry.size !== entry.source.size)
18
+ ctx.addIssue({ code: "custom", message: "Snapshot source identity disagrees with entry metadata" });
19
+ const typeMode = { file: 0o100000, directory: 0o040000, symlink: 0o120000 }[entry.type];
20
+ if ((entry.mode & 0o170000) !== typeMode)
21
+ ctx.addIssue({ code: "custom", message: "Snapshot mode disagrees with entry type" });
22
+ });
23
+ /** Daimon's manifest records source identity, not the identity of retained/copied inodes. */
24
+ export const snapshotManifestSchema = z.object({ version: z.literal("noopolis.daimon.wake-moment.v1"), id: z.string().min(1),
25
+ snapshot: z.string().min(1), started_at: trainingInstantSchema,
26
+ sourcePath: z.string().refine((value) => path.posix.isAbsolute(value) && !value.includes("\0"), "Expected an absolute snapshot sourcePath"),
27
+ entries: z.record(relativePath, entrySchema) }).strict().superRefine((manifest, ctx) => {
28
+ for (const name of Object.keys(manifest.entries)) {
29
+ for (let parent = path.posix.dirname(name); parent !== "."; parent = path.posix.dirname(parent)) {
30
+ if (manifest.entries[parent]?.type !== "directory")
31
+ ctx.addIssue({ code: "custom", message: `Snapshot parent ${parent} must be a recorded directory` });
32
+ }
33
+ }
34
+ });
35
+ export const snapshotHistoryPath = (agentSlug, id, snapshot) => `recording/${safeSegment(agentSlug)}/snapshots/${safeSegment(id === "." || id === ".." ? id.replaceAll(".", "%2E") : id)}/${safeSegment(snapshot)}`;
36
+ export const readSnapshotManifest = async (history, relative, id, snapshot) => {
37
+ // Daimon publishes this marker only after the tree and manifest are durable.
38
+ if (await history.bytes(`${relative}.complete`) === null)
39
+ return null;
40
+ const bytes = await history.text(`${relative}.manifest.json`);
41
+ if (bytes === null)
42
+ return null;
43
+ let manifest;
44
+ try {
45
+ manifest = snapshotManifestSchema.parse(JSON.parse(bytes));
46
+ }
47
+ catch (error) {
48
+ throw new Error(`Invalid snapshot manifest ${relative}.manifest.json: ${error instanceof Error ? error.message : String(error)}`);
49
+ }
50
+ if (manifest.id !== id || manifest.snapshot !== snapshot)
51
+ throw new Error(`Snapshot manifest identity mismatch at ${relative}.manifest.json`);
52
+ return manifest;
53
+ };
54
+ /** No symlink traversal. A separate call inspects the copied tree, independently of the producer. */
55
+ export const snapshotTreeFindings = async (root, manifest, options = {}) => {
56
+ if (!(await lstat(root)).isDirectory())
57
+ throw new Error("Snapshot tree must be a real directory");
58
+ const findings = [], found = new Set();
59
+ const visit = async (relative) => {
60
+ for (const leaf of (await readdir(path.join(root, relative))).sort()) {
61
+ const name = relative ? `${relative}/${leaf}` : leaf, file = path.join(root, name);
62
+ const stat = await lstat(file, { bigint: true }), expected = manifest.entries[name];
63
+ found.add(name);
64
+ const type = stat.isFile() ? "file" : stat.isDirectory() ? "directory" : stat.isSymbolicLink() ? "symlink" : "special";
65
+ if (!expected)
66
+ findings.push(`Unexpected snapshot entry ${name}`);
67
+ else if (type !== expected.type)
68
+ findings.push(`Snapshot type mismatch for ${name}`);
69
+ else {
70
+ // Recorder directories are deliberately 0700. Restore source modes while copying.
71
+ const wantedMode = options.retained && type === "file" ? expected.mode & 0o777 : expected.mode & 0o7777;
72
+ if (!(options.retained && type === "directory") && (Number(stat.mode) & 0o7777) !== wantedMode)
73
+ findings.push(`Snapshot mode mismatch for ${name}`);
74
+ // Directory inode sizes describe source filesystem bookkeeping, not tree content.
75
+ if (type !== "directory" && stat.size.toString() !== expected.size)
76
+ findings.push(`Snapshot size mismatch for ${name}`);
77
+ if (type === "symlink" && await readlink(file) !== expected.target)
78
+ findings.push(`Snapshot symlink target mismatch for ${name}`);
79
+ if (type === "file" && options.expectedBytes) {
80
+ const actual = options.readBytes ? await options.readBytes(name) : await readFile(file);
81
+ const original = await options.expectedBytes(name);
82
+ const digest = (bytes) => createHash("sha256").update(bytes).digest("hex");
83
+ if (digest(actual) !== digest(original))
84
+ findings.push(`Snapshot digest mismatch for ${name}`);
85
+ }
86
+ }
87
+ if (type === "directory")
88
+ await visit(name);
89
+ }
90
+ };
91
+ await visit("");
92
+ for (const name of Object.keys(manifest.entries))
93
+ if (!found.has(name))
94
+ findings.push(`Missing snapshot entry ${name}`);
95
+ return findings;
96
+ };
97
+ export const snapshotBytes = async (history, relative, name) => {
98
+ const bytes = await history.bytes(`${relative}/${name}`);
99
+ if (bytes === null)
100
+ throw new Error(`Missing snapshot entry ${name}`);
101
+ return bytes;
102
+ };
103
+ /** Retained files may be hard-linked to each other; bundle files are always new copies. */
104
+ export const copySnapshotTree = async (history, relative, destination, manifest) => {
105
+ const source = await history.path(relative);
106
+ if (!source)
107
+ throw new Error(`Missing snapshot tree ${relative}`);
108
+ const findings = await snapshotTreeFindings(source, manifest, { retained: true });
109
+ if (findings.length)
110
+ throw new Error(findings.join("; "));
111
+ await mkdir(destination, { recursive: true, mode: 0o700 });
112
+ const entries = Object.entries(manifest.entries).sort(([a], [b]) => a.split("/").length - b.split("/").length || a.localeCompare(b));
113
+ for (const [name, entry] of entries) {
114
+ const target = path.join(destination, name);
115
+ if (entry.type === "directory")
116
+ await mkdir(target, { mode: 0o700 });
117
+ else if (entry.type === "symlink") {
118
+ if (path.isAbsolute(entry.target) || !inside(destination, path.resolve(path.dirname(target), entry.target))) {
119
+ throw new Error(`Snapshot symlink escapes root: ${name}`);
120
+ }
121
+ await symlink(entry.target, target);
122
+ }
123
+ else {
124
+ await writeFile(target, await snapshotBytes(history, relative, name), { flag: "wx" });
125
+ await chmod(target, entry.mode & 0o7777);
126
+ }
127
+ }
128
+ for (const [name, entry] of entries.reverse())
129
+ if (entry.type === "directory")
130
+ await chmod(path.join(destination, name), entry.mode & 0o7777);
131
+ const copied = await snapshotTreeFindings(destination, manifest, { expectedBytes: (name) => snapshotBytes(history, relative, name) });
132
+ if (copied.length)
133
+ throw new Error(copied.join("; "));
134
+ };
@@ -0,0 +1,12 @@
1
+ /** Shared ecosystem range applies to trial instants, not historical source timestamps. */
2
+ export declare const assertTaskClockInstant: (instant: string) => void;
3
+ export declare const createTaskClock: (origin: string) => {
4
+ version: "spawnfile.task-clock.v1";
5
+ origin: string;
6
+ };
7
+ /** Top-level Daimon only: its clock stays real and it derives each child's clock environment. */
8
+ export declare const harnessTaskClockEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
9
+ /** Child/tool wall clock. Trial preparation supplies libfaketime LD_PRELOAD and a dot-decimal locale. */
10
+ export declare const processClockEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
11
+ /** Clock-aware child (e.g. Mneme) without libfaketime: apply the offset inside the process exactly once. */
12
+ export declare const clockAwareEnvironment: (origin: string, anchorEpochMs: number) => Record<string, string>;
@@ -0,0 +1,40 @@
1
+ import { instantNanos, normalizeInstant } from "./instant.js";
2
+ import { taskClockSchema } from "./contract.js";
3
+ /** Shared ecosystem range applies to trial instants, not historical source timestamps. */
4
+ export const assertTaskClockInstant = (instant) => {
5
+ const nanos = instantNanos(instant);
6
+ if (nanos < 0n || nanos > 253402300799999000000n) {
7
+ throw new Error(`Trial instant ${instant} must be within 1970-01-01T00:00:00Z .. 9999-12-31T23:59:59.999Z`);
8
+ }
9
+ };
10
+ const taskOrigin = (origin) => {
11
+ assertTaskClockInstant(origin);
12
+ return normalizeInstant(origin);
13
+ };
14
+ export const createTaskClock = (origin) => taskClockSchema.parse({
15
+ version: "spawnfile.task-clock.v1", origin: taskOrigin(origin)
16
+ });
17
+ const clockOrigin = (origin, anchorEpochMs) => {
18
+ if (!Number.isSafeInteger(anchorEpochMs))
19
+ throw new Error("Task clock anchorEpochMs must be a safe integer");
20
+ return taskOrigin(origin);
21
+ };
22
+ /** Top-level Daimon only: its clock stays real and it derives each child's clock environment. */
23
+ export const harnessTaskClockEnvironment = (origin, anchorEpochMs) => ({
24
+ NOOPOLIS_TASK_CLOCK: JSON.stringify({ version: "noopolis.task-clock.v1", origin: clockOrigin(origin, anchorEpochMs), anchorEpochMs })
25
+ });
26
+ /** Child/tool wall clock. Trial preparation supplies libfaketime LD_PRELOAD and a dot-decimal locale. */
27
+ export const processClockEnvironment = (origin, anchorEpochMs) => {
28
+ const normalized = clockOrigin(origin, anchorEpochMs);
29
+ const offsetMs = BigInt(Date.parse(normalized)) - BigInt(anchorEpochMs);
30
+ const magnitude = offsetMs < 0n ? -offsetMs : offsetMs;
31
+ const fraction = magnitude % 1000n;
32
+ return {
33
+ FAKETIME: `${offsetMs < 0n ? "-" : "+"}${magnitude / 1000n}${fraction ? `.${String(fraction).padStart(3, "0")}` : ""}`,
34
+ FAKETIME_DONT_FAKE_MONOTONIC: "1"
35
+ };
36
+ };
37
+ /** Clock-aware child (e.g. Mneme) without libfaketime: apply the offset inside the process exactly once. */
38
+ export const clockAwareEnvironment = (origin, anchorEpochMs) => ({
39
+ MNEME_CLOCK_ORIGIN: clockOrigin(origin, anchorEpochMs), MNEME_CLOCK_ANCHOR_MS: String(anchorEpochMs)
40
+ });
@@ -0,0 +1,4 @@
1
+ /** Round down to milliseconds so filesystem precision cannot put a stamp after the instant. */
2
+ export declare const stampTree: (root: string, instant: string, at: string) => Promise<void>;
3
+ /** Disk verification reads may update atime. Restore access time without changing verified mtimes. */
4
+ export declare const restoreAccessTimes: (root: string, at: string) => Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { lstat, lutimes, readdir, utimes } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { compareInstants } from "./instant.js";
4
+ /** Round down to milliseconds so filesystem precision cannot put a stamp after the instant. */
5
+ export const stampTree = async (root, instant, at) => {
6
+ const stamp = new Date(compareInstants(instant, at) > 0 ? at : instant);
7
+ const visit = async (file) => {
8
+ const stats = await lstat(file);
9
+ if (stats.isDirectory())
10
+ for (const name of await readdir(file))
11
+ await visit(path.join(file, name));
12
+ await (stats.isSymbolicLink() ? lutimes : utimes)(file, stamp, stamp);
13
+ };
14
+ await visit(root);
15
+ };
16
+ /** Disk verification reads may update atime. Restore access time without changing verified mtimes. */
17
+ export const restoreAccessTimes = async (root, at) => {
18
+ const visit = async (file) => {
19
+ const stats = await lstat(file);
20
+ if (stats.isDirectory())
21
+ for (const name of await readdir(file))
22
+ await visit(path.join(file, name));
23
+ await (stats.isSymbolicLink() ? lutimes : utimes)(file, new Date(Math.min(stats.mtimeMs, Date.parse(at))), new Date(stats.mtimeMs));
24
+ };
25
+ await visit(root);
26
+ };
@@ -0,0 +1,43 @@
1
+ import type { MemoryBank, TeamNetwork, TeamWorkspaceResource } from "../../../manifest/index.js";
2
+ import type { ResolvedMemoryBank } from "../../types.js";
3
+ import type { MaterializedInput } from "./contract.js";
4
+ import type { MomentRecord } from "../../../recording/index.js";
5
+ import type { History } from "./history.js";
6
+ export interface InputIdentity {
7
+ section: "resources" | "memory" | "networks";
8
+ id: string;
9
+ declaredBy: string;
10
+ }
11
+ interface InputBase extends InputIdentity {
12
+ overridden: boolean;
13
+ declarationBase: string;
14
+ }
15
+ export type RewindInput = InputBase & ({
16
+ section: "resources";
17
+ declaration: TeamWorkspaceResource;
18
+ } | {
19
+ section: "memory";
20
+ declaration: MemoryBank | ResolvedMemoryBank;
21
+ } | {
22
+ section: "networks";
23
+ declaration: TeamNetwork;
24
+ });
25
+ export interface InputContext {
26
+ input: RewindInput;
27
+ at: string;
28
+ agentSlug?: string;
29
+ agentId?: string;
30
+ record: MomentRecord | null;
31
+ candidateRecords?: readonly MomentRecord[];
32
+ history: History | undefined;
33
+ destination: string;
34
+ }
35
+ export interface InputResult {
36
+ fidelity: "exact" | "approximate" | "overridden";
37
+ basis: string;
38
+ source: MaterializedInput["source"];
39
+ notes: string[];
40
+ instant: string;
41
+ build?: "deferred";
42
+ }
43
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ import { type History } from "./history.js";
2
+ import { type SnapshotManifest } from "./snapshotManifest.js";
3
+ import type { InputContext, InputResult } from "./types.js";
4
+ export interface SelectedVolumeSnapshot {
5
+ snapshot: string;
6
+ startedAt: string;
7
+ manifest: SnapshotManifest;
8
+ relative: string;
9
+ }
10
+ /** A published row plus retained directory and manifest is complete; never infer time from its name. */
11
+ export declare const selectVolumeSnapshot: (history: History, agentSlug: string, agentId: string, id: string, at: string, recordId?: string) => Promise<SelectedVolumeSnapshot>;
12
+ export declare const materializeVolume: (context: InputContext) => Promise<InputResult>;
@@ -0,0 +1,58 @@
1
+ import { lstat, mkdir } from "node:fs/promises";
2
+ import { safeSegment } from "./history.js";
3
+ import { compareInstants } from "./instant.js";
4
+ import { copySnapshotTree, readSnapshotManifest, snapshotHistoryPath } from "./snapshotManifest.js";
5
+ /** A published row plus retained directory and manifest is complete; never infer time from its name. */
6
+ export const selectVolumeSnapshot = async (history, agentSlug, agentId, id, at, recordId) => {
7
+ const rowsPath = `recording/${safeSegment(agentSlug)}/wake-moments.jsonl`;
8
+ const rows = await history.wakeMoments(rowsPath);
9
+ if (!rows)
10
+ throw new Error(`Missing volume snapshot history ${rowsPath}`);
11
+ const candidates = rows.flatMap((row, index) => row.agent_id !== agentId ? [] : row.snapshots.filter((entry) => entry.id === id)
12
+ .map((entry) => ({ row, entry, index })))
13
+ .filter(({ row, entry }) => recordId === undefined ? compareInstants(row.started_at, at) <= 0 : entry.snapshot === recordId)
14
+ .sort((a, b) => compareInstants(b.row.started_at, a.row.started_at) || b.index - a.index);
15
+ for (const { row, entry } of candidates) {
16
+ if (entry.snapshot.endsWith(".partial")) {
17
+ if (recordId !== undefined)
18
+ throw new Error(`Recorded volume snapshot ${recordId} is partial`);
19
+ continue;
20
+ }
21
+ if (compareInstants(row.started_at, at) > 0)
22
+ throw new Error(`Recorded volume snapshot ${entry.snapshot} is later than the moment`);
23
+ const relative = snapshotHistoryPath(agentSlug, id, entry.snapshot), tree = await history.path(relative);
24
+ const manifest = await readSnapshotManifest(history, relative, id, entry.snapshot);
25
+ if (!tree || !manifest) {
26
+ if (recordId !== undefined)
27
+ throw new Error(`Recorded volume snapshot ${recordId} is incomplete`);
28
+ continue;
29
+ }
30
+ if (!(await lstat(tree)).isDirectory())
31
+ throw new Error(`Snapshot tree must be a real directory: ${relative}`);
32
+ if (compareInstants(manifest.started_at, row.started_at) !== 0)
33
+ throw new Error(`Snapshot manifest started_at disagrees with its wake row: ${relative}`);
34
+ return { snapshot: entry.snapshot, startedAt: row.started_at, manifest, relative };
35
+ }
36
+ if (recordId !== undefined)
37
+ throw new Error(`Recorded volume snapshot ${recordId} is absent from ${rowsPath}`);
38
+ throw new Error("No complete volume snapshot was taken at or before the moment");
39
+ };
40
+ export const materializeVolume = async (context) => {
41
+ const { input, at, record, history, destination } = context;
42
+ if (input.section !== "resources" || input.declaration.kind !== "volume" || input.declaration.feed) {
43
+ throw new Error("Volume materialization requires an unfed volume input");
44
+ }
45
+ if (input.overridden) {
46
+ await mkdir(destination, { recursive: true });
47
+ return { fidelity: "overridden", basis: "override", source: {}, notes: [], instant: at };
48
+ }
49
+ if (!history)
50
+ throw new Error(`Volume ${input.id} requires --history or an override`);
51
+ if (!context.agentSlug || !context.agentId)
52
+ throw new Error("Volume snapshots require the compiled agent slug and identity");
53
+ const pin = record?.volumes.find((entry) => entry.id === input.id);
54
+ const selected = await selectVolumeSnapshot(history, context.agentSlug, context.agentId, input.id, at, pin?.snapshot);
55
+ await copySnapshotTree(history, selected.relative, destination, selected.manifest);
56
+ return { fidelity: pin ? "exact" : "approximate", basis: pin ? "record" : "snapshot-at",
57
+ source: { snapshot: selected.snapshot, agentSlug: context.agentSlug }, notes: [], instant: selected.startedAt };
58
+ };
@@ -0,0 +1,7 @@
1
+ /** Exact IDs win; a short authored name must identify exactly one graph node. */
2
+ export declare const selectTrainingAgent: <T extends {
3
+ id: string;
4
+ value: {
5
+ name: string;
6
+ };
7
+ }>(agents: readonly T[], selector: string | undefined) => T;
@@ -0,0 +1,15 @@
1
+ import { SpawnfileError } from "../../shared/index.js";
2
+ /** Exact IDs win; a short authored name must identify exactly one graph node. */
3
+ export const selectTrainingAgent = (agents, selector) => {
4
+ const exact = agents.find(agent => agent.id === selector);
5
+ if (exact)
6
+ return exact;
7
+ const matches = selector === undefined ? agents : selector.includes(":") ? []
8
+ : agents.filter(agent => agent.value.name === selector || agent.id.slice("agent:".length) === selector);
9
+ if (matches.length === 1)
10
+ return matches[0];
11
+ throw new SpawnfileError("validation_error", selector === undefined
12
+ ? "Training requires --agent when the project does not contain exactly one agent"
13
+ : matches.length > 1 ? `Ambiguous training agent ${selector}; use an exact node id: ${matches.map(agent => agent.id).sort().join(", ")}`
14
+ : `No canonical agent matches ${selector}`);
15
+ };
@@ -1,6 +1,7 @@
1
- import { AgentSchedule, ExecutionBlock, McpServer, MemoryConsolidation, MemoryRetention, ModelEndpoint, Secret, TeamNetworkServer, type ExternalParticipantService } from "../manifest/index.js";
1
+ import { AgentSchedule, ExecutionBlock, McpServer, SharedMcpServer, MemoryConsolidation, MemoryRetention, ModelEndpoint, ModelTarget, Secret, TeamNetworkServer, type ExternalParticipantService } from "../manifest/index.js";
2
2
  import { ModelAuthMethod, StringMap } from "../shared/index.js";
3
3
  import type { ResolvedWorkspaceResource } from "./workspaceResources.js";
4
+ import type { ResolvedTraining } from "./training/resolution.js";
4
5
  import type { ResolvedExternalParticipant, ResolvedOrganizationIdentity } from "./organizationIdentity.js";
5
6
  export interface ResolvedDocument {
6
7
  content: string;
@@ -198,7 +199,7 @@ export interface EffectiveModelTarget {
198
199
  endpoint?: ModelEndpoint;
199
200
  name: string;
200
201
  provider: string;
201
- reasoningEffort?: "high" | "low" | "medium";
202
+ reasoningEffort?: ModelTarget["reasoning_effort"];
202
203
  }
203
204
  export interface ResolvedSubagentRef {
204
205
  id: string;
@@ -232,6 +233,7 @@ export interface ResolvedAgentNode {
232
233
  subagents: ResolvedSubagentRef[];
233
234
  memory?: ResolvedMemoryBank[];
234
235
  memoryAccess?: ResolvedMemoryAccess[];
236
+ training?: ResolvedTraining;
235
237
  workspaceResources?: ResolvedWorkspaceResource[];
236
238
  }
237
239
  export interface ResolvedTeamNode {
@@ -251,12 +253,13 @@ export interface ResolvedTeamNode {
251
253
  workspaceResources?: ResolvedWorkspaceResource[];
252
254
  shared: {
253
255
  env: StringMap;
254
- mcpServers: McpServer[];
256
+ mcpServers: SharedMcpServer[];
255
257
  secrets: Secret[];
256
258
  skills: ResolvedSkill[];
257
259
  packages?: ResolvedPackage[];
258
260
  };
259
261
  memory?: ResolvedMemoryBank[];
262
+ training?: ResolvedTraining;
260
263
  source: string;
261
264
  }
262
265
  export interface CompilePlanEdge {
@@ -27,6 +27,7 @@ export interface UpProjectOptions extends CompileProjectOptions {
27
27
  imageTag?: string;
28
28
  lifecycleRecovery?: UpLifecycleRecovery;
29
29
  runRunner?: DockerRunRunner;
30
+ now?: () => Date;
30
31
  onDetachedReservation?: (authority: {
31
32
  containerName: string;
32
33
  deploymentLabels: Readonly<Record<string, string>>;
@@ -1,6 +1,6 @@
1
1
  import path from "node:path";
2
- import { rm } from "node:fs/promises";
3
- import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
2
+ import { readFile, rm } from "node:fs/promises";
3
+ import { createOrganizationReadinessPending, createDockerDeploymentRecord, probeDockerOrganizationReadiness, readDeploymentRecord, recordDeploymentRollback, resolveDockerDeploymentTarget, resolveDeploymentRecordPath, writeDeploymentRecord, writeDockerDeploymentRecordForRun, } from "../deployment/index.js";
4
4
  import { buildProject } from "./buildProject.js";
5
5
  import { createDockerRunInvocation, resolveDetachedDeploymentOptions, runDockerContainer } from "./runProject.js";
6
6
  import { executeDockerRunWithSupportCleanup } from "./runProjectLifecycle.js";
@@ -13,7 +13,7 @@ import { resolveHostCliCredential } from "./runProjectAuth.js";
13
13
  import { defaultDockerTargetExecFile } from "../target/dockerTargetExecFile.js";
14
14
  import { compileOrganizationHandoff, executeOrganizationHandoff, organizationHandoffInputError, resolveRequestedOrganizationHandoff, verifyRequestedOrganizationHandoffTarget, } from "./upProjectHandoff.js";
15
15
  const stableRecord = (record) => {
16
- const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, ...stable } = record;
16
+ const { created_at: _createdAt, export_index: _exportIndex, organization_ready: _organizationReady, activated_at: _activatedAt, activation_exact: _activationExact, activation_note: _activationNote, resource_snapshot: _snapshot, recording: _recording, ...stable } = record;
17
17
  return stable;
18
18
  };
19
19
  const canonicalJson = (value) => {
@@ -102,6 +102,15 @@ export const upProject = async (inputPath, options = {}) => {
102
102
  await started({ ...result, containerId: result.containerId, containerName: result.containerName, imageId: result.imageId, deploymentLabels: result.deploymentLabels });
103
103
  };
104
104
  }
105
+ let activation = {};
106
+ const recordingRunner = async (runInvocation) => {
107
+ if (buildResult.report.recording && invocation.detach && invocation.deploymentName) {
108
+ const hasPredecessor = await fileExists(resolveDeploymentRecordPath(buildResult.outputDirectory, invocation.deploymentName));
109
+ activation = { activated_at: (options.now ?? (() => new Date()))().toISOString(), activation_exact: !hasPredecessor,
110
+ ...(hasPredecessor ? { activation_note: "Project up does not stop or drain the previous container; turns may overlap" } : {}) };
111
+ }
112
+ return (options.runRunner ?? runDockerContainer)(runInvocation);
113
+ };
105
114
  let deploymentRecordPath;
106
115
  if (handoff) {
107
116
  const executed = await executeOrganizationHandoff({
@@ -110,7 +119,7 @@ export const upProject = async (inputPath, options = {}) => {
110
119
  invocation,
111
120
  lifecycleRecovery: options.lifecycleRecovery,
112
121
  onDetachedReservation: options.onDetachedReservation,
113
- runRunner: options.runRunner ?? runDockerContainer,
122
+ runRunner: recordingRunner,
114
123
  targetExecFile: options.targetExecFile,
115
124
  });
116
125
  const { organizationHandoffHandle, runMetadata } = executed;
@@ -152,6 +161,8 @@ export const upProject = async (inputPath, options = {}) => {
152
161
  else {
153
162
  deploymentRecordPath = invocation.detach && invocation.deploymentName
154
163
  ? await writeDockerDeploymentRecordForRun({
164
+ previousRecord: resolvedOptions.previousRecord,
165
+ ...activation,
155
166
  authProfileName: authProfile?.name ?? null,
156
167
  envFilePath: resolvedOptions.envFilePath,
157
168
  imageTag,
@@ -181,9 +192,11 @@ export const upProject = async (inputPath, options = {}) => {
181
192
  });
182
193
  }
183
194
  dockerLifecycleInvoked = true;
184
- const runMetadata = await executeDockerRunWithSupportCleanup(invocation, options.runRunner ?? runDockerContainer);
195
+ const runMetadata = await executeDockerRunWithSupportCleanup(invocation, recordingRunner);
185
196
  deploymentRecordPath = invocation.detach && invocation.deploymentName
186
197
  ? await writeDockerDeploymentRecordForRun({
198
+ previousRecord: resolvedOptions.previousRecord,
199
+ ...activation,
187
200
  authProfileName: authProfile?.name ?? null,
188
201
  envFilePath: resolvedOptions.envFilePath,
189
202
  imageTag,
@@ -227,6 +240,9 @@ export const upProject = async (inputPath, options = {}) => {
227
240
  : invocation.dockerHost ? ["--host", invocation.dockerHost] : [];
228
241
  await (options.targetExecFile ?? defaultDockerTargetExecFile)(invocation.command, [...prefix, "container", "rm", "--force", reference], { timeout: 30_000 });
229
242
  }
243
+ if (buildResult.report.recording) {
244
+ await recordDeploymentRollback(deploymentRecordPath, record, buildResult.report, record.resource_snapshot ? "" : await readFile(buildResult.reportPath, "utf8"), (options.now ?? (() => new Date()))().toISOString());
245
+ }
230
246
  await rm(invocation.supportDirectory, { recursive: true, force: true });
231
247
  await rm(deploymentRecordPath, { force: true });
232
248
  throw new SpawnfileError("runtime_error", "Detached deployment failed organization readiness and was rolled back");
@@ -1,3 +1,18 @@
1
1
  import type { CompilePlan } from "./types.js";
2
2
  export declare const validateWorkspaceBundleTar: (bytes: Buffer) => void;
3
- export declare const stageWorkspaceBundles: (outputDirectory: string, plan: CompilePlan) => Promise<boolean>;
3
+ export declare const workspaceBundleContextPath: (outputDirectory: string, identity: string) => string;
4
+ /**
5
+ * Hard-links a read-only cached archive into the Docker context (cloning or
6
+ * copying across filesystems). Never writes through an existing name: with
7
+ * `clean: false` it may already be a link into the cache. Returns the staged
8
+ * path, or undefined when the cached archive no longer exists.
9
+ */
10
+ export declare const linkBuiltBundle: (archive: string, outputDirectory: string, identity: string) => Promise<string | undefined>;
11
+ /**
12
+ * Completes the bundle archives in the Docker context. Built bundles were
13
+ * already linked by `resolveWorkspaceBundles` (`built` maps their digests to
14
+ * the staged path). Every `source` tar is hashed, validated and staged from
15
+ * the exact bytes that were verified, even when a built bundle shares its
16
+ * digest; distinct source paths with identical bytes stage once.
17
+ */
18
+ export declare const stageWorkspaceBundles: (outputDirectory: string, plan: CompilePlan, built?: ReadonlyMap<string, string>) => Promise<boolean>;