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,38 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createDockerProbeGateway, dockerContextNameForTarget, inspectDockerDeployment } from "../deployment/index.js";
3
+ import { SpawnfileError } from "../shared/index.js";
4
+ import { resolveFeedStateDirectory } from "../volume/index.js";
5
+ import { readRecordingFeedHistory } from "./history.js";
6
+ import { syncMomentRecords } from "./sync.js";
7
+ export const syncDeploymentMoments = async (options, handlers = {}) => {
8
+ const { record, recordPath } = options;
9
+ if (record.recording && !record.recording.agents) {
10
+ throw new SpawnfileError("runtime_error", "Deployment predates compiled recording facts; recompile and redeploy before record sync");
11
+ }
12
+ const agents = record.recording?.agents ?? [];
13
+ if (!agents.length)
14
+ return { written: 0, skipped: 0, nonExact: 0, failures: [], warnings: [] };
15
+ const inspections = await (handlers.inspectDockerDeployment ?? inspectDockerDeployment)(record, {
16
+ dockerCommand: options.dockerCommand, timeoutMs: options.timeoutMs
17
+ });
18
+ const gatewayFor = handlers.createDockerProbeGateway ?? createDockerProbeGateway;
19
+ const context = dockerContextNameForTarget(record.target);
20
+ const dockerTarget = context ? ["--context", context] : record.target.kind === "host" ? ["--host", record.target.value] : [];
21
+ return syncMomentRecords({
22
+ recordPath, agents, now: handlers.now,
23
+ execForAgent: (agent) => {
24
+ const units = record.units.filter((unit) => unit.contains.some((entry) => entry.kind === "agent" && entry.id === agent.node_id));
25
+ if (units.length !== 1)
26
+ throw new Error(`Expected one deployment unit for ${agent.node_id}, found ${units.length}`);
27
+ const unit = units[0], inspection = inspections.get(unit.id);
28
+ if (inspection?.running !== true)
29
+ throw new Error(`Container ${unit.id} is stopped or unreachable`);
30
+ const gateway = gatewayFor(record, unit, { inspection, dockerCommand: options.dockerCommand, timeoutMs: options.timeoutMs });
31
+ return (command) => gateway.exec(command);
32
+ },
33
+ readFeedHistory: handlers.readFeedHistory ?? (async (feed) => {
34
+ const state = resolveFeedStateDirectory(feed.volume_name, { exec: (_command, args) => execFileSync(options.dockerCommand ?? "docker", [...dockerTarget, ...args], { timeout: options.timeoutMs ?? 30_000, maxBuffer: 1024 * 1024 }) });
35
+ return readRecordingFeedHistory(state, (handlers.now ?? (() => new Date()))());
36
+ })
37
+ });
38
+ };
@@ -0,0 +1,16 @@
1
+ import { type DeployResources } from "../deployment/index.js";
2
+ import type { RecordingAgentReport } from "../report/index.js";
3
+ import { type FeedLanding } from "../volume/index.js";
4
+ export interface RecordingHistory<T> {
5
+ entries: T[];
6
+ errors: string[];
7
+ publicationPending?: true;
8
+ }
9
+ export declare const readRecordingDeployHistory: (recordPath: string) => Promise<RecordingHistory<DeployResources>>;
10
+ export declare const readRecordingFeedHistory: (stateDir: string, now: Date) => RecordingHistory<FeedLanding>;
11
+ /** Absence is unknown evidence, even for agents with no resource pins. Never use today's facts. */
12
+ export declare const recordingHistoryAt: (entries: readonly DeployResources[], recordPath: string, startedAt: string, agentNodeId: string) => {
13
+ deployment: DeployResources | null;
14
+ agent?: RecordingAgentReport;
15
+ errors: string[];
16
+ };
@@ -0,0 +1,47 @@
1
+ import { acquirePidLock, deployResourcesAt, readDeployResources, reconcileDeploymentResources } from "../deployment/index.js";
2
+ import { acquireFeedLock, ensureFeedLanding, readFeedLanded, readFeedLandings } from "../volume/index.js";
3
+ export const readRecordingDeployHistory = async (recordPath) => {
4
+ try {
5
+ const release = await acquirePidLock(`${recordPath}.resource-log.lock`);
6
+ try {
7
+ await reconcileDeploymentResources(recordPath);
8
+ return readDeployResources(recordPath);
9
+ }
10
+ finally {
11
+ await release();
12
+ }
13
+ }
14
+ catch {
15
+ return { ...readDeployResources(recordPath), publicationPending: true };
16
+ }
17
+ };
18
+ export const readRecordingFeedHistory = (stateDir, now) => {
19
+ try {
20
+ const lock = acquireFeedLock(stateDir);
21
+ if (!lock)
22
+ throw new Error("Feed history publication pending");
23
+ try {
24
+ const { record, reason } = readFeedLanded(stateDir);
25
+ if (!record?.recording || reason)
26
+ throw new Error(reason ?? "Missing authoritative feed recording");
27
+ ensureFeedLanding({ stateDir }, record, now);
28
+ return readFeedLandings(stateDir);
29
+ }
30
+ finally {
31
+ lock.release();
32
+ }
33
+ }
34
+ catch {
35
+ return { ...readFeedLandings(stateDir), publicationPending: true };
36
+ }
37
+ };
38
+ /** Absence is unknown evidence, even for agents with no resource pins. Never use today's facts. */
39
+ export const recordingHistoryAt = (entries, recordPath, startedAt, agentNodeId) => {
40
+ const deployment = deployResourcesAt(entries, recordPath, startedAt, agentNodeId);
41
+ if (!deployment)
42
+ return { deployment, errors: [`Missing deployment history at ${startedAt}`] };
43
+ const agents = deployment.recording_agents?.filter((agent) => agent.node_id === agentNodeId) ?? [];
44
+ return agents.length === 1 ? { deployment, agent: agents[0], errors: [] } : {
45
+ deployment, errors: [`${agents.length ? "Ambiguous" : "Missing"} activation recording facts for ${agentNodeId} at ${startedAt}`]
46
+ };
47
+ };
@@ -0,0 +1,9 @@
1
+ export * from "./types.js";
2
+ export * from "./moment.js";
3
+ export * from "./compose.js";
4
+ export * from "./parse.js";
5
+ export * from "./store.js";
6
+ export * from "./sync.js";
7
+ export * from "./deployment.js";
8
+ export * from "./history.js";
9
+ export * from "./read.js";
@@ -0,0 +1,9 @@
1
+ export * from "./types.js";
2
+ export * from "./moment.js";
3
+ export * from "./compose.js";
4
+ export * from "./parse.js";
5
+ export * from "./store.js";
6
+ export * from "./sync.js";
7
+ export * from "./deployment.js";
8
+ export * from "./history.js";
9
+ export * from "./read.js";
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ export declare const recordedSha256Schema: z.ZodString;
3
+ export declare const recordedCommitSchema: z.ZodString;
4
+ export declare const momentRecordSchema: z.ZodObject<{
5
+ version: z.ZodLiteral<"spawnfile.moment-record.v1">;
6
+ agent: z.ZodString;
7
+ wake: z.ZodObject<{
8
+ at: z.ZodISODateTime;
9
+ startedAt: z.ZodISODateTime;
10
+ executionId: z.ZodString;
11
+ deliveries: z.ZodArray<z.ZodObject<{
12
+ deliveryId: z.ZodString;
13
+ kind: z.ZodString;
14
+ occurredAt: z.ZodISODateTime;
15
+ }, z.core.$strict>>;
16
+ surface: z.ZodOptional<z.ZodLiteral<"moltnet">>;
17
+ room: z.ZodOptional<z.ZodString>;
18
+ from: z.ZodOptional<z.ZodString>;
19
+ messageId: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strict>;
21
+ recordedAt: z.ZodISODateTime;
22
+ exact: z.ZodBoolean;
23
+ errors: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
+ resources: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
25
+ id: z.ZodString;
26
+ kind: z.ZodLiteral<"git">;
27
+ commit: z.ZodString;
28
+ sha256: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strict>, z.ZodObject<{
30
+ id: z.ZodString;
31
+ kind: z.ZodLiteral<"bundle">;
32
+ sha256: z.ZodString;
33
+ }, z.core.$strict>], "kind">>;
34
+ feeds: z.ZodArray<z.ZodObject<{
35
+ id: z.ZodString;
36
+ revision: z.ZodString;
37
+ tree: z.ZodString;
38
+ commit: z.ZodOptional<z.ZodString>;
39
+ ref: z.ZodOptional<z.ZodString>;
40
+ paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ landedAt: z.ZodISODateTime;
42
+ period: z.ZodOptional<z.ZodString>;
43
+ }, z.core.$strict>>;
44
+ memory: z.ZodArray<z.ZodObject<{
45
+ id: z.ZodString;
46
+ declaredBy: z.ZodString;
47
+ seq: z.ZodNumber;
48
+ generation: z.ZodOptional<z.ZodNumber>;
49
+ }, z.core.$strict>>;
50
+ moltnet: z.ZodArray<z.ZodObject<{
51
+ network: z.ZodString;
52
+ cursor: z.ZodISODateTime;
53
+ messageIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
+ }, z.core.$strict>>;
55
+ volumes: z.ZodArray<z.ZodObject<{
56
+ id: z.ZodString;
57
+ snapshot: z.ZodString;
58
+ }, z.core.$strict>>;
59
+ }, z.core.$strict>;
60
+ export type MomentRecord = z.infer<typeof momentRecordSchema>;
61
+ export declare const parseMomentRecord: (payload: string) => MomentRecord;
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ import { trainingInstantSchema } from "../manifest/index.js";
3
+ import { MOMENT_RECORD_VERSION } from "./types.js";
4
+ const text = z.string().min(1);
5
+ const count = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
6
+ export const recordedSha256Schema = z.string().regex(/^sha256:[a-f0-9]{64}$/u);
7
+ export const recordedCommitSchema = z.string()
8
+ .regex(/^(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})$/u, "Expected a full 40- or 64-hex commit object id")
9
+ .toLowerCase();
10
+ const unique = (schema, key) => z.array(schema).superRefine((items, context) => {
11
+ const keys = new Set();
12
+ items.forEach((item, index) => {
13
+ const id = key(item);
14
+ if (keys.has(id))
15
+ context.addIssue({ code: "custom", message: `Duplicate identity ${id}`, path: [index] });
16
+ keys.add(id);
17
+ });
18
+ });
19
+ export const momentRecordSchema = z.object({
20
+ version: z.literal(MOMENT_RECORD_VERSION), agent: text,
21
+ wake: z.object({ at: trainingInstantSchema, startedAt: trainingInstantSchema, executionId: text,
22
+ deliveries: z.array(z.object({ deliveryId: text, kind: text, occurredAt: trainingInstantSchema }).strict()).min(1),
23
+ surface: z.literal("moltnet").optional(), room: z.string().optional(),
24
+ from: z.string().optional(), messageId: text.optional() }).strict(),
25
+ recordedAt: trainingInstantSchema, exact: z.boolean(), errors: z.array(z.string()).optional(),
26
+ resources: unique(z.discriminatedUnion("kind", [
27
+ z.object({ id: text, kind: z.literal("git"), commit: recordedCommitSchema, sha256: recordedSha256Schema.optional() }).strict(),
28
+ z.object({ id: text, kind: z.literal("bundle"), sha256: recordedSha256Schema }).strict()
29
+ ]), (r) => r.id),
30
+ feeds: unique(z.object({ id: text, revision: text, tree: text, commit: recordedCommitSchema.optional(), ref: text.optional(),
31
+ paths: z.array(text).optional(), landedAt: trainingInstantSchema, period: text.optional() }).strict(), (r) => r.id),
32
+ memory: unique(z.object({ id: text, declaredBy: text, seq: count, generation: count.optional() }).strict(), (r) => JSON.stringify([r.declaredBy, r.id])),
33
+ moltnet: unique(z.object({ network: text, cursor: trainingInstantSchema, messageIds: z.array(text).optional() }).strict(), (r) => r.network),
34
+ volumes: unique(z.object({ id: text, snapshot: text }).strict(), (r) => r.id)
35
+ }).strict();
36
+ export const parseMomentRecord = (payload) => momentRecordSchema.parse(JSON.parse(payload));
@@ -0,0 +1,15 @@
1
+ import { type MemoryLedgerEntry, type WakeMomentRow } from "./types.js";
2
+ export interface RecordingJsonlRead<T> {
3
+ entries: T[];
4
+ errors: string[];
5
+ }
6
+ export interface RecordingJsonlParser<T> {
7
+ write: (chunk: string) => void;
8
+ finish: () => RecordingJsonlRead<T>;
9
+ }
10
+ export declare const createWakeMomentsParser: () => RecordingJsonlParser<WakeMomentRow>;
11
+ export declare const createMemoryLedgerParser: () => RecordingJsonlParser<MemoryLedgerEntry>;
12
+ /** Preserve valid rows and report each malformed line, including a torn final append. */
13
+ export declare const parseWakeMoments: (payload: string) => RecordingJsonlRead<WakeMomentRow>;
14
+ /** Missing/invalid sequence numbers are unknown history; never infer them from line order. */
15
+ export declare const parseMemoryLedger: (payload: string) => RecordingJsonlRead<MemoryLedgerEntry>;
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { WAKE_MOMENT_VERSION } from "./types.js";
3
+ const text = z.string().min(1);
4
+ const instant = z.iso.datetime({ offset: true }).refine((value) => Number.isFinite(Date.parse(value)));
5
+ const count = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
6
+ const snapshot = z.object({
7
+ id: text.regex(/^[A-Za-z0-9._-]{1,128}$/u),
8
+ snapshot: text.regex(/^\d{8}T\d{9}Z-[A-Za-z0-9._-]{1,200}$/u),
9
+ files: count, copied: count, linked: count, skipped: count
10
+ }).strict();
11
+ const wakeMomentSchema = z.object({
12
+ version: z.literal(WAKE_MOMENT_VERSION), agent_id: text, execution_id: text, started_at: instant,
13
+ deliveries: z.array(z.object({
14
+ acceptance_id: text, delivery_id: text, kind: text, occurred_at: instant
15
+ }).strict()).min(1),
16
+ snapshots: z.array(snapshot).max(16).refine((values) => new Set(values.map(({ id }) => id)).size === values.length),
17
+ error: text.max(2048).optional()
18
+ }).strict();
19
+ // Only the public cursor fields are consumed; event contents never enter a moment record.
20
+ const memoryLedgerSchema = z.object({ seq: count.positive(), createdAt: instant });
21
+ const lineParser = (label, schema, maxBytes) => {
22
+ const entries = [], errors = [];
23
+ let pending = "", lineNumber = 0, oversized = false;
24
+ const parseLine = (line) => {
25
+ lineNumber += 1;
26
+ try {
27
+ if (oversized || (maxBytes !== undefined && Buffer.byteLength(line, "utf8") + 1 > maxBytes))
28
+ throw new Error("row size limit");
29
+ entries.push(schema.parse(JSON.parse(line)));
30
+ }
31
+ catch {
32
+ errors.push(`${label} line ${lineNumber}: invalid JSON or entry`);
33
+ }
34
+ oversized = false;
35
+ };
36
+ return {
37
+ write(chunk) {
38
+ const lines = chunk.split("\n");
39
+ for (let index = 0; index < lines.length; index += 1) {
40
+ if (!oversized)
41
+ pending += lines[index];
42
+ if (maxBytes !== undefined && Buffer.byteLength(pending, "utf8") + 1 > maxBytes) {
43
+ oversized = true;
44
+ pending = "";
45
+ }
46
+ if (index < lines.length - 1) {
47
+ parseLine(pending);
48
+ pending = "";
49
+ }
50
+ }
51
+ },
52
+ finish() {
53
+ if (pending || oversized) {
54
+ parseLine(pending);
55
+ pending = "";
56
+ }
57
+ return { entries, errors };
58
+ }
59
+ };
60
+ };
61
+ export const createWakeMomentsParser = () => lineParser("wake moments", wakeMomentSchema, 4_194_304);
62
+ export const createMemoryLedgerParser = () => lineParser("memory ledger", memoryLedgerSchema);
63
+ /** Preserve valid rows and report each malformed line, including a torn final append. */
64
+ export const parseWakeMoments = (payload) => {
65
+ const parser = createWakeMomentsParser();
66
+ parser.write(payload);
67
+ return parser.finish();
68
+ };
69
+ /** Missing/invalid sequence numbers are unknown history; never infer them from line order. */
70
+ export const parseMemoryLedger = (payload) => {
71
+ const parser = createMemoryLedgerParser();
72
+ parser.write(payload);
73
+ return parser.finish();
74
+ };
@@ -0,0 +1,8 @@
1
+ import type { UsageLedgerExec } from "../runtime/usageLedgerRead.js";
2
+ import type { RecordingJsonlParser, RecordingJsonlRead } from "./parse.js";
3
+ /** Each exec response is bounded (base64 adds 1/3); decode UTF-8 across byte boundaries.
4
+ * Pin the initial length/inode so appends cannot make sync chase a growing ledger forever. */
5
+ export declare const readRecordingJsonl: <T>(exec: UsageLedgerExec, file: string, parser: RecordingJsonlParser<T>, chunkBytes?: number) => Promise<RecordingJsonlRead<T> & {
6
+ failure?: string;
7
+ missing?: true;
8
+ }>;
@@ -0,0 +1,61 @@
1
+ import { StringDecoder } from "node:string_decoder";
2
+ import { z } from "zod";
3
+ // Daimon's generated organization image uses its Node standalone base (runtime metadata),
4
+ // and runs the Node daimon-runtime launcher. No optional container executable is required.
5
+ const readChunkScript = `
6
+ const fs = require('node:fs');
7
+ try {
8
+ const fd = fs.openSync(process.argv[1], 'r');
9
+ try {
10
+ const stat = fs.fstatSync(fd);
11
+ if (!stat.isFile()) throw {code:'NOT_REGULAR_FILE'};
12
+ const bytes = Buffer.alloc(Number(process.argv[3]));
13
+ const count = fs.readSync(fd, bytes, 0, bytes.length, Number(process.argv[2]));
14
+ process.stdout.write(JSON.stringify({size:stat.size, identity:stat.dev+':'+stat.ino, data:bytes.subarray(0,count).toString('base64')}));
15
+ } finally { fs.closeSync(fd); }
16
+ } catch (error) {
17
+ if (error.code === 'ENOENT') process.stdout.write('null');
18
+ else { process.stderr.write(String(error.code || 'READ_FAILED')); process.exitCode = 1; }
19
+ }`;
20
+ const chunkSchema = z.object({
21
+ size: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER), identity: z.string().min(1),
22
+ data: z.string().regex(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u)
23
+ }).strict().nullable();
24
+ /** Each exec response is bounded (base64 adds 1/3); decode UTF-8 across byte boundaries.
25
+ * Pin the initial length/inode so appends cannot make sync chase a growing ledger forever. */
26
+ export const readRecordingJsonl = async (exec, file, parser, chunkBytes = 256 * 1024) => {
27
+ const decoder = new StringDecoder("utf8");
28
+ let offset = 0, length, identity;
29
+ try {
30
+ if (!Number.isSafeInteger(chunkBytes) || chunkBytes <= 0 || chunkBytes > 256 * 1024)
31
+ throw new Error("Invalid recording chunk size");
32
+ do {
33
+ const count = Math.min(chunkBytes, length === undefined ? chunkBytes : length - offset);
34
+ const { stdout } = await exec(["node", "-e", readChunkScript, file, String(offset), String(count)]);
35
+ const chunk = chunkSchema.parse(JSON.parse(stdout));
36
+ if (chunk === null) {
37
+ if (length !== undefined)
38
+ throw new Error("Runtime file disappeared during read");
39
+ return { ...parser.finish(), missing: true };
40
+ }
41
+ length ??= chunk.size;
42
+ identity ??= chunk.identity;
43
+ if (identity !== chunk.identity || chunk.size < length)
44
+ throw new Error("Runtime file replaced or truncated during read");
45
+ const bytes = Buffer.from(chunk.data, "base64");
46
+ if (bytes.length > count || bytes.length < Math.min(count, length - offset))
47
+ throw new Error("Incomplete runtime file chunk");
48
+ const bounded = bytes.subarray(0, length - offset);
49
+ parser.write(decoder.write(bounded));
50
+ offset += bounded.length;
51
+ } while (offset < length);
52
+ parser.write(decoder.end());
53
+ return parser.finish();
54
+ }
55
+ catch (error) {
56
+ // The remote script emits codes only. Do not expose raw exec messages or partial stdout.
57
+ const reason = error instanceof Error && /^(?:Invalid recording|Runtime file|Incomplete runtime)/u.test(error.message)
58
+ ? error.message : "Runtime file exec or chunk decoding failed";
59
+ return { entries: [], errors: [], failure: reason };
60
+ }
61
+ };
@@ -0,0 +1,10 @@
1
+ import type { MomentRecord, WakeMomentRow } from "./types.js";
2
+ /** Project records share a directory, so each gets its own state subdirectory. */
3
+ export declare const deploymentMomentsDirectory: (recordPath: string) => string;
4
+ export declare const momentFileName: (row: WakeMomentRow) => string;
5
+ export declare const withMomentStore: <T>(recordPath: string, slug: string, action: (directory: string) => Promise<T>) => Promise<T>;
6
+ /** Caller holds the store lock. Existing records are never replaced, including non-exact ones. */
7
+ export declare const writeMomentRecord: (directory: string, record: MomentRecord, row: WakeMomentRow) => Promise<boolean>;
8
+ export declare const newestMomentInstant: (directory: string, agentId: string) => Promise<number>;
9
+ /** Retention reads the recorded instant, never mtime; preserve all newest-instant ties. */
10
+ export declare const pruneMomentRecords: (directory: string, agentId: string, now: Date, keepMs: number) => Promise<void>;
@@ -0,0 +1,94 @@
1
+ import { createHash } from "node:crypto";
2
+ import { lstat, mkdir, readFile, readdir, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { acquirePidLock } from "../deployment/pidLock.js";
5
+ import { syncDirectory, writeDurableFile } from "../filesystem/index.js";
6
+ /** Project records share a directory, so each gets its own state subdirectory. */
7
+ export const deploymentMomentsDirectory = (recordPath) => path.join(path.dirname(recordPath), ...(path.basename(recordPath) === "record.json" ? [] : [path.basename(recordPath, ".json")]), "moments");
8
+ /** JSON object keys are sorted recursively; array order and all row values remain significant. */
9
+ const canonicalJson = (value) => {
10
+ if (Array.isArray(value))
11
+ return `[${value.map(canonicalJson).join(",")}]`;
12
+ if (value !== null && typeof value === "object")
13
+ return `{${Object.entries(value)
14
+ .filter(([, entry]) => entry !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)
15
+ .map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(",")}}`;
16
+ return JSON.stringify(value);
17
+ };
18
+ export const momentFileName = (row) => {
19
+ const { started_at: startedAt, execution_id: executionId } = row;
20
+ const compact = new Date(startedAt).toISOString().replace(/[-:.]/gu, "");
21
+ const safeId = /^[A-Za-z0-9._-]{1,128}$/u.test(executionId)
22
+ ? executionId : `sha256-${createHash("sha256").update(executionId).digest("hex")}`;
23
+ const attempt = createHash("sha256").update(canonicalJson(row)).digest("hex").slice(0, 12);
24
+ return `${compact}-${safeId}-${attempt}.json`;
25
+ };
26
+ const ensurePrivateDirectory = async (directory) => {
27
+ await mkdir(directory, { recursive: true, mode: 0o700 });
28
+ const stat = await lstat(directory);
29
+ if (!stat.isDirectory() || stat.isSymbolicLink())
30
+ throw new Error(`Moment directory is not a real directory: ${directory}`);
31
+ };
32
+ export const withMomentStore = async (recordPath, slug, action) => {
33
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(slug))
34
+ throw new Error("Unsafe recording agent slug");
35
+ const root = deploymentMomentsDirectory(recordPath);
36
+ await ensurePrivateDirectory(root);
37
+ const directory = path.join(root, slug);
38
+ await ensurePrivateDirectory(directory);
39
+ const release = await acquirePidLock(path.join(directory, ".sync.lock"));
40
+ try {
41
+ return await action(directory);
42
+ }
43
+ finally {
44
+ await release();
45
+ }
46
+ };
47
+ /** Caller holds the store lock. Existing records are never replaced, including non-exact ones. */
48
+ export const writeMomentRecord = async (directory, record, row) => {
49
+ const file = path.join(directory, momentFileName(row));
50
+ try {
51
+ const stat = await lstat(file);
52
+ if (!stat.isFile() || stat.isSymbolicLink())
53
+ throw new Error(`Moment is not a regular file: ${file}`);
54
+ const existing = JSON.parse(await readFile(file, "utf8"));
55
+ if (existing.agent !== record.agent || existing.wake?.executionId !== record.wake.executionId
56
+ || existing.wake?.startedAt !== record.wake.startedAt)
57
+ throw new Error(`Moment filename collision: ${file}`);
58
+ return false;
59
+ }
60
+ catch (error) {
61
+ if (error.code !== "ENOENT")
62
+ throw error;
63
+ }
64
+ await writeDurableFile(file, `${JSON.stringify(record, null, 2)}\n`);
65
+ return true;
66
+ };
67
+ const storedMoments = async (directory, agentId) => {
68
+ const candidates = [];
69
+ for (const name of (await readdir(directory)).sort()) {
70
+ if (!name.endsWith(".json"))
71
+ continue;
72
+ const file = path.join(directory, name), stat = await lstat(file);
73
+ if (!stat.isFile() || stat.isSymbolicLink())
74
+ throw new Error(`Moment is not a regular file: ${file}`);
75
+ const record = JSON.parse(await readFile(file, "utf8"));
76
+ const started = Date.parse(record.wake?.startedAt);
77
+ if (record.version !== "spawnfile.moment-record.v1" || record.agent !== agentId || !Number.isFinite(started)) {
78
+ throw new Error(`Invalid retained moment: ${file}`);
79
+ }
80
+ candidates.push({ file, started });
81
+ }
82
+ return candidates;
83
+ };
84
+ export const newestMomentInstant = async (directory, agentId) => (await storedMoments(directory, agentId)).reduce((latest, item) => Math.max(latest, item.started), -Infinity);
85
+ /** Retention reads the recorded instant, never mtime; preserve all newest-instant ties. */
86
+ export const pruneMomentRecords = async (directory, agentId, now, keepMs) => {
87
+ const candidates = await storedMoments(directory, agentId);
88
+ const newest = candidates.reduce((latest, item) => Math.max(latest, item.started), -Infinity);
89
+ const expired = candidates.filter((item) => item.started < newest && item.started < now.getTime() - keepMs);
90
+ for (const item of expired)
91
+ await unlink(item.file);
92
+ if (expired.length)
93
+ await syncDirectory(directory);
94
+ };
@@ -0,0 +1,24 @@
1
+ import { type DeployResources } from "../deployment/index.js";
2
+ import type { RecordingAgentReport } from "../report/index.js";
3
+ import type { UsageLedgerExec } from "../runtime/usageLedgerRead.js";
4
+ import type { FeedLanding } from "../volume/index.js";
5
+ import { type RecordingHistory } from "./history.js";
6
+ export interface SyncMomentRecordsOptions {
7
+ recordPath: string;
8
+ agents: readonly RecordingAgentReport[];
9
+ execForAgent: (agent: RecordingAgentReport) => UsageLedgerExec;
10
+ readFeedHistory: (feed: RecordingAgentReport["feeds"][number]) => Promise<RecordingHistory<FeedLanding>>;
11
+ readDeployHistory?: (recordPath: string) => RecordingHistory<DeployResources> | Promise<RecordingHistory<DeployResources>>;
12
+ readChunkBytes?: number;
13
+ now?: () => Date;
14
+ }
15
+ export interface SyncMomentRecordsResult {
16
+ written: number;
17
+ skipped: number;
18
+ nonExact: number;
19
+ /** Operational errors cause nonzero exit; data errors only qualify exactness. */
20
+ failures: string[];
21
+ warnings: string[];
22
+ }
23
+ /** Artifact egress only. No turn, snapshot copy, network-history fetch, or source resolution. */
24
+ export declare const syncMomentRecords: (options: SyncMomentRecordsOptions) => Promise<SyncMomentRecordsResult>;
@@ -0,0 +1,126 @@
1
+ import path from "node:path";
2
+ import { deployResourcesAt } from "../deployment/index.js";
3
+ import { composeMomentRecord } from "./compose.js";
4
+ import { readRecordingDeployHistory, recordingHistoryAt } from "./history.js";
5
+ import { createMemoryLedgerParser, createWakeMomentsParser } from "./parse.js";
6
+ import { readRecordingJsonl } from "./read.js";
7
+ import { newestMomentInstant, pruneMomentRecords, withMomentStore, writeMomentRecord } from "./store.js";
8
+ /** Artifact egress only. No turn, snapshot copy, network-history fetch, or source resolution. */
9
+ export const syncMomentRecords = async (options) => {
10
+ const result = { written: 0, skipped: 0, nonExact: 0, failures: [], warnings: [] };
11
+ if (!options.agents.length)
12
+ return result;
13
+ const now = (options.now ?? (() => new Date()))();
14
+ if (!Number.isFinite(now.getTime()))
15
+ throw new Error("Recording requires a valid clock");
16
+ const deploy = await (options.readDeployHistory ?? readRecordingDeployHistory)(options.recordPath);
17
+ const deployTail = deploy.entries.at(-1);
18
+ const deployPendingSince = deployTail ? Date.parse(deployTail.activated_at) : -Infinity;
19
+ const currentDeployment = deployResourcesAt(deploy.entries, options.recordPath, now);
20
+ for (const agent of options.agents) {
21
+ try {
22
+ if (!Number.isSafeInteger(agent.keep_ms) || agent.keep_ms <= 0)
23
+ throw new Error("Invalid recording retention");
24
+ const exec = options.execForAgent(agent);
25
+ const directories = new Set([agent.directory, ...deploy.entries
26
+ .filter((entry) => entry.deployment_id === path.resolve(options.recordPath))
27
+ .flatMap((entry) => entry.recording_agents ?? []).filter((entry) => entry.node_id === agent.node_id)
28
+ .map((entry) => entry.directory)]);
29
+ const errors = deploy.errors.map((error) => `Deploy history: ${error}`);
30
+ const rowsBySlug = new Map();
31
+ rowsBySlug.set(agent.slug, []);
32
+ for (const directory of directories) {
33
+ // Retention still runs when a log has become empty since the previous sync.
34
+ rowsBySlug.set(path.posix.basename(directory), rowsBySlug.get(path.posix.basename(directory)) ?? []);
35
+ const wake = await readRecordingJsonl(exec, path.posix.join(directory, "wake-moments.jsonl"), createWakeMomentsParser(), options.readChunkBytes);
36
+ if (wake.failure)
37
+ throw new Error(`Wake moments unreadable: ${wake.failure}`);
38
+ errors.push(...wake.errors);
39
+ for (const row of wake.entries) {
40
+ if (row.agent_id !== agent.node_id) {
41
+ errors.push(`Foreign wake row for ${row.agent_id}`);
42
+ continue;
43
+ }
44
+ const historical = recordingHistoryAt(deploy.entries, options.recordPath, row.started_at, agent.node_id).agent;
45
+ const slug = historical?.slug ?? agent.slug;
46
+ const rows = rowsBySlug.get(slug) ?? [];
47
+ rows.push({ row, directory });
48
+ rowsBySlug.set(slug, rows);
49
+ }
50
+ }
51
+ const memoryCache = Object.create(null);
52
+ const feedCache = new Map();
53
+ result.warnings.push(...errors.map((error) => `${agent.node_id}: ${error}`));
54
+ for (const [slug, rows] of rowsBySlug)
55
+ await withMomentStore(options.recordPath, slug, async (directory) => {
56
+ const newest = rows.reduce((latest, { row }) => Math.max(latest, Date.parse(row.started_at)), await newestMomentInstant(directory, agent.node_id));
57
+ for (const { row, directory: sourceDirectory } of rows) {
58
+ const started = Date.parse(row.started_at);
59
+ // Do not recreate already-pruned attempts on every sync while Daimon retains its row log.
60
+ if (started < now.getTime() - agent.keep_ms && started < newest) {
61
+ result.skipped += 1;
62
+ continue;
63
+ }
64
+ const { agent: historical, deployment } = recordingHistoryAt(deploy.entries, options.recordPath, row.started_at, agent.node_id);
65
+ const rowErrors = [...errors];
66
+ if (deploy.publicationPending && started >= deployPendingSince)
67
+ rowErrors.push("Deploy history publication pending");
68
+ if (historical && historical.directory !== sourceDirectory)
69
+ rowErrors.push("Wake row directory differs from activation recording facts");
70
+ const feedLandings = Object.create(null);
71
+ for (const feed of historical?.feeds ?? []) {
72
+ const key = JSON.stringify([feed.id, feed.volume_name]);
73
+ if (!feedCache.has(key)) {
74
+ try {
75
+ feedCache.set(key, await options.readFeedHistory(feed));
76
+ }
77
+ catch {
78
+ feedCache.set(key, { entries: [], errors: [`cannot resolve or read host landing history for volume ${feed.volume_name}`] });
79
+ }
80
+ }
81
+ const history = feedCache.get(key);
82
+ feedLandings[feed.id] = history.entries.filter((entry) => entry.resource === feed.id && entry.volume === feed.volume_name);
83
+ const tail = history.entries.at(-1);
84
+ const pendingSince = tail ? Date.parse(tail.landed_at) : -Infinity;
85
+ if (history.publicationPending && started >= pendingSince)
86
+ rowErrors.push(`Feed ${feed.id}: history publication pending`);
87
+ rowErrors.push(...history.errors.map((error) => `Feed ${feed.id}: ${error}`));
88
+ }
89
+ const memoryLedgers = Object.create(null);
90
+ for (const bank of historical?.memory ?? []) {
91
+ if (bank.ledger_path === null)
92
+ continue;
93
+ const current = agent.memory.some((entry) => entry.id === bank.id && entry.declared_by === bank.declared_by
94
+ && entry.ledger_path === bank.ledger_path);
95
+ // Older facts do not carry a physical volume ID. A different report cannot
96
+ // establish that today's readable path still names the historical bank.
97
+ if (!current || deployment?.report_sha256 !== currentDeployment?.report_sha256) {
98
+ memoryLedgers[bank.ledger_path] = { entries: [], errors: ["Historical bank identity or mount cannot be verified in the current deployment"] };
99
+ continue;
100
+ }
101
+ if (!memoryCache[bank.ledger_path]) {
102
+ const ledger = await readRecordingJsonl(exec, bank.ledger_path, createMemoryLedgerParser(), options.readChunkBytes);
103
+ memoryCache[bank.ledger_path] = ledger.failure || ledger.missing
104
+ ? { entries: [], errors: [`Ledger unreadable: ${ledger.failure ?? "runtime file is absent"}`] } : ledger;
105
+ }
106
+ memoryLedgers[bank.ledger_path] = memoryCache[bank.ledger_path];
107
+ }
108
+ const record = composeMomentRecord({ row, agentNodeId: agent.node_id, deploymentRecordPath: options.recordPath,
109
+ feedLandings, deployResources: deploy.entries, memoryLedgers, errors: rowErrors, recordedAt: now.toISOString() });
110
+ if (await writeMomentRecord(directory, record, row)) {
111
+ result.written += 1;
112
+ if (!record.exact)
113
+ result.nonExact += 1;
114
+ }
115
+ else
116
+ result.skipped += 1;
117
+ }
118
+ await pruneMomentRecords(directory, agent.node_id, now, agent.keep_ms);
119
+ });
120
+ }
121
+ catch (error) {
122
+ result.failures.push(`${agent.node_id}: ${error instanceof Error ? error.message : String(error)}`);
123
+ }
124
+ }
125
+ return result;
126
+ };