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,159 @@
1
+ import { mkdir, rm } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { deployedResource } from "./deployedResource.js";
5
+ import { historyKey } from "./history.js";
6
+ import { assertLocalGitRepository } from "./gitHistory.js";
7
+ import { assertCommitNotFuture, commitAt, commitInstant, resolveRewindCommit, rewindGit } from "./gitProcess.js";
8
+ import { exportGitTree, extractOverrideBundle } from "./gitTree.js";
9
+ import { resolveRecordedCommit } from "./recordedCommit.js";
10
+ import { materializeRecordedBundle } from "./recordedBundle.js";
11
+ import { recordActivationErrors } from "./recordInput.js";
12
+ export { commitAt, commitInstant, resolveRewindCommit, rewindGit, rewindGitEnvironment, rewindGitSync, selectCommitAt } from "./gitProcess.js";
13
+ export { exportGitTree } from "./gitTree.js";
14
+ export { assertLocalGitRepository } from "./gitHistory.js";
15
+ const FULL_OBJECT = /^(?:[a-fA-F0-9]{40}|[a-fA-F0-9]{64})$/u;
16
+ export const localRepositoryPath = (location, base) => {
17
+ if (location.startsWith("file://")) {
18
+ const url = new URL(location);
19
+ if (url.hostname && url.hostname !== "localhost")
20
+ throw new Error("Rewind only reads local repositories; remote file hosts are forbidden");
21
+ return fileURLToPath(url);
22
+ }
23
+ if (/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(location) || /^[^/]+@[^:]+:/u.test(location))
24
+ throw new Error("Rewind only reads local repositories; network access is forbidden");
25
+ return path.resolve(base, location);
26
+ };
27
+ /** Import only the transitive object set of the selected commit; no source refs or config survive. */
28
+ export const materializeCleanRepository = async (repository, commit, destination) => {
29
+ const format = (await rewindGit(repository, ["rev-parse", "--show-object-format"])).toString().trim();
30
+ const pack = await rewindGit(repository, ["pack-objects", "--revs", "--stdout"], Buffer.from(`${commit}\n`));
31
+ await mkdir(destination, { recursive: true });
32
+ await rewindGit(destination, ["init", "--quiet", "--template=", "--initial-branch=moment", `--object-format=${format}`]);
33
+ await rewindGit(destination, ["config", "core.logAllRefUpdates", "false"]);
34
+ await rewindGit(destination, ["index-pack", "--stdin"], pack);
35
+ await rewindGit(destination, ["update-ref", "refs/heads/moment", commit]);
36
+ await rewindGit(destination, ["read-tree", commit]);
37
+ await rewindGit(destination, ["checkout-index", "--all", "--force"]);
38
+ // read-tree may reuse cached stat data from an existing index; rebuild it from scratch.
39
+ await rm(path.join(destination, ".git/index"));
40
+ await rewindGit(destination, ["read-tree", commit]);
41
+ for (const name of ["FETCH_HEAD", "ORIG_HEAD", "logs", "packed-refs"])
42
+ await rm(path.join(destination, ".git", name), { recursive: true, force: true });
43
+ };
44
+ const selectorOf = (resource) => resource.kind === "git"
45
+ ? resource.ref || (resource.branch ? `refs/heads/${resource.branch}` : resource.tag ? `refs/tags/${resource.tag}` : "HEAD")
46
+ : resource.build?.files?.ref ?? "HEAD";
47
+ const localRoot = (resource) => resource.kind === "git" ? resource.url
48
+ : resource.build?.files?.root ?? resource.build?.dependencies?.directory ?? resource.build?.generated?.cwd ?? resource.build?.generated?.inputs[0]?.root;
49
+ /** Preserve the authored root's prefix when its checkout exists; otherwise use a plain manifest-relative root. */
50
+ const bundlePrefix = async (root, base) => {
51
+ const absolute = path.resolve(base, root);
52
+ try {
53
+ return (await rewindGit(absolute, ["rev-parse", "--show-prefix"])).toString().trim().replace(/\/$/u, "");
54
+ }
55
+ catch {
56
+ if (path.isAbsolute(root) || root.split(/[\\/]/u).includes(".."))
57
+ throw new Error(`Cannot determine historical repository prefix for bundle root ${root}; keep its local checkout or use a repository-relative root`);
58
+ return root.replace(/^\.\//u, "").replace(/\/$/u, "").replace(/^\.$/u, "");
59
+ }
60
+ };
61
+ const materializeBundle = async (resource, context, repository, commit) => {
62
+ const build = resource.build;
63
+ const trees = [];
64
+ if (!build)
65
+ trees.push({ root: "" });
66
+ else if (build.files)
67
+ trees.push({ root: await bundlePrefix(build.files.root, context.input.declarationBase), exclude: build.files.exclude });
68
+ else if (build.dependencies)
69
+ trees.push({ root: await bundlePrefix(build.dependencies.directory, context.input.declarationBase) });
70
+ else {
71
+ const origins = await Promise.all(build.generated.inputs.map(async (input) => {
72
+ try {
73
+ return (await rewindGit(path.resolve(context.input.declarationBase, input.root), ["rev-parse", "--show-toplevel"])).toString().trim();
74
+ }
75
+ catch {
76
+ return null;
77
+ } // Missing relative roots are mapped against the retained repository below.
78
+ }));
79
+ if (new Set(origins.filter((origin) => origin !== null)).size > 1) {
80
+ throw new Error("Generated bundle inputs span multiple git repositories; one recorded repository/commit cannot rewind them correctly");
81
+ }
82
+ // Keep repository-relative paths: trial preparation can restore the declared cwd/input relationship.
83
+ for (const input of build.generated.inputs) {
84
+ if (input.ref !== undefined)
85
+ throw new Error("Generated bundle inputs cannot pin a ref: the deferred command reads the work tree");
86
+ const root = await bundlePrefix(input.root, context.input.declarationBase);
87
+ trees.push({ root, prefix: root, exclude: input.exclude });
88
+ }
89
+ }
90
+ for (const tree of trees)
91
+ await exportGitTree(repository, commit, context.destination, { ...tree, mergeIdentical: true });
92
+ return { trees, deferred: Boolean(build?.dependencies || build?.generated) };
93
+ };
94
+ export const materializeGit = async (context) => {
95
+ const { input, history } = context;
96
+ if (input.section !== "resources" || input.declaration.kind === "volume")
97
+ throw new Error("Git rewind requires a git or bundle resource");
98
+ const resource = input.declaration, selector = selectorOf(resource), pinned = FULL_OBJECT.test(selector);
99
+ const matchingRecord = input.overridden ? undefined : context.record?.resources.find((entry) => entry.id === input.id);
100
+ const activationErrors = matchingRecord ? recordActivationErrors(context.record) : [];
101
+ const candidateCommits = input.overridden ? [] : context.candidateRecords?.flatMap((candidate) => candidate.resources.flatMap((entry) => entry.id === input.id && entry.kind === "git" ? [entry.commit] : [])) ?? [];
102
+ if (matchingRecord && matchingRecord.kind !== resource.kind)
103
+ throw new Error(`Moment resource ${input.id} kind disagrees with its declaration`);
104
+ const deployed = !input.overridden && !matchingRecord && !(resource.kind === "git" && pinned)
105
+ ? await deployedResource(context) : null;
106
+ if (deployed && deployed.pin.kind !== resource.kind)
107
+ throw new Error(`Deployment resource ${input.id} kind disagrees with its declaration`);
108
+ const effectivePin = matchingRecord ?? deployed?.pin;
109
+ const bundlePin = effectivePin?.kind === "bundle" ? effectivePin : undefined;
110
+ if (bundlePin && await materializeRecordedBundle(history, bundlePin.sha256, context.destination)) {
111
+ return { fidelity: activationErrors.length || deployed && !deployed.exact ? "approximate" : "exact", basis: deployed ? "deploy-log" : "record",
112
+ source: { sha256: bundlePin.sha256 }, notes: [...(deployed?.notes ?? []), ...activationErrors], instant: context.at };
113
+ }
114
+ if (deployed && bundlePin)
115
+ throw new Error(`Deployment bundle ${bundlePin.sha256} could not be reproduced from retained archive bytes`);
116
+ const bundleNote = bundlePin ? `Recorded bundle ${bundlePin.sha256} could not be reproduced from retained archive bytes.` : undefined;
117
+ const gitPin = effectivePin?.kind === "git" ? effectivePin : undefined;
118
+ const record = pinned ? undefined : gitPin;
119
+ if (input.overridden && resource.kind === "bundle" && resource.source) {
120
+ await extractOverrideBundle(localRepositoryPath(resource.source, input.declarationBase), context.destination, resource.sha256);
121
+ return { fidelity: "overridden", basis: "override", source: {}, notes: [], instant: context.at };
122
+ }
123
+ if (resource.kind === "bundle" && resource.source)
124
+ throw new Error(`${bundleNote ?? "Prebuilt bundle has no matching recorded archive"} and cannot be rewound; provide an override`);
125
+ let repository = input.overridden ? null : await history?.repository(`git/${historyKey(input)}`);
126
+ const fromHistory = Boolean(repository);
127
+ if ((gitPin || candidateCommits.length) && !repository)
128
+ throw new Error(`Missing git history for recorded resource ${input.id}`);
129
+ if (!repository && (pinned || input.overridden)) {
130
+ const declared = localRoot(resource);
131
+ if (declared)
132
+ repository = localRepositoryPath(declared, input.declarationBase);
133
+ }
134
+ if (!repository)
135
+ throw new Error(`Missing git history for ${input.id}; unpinned resources require --history`);
136
+ await assertLocalGitRepository(repository, !input.overridden && history && repository.startsWith(`${history.root}${path.sep}`) ? history : undefined);
137
+ for (const commit of candidateCommits)
138
+ await resolveRecordedCommit(repository, commit);
139
+ const recordedCommit = gitPin ? await resolveRecordedCommit(repository, gitPin.commit) : null;
140
+ const selected = pinned || record || input.overridden
141
+ ? await (record ? Promise.resolve(recordedCommit) : resolveRewindCommit(repository, selector))
142
+ .then(async (commit) => ({ commit, instant: await commitInstant(repository, commit) }))
143
+ : await commitAt(repository, selector, context.at);
144
+ if (!selected)
145
+ throw new Error(`No first-parent commit for ${selector} exists at or before ${context.at}`);
146
+ await assertCommitNotFuture(repository, selected.commit, context.at);
147
+ const bundle = resource.kind === "bundle" ? await materializeBundle(resource, context, repository, selected.commit) : undefined;
148
+ if (resource.kind === "git")
149
+ await materializeCleanRepository(repository, selected.commit, context.destination);
150
+ return {
151
+ fidelity: input.overridden ? "overridden" : resource.kind === "bundle" ? "approximate"
152
+ : record && activationErrors.length ? "approximate" : deployed ? deployed.exact ? "exact" : "approximate" : pinned || record ? "exact" : "approximate",
153
+ basis: input.overridden ? "override" : pinned ? "pinned" : deployed ? "deploy-log" : record ? "record" : "selector-at",
154
+ source: { commit: selected.commit, ...(!fromHistory ? { repository } : {}), ...(bundle ? { trees: bundle.trees } : {}) }, instant: selected.instant,
155
+ notes: [...(deployed?.notes ?? []), ...(record || bundle ? activationErrors : []), ...(pinned || record || input.overridden ? [] : ["Commit dates do not establish when a commit reached the selected ref."]),
156
+ ...(!input.overridden && resource.kind === "bundle" ? [bundleNote ?? "Source reconstruction has no matching recorded bundle digest."] : [])],
157
+ ...(bundle?.deferred ? { build: "deferred" } : {})
158
+ };
159
+ };
@@ -0,0 +1,2 @@
1
+ /** Retain raw blob bytes: archive attributes may disclose refs added after the moment. */
2
+ export declare const exportFeedGitTree: (repository: string, commit: string, destination: string, paths?: string[]) => Promise<void>;
@@ -0,0 +1,7 @@
1
+ import { exportGitTree, safeCommittedPath } from "./gitTree.js";
2
+ /** Retain raw blob bytes: archive attributes may disclose refs added after the moment. */
3
+ export const exportFeedGitTree = async (repository, commit, destination, paths) => {
4
+ for (const selected of paths ?? [])
5
+ safeCommittedPath(selected);
6
+ await exportGitTree(repository, commit, destination, { paths });
7
+ };
@@ -0,0 +1,3 @@
1
+ import type { History } from "./history.js";
2
+ /** Git's textual indirections are not covered by ordinary realpath containment. */
3
+ export declare const assertLocalGitRepository: (repository: string, history?: History) => Promise<void>;
@@ -0,0 +1,55 @@
1
+ import { lstat, readFile, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { rewindGit } from "./gitProcess.js";
4
+ /** Git's textual indirections are not covered by ordinary realpath containment. */
5
+ export const assertLocalGitRepository = async (repository, history) => {
6
+ const exists = (file) => history ? history.path(path.relative(history.root, file)) : lstat(file).then(() => file, (error) => {
7
+ if (error.code === "ENOENT")
8
+ return null;
9
+ throw error;
10
+ });
11
+ const text = (file) => history ? history.text(path.relative(history.root, file)) : readFile(file, "utf8").catch((error) => {
12
+ if (error.code === "ENOENT")
13
+ return null;
14
+ throw error;
15
+ });
16
+ const dotGit = path.join(repository, ".git");
17
+ if (history && await exists(dotGit) && !(await lstat(dotGit)).isDirectory())
18
+ throw new Error("History repository .git indirection files are not supported; retain a standalone repository");
19
+ // `git -C` would discover an ancestor repository if this history directory is not itself one.
20
+ if (history && !await exists(dotGit) && (!await exists(path.join(repository, "HEAD")) || !await exists(path.join(repository, "objects")))) {
21
+ throw new Error("History entry is not a standalone git repository");
22
+ }
23
+ // Check config includes before asking git anything: even rev-parse reads included config files.
24
+ if (history) {
25
+ const directory = await exists(dotGit) ? dotGit : repository;
26
+ // `commondir` is another textual redirect git follows during discovery, before any command runs.
27
+ for (const name of ["commondir", "objects/info/alternates", "objects/info/http-alternates", "shallow", "info/grafts"]) {
28
+ if (await text(path.join(directory, name)))
29
+ throw new Error(`Rewind requires complete standalone git history; ${name} is unsupported`);
30
+ }
31
+ const configFile = path.join(directory, "config");
32
+ const configText = await text(configFile);
33
+ if (configText && /^\s*\[\s*include(?:if)?\b/imu.test(configText))
34
+ throw new Error("Rewind refuses git configuration indirection include");
35
+ }
36
+ // Resolve only after refusing textual worktree links that could leave the history root.
37
+ const gitDirectory = (await rewindGit(repository, ["rev-parse", "--absolute-git-dir"])).toString().trim();
38
+ if (history)
39
+ await history.path(path.relative(history.root, gitDirectory));
40
+ for (const name of ["commondir", "objects/info/alternates", "objects/info/http-alternates", "shallow", "info/grafts"]) {
41
+ if (await text(path.join(gitDirectory, name)))
42
+ throw new Error(`Rewind requires complete standalone git history; ${name} is unsupported`);
43
+ }
44
+ const config = (await rewindGit(repository, ["config", "--local", "--no-includes", "--list", "--null"]))
45
+ .toString().split("\0").filter(Boolean);
46
+ for (const entry of config) {
47
+ const key = entry.split("\n")[0].toLowerCase();
48
+ if (key === "include.path" || /^includeif\..*\.path$/u.test(key) || key === "extensions.partialclone" || /^remote\..*\.promisor$/u.test(key)) {
49
+ throw new Error(`Rewind refuses git configuration indirection ${key}`);
50
+ }
51
+ }
52
+ const packs = path.join(gitDirectory, "objects/pack");
53
+ if (await exists(packs) && (await readdir(packs)).some((name) => name.endsWith(".promisor")))
54
+ throw new Error("Rewind refuses incomplete promisor git history");
55
+ };
@@ -0,0 +1,19 @@
1
+ /** Do not inherit GIT_DIR, injected -c options, credentials or user/system configuration. */
2
+ export declare const rewindGitEnvironment: () => NodeJS.ProcessEnv;
3
+ /** Bounded argv-only git invocation. Local transport is the only enabled protocol. */
4
+ export declare const rewindGit: (repo: string, args: readonly string[], input?: Buffer) => Promise<Buffer>;
5
+ /** Adapter for the existing synchronous feed revision function; it never fetches. */
6
+ export declare const rewindGitSync: (repo: string, args: readonly string[]) => Buffer;
7
+ export interface SelectedCommit {
8
+ commit: string;
9
+ instant: string;
10
+ authorInstant?: string;
11
+ }
12
+ export declare const commitInstant: (repo: string, commit: string) => Promise<string>;
13
+ /** Validate the selected source before any copy/export, regardless of the materialized layout. */
14
+ export declare const assertCommitNotFuture: (repo: string, commit: string, at: string) => Promise<void>;
15
+ export declare const resolveRewindCommit: (repo: string, selector: string) => Promise<string>;
16
+ /** Dates approximate ref history; they cannot establish when a commit reached a moving ref. */
17
+ export declare const commitAt: (repo: string, selector: string, at: string) => Promise<SelectedCommit | null>;
18
+ /** Stable ties preserve the first-parent order returned by git. */
19
+ export declare const selectCommitAt: (commits: readonly SelectedCommit[], at: string) => SelectedCommit | null;
@@ -0,0 +1,81 @@
1
+ import { execFile, execFileSync } from "node:child_process";
2
+ import { compareInstants } from "./instant.js";
3
+ const LIMIT = 268_435_456;
4
+ /** Do not inherit GIT_DIR, injected -c options, credentials or user/system configuration. */
5
+ export const rewindGitEnvironment = () => ({
6
+ PATH: process.env.PATH,
7
+ ...(process.env.SystemRoot ? { SystemRoot: process.env.SystemRoot } : {}),
8
+ LC_ALL: "C", GIT_CONFIG_NOSYSTEM: "1", GIT_CONFIG_SYSTEM: "/dev/null", GIT_CONFIG_GLOBAL: "/dev/null",
9
+ GIT_NO_REPLACE_OBJECTS: "1", GIT_OPTIONAL_LOCKS: "0", GIT_TERMINAL_PROMPT: "0", GIT_NO_LAZY_FETCH: "1",
10
+ GIT_ATTR_NOSYSTEM: "1", GIT_CONFIG_COUNT: "0"
11
+ });
12
+ const argumentsFor = (repo, args) => [
13
+ "-c", "core.hooksPath=/dev/null", "-c", "core.fsmonitor=false", "-c", "core.autocrlf=false",
14
+ "-c", "core.logAllRefUpdates=false", "-c", "core.attributesFile=/dev/null", "-c", "protocol.allow=never", "-c", "protocol.file.allow=always",
15
+ "-c", "maintenance.auto=false", "-c", "gc.auto=0", "-c", "safe.directory=*", "-C", repo, ...args
16
+ ];
17
+ /** Bounded argv-only git invocation. Local transport is the only enabled protocol. */
18
+ export const rewindGit = (repo, args, input) => new Promise((resolve, reject) => {
19
+ const child = execFile("git", argumentsFor(repo, args), {
20
+ encoding: "buffer", env: rewindGitEnvironment(), maxBuffer: LIMIT, timeout: 60_000
21
+ }, (error, stdout, stderr) => {
22
+ if (error)
23
+ reject(new Error(`Rewind git ${args[0]} failed: ${stderr.toString("utf8").trim() || error.message}`));
24
+ else
25
+ resolve(stdout);
26
+ });
27
+ child.stdin?.on("error", () => undefined);
28
+ child.stdin?.end(input);
29
+ });
30
+ /** Adapter for the existing synchronous feed revision function; it never fetches. */
31
+ export const rewindGitSync = (repo, args) => execFileSync("git", argumentsFor(repo, args), {
32
+ env: rewindGitEnvironment(), maxBuffer: LIMIT, stdio: ["ignore", "pipe", "pipe"], timeout: 60_000
33
+ });
34
+ /** Git's pretty formatter drops negative epochs. Read the signed raw dates instead. */
35
+ const commitDates = async (repo, commit) => {
36
+ const headers = (await rewindGit(repo, ["cat-file", "commit", commit])).toString().split("\n\n", 1)[0];
37
+ const date = (role) => {
38
+ const match = new RegExp(`^${role} .* (-?\\d+) [+-]\\d{4}$`, "mu").exec(headers);
39
+ const seconds = match ? Number(match[1]) : NaN;
40
+ if (!Number.isSafeInteger(seconds) || !Number.isFinite(new Date(seconds * 1000).getTime())) {
41
+ throw new Error(`Commit ${commit} has an invalid ${role} date`);
42
+ }
43
+ return new Date(seconds * 1000).toISOString();
44
+ };
45
+ return { author: date("author"), committer: date("committer") };
46
+ };
47
+ export const commitInstant = async (repo, commit) => (await commitDates(repo, commit)).committer;
48
+ /** Validate the selected source before any copy/export, regardless of the materialized layout. */
49
+ export const assertCommitNotFuture = async (repo, commit, at) => {
50
+ const dates = await commitDates(repo, commit);
51
+ if (Object.values(dates).some((instant) => compareInstants(instant, at) > 0)) {
52
+ throw new Error(`Selected commit ${commit} has an author or committer date after ${at}`);
53
+ }
54
+ };
55
+ export const resolveRewindCommit = async (repo, selector) => {
56
+ if (!selector || selector.startsWith("-") || /[\0\r\n]/u.test(selector))
57
+ throw new Error("Invalid git selector");
58
+ const ref = /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/iu.test(selector) ? selector.toLowerCase() : selector;
59
+ return (await rewindGit(repo, ["rev-parse", "--verify", "--end-of-options", `${ref}^{commit}`])).toString().trim();
60
+ };
61
+ /** Dates approximate ref history; they cannot establish when a commit reached a moving ref. */
62
+ export const commitAt = async (repo, selector, at) => {
63
+ let head;
64
+ try {
65
+ head = await resolveRewindCommit(repo, selector);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ const commits = (await rewindGit(repo, ["log", "--first-parent", "--format=%H", head, "--"]))
71
+ .toString().trim().split("\n").filter(Boolean);
72
+ const dated = [];
73
+ for (const commit of commits) {
74
+ const dates = await commitDates(repo, commit);
75
+ dated.push({ commit, instant: dates.committer, authorInstant: dates.author });
76
+ }
77
+ return selectCommitAt(dated, at);
78
+ };
79
+ /** Stable ties preserve the first-parent order returned by git. */
80
+ export const selectCommitAt = (commits, at) => commits.filter((entry) => compareInstants(entry.instant, at) <= 0 && compareInstants(entry.authorInstant ?? entry.instant, at) <= 0)
81
+ .reduce((latest, entry) => latest === null || compareInstants(entry.instant, latest.instant) > 0 ? entry : latest, null);
@@ -0,0 +1,14 @@
1
+ export declare const safeCommittedPath: (value: string) => string;
2
+ export interface ExportTreeOptions {
3
+ root?: string;
4
+ exclude?: readonly string[];
5
+ paths?: readonly string[];
6
+ prefix?: string;
7
+ mergeIdentical?: boolean;
8
+ }
9
+ /** Materialize blobs by object id, without invoking archive attributes, filters or extraction tools. */
10
+ export declare const exportGitTree: (repo: string, commit: string, destination: string, options?: ExportTreeOptions) => Promise<void>;
11
+ /** Overrides use validated local ustar bytes, never tar commands or the network. */
12
+ export declare const extractOverrideBundle: (file: string, destination: string, expected?: string) => Promise<void>;
13
+ /** Validated archive bytes are extracted only after digest validation by the caller. */
14
+ export declare const extractBundleBytes: (bytes: Buffer, destination: string) => Promise<void>;
@@ -0,0 +1,90 @@
1
+ import { lstat, mkdir, readFile, readlink, stat, symlink, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { compileExcludePatterns } from "../../workspaceBundleFiles.js";
5
+ import { validateWorkspaceBundleTar } from "../../workspaceBundleArtifacts.js";
6
+ import { rewindGit } from "./gitProcess.js";
7
+ export const safeCommittedPath = (value) => {
8
+ if (!value || value.startsWith("/") || value.includes("\\") || value.includes("\0") || value.split("/").some((part) => !part || part === "." || part === ".." || part.toLowerCase() === ".git")) {
9
+ throw new Error(`Unsafe committed path: ${value}`);
10
+ }
11
+ return value;
12
+ };
13
+ /** Never traverse a symlink left by an earlier generated input while merging trees. */
14
+ const parentDirectory = async (root, relative) => {
15
+ let directory = root;
16
+ for (const segment of relative.split("/").slice(0, -1)) {
17
+ directory = path.join(directory, segment);
18
+ const existing = await lstat(directory).catch((error) => { if (error.code === "ENOENT")
19
+ return null; throw error; });
20
+ if (existing && !existing.isDirectory())
21
+ throw new Error(`Committed entry traverses a non-directory: ${relative}`);
22
+ if (!existing)
23
+ await mkdir(directory);
24
+ }
25
+ };
26
+ /** Materialize blobs by object id, without invoking archive attributes, filters or extraction tools. */
27
+ export const exportGitTree = async (repo, commit, destination, options = {}) => {
28
+ const root = options.root && options.root !== "." ? safeCommittedPath(options.root.replace(/\/$/u, "")) : "";
29
+ const tree = root ? `${commit}:${root}` : `${commit}^{tree}`;
30
+ if ((await rewindGit(repo, ["cat-file", "-t", tree])).toString().trim() !== "tree")
31
+ throw new Error(`Bundle root ${root || "."} is not a tree at ${commit}`);
32
+ const entries = (await rewindGit(repo, ["ls-tree", "-rz", tree])).toString("utf8").split("\0").filter(Boolean);
33
+ const excluded = compileExcludePatterns(options.exclude);
34
+ const prefix = options.prefix ? safeCommittedPath(options.prefix) : "";
35
+ await mkdir(destination, { recursive: true });
36
+ for (const entry of entries) {
37
+ const tab = entry.indexOf("\t"), name = safeCommittedPath(entry.slice(tab + 1));
38
+ const [mode, kind, oid] = entry.slice(0, tab).split(" ");
39
+ if (excluded(name) || (options.paths && !options.paths.some((selected) => name === selected || name.startsWith(`${selected}/`))))
40
+ continue;
41
+ if (kind !== "blob" || !["100644", "100755", "120000"].includes(mode))
42
+ throw new Error(`Committed path ${name} is not a supported file or symlink (submodules need their own history)`);
43
+ const target = path.join(destination, prefix, name), bytes = await rewindGit(repo, ["cat-file", "blob", oid]);
44
+ await parentDirectory(destination, [prefix, name].filter(Boolean).join("/"));
45
+ if (options.mergeIdentical) {
46
+ const present = await lstat(target).catch((error) => { if (error.code === "ENOENT")
47
+ return null; throw error; });
48
+ if (present) {
49
+ const identical = mode === "120000" ? present.isSymbolicLink() && await readlink(target) === bytes.toString("utf8")
50
+ : present.isFile() && (present.mode & 0o111 ? "100755" : "100644") === mode && (await readFile(target)).equals(bytes);
51
+ if (!identical)
52
+ throw new Error(`Conflicting generated bundle inputs at ${name}`);
53
+ continue;
54
+ }
55
+ }
56
+ if (mode === "120000")
57
+ await symlink(bytes.toString("utf8"), target);
58
+ else
59
+ await writeFile(target, bytes, { flag: "wx", mode: mode === "100755" ? 0o755 : 0o644 });
60
+ }
61
+ };
62
+ /** Overrides use validated local ustar bytes, never tar commands or the network. */
63
+ export const extractOverrideBundle = async (file, destination, expected) => {
64
+ const info = await stat(file);
65
+ if (!info.isFile() || info.size > 536_870_912)
66
+ throw new Error("Override bundle must be a bounded local tar file");
67
+ const bytes = await readFile(file);
68
+ if (expected && `sha256:${createHash("sha256").update(bytes).digest("hex")}` !== expected)
69
+ throw new Error("Override bundle checksum mismatch");
70
+ await extractBundleBytes(bytes, destination);
71
+ };
72
+ /** Validated archive bytes are extracted only after digest validation by the caller. */
73
+ export const extractBundleBytes = async (bytes, destination) => {
74
+ validateWorkspaceBundleTar(bytes);
75
+ await mkdir(destination, { recursive: true });
76
+ const text = (buffer) => buffer.toString("utf8").replace(/\0.*$/su, "");
77
+ for (let offset = 0; offset < bytes.length && !bytes.subarray(offset, offset + 512).every((byte) => byte === 0);) {
78
+ const header = bytes.subarray(offset, offset + 512), prefix = text(header.subarray(345, 500)), name = text(header.subarray(0, 100));
79
+ const target = path.join(destination, safeCommittedPath(`${prefix ? `${prefix}/` : ""}${name}`.replace(/\/$/u, "")));
80
+ const size = Number.parseInt(text(header.subarray(124, 136)).trim(), 8);
81
+ if (header[156] === 53)
82
+ await mkdir(target, { recursive: true });
83
+ else {
84
+ await mkdir(path.dirname(target), { recursive: true });
85
+ const executable = Number.parseInt(text(header.subarray(100, 108)).trim(), 8) & 0o111;
86
+ await writeFile(target, bytes.subarray(offset + 512, offset + 512 + size), { flag: "wx", mode: executable ? 0o755 : 0o644 });
87
+ }
88
+ offset += 512 + Math.ceil(size / 512) * 512;
89
+ }
90
+ };
@@ -0,0 +1,28 @@
1
+ import type { z } from "zod";
2
+ import { type MomentRecord, type WakeMomentRow } from "../../../recording/index.js";
3
+ import { type DeployResources } from "../../../deployment/index.js";
4
+ import { type FeedLanding } from "../../../volume/index.js";
5
+ export declare const inside: (root: string, target: string) => boolean;
6
+ export declare const safeSegment: (value: string) => string;
7
+ export declare const historyKey: (identity: {
8
+ declaredBy: string;
9
+ id: string;
10
+ }) => string;
11
+ /** All reads of the consumer history layout pass through this containment boundary. */
12
+ export declare class History {
13
+ readonly root: string;
14
+ constructor(root: string);
15
+ path(relative: string): Promise<string | null>;
16
+ bytes(relative: string): Promise<Buffer | null>;
17
+ text(relative: string): Promise<string | null>;
18
+ jsonl<T>(relative: string, schema: z.ZodType<T>): Promise<T[] | null>;
19
+ feedLandings(key: string, resource: string): Promise<FeedLanding[]>;
20
+ wakeMoments(relative: string): Promise<WakeMomentRow[] | null>;
21
+ /** One imported deployment, preserving its original absolute identity without opening that path. */
22
+ deploymentResources(at: string, agentId?: string): Promise<DeployResources | null>;
23
+ records(): Promise<MomentRecord[]>;
24
+ /** Validate all tree entries before git or another local parser receives the directory. */
25
+ repository(relative: string): Promise<string | null>;
26
+ copyTree(relative: string, destination: string): Promise<void>;
27
+ }
28
+ export declare const openHistory: (directory?: string) => Promise<History | undefined>;