spawnfile 0.1.14 → 0.1.17

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 (546) hide show
  1. package/README.md +60 -159
  2. package/dist/audit/checksShared.d.ts +1 -1
  3. package/dist/auth/importers.d.ts +10 -0
  4. package/dist/auth/importers.js +29 -4
  5. package/dist/auth/index.d.ts +2 -0
  6. package/dist/auth/index.js +1 -0
  7. package/dist/auth/paths.d.ts +1 -1
  8. package/dist/auth/profileStore.js +9 -9
  9. package/dist/auth/targetSecretSourceFsIdentity.d.ts +40 -0
  10. package/dist/auth/targetSecretSourceFsIdentity.js +42 -0
  11. package/dist/auth/targetSecretSourceFsPublish.d.ts +2 -0
  12. package/dist/auth/targetSecretSourceFsPublish.js +3 -1
  13. package/dist/auth/targetSecretSourceFsPublishImmutable.d.ts +2 -1
  14. package/dist/auth/targetSecretSourceFsPublishImmutable.js +104 -71
  15. package/dist/auth/targetSecretSourceFsRead.js +5 -14
  16. package/dist/auth/trainingAuth.d.ts +21 -0
  17. package/dist/auth/trainingAuth.js +86 -0
  18. package/dist/auth/types.d.ts +1 -1
  19. package/dist/cli/authCommands.d.ts +1 -1
  20. package/dist/cli/authCommands.js +9 -0
  21. package/dist/cli/canaryCutoverCommand.d.ts +2 -0
  22. package/dist/cli/canaryCutoverCommand.js +30 -0
  23. package/dist/cli/capabilitiesCommand.d.ts +3 -0
  24. package/dist/cli/capabilitiesCommand.js +12 -0
  25. package/dist/cli/capabilitiesReceipt.d.ts +56 -0
  26. package/dist/cli/capabilitiesReceipt.js +56 -0
  27. package/dist/cli/compileBuildCommands.js +13 -0
  28. package/dist/cli/composedLifecycleContractSet.d.ts +21 -0
  29. package/dist/cli/composedLifecycleContractSet.js +204 -0
  30. package/dist/cli/devCommands.js +2 -0
  31. package/dist/cli/downCommand.js +19 -8
  32. package/dist/cli/evidenceExportHelperCommand.d.ts +13 -0
  33. package/dist/cli/evidenceExportHelperCommand.js +51 -0
  34. package/dist/cli/index.js +12 -3
  35. package/dist/cli/lifecycleMachine.d.ts +7 -1
  36. package/dist/cli/lifecycleMachine.js +2 -2
  37. package/dist/cli/paideiaDelegation.d.ts +17 -0
  38. package/dist/cli/paideiaDelegation.js +210 -0
  39. package/dist/cli/paideiaSupervisor.d.ts +17 -0
  40. package/dist/cli/paideiaSupervisor.js +48 -0
  41. package/dist/cli/productStateCloneCommand.d.ts +2 -0
  42. package/dist/cli/productStateCloneCommand.js +34 -0
  43. package/dist/cli/runCli.d.ts +13 -3
  44. package/dist/cli/runCli.js +37 -9
  45. package/dist/cli/targetCommands.d.ts +4 -7
  46. package/dist/cli/targetCommands.js +16 -46
  47. package/dist/cli/targetConfigPreparedPlan.d.ts +3 -0
  48. package/dist/cli/targetConfigPreparedPlan.js +74 -0
  49. package/dist/cli/targetConfigResolver.d.ts +3 -0
  50. package/dist/cli/targetConfigResolver.js +111 -0
  51. package/dist/cli/targetConfigResolverCommand.d.ts +6 -0
  52. package/dist/cli/targetConfigResolverCommand.js +43 -0
  53. package/dist/cli/targetConfigResolverContracts.d.ts +56 -0
  54. package/dist/cli/targetConfigResolverContracts.js +30 -0
  55. package/dist/cli/targetConfigResolverDocker.d.ts +4 -0
  56. package/dist/cli/targetConfigResolverDocker.js +47 -0
  57. package/dist/cli/targetConfigResolverValidation.d.ts +10 -0
  58. package/dist/cli/targetConfigResolverValidation.js +94 -0
  59. package/dist/cli/targetDefaultAuthorities.d.ts +2 -0
  60. package/dist/cli/targetDefaultAuthorities.js +3 -0
  61. package/dist/cli/targetDefaultConfig.d.ts +7 -0
  62. package/dist/cli/targetDefaultConfig.js +22 -5
  63. package/dist/cli/targetDefaultConfigStdin.js +7 -1
  64. package/dist/cli/targetDefaultHandlerFactory.js +23 -2
  65. package/dist/cli/targetDefaultHandlers.d.ts +2 -2
  66. package/dist/cli/targetProductionCommands.d.ts +5 -0
  67. package/dist/cli/targetProductionCommands.js +45 -0
  68. package/dist/cli/trainCommand.d.ts +3 -0
  69. package/dist/cli/trainCommand.js +61 -0
  70. package/dist/cli/upCommand.js +35 -6
  71. package/dist/cli/upLifecycleRecovery.d.ts +2 -2
  72. package/dist/cli/upLifecycleRecovery.js +188 -44
  73. package/dist/cli/usageCommand.d.ts +40 -0
  74. package/dist/cli/usageCommand.js +284 -0
  75. package/dist/cli/usageCommandLive.d.ts +84 -0
  76. package/dist/cli/usageCommandLive.js +95 -0
  77. package/dist/cli/usageDeploymentSource.d.ts +9 -0
  78. package/dist/cli/usageDeploymentSource.js +22 -0
  79. package/dist/cli/workspaceResourceMigrationCommand.d.ts +8 -0
  80. package/dist/cli/workspaceResourceMigrationCommand.js +36 -0
  81. package/dist/compiler/buildCompilePlanTeams.d.ts +1 -1
  82. package/dist/compiler/buildCompilePlanTeams.js +6 -1
  83. package/dist/compiler/compilePlanHelpers.js +3 -0
  84. package/dist/compiler/compileProject.d.ts +2 -0
  85. package/dist/compiler/compileProject.js +5 -1
  86. package/dist/compiler/compileProjectSupport.js +9 -0
  87. package/dist/compiler/containerArtifacts.d.ts +3 -1
  88. package/dist/compiler/containerArtifacts.js +92 -40
  89. package/dist/compiler/containerArtifactsPlans.d.ts +1 -1
  90. package/dist/compiler/containerArtifactsPlans.js +24 -7
  91. package/dist/compiler/containerArtifactsRender.d.ts +2 -1
  92. package/dist/compiler/containerArtifactsRender.js +91 -58
  93. package/dist/compiler/containerArtifactsTypes.d.ts +8 -0
  94. package/dist/compiler/containerBackedMountRender.d.ts +56 -0
  95. package/dist/compiler/containerBackedMountRender.js +101 -0
  96. package/dist/compiler/containerDaimonBrokerRender.d.ts +112 -0
  97. package/dist/compiler/containerDaimonBrokerRender.js +191 -0
  98. package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +38 -0
  99. package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +108 -0
  100. package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +172 -0
  101. package/dist/compiler/containerDaimonGrokWorkerRender.js +268 -0
  102. package/dist/compiler/containerDaimonOwnershipGuardRender.d.ts +12 -0
  103. package/dist/compiler/containerDaimonOwnershipGuardRender.js +191 -0
  104. package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +24 -0
  105. package/dist/compiler/containerDaimonUidEntrypointRender.js +297 -0
  106. package/dist/compiler/containerEntrypointRender.d.ts +7 -0
  107. package/dist/compiler/containerEntrypointRender.js +28 -22
  108. package/dist/compiler/containerPersistentMounts.d.ts +30 -0
  109. package/dist/compiler/containerPersistentMounts.js +66 -0
  110. package/dist/compiler/containerReadinessPaths.d.ts +1 -0
  111. package/dist/compiler/containerReadinessPaths.js +1 -0
  112. package/dist/compiler/containerRuntimeLinkMaterializer.d.ts +2 -0
  113. package/dist/compiler/containerRuntimeLinkMaterializer.js +12 -0
  114. package/dist/compiler/containerRuntimeReadinessRender.d.ts +7 -0
  115. package/dist/compiler/containerRuntimeReadinessRender.js +40 -0
  116. package/dist/compiler/containerStateOwnershipRender.d.ts +4 -0
  117. package/dist/compiler/containerStateOwnershipRender.js +75 -0
  118. package/dist/compiler/containerTargetResources.d.ts +22 -1
  119. package/dist/compiler/containerTargetResources.js +94 -2
  120. package/dist/compiler/containerVolumeBootstrap.d.ts +3 -0
  121. package/dist/compiler/containerVolumeBootstrap.js +3 -0
  122. package/dist/compiler/containerWorkspaceResourceRender.js +49 -1
  123. package/dist/compiler/daimonTelemetryArtifacts.d.ts +2 -2
  124. package/dist/compiler/daimonTelemetryArtifacts.js +5 -10
  125. package/dist/compiler/deploymentLineage.d.ts +40 -0
  126. package/dist/compiler/deploymentLineage.js +50 -0
  127. package/dist/compiler/index.d.ts +3 -0
  128. package/dist/compiler/index.js +3 -0
  129. package/dist/compiler/initProject.d.ts +2 -0
  130. package/dist/compiler/initProject.js +39 -1
  131. package/dist/compiler/localMoltnetAuthority.d.ts +64 -0
  132. package/dist/compiler/localMoltnetAuthority.js +177 -0
  133. package/dist/compiler/memoryArtifacts.d.ts +1 -1
  134. package/dist/compiler/memoryArtifacts.js +108 -32
  135. package/dist/compiler/modelEnv.d.ts +5 -0
  136. package/dist/compiler/modelEnv.js +8 -2
  137. package/dist/compiler/moltnetArtifactPaths.d.ts +17 -12
  138. package/dist/compiler/moltnetArtifactPaths.js +17 -15
  139. package/dist/compiler/moltnetArtifactTypes.d.ts +10 -0
  140. package/dist/compiler/moltnetArtifacts.d.ts +1 -1
  141. package/dist/compiler/moltnetArtifacts.js +52 -12
  142. package/dist/compiler/moltnetBinaries.d.ts +16 -4
  143. package/dist/compiler/moltnetBinaries.js +46 -6
  144. package/dist/compiler/moltnetClientConfig.js +1 -1
  145. package/dist/compiler/moltnetConfigLowering.d.ts +3 -1
  146. package/dist/compiler/moltnetConfigLowering.js +30 -6
  147. package/dist/compiler/moltnetNodeConfig.js +1 -1
  148. package/dist/compiler/moltnetReleaseAuthority.d.ts +24 -1
  149. package/dist/compiler/moltnetReleaseAuthority.js +33 -4
  150. package/dist/compiler/moltnetRepresentativeResolution.d.ts +1 -1
  151. package/dist/compiler/moltnetRepresentativeResolution.js +2 -2
  152. package/dist/compiler/moltnetResolution.js +9 -15
  153. package/dist/compiler/moltnetRoomMemberships.js +20 -5
  154. package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +1 -1
  155. package/dist/compiler/moltnetRoomPolicyCompatibility.js +3 -1
  156. package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
  157. package/dist/compiler/moltnetRuntimeConfig.js +22 -2
  158. package/dist/compiler/moltnetServerPlans.js +19 -0
  159. package/dist/compiler/organizationExternalParticipants.d.ts +3 -0
  160. package/dist/compiler/organizationExternalParticipants.js +176 -0
  161. package/dist/compiler/organizationIdentity.d.ts +3 -9
  162. package/dist/compiler/organizationIdentity.js +37 -270
  163. package/dist/compiler/organizationIdentityGraph.d.ts +15 -0
  164. package/dist/compiler/organizationIdentityGraph.js +115 -0
  165. package/dist/compiler/organizationReadyEvidence.d.ts +8 -0
  166. package/dist/compiler/organizationReadyEvidence.js +23 -3
  167. package/dist/compiler/runProject.d.ts +4 -2
  168. package/dist/compiler/runProject.js +32 -6
  169. package/dist/compiler/runProjectAuth.d.ts +3 -1
  170. package/dist/compiler/runProjectAuth.js +19 -3
  171. package/dist/compiler/runProjectDaimonCodexDocker.d.ts +3 -0
  172. package/dist/compiler/runProjectDaimonCodexDocker.js +36 -0
  173. package/dist/compiler/runProjectDocker.d.ts +8 -4
  174. package/dist/compiler/runProjectDocker.js +43 -18
  175. package/dist/compiler/runProjectDockerDaimonGuards.d.ts +15 -0
  176. package/dist/compiler/runProjectDockerDaimonGuards.js +122 -0
  177. package/dist/compiler/runProjectDockerReservation.d.ts +3 -0
  178. package/dist/compiler/runProjectDockerReservation.js +118 -0
  179. package/dist/compiler/runProjectLifecycle.js +1 -1
  180. package/dist/compiler/training/broker/declaration.d.ts +45 -0
  181. package/dist/compiler/training/broker/declaration.js +55 -0
  182. package/dist/compiler/training/broker/entrypoint.d.ts +39 -0
  183. package/dist/compiler/training/broker/entrypoint.js +111 -0
  184. package/dist/compiler/training/broker/index.d.ts +10 -0
  185. package/dist/compiler/training/broker/index.js +10 -0
  186. package/dist/compiler/training/broker/main.d.ts +2 -0
  187. package/dist/compiler/training/broker/main.js +14 -0
  188. package/dist/compiler/training/broker/paths.d.ts +196 -0
  189. package/dist/compiler/training/broker/paths.js +241 -0
  190. package/dist/compiler/training/broker/processes.d.ts +42 -0
  191. package/dist/compiler/training/broker/processes.js +99 -0
  192. package/dist/compiler/training/broker/projection.d.ts +51 -0
  193. package/dist/compiler/training/broker/projection.js +76 -0
  194. package/dist/compiler/training/broker/provisioning.d.ts +87 -0
  195. package/dist/compiler/training/broker/provisioning.js +213 -0
  196. package/dist/compiler/training/broker/receipt.d.ts +77 -0
  197. package/dist/compiler/training/broker/receipt.js +110 -0
  198. package/dist/compiler/training/broker/registration.d.ts +41 -0
  199. package/dist/compiler/training/broker/registration.js +102 -0
  200. package/dist/compiler/training/broker/runtime.d.ts +25 -0
  201. package/dist/compiler/training/broker/runtime.js +173 -0
  202. package/dist/compiler/training/broker/seccompRoutes.d.ts +31 -0
  203. package/dist/compiler/training/broker/seccompRoutes.js +36 -0
  204. package/dist/compiler/training/broker/supervisor.d.ts +109 -0
  205. package/dist/compiler/training/broker/supervisor.js +173 -0
  206. package/dist/compiler/training/container/contract.d.ts +31 -0
  207. package/dist/compiler/training/container/contract.js +33 -0
  208. package/dist/compiler/training/container/index.d.ts +4 -0
  209. package/dist/compiler/training/container/index.js +2 -0
  210. package/dist/compiler/training/container/launch.d.ts +18 -0
  211. package/dist/compiler/training/container/launch.js +173 -0
  212. package/dist/compiler/training/container/prepare.d.ts +8 -0
  213. package/dist/compiler/training/container/prepare.js +80 -0
  214. package/dist/compiler/training/container/process.d.ts +14 -0
  215. package/dist/compiler/training/container/process.js +70 -0
  216. package/dist/compiler/training/container/security.d.ts +36 -0
  217. package/dist/compiler/training/container/security.js +58 -0
  218. package/dist/compiler/training/context.d.ts +7 -0
  219. package/dist/compiler/training/context.js +93 -0
  220. package/dist/compiler/training/contract.d.ts +142 -0
  221. package/dist/compiler/training/contract.js +34 -0
  222. package/dist/compiler/training/index.d.ts +4 -0
  223. package/dist/compiler/training/index.js +3 -0
  224. package/dist/compiler/training/preparation/assets/Dockerfile +98 -0
  225. package/dist/compiler/training/preparation/assets/package-lock.json +3787 -0
  226. package/dist/compiler/training/preparation/broker.d.ts +21 -0
  227. package/dist/compiler/training/preparation/broker.js +43 -0
  228. package/dist/compiler/training/preparation/contextModes.d.ts +12 -0
  229. package/dist/compiler/training/preparation/contextModes.js +38 -0
  230. package/dist/compiler/training/preparation/contract.d.ts +182 -0
  231. package/dist/compiler/training/preparation/contract.js +94 -0
  232. package/dist/compiler/training/preparation/copyAssets.d.ts +1 -0
  233. package/dist/compiler/training/preparation/copyAssets.js +8 -0
  234. package/dist/compiler/training/preparation/daimonParent.d.ts +42 -0
  235. package/dist/compiler/training/preparation/daimonParent.js +114 -0
  236. package/dist/compiler/training/preparation/files.d.ts +25 -0
  237. package/dist/compiler/training/preparation/files.js +85 -0
  238. package/dist/compiler/training/preparation/image.d.ts +28 -0
  239. package/dist/compiler/training/preparation/image.js +102 -0
  240. package/dist/compiler/training/preparation/index.d.ts +3 -0
  241. package/dist/compiler/training/preparation/index.js +2 -0
  242. package/dist/compiler/training/preparation/inputs.d.ts +23 -0
  243. package/dist/compiler/training/preparation/inputs.js +93 -0
  244. package/dist/compiler/training/preparation/prepare.d.ts +33 -0
  245. package/dist/compiler/training/preparation/prepare.js +186 -0
  246. package/dist/compiler/training/preparation/scratch.d.ts +19 -0
  247. package/dist/compiler/training/preparation/scratch.js +48 -0
  248. package/dist/compiler/training/repair/compatibility.d.ts +11 -0
  249. package/dist/compiler/training/repair/compatibility.js +34 -0
  250. package/dist/compiler/training/repair/contract.d.ts +506 -0
  251. package/dist/compiler/training/repair/contract.js +31 -0
  252. package/dist/compiler/training/repair/index.d.ts +3 -0
  253. package/dist/compiler/training/repair/index.js +3 -0
  254. package/dist/compiler/training/repair/prepare.d.ts +230 -0
  255. package/dist/compiler/training/repair/prepare.js +74 -0
  256. package/dist/compiler/training/repair/witness.d.ts +203 -0
  257. package/dist/compiler/training/repair/witness.js +42 -0
  258. package/dist/compiler/types.d.ts +2 -0
  259. package/dist/compiler/upProject.d.ts +26 -1
  260. package/dist/compiler/upProject.js +117 -178
  261. package/dist/compiler/upProjectHandoff.d.ts +62 -0
  262. package/dist/compiler/upProjectHandoff.js +204 -0
  263. package/dist/compiler/upReceipt.js +49 -4
  264. package/dist/compiler/updateProjectModels.js +1 -0
  265. package/dist/compiler/view/types.d.ts +1 -1
  266. package/dist/compiler/workspaceBundleArtifacts.d.ts +3 -0
  267. package/dist/compiler/workspaceBundleArtifacts.js +106 -0
  268. package/dist/compiler/workspaceResources.d.ts +4 -1
  269. package/dist/compiler/workspaceResources.js +12 -7
  270. package/dist/deployment/artifactsExportPlan.js +51 -1
  271. package/dist/deployment/canaryCutover.d.ts +42 -0
  272. package/dist/deployment/canaryCutover.js +140 -0
  273. package/dist/deployment/candidateDiagnostics.d.ts +15 -0
  274. package/dist/deployment/candidateDiagnostics.js +90 -0
  275. package/dist/deployment/dockerLogs.js +4 -1
  276. package/dist/deployment/dockerManager.js +9 -3
  277. package/dist/deployment/dockerProbeGateway.d.ts +17 -0
  278. package/dist/deployment/dockerProbeGateway.js +17 -2
  279. package/dist/deployment/downDeployment.d.ts +5 -0
  280. package/dist/deployment/downDeployment.js +109 -8
  281. package/dist/deployment/downReceiptTypes.d.ts +17 -2
  282. package/dist/deployment/downReceiptTypes.js +17 -2
  283. package/dist/deployment/index.d.ts +4 -0
  284. package/dist/deployment/index.js +4 -0
  285. package/dist/deployment/lifecycleCompletionContracts.d.ts +66 -0
  286. package/dist/deployment/lifecycleCompletionContracts.js +34 -0
  287. package/dist/deployment/lifecycleCompletionPaths.d.ts +4 -1
  288. package/dist/deployment/lifecycleCompletionPaths.js +3 -0
  289. package/dist/deployment/lifecycleCompletionPublication.d.ts +2 -0
  290. package/dist/deployment/lifecycleCompletionPublication.js +18 -4
  291. package/dist/deployment/lifecycleCompletionStore.d.ts +1 -1
  292. package/dist/deployment/lifecycleCompletionStore.js +7 -7
  293. package/dist/deployment/lifecycleUpRecords.d.ts +11 -0
  294. package/dist/deployment/lifecycleUpRecords.js +127 -0
  295. package/dist/deployment/native/AGENTS.md +11 -0
  296. package/dist/deployment/native/rename-noreplace-arm64 +0 -0
  297. package/dist/deployment/native/rename-noreplace-arm64.provenance.json +1 -0
  298. package/dist/deployment/native/rename-noreplace-x64 +0 -0
  299. package/dist/deployment/native/rename-noreplace-x64.provenance.json +1 -0
  300. package/dist/deployment/noReplaceActivation.d.ts +17 -0
  301. package/dist/deployment/noReplaceActivation.js +50 -0
  302. package/dist/deployment/organizationHandoffAuthorityFsBudget.d.ts +110 -0
  303. package/dist/deployment/organizationHandoffAuthorityFsBudget.js +156 -0
  304. package/dist/deployment/organizationHandoffAuthorityFsClient.js +82 -27
  305. package/dist/deployment/organizationHandoffAuthorityFsElection.d.ts +21 -0
  306. package/dist/deployment/organizationHandoffAuthorityFsElection.js +57 -0
  307. package/dist/deployment/organizationHandoffAuthorityFsWorker.js +254 -108
  308. package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.d.ts +1 -0
  309. package/dist/deployment/organizationHandoffAuthorityFsWorkerStall.fixture.js +16 -0
  310. package/dist/deployment/organizationHandoffAuthorityStore.js +14 -7
  311. package/dist/deployment/organizationHandoffAuthorityTypes.d.ts +2 -2
  312. package/dist/deployment/organizationHandoffAuthorityTypes.js +2 -1
  313. package/dist/deployment/organizationReady.d.ts +2 -0
  314. package/dist/deployment/organizationReady.js +36 -4
  315. package/dist/deployment/productStateClone.d.ts +43 -0
  316. package/dist/deployment/productStateClone.js +319 -0
  317. package/dist/deployment/upLifecycleRecoveryState.d.ts +23 -0
  318. package/dist/deployment/upLifecycleRecoveryState.js +12 -0
  319. package/dist/deployment/upReceiptTypes.d.ts +32 -6
  320. package/dist/deployment/upReceiptTypes.js +29 -2
  321. package/dist/deployment/workspaceResourceMigration.d.ts +55 -0
  322. package/dist/deployment/workspaceResourceMigration.js +315 -0
  323. package/dist/dev/project.d.ts +7 -0
  324. package/dist/dev/project.js +9 -0
  325. package/dist/distribution/consumeImage.d.ts +2 -0
  326. package/dist/distribution/consumeImage.js +98 -73
  327. package/dist/distribution/consumeImageDaimonDocker.d.ts +3 -0
  328. package/dist/distribution/consumeImageDaimonDocker.js +45 -0
  329. package/dist/distribution/consumeImageLifecycle.d.ts +17 -0
  330. package/dist/distribution/consumeImageLifecycle.js +231 -0
  331. package/dist/distribution/consumeImageSupport.d.ts +12 -0
  332. package/dist/distribution/consumeImageSupport.js +15 -0
  333. package/dist/distribution/distributionReportSchema.d.ts +11 -1
  334. package/dist/distribution/distributionReportSchema.js +15 -2
  335. package/dist/distribution/dockerRunner.d.ts +6 -1
  336. package/dist/distribution/dockerRunner.js +31 -4
  337. package/dist/distribution/imageRuntimeAuth.d.ts +9 -1
  338. package/dist/distribution/imageRuntimeAuth.js +70 -1
  339. package/dist/distribution/index.d.ts +1 -1
  340. package/dist/distribution/index.js +1 -1
  341. package/dist/distribution/preflight.js +5 -1
  342. package/dist/distribution/types.d.ts +14 -1
  343. package/dist/distribution/types.js +3 -0
  344. package/dist/evidenceExportHelper/boundedExecutor.d.ts +3 -0
  345. package/dist/evidenceExportHelper/boundedExecutor.js +33 -0
  346. package/dist/evidenceExportHelper/helperProgram.mjs +156 -0
  347. package/dist/evidenceExportHelper/index.d.ts +4 -0
  348. package/dist/evidenceExportHelper/index.js +4 -0
  349. package/dist/evidenceExportHelper/preparedAuthority.d.ts +64 -0
  350. package/dist/evidenceExportHelper/preparedAuthority.js +228 -0
  351. package/dist/evidenceExportHelper/preparedBuilder.d.ts +10 -0
  352. package/dist/evidenceExportHelper/preparedBuilder.js +183 -0
  353. package/dist/evidenceExportHelper/preparedBuilderTypes.d.ts +19 -0
  354. package/dist/evidenceExportHelper/preparedBuilderTypes.js +1 -0
  355. package/dist/evidenceExportHelper/recipe.d.ts +7 -0
  356. package/dist/evidenceExportHelper/recipe.js +83 -0
  357. package/dist/filesystem/io.d.ts +2 -0
  358. package/dist/filesystem/io.js +16 -1
  359. package/dist/manifest/executionSchemas.d.ts +27 -0
  360. package/dist/manifest/executionSchemas.js +21 -2
  361. package/dist/manifest/mcpSchemas.d.ts +1 -0
  362. package/dist/manifest/mcpSchemas.js +3 -0
  363. package/dist/manifest/renderSpawnfileNetworks.js +11 -0
  364. package/dist/manifest/renderSpawnfileWorkspace.js +5 -0
  365. package/dist/manifest/scheduleSchemas.d.ts +3 -1
  366. package/dist/manifest/scheduleSchemas.js +91 -5
  367. package/dist/manifest/schemas.d.ts +237 -12
  368. package/dist/manifest/schemas.js +5 -2
  369. package/dist/manifest/teamNetworkAccessSchemas.d.ts +5 -1
  370. package/dist/manifest/teamNetworkAccessSchemas.js +11 -0
  371. package/dist/manifest/teamNetworkAuthSchemas.d.ts +1 -1
  372. package/dist/manifest/teamNetworkSchemas.d.ts +17 -3
  373. package/dist/manifest/teamNetworkSchemas.js +19 -1
  374. package/dist/manifest/teamNetworkServerSchemas.d.ts +8 -3
  375. package/dist/manifest/teamNetworkServerSchemas.js +18 -2
  376. package/dist/manifest/workspaceSchemas.d.ts +16 -0
  377. package/dist/manifest/workspaceSchemas.js +11 -0
  378. package/dist/report/types.d.ts +34 -4
  379. package/dist/runtime/common.d.ts +28 -1
  380. package/dist/runtime/common.js +33 -3
  381. package/dist/runtime/container.js +49 -33
  382. package/dist/runtime/daimon/adapter.d.ts +14 -0
  383. package/dist/runtime/daimon/adapter.js +243 -0
  384. package/dist/runtime/daimon/attention.d.ts +8 -0
  385. package/dist/runtime/daimon/attention.js +32 -0
  386. package/dist/runtime/daimon/config.d.ts +25 -0
  387. package/dist/runtime/daimon/config.js +272 -0
  388. package/dist/runtime/daimon/contractManifest.d.ts +295 -0
  389. package/dist/runtime/daimon/contractManifest.js +319 -0
  390. package/dist/runtime/daimon/grokModel.d.ts +19 -0
  391. package/dist/runtime/daimon/grokModel.js +33 -0
  392. package/dist/runtime/daimon/grokWorkerConfigBytes.d.ts +26 -0
  393. package/dist/runtime/daimon/grokWorkerConfigBytes.js +36 -0
  394. package/dist/runtime/daimon/grokWorkerContract.d.ts +22 -0
  395. package/dist/runtime/daimon/grokWorkerContract.js +48 -0
  396. package/dist/runtime/daimon/memory.d.ts +57 -0
  397. package/dist/runtime/daimon/memory.js +125 -0
  398. package/dist/runtime/daimon/runAuth.d.ts +51 -0
  399. package/dist/runtime/daimon/runAuth.js +279 -0
  400. package/dist/runtime/daimon/runtimeIdentity.d.ts +22 -0
  401. package/dist/runtime/daimon/runtimeIdentity.js +22 -0
  402. package/dist/runtime/daimon/scheduleAuthority.d.ts +3 -0
  403. package/dist/runtime/daimon/scheduleAuthority.js +17 -0
  404. package/dist/runtime/index.d.ts +4 -0
  405. package/dist/runtime/index.js +4 -0
  406. package/dist/runtime/install.d.ts +3 -0
  407. package/dist/runtime/install.js +3 -0
  408. package/dist/runtime/localDaimonAuthority.d.ts +11 -0
  409. package/dist/runtime/localDaimonAuthority.js +77 -0
  410. package/dist/runtime/mnemeMcp.d.ts +13 -0
  411. package/dist/runtime/mnemeMcp.js +26 -0
  412. package/dist/runtime/openclaw/adapter.js +2 -2
  413. package/dist/runtime/pi/adapter.d.ts +0 -1
  414. package/dist/runtime/pi/adapter.js +2 -6
  415. package/dist/runtime/pi/appCliSource.js +1 -1
  416. package/dist/runtime/pi/appScheduleSource.js +6 -2
  417. package/dist/runtime/pi/appTemplateTypes.d.ts +1 -1
  418. package/dist/runtime/picoclaw/adapter.js +2 -2
  419. package/dist/runtime/registry.d.ts +3 -0
  420. package/dist/runtime/registry.js +19 -2
  421. package/dist/runtime/scheduleUtils.d.ts +1 -0
  422. package/dist/runtime/scheduleUtils.js +5 -1
  423. package/dist/runtime/types.d.ts +25 -0
  424. package/dist/runtime/usageLedger.d.ts +158 -0
  425. package/dist/runtime/usageLedger.js +269 -0
  426. package/dist/runtime/usageLedgerRead.d.ts +48 -0
  427. package/dist/runtime/usageLedgerRead.js +102 -0
  428. package/dist/runtime/usageRequestLedger.d.ts +42 -0
  429. package/dist/runtime/usageRequestLedger.js +72 -0
  430. package/dist/shared/daimonCodexDocker.d.ts +32 -0
  431. package/dist/shared/daimonCodexDocker.js +120 -0
  432. package/dist/shared/daimonGrokSeccompProfile.d.ts +10 -0
  433. package/dist/shared/daimonGrokSeccompProfile.js +11 -0
  434. package/dist/shared/index.d.ts +2 -0
  435. package/dist/shared/index.js +2 -0
  436. package/dist/shared/types.d.ts +1 -1
  437. package/dist/shared/volumeNames.d.ts +6 -0
  438. package/dist/shared/volumeNames.js +14 -0
  439. package/dist/target/dockerArtifactsProvider.js +34 -7
  440. package/dist/target/dockerBaseImage.d.ts +2 -0
  441. package/dist/target/dockerBaseImage.js +11 -0
  442. package/dist/target/dockerCommandExecutor.d.ts +11 -0
  443. package/dist/target/dockerCommandExecutor.js +53 -2
  444. package/dist/target/dockerCommandExecutorCore.d.ts +2 -1
  445. package/dist/target/dockerCommandExecutorCore.js +4 -2
  446. package/dist/target/dockerPublicArtifactSnapshot.d.ts +3 -3
  447. package/dist/target/dockerPublicArtifactSnapshot.js +17 -33
  448. package/dist/target/dockerTarget.d.ts +1 -0
  449. package/dist/target/dockerTargetBinding.d.ts +1 -2
  450. package/dist/target/dockerTargetBinding.js +2 -3
  451. package/dist/target/dockerTargetExecFile.d.ts +19 -0
  452. package/dist/target/dockerTargetExecFile.js +194 -0
  453. package/dist/target/dockerWorldServiceProvider.d.ts +4 -0
  454. package/dist/target/dockerWorldServiceProvider.js +13 -1
  455. package/dist/target/evidenceExport.d.ts +3 -1
  456. package/dist/target/evidenceExport.js +12 -3
  457. package/dist/target/evidenceExportOperationsTestKit.js +3 -3
  458. package/dist/target/evidenceExportProvider.d.ts +2 -0
  459. package/dist/target/evidenceExportProvider.js +15 -5
  460. package/dist/target/publicArtifactSnapshot.d.ts +31 -0
  461. package/dist/target/publicArtifactSnapshot.js +37 -3
  462. package/examples/README.md +45 -0
  463. package/examples/agent-with-subagents/AGENTS.md +3 -0
  464. package/examples/agent-with-subagents/Spawnfile +30 -0
  465. package/examples/agent-with-subagents/subagents/critic/AGENTS.md +3 -0
  466. package/examples/agent-with-subagents/subagents/critic/Spawnfile +15 -0
  467. package/examples/agent-with-subagents/subagents/researcher/AGENTS.md +3 -0
  468. package/examples/agent-with-subagents/subagents/researcher/Spawnfile +17 -0
  469. package/examples/daimon-org/Spawnfile +68 -0
  470. package/examples/daimon-org/TEAM.md +4 -0
  471. package/examples/daimon-org/agents/mapper/AGENTS.md +4 -0
  472. package/examples/daimon-org/agents/mapper/Spawnfile +37 -0
  473. package/examples/daimon-org/shared/skills/file-note/SKILL.md +9 -0
  474. package/examples/daimon-org/teams/review/Spawnfile +53 -0
  475. package/examples/daimon-org/teams/review/agents/reviewer/AGENTS.md +4 -0
  476. package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +37 -0
  477. package/examples/daimon-public-host/AGENTS.md +3 -0
  478. package/examples/daimon-public-host/Spawnfile +21 -0
  479. package/examples/distribution-org/Spawnfile +43 -0
  480. package/examples/distribution-org/TEAM.md +4 -0
  481. package/examples/distribution-org/agents/coordinator/AGENTS.md +1 -0
  482. package/examples/distribution-org/agents/coordinator/Spawnfile +20 -0
  483. package/examples/distribution-org/agents/researcher/AGENTS.md +1 -0
  484. package/examples/distribution-org/agents/researcher/Spawnfile +20 -0
  485. package/examples/jungian-daimon-org/Spawnfile +41 -0
  486. package/examples/jungian-daimon-org/TEAM.md +21 -0
  487. package/examples/jungian-daimon-org/teams/luna/Spawnfile +47 -0
  488. package/examples/jungian-daimon-org/teams/luna/TEAM.md +4 -0
  489. package/examples/jungian-daimon-org/teams/luna/agents/animus/AGENTS.md +10 -0
  490. package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +33 -0
  491. package/examples/jungian-daimon-org/teams/luna/agents/representative/AGENTS.md +21 -0
  492. package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +30 -0
  493. package/examples/jungian-daimon-org/teams/luna/agents/shadow/AGENTS.md +10 -0
  494. package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +33 -0
  495. package/examples/jungian-daimon-org/teams/selene/Spawnfile +47 -0
  496. package/examples/jungian-daimon-org/teams/selene/TEAM.md +4 -0
  497. package/examples/jungian-daimon-org/teams/selene/agents/animus/AGENTS.md +10 -0
  498. package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +33 -0
  499. package/examples/jungian-daimon-org/teams/selene/agents/representative/AGENTS.md +19 -0
  500. package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +33 -0
  501. package/examples/jungian-daimon-org/teams/selene/agents/shadow/AGENTS.md +10 -0
  502. package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +30 -0
  503. package/examples/mixed-runtime-org/Spawnfile +71 -0
  504. package/examples/mixed-runtime-org/TEAM.md +8 -0
  505. package/examples/mixed-runtime-org/agents/analyst/AGENTS.md +8 -0
  506. package/examples/mixed-runtime-org/agents/analyst/Spawnfile +27 -0
  507. package/examples/mixed-runtime-org/agents/conductor/AGENTS.md +8 -0
  508. package/examples/mixed-runtime-org/agents/conductor/Spawnfile +27 -0
  509. package/examples/mixed-runtime-org/agents/localist/AGENTS.md +7 -0
  510. package/examples/mixed-runtime-org/agents/localist/Spawnfile +50 -0
  511. package/examples/moltnet-team-chat/Spawnfile +43 -0
  512. package/examples/moltnet-team-chat/TEAM.md +5 -0
  513. package/examples/moltnet-team-chat/agents/coordinator/AGENTS.md +9 -0
  514. package/examples/moltnet-team-chat/agents/coordinator/Spawnfile +26 -0
  515. package/examples/moltnet-team-chat/teams/analysis/Spawnfile +23 -0
  516. package/examples/moltnet-team-chat/teams/analysis/TEAM.md +3 -0
  517. package/examples/moltnet-team-chat/teams/analysis/agents/observer/AGENTS.md +5 -0
  518. package/examples/moltnet-team-chat/teams/analysis/agents/observer/Spawnfile +19 -0
  519. package/examples/moltnet-team-chat/teams/analysis/agents/representative/AGENTS.md +5 -0
  520. package/examples/moltnet-team-chat/teams/analysis/agents/representative/Spawnfile +19 -0
  521. package/examples/moltnet-team-chat/teams/field/Spawnfile +41 -0
  522. package/examples/moltnet-team-chat/teams/field/TEAM.md +3 -0
  523. package/examples/moltnet-team-chat/teams/field/agents/observer/AGENTS.md +5 -0
  524. package/examples/moltnet-team-chat/teams/field/agents/observer/Spawnfile +26 -0
  525. package/examples/moltnet-team-chat/teams/field/agents/representative/AGENTS.md +11 -0
  526. package/examples/moltnet-team-chat/teams/field/agents/representative/Spawnfile +26 -0
  527. package/examples/single-agent/AGENTS.md +3 -0
  528. package/examples/single-agent/HEARTBEAT.md +3 -0
  529. package/examples/single-agent/IDENTITY.md +3 -0
  530. package/examples/single-agent/MEMORY.md +3 -0
  531. package/examples/single-agent/SOUL.md +3 -0
  532. package/examples/single-agent/Spawnfile +41 -0
  533. package/examples/single-agent/skills/web_search/SKILL.md +6 -0
  534. package/moltnet-releases.json +5 -4
  535. package/package.json +36 -9
  536. package/runtimes.yaml +5 -2
  537. package/dist/cli/targetWorldClockCrossProcess.test-helper.d.ts +0 -13
  538. package/dist/cli/targetWorldClockCrossProcess.test-helper.js +0 -109
  539. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.d.ts +0 -8
  540. package/dist/deployment/providerRuntimeBoundaryScanner.test-helper.js +0 -60
  541. package/dist/deployment/simfileFixtureBoundary.test-helper.d.ts +0 -8
  542. package/dist/deployment/simfileFixtureBoundary.test-helper.js +0 -103
  543. package/dist/ownership/simfileRunOperatorInputs.d.ts +0 -103
  544. package/dist/ownership/simfileRunOperatorInputs.js +0 -139
  545. package/dist/target/cleanupRunDocker.test-helper.d.ts +0 -67
  546. package/dist/target/cleanupRunDocker.test-helper.js +0 -238
@@ -0,0 +1,3 @@
1
+ import { type DockerArtifactExecutor } from "../target/dockerArtifactsProvider.js";
2
+ /** Tree-safe private Docker executor used at every local-helper boundary. */
3
+ export declare const createPreparedEvidenceHelperExecutor: (dockerCommand: string) => DockerArtifactExecutor;
@@ -0,0 +1,33 @@
1
+ import { DockerArtifactProviderError, } from "../target/dockerArtifactsProvider.js";
2
+ import { createBoundedDockerTargetExecFile, DockerTargetCommandFailure, } from "../target/dockerTargetExecFile.js";
3
+ const missingExactImage = (args, error) => {
4
+ if (!(error instanceof DockerTargetCommandFailure))
5
+ return false;
6
+ const command = args[0] === "--context" ? args.slice(2) : args;
7
+ if (command.length !== 5 || command[0] !== "image" || command[1] !== "inspect"
8
+ || command[3] !== "--format")
9
+ return false;
10
+ const match = /^(?:Error response from daemon: )?No such image: ([A-Za-z0-9_.:@/-]+)$/u
11
+ .exec(error.stderr.trim());
12
+ return match?.[1] === command[2];
13
+ };
14
+ /** Tree-safe private Docker executor used at every local-helper boundary. */
15
+ export const createPreparedEvidenceHelperExecutor = (dockerCommand) => {
16
+ const execute = createBoundedDockerTargetExecFile();
17
+ return async (file, args, options) => {
18
+ if (file !== "docker")
19
+ throw new Error("Prepared evidence-export helper failed");
20
+ try {
21
+ return await execute(dockerCommand, args, {
22
+ signal: options.signal,
23
+ stdin: options.stdin,
24
+ timeout: options.timeout,
25
+ });
26
+ }
27
+ catch (error) {
28
+ if (missingExactImage(args, error))
29
+ throw new DockerArtifactProviderError("image_not_found");
30
+ throw error;
31
+ }
32
+ };
33
+ };
@@ -0,0 +1,156 @@
1
+ #!/usr/local/bin/node
2
+
3
+ import { constants } from "node:fs";
4
+ import { lstat, open, opendir } from "node:fs/promises";
5
+ import path from "node:path";
6
+
7
+ const ROOT = "/spawnfile/evidence";
8
+ const BLOCK = 512;
9
+ const MAX_BYTES = 67_108_864;
10
+ const MAX_ENTRIES = 10_000;
11
+ const MAX_DEPTH = 32;
12
+ const MAX_PATH_BYTES = 255;
13
+
14
+ const fail = () => { throw new Error("Evidence export helper failed"); };
15
+ const pad = (size) => Math.ceil(size / BLOCK) * BLOCK;
16
+ const same = (left, right) => left.dev === right.dev && left.ino === right.ino
17
+ && left.size === right.size && left.mode === right.mode;
18
+
19
+ const safePath = (value) => {
20
+ const bytes = Buffer.from(value, "utf8");
21
+ if (value.length < 1 || bytes.toString("utf8") !== value
22
+ || bytes.byteLength > MAX_PATH_BYTES || value.startsWith("/")
23
+ || value.includes("\\") || value.includes("\0") || value.includes("//")) fail();
24
+ const parts = value.split("/");
25
+ if (parts.length > MAX_DEPTH || parts.some((part) => part === "" || part === "." || part === "..")) fail();
26
+ for (const part of parts) {
27
+ for (let index = 0; index < part.length; index += 1) {
28
+ const code = part.charCodeAt(index);
29
+ if (code < 0x20 || code === 0x7f) fail();
30
+ }
31
+ }
32
+ return value;
33
+ };
34
+
35
+ const comparePaths = (left, right) => Buffer.compare(
36
+ Buffer.from(left.path, "utf8"),
37
+ Buffer.from(right.path, "utf8"),
38
+ );
39
+
40
+ const collect = async (directory, prefix, entries) => {
41
+ const before = await lstat(directory);
42
+ if (!before.isDirectory() || before.isSymbolicLink()) fail();
43
+ const handle = await opendir(directory);
44
+ const names = [];
45
+ try {
46
+ for await (const item of handle) names.push(item.name);
47
+ } finally {
48
+ await handle.close().catch(() => undefined);
49
+ }
50
+ names.sort((left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right)));
51
+ for (const name of names) {
52
+ const relative = safePath(prefix ? `${prefix}/${name}` : name);
53
+ const absolute = path.join(directory, name);
54
+ const info = await lstat(absolute);
55
+ if (info.isSymbolicLink()) fail();
56
+ if (info.isDirectory()) {
57
+ entries.push({ info, path: relative, type: "directory" });
58
+ await collect(absolute, relative, entries);
59
+ } else if (info.isFile()) {
60
+ entries.push({ info, path: relative, type: "file" });
61
+ } else fail();
62
+ if (entries.length > MAX_ENTRIES) fail();
63
+ }
64
+ const after = await lstat(directory);
65
+ if (!same(before, after)) fail();
66
+ };
67
+
68
+ const octal = (value, width) => {
69
+ const raw = value.toString(8);
70
+ if (!Number.isSafeInteger(value) || value < 0 || raw.length > width - 1) fail();
71
+ return Buffer.from(`${raw.padStart(width - 1, "0")}\0`, "ascii");
72
+ };
73
+
74
+ const storedPath = (entry) => entry.type === "directory" ? `${entry.path}/` : entry.path;
75
+ const splitPath = (stored) => {
76
+ const bytes = Buffer.from(stored, "utf8");
77
+ if (bytes.byteLength <= 100) return { name: bytes, prefix: Buffer.alloc(0) };
78
+ for (let split = stored.lastIndexOf("/"); split > 0; split = stored.lastIndexOf("/", split - 1)) {
79
+ const prefix = Buffer.from(stored.slice(0, split), "utf8");
80
+ const name = Buffer.from(stored.slice(split + 1), "utf8");
81
+ if (prefix.byteLength <= 155 && name.byteLength > 0 && name.byteLength <= 100) {
82
+ return { name, prefix };
83
+ }
84
+ }
85
+ return fail();
86
+ };
87
+
88
+ const header = (entry) => {
89
+ const stored = storedPath(entry);
90
+ const { name, prefix } = splitPath(stored);
91
+ const output = Buffer.alloc(BLOCK);
92
+ output.set(name, 0);
93
+ output.set(octal(entry.type === "directory" ? 0o755 : 0o644, 8), 100);
94
+ output.set(octal(0, 8), 108);
95
+ output.set(octal(0, 8), 116);
96
+ output.set(octal(entry.type === "file" ? entry.info.size : 0, 12), 124);
97
+ output.set(octal(0, 12), 136);
98
+ output[156] = entry.type === "directory" ? 53 : 48;
99
+ output.set(Buffer.from("ustar\0", "ascii"), 257);
100
+ output.set(Buffer.from("00", "ascii"), 263);
101
+ output.set(octal(0, 8), 329);
102
+ output.set(octal(0, 8), 337);
103
+ output.set(prefix, 345);
104
+ output.fill(0x20, 148, 156);
105
+ let sum = 0;
106
+ for (const byte of output) sum += byte;
107
+ if (sum > 0o777777) fail();
108
+ output.set(Buffer.from(`${sum.toString(8).padStart(6, "0")}\0 `, "ascii"), 148);
109
+ return output;
110
+ };
111
+
112
+ const write = async (bytes) => {
113
+ if (process.stdout.write(bytes)) return;
114
+ await new Promise((resolve, reject) => {
115
+ process.stdout.once("drain", resolve);
116
+ process.stdout.once("error", reject);
117
+ });
118
+ };
119
+
120
+ const main = async () => {
121
+ const root = await lstat(ROOT);
122
+ if (!root.isDirectory() || root.isSymbolicLink()) fail();
123
+ const entries = [];
124
+ await collect(ROOT, "", entries);
125
+ entries.sort(comparePaths);
126
+ if (entries.length < 1) fail();
127
+ let total = BLOCK * 2;
128
+ for (const entry of entries) {
129
+ total += BLOCK + (entry.type === "file" ? pad(entry.info.size) : 0);
130
+ if (!Number.isSafeInteger(total) || total > MAX_BYTES) fail();
131
+ }
132
+ for (const entry of entries) {
133
+ await write(header(entry));
134
+ if (entry.type !== "file") continue;
135
+ const absolute = path.join(ROOT, entry.path);
136
+ const file = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW);
137
+ try {
138
+ const before = await file.stat();
139
+ if (!before.isFile() || !same(before, entry.info)) fail();
140
+ const bytes = await file.readFile();
141
+ const after = await file.stat();
142
+ if (!same(before, after) || bytes.byteLength !== before.size) fail();
143
+ await write(bytes);
144
+ const padding = pad(bytes.byteLength) - bytes.byteLength;
145
+ if (padding > 0) await write(Buffer.alloc(padding));
146
+ } finally {
147
+ await file.close().catch(() => undefined);
148
+ }
149
+ }
150
+ await write(Buffer.alloc(BLOCK * 2));
151
+ };
152
+
153
+ main().catch(() => {
154
+ process.stderr.write("Evidence export helper failed\n");
155
+ process.exitCode = 1;
156
+ });
@@ -0,0 +1,4 @@
1
+ export { createPreparedEvidenceHelperExecutor } from "./boundedExecutor.js";
2
+ export * from "./preparedAuthority.js";
3
+ export * from "./preparedBuilder.js";
4
+ export * from "./recipe.js";
@@ -0,0 +1,4 @@
1
+ export { createPreparedEvidenceHelperExecutor } from "./boundedExecutor.js";
2
+ export * from "./preparedAuthority.js";
3
+ export * from "./preparedBuilder.js";
4
+ export * from "./recipe.js";
@@ -0,0 +1,64 @@
1
+ import { type OpaqueTargetHandle } from "../target/contracts.js";
2
+ export declare const PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION: "spawnfile.target-evidence-export-helper.prepared.v1";
3
+ export declare const PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION: "spawnfile.target-evidence-export-helper.private.v3";
4
+ export interface PreparedEvidenceHelperReceipt {
5
+ readonly digest: `sha256:${string}`;
6
+ readonly handle: OpaqueTargetHandle;
7
+ readonly version: typeof PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION;
8
+ }
9
+ export interface PreparedEvidenceHelperPendingRecord {
10
+ readonly base_config_digest: `sha256:${string}`;
11
+ readonly base_image: string;
12
+ readonly context: string;
13
+ readonly daemon_digest: `sha256:${string}`;
14
+ readonly endpoint_digest: `sha256:${string}`;
15
+ readonly platform: {
16
+ readonly architecture: "amd64" | "arm64";
17
+ readonly os: "linux";
18
+ };
19
+ readonly recipe_digest: `sha256:${string}`;
20
+ readonly version: typeof PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION;
21
+ }
22
+ export interface PreparedEvidenceHelperCompletionRecord {
23
+ readonly accepted_image_config_digest: `sha256:${string}`;
24
+ readonly pending_digest: `sha256:${string}`;
25
+ readonly receipt: PreparedEvidenceHelperReceipt;
26
+ readonly version: typeof PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION;
27
+ }
28
+ export interface PreparedEvidenceHelperAuthority {
29
+ readonly completion: PreparedEvidenceHelperCompletionRecord | null;
30
+ readonly pending: PreparedEvidenceHelperPendingRecord;
31
+ }
32
+ export declare const parsePreparedEvidenceHelperReceipt: (raw: unknown) => PreparedEvidenceHelperReceipt;
33
+ export declare const createPreparedEvidenceHelperReceiptBytes: (raw: unknown) => string;
34
+ export declare const pendingDigest: (raw: unknown) => `sha256:${string}`;
35
+ export declare const createPreparedEvidenceHelperReceipt: (input: {
36
+ readonly configDigest: unknown;
37
+ readonly pendingDigest: unknown;
38
+ }) => PreparedEvidenceHelperReceipt;
39
+ export declare const parsePreparedEvidenceHelperPendingRecord: (raw: unknown) => PreparedEvidenceHelperPendingRecord;
40
+ export declare const createPreparedEvidenceHelperPendingBytes: (raw: unknown) => string;
41
+ export declare const parsePreparedEvidenceHelperCompletionRecord: (raw: unknown) => PreparedEvidenceHelperCompletionRecord;
42
+ export declare const createPreparedEvidenceHelperCompletionBytes: (raw: unknown) => string;
43
+ export declare const createPreparedEvidenceHelperKey: (input: {
44
+ readonly baseConfigDigest: string;
45
+ readonly context: string;
46
+ readonly daemonDigest: string;
47
+ readonly endpointDigest: string;
48
+ readonly platform: {
49
+ readonly architecture: string;
50
+ readonly os: string;
51
+ };
52
+ readonly recipeDigest: string;
53
+ }) => string;
54
+ export declare const newPreparedEvidenceHelperPendingRecord: (input: Omit<PreparedEvidenceHelperPendingRecord, "version">) => PreparedEvidenceHelperPendingRecord;
55
+ export declare const newPreparedEvidenceHelperCompletionRecord: (pending: unknown, configDigest: unknown) => PreparedEvidenceHelperCompletionRecord;
56
+ /** Immutable, fsynced pending/completion authority records keyed by exact target facts. */
57
+ export declare class PreparedEvidenceHelperAuthorityStore {
58
+ #private;
59
+ constructor(privateRoot: string);
60
+ load(key: string): Promise<PreparedEvidenceHelperAuthority | null>;
61
+ reserve(key: string, raw: unknown): Promise<PreparedEvidenceHelperPendingRecord>;
62
+ complete(key: string, raw: unknown): Promise<PreparedEvidenceHelperCompletionRecord>;
63
+ }
64
+ export declare const initializePreparedEvidenceHelperAuthorityStore: (privateRoot: unknown) => Promise<PreparedEvidenceHelperAuthorityStore>;
@@ -0,0 +1,228 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { link, lstat, mkdir, open, realpath, unlink } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { types as nodeTypes } from "node:util";
6
+ import { parseOpaqueTargetHandle } from "../target/contracts.js";
7
+ export const PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION = "spawnfile.target-evidence-export-helper.prepared.v1";
8
+ export const PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION = "spawnfile.target-evidence-export-helper.private.v3";
9
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
10
+ const HANDLE = /^opaque_[a-f0-9]{64}$/u;
11
+ const CONTEXT = /^[a-z][a-z0-9_-]{0,63}$/u;
12
+ const ERROR = "Prepared evidence-export helper failed";
13
+ const OWNER = process.getuid?.();
14
+ const fail = () => { throw new Error(ERROR); };
15
+ const hash = (domain, value) => `sha256:${createHash("sha256").update(`spawnfile.evidence-helper.${domain}.v1\0`).update(value).digest("hex")}`;
16
+ const exact = (raw, keys) => raw !== null && typeof raw === "object" && !Array.isArray(raw)
17
+ && !nodeTypes.isProxy(raw) && Object.getPrototypeOf(raw) === Object.prototype
18
+ && Reflect.ownKeys(raw).every((key) => typeof key === "string")
19
+ && Object.keys(raw).sort().join("\0") === [...keys].sort().join("\0")
20
+ && Object.values(Object.getOwnPropertyDescriptors(raw)).every((item) => item.enumerable && "value" in item);
21
+ const digest = (raw) => typeof raw === "string" && DIGEST.test(raw) ? raw : fail();
22
+ const text = (raw, maximum) => typeof raw === "string" && raw === raw.trim() && !raw.includes("\0")
23
+ && Buffer.byteLength(raw, "utf8") > 0 && Buffer.byteLength(raw, "utf8") <= maximum ? raw : fail();
24
+ export const parsePreparedEvidenceHelperReceipt = (raw) => {
25
+ if (!exact(raw, ["digest", "handle", "version"])
26
+ || raw.version !== PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION
27
+ || typeof raw.handle !== "string" || !HANDLE.test(raw.handle))
28
+ return fail();
29
+ return Object.freeze({ digest: digest(raw.digest), handle: parseOpaqueTargetHandle(raw.handle),
30
+ version: PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION });
31
+ };
32
+ export const createPreparedEvidenceHelperReceiptBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperReceipt(raw));
33
+ export const pendingDigest = (raw) => hash("pending", createPreparedEvidenceHelperPendingBytes(raw));
34
+ export const createPreparedEvidenceHelperReceipt = (input) => {
35
+ const config = digest(input.configDigest);
36
+ const pending = digest(input.pendingDigest);
37
+ const handle = parseOpaqueTargetHandle(`opaque_${hash("prepared-handle", `${pending}\0${config}`).slice(7)}`);
38
+ return Object.freeze({ digest: hash("prepared-receipt", `${PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION}\0${handle}\0${pending}\0${config}`),
39
+ handle, version: PREPARED_EVIDENCE_HELPER_RECEIPT_VERSION });
40
+ };
41
+ export const parsePreparedEvidenceHelperPendingRecord = (raw) => {
42
+ if (!exact(raw, ["base_config_digest", "base_image", "context", "daemon_digest", "endpoint_digest",
43
+ "platform", "recipe_digest", "version"])
44
+ || raw.version !== PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION
45
+ || !exact(raw.platform, ["architecture", "os"])
46
+ || raw.platform.os !== "linux"
47
+ || raw.platform.architecture !== "amd64" && raw.platform.architecture !== "arm64")
48
+ return fail();
49
+ const context = text(raw.context, 64);
50
+ if (!CONTEXT.test(context))
51
+ return fail();
52
+ return Object.freeze({ base_config_digest: digest(raw.base_config_digest), base_image: text(raw.base_image, 512),
53
+ context, daemon_digest: digest(raw.daemon_digest), endpoint_digest: digest(raw.endpoint_digest),
54
+ platform: Object.freeze({ architecture: raw.platform.architecture, os: "linux" }),
55
+ recipe_digest: digest(raw.recipe_digest),
56
+ version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
57
+ };
58
+ export const createPreparedEvidenceHelperPendingBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperPendingRecord(raw));
59
+ export const parsePreparedEvidenceHelperCompletionRecord = (raw) => {
60
+ if (!exact(raw, ["accepted_image_config_digest", "pending_digest", "receipt", "version"])
61
+ || raw.version !== PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION)
62
+ return fail();
63
+ const accepted = digest(raw.accepted_image_config_digest);
64
+ const pending = digest(raw.pending_digest);
65
+ const receipt = parsePreparedEvidenceHelperReceipt(raw.receipt);
66
+ const expected = createPreparedEvidenceHelperReceipt({ configDigest: accepted, pendingDigest: pending });
67
+ if (receipt.handle !== expected.handle || receipt.digest !== expected.digest)
68
+ return fail();
69
+ return Object.freeze({ accepted_image_config_digest: accepted, pending_digest: pending, receipt,
70
+ version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
71
+ };
72
+ export const createPreparedEvidenceHelperCompletionBytes = (raw) => JSON.stringify(parsePreparedEvidenceHelperCompletionRecord(raw));
73
+ export const createPreparedEvidenceHelperKey = (input) => hash("private-record", [input.context, input.endpointDigest, input.daemonDigest,
74
+ input.platform.os, input.platform.architecture, input.baseConfigDigest, input.recipeDigest].join("\0")).slice(7);
75
+ export const newPreparedEvidenceHelperPendingRecord = (input) => parsePreparedEvidenceHelperPendingRecord({ ...input, version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
76
+ export const newPreparedEvidenceHelperCompletionRecord = (pending, configDigest) => {
77
+ const pendingRecord = parsePreparedEvidenceHelperPendingRecord(pending);
78
+ const pendingHash = pendingDigest(pendingRecord);
79
+ const accepted = digest(configDigest);
80
+ return parsePreparedEvidenceHelperCompletionRecord({ accepted_image_config_digest: accepted, pending_digest: pendingHash,
81
+ receipt: createPreparedEvidenceHelperReceipt({ configDigest: accepted, pendingDigest: pendingHash }),
82
+ version: PREPARED_EVIDENCE_HELPER_PRIVATE_VERSION });
83
+ };
84
+ const root = async (raw) => {
85
+ if (typeof raw !== "string" || !path.isAbsolute(raw) || path.normalize(raw) !== raw
86
+ || raw === path.parse(raw).root)
87
+ return fail();
88
+ let existed = true;
89
+ try {
90
+ await lstat(raw);
91
+ }
92
+ catch (error) {
93
+ if (error.code !== "ENOENT")
94
+ return fail();
95
+ existed = false;
96
+ }
97
+ try {
98
+ await mkdir(raw, { mode: 0o700, recursive: true });
99
+ }
100
+ catch {
101
+ return fail();
102
+ }
103
+ const info = await lstat(raw).catch(fail);
104
+ if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o777) !== 0o700
105
+ || OWNER !== undefined && info.uid !== OWNER || await realpath(raw).catch(fail) !== raw)
106
+ return fail();
107
+ await syncRoot(raw);
108
+ if (!existed)
109
+ await syncRoot(path.dirname(raw));
110
+ return raw;
111
+ };
112
+ const readFile = async (file, links = [1]) => {
113
+ let handle;
114
+ try {
115
+ handle = await open(file, constants.O_RDONLY | constants.O_NOFOLLOW);
116
+ }
117
+ catch (error) {
118
+ if (error.code === "ENOENT")
119
+ return null;
120
+ return fail();
121
+ }
122
+ try {
123
+ const info = await handle.stat();
124
+ if (!info.isFile() || !links.includes(info.nlink) || info.size < 1 || info.size > 16_384
125
+ || (info.mode & 0o777) !== 0o600 || OWNER !== undefined && info.uid !== OWNER)
126
+ return fail();
127
+ return await handle.readFile({ encoding: "utf8" });
128
+ }
129
+ catch {
130
+ return fail();
131
+ }
132
+ finally {
133
+ await handle?.close().catch(() => undefined);
134
+ }
135
+ };
136
+ const syncRoot = async (directory) => {
137
+ const handle = await open(directory, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW).catch(fail);
138
+ try {
139
+ await handle.sync();
140
+ }
141
+ finally {
142
+ await handle.close().catch(() => undefined);
143
+ }
144
+ };
145
+ /** Immutable, fsynced pending/completion authority records keyed by exact target facts. */
146
+ export class PreparedEvidenceHelperAuthorityStore {
147
+ #root;
148
+ constructor(privateRoot) { this.#root = privateRoot; }
149
+ async load(key) {
150
+ const pending = await this.#read(key, "pending", parsePreparedEvidenceHelperPendingRecord);
151
+ if (!pending)
152
+ return null;
153
+ // A writer fsyncs before and after publication. A racing reader may observe
154
+ // the link before that writer reaches its directory fsync, so it must make
155
+ // the accepted transaction durable before proceeding to a Docker mutation.
156
+ await syncRoot(this.#root);
157
+ const completion = await this.#read(key, "complete", parsePreparedEvidenceHelperCompletionRecord);
158
+ if (completion)
159
+ await syncRoot(this.#root);
160
+ if (completion && completion.pending_digest !== pendingDigest(pending))
161
+ return fail();
162
+ return Object.freeze({ completion, pending });
163
+ }
164
+ async reserve(key, raw) {
165
+ const record = parsePreparedEvidenceHelperPendingRecord(raw);
166
+ return this.#publish(key, "pending", record, createPreparedEvidenceHelperPendingBytes, parsePreparedEvidenceHelperPendingRecord);
167
+ }
168
+ async complete(key, raw) {
169
+ const pending = await this.#read(key, "pending", parsePreparedEvidenceHelperPendingRecord);
170
+ if (!pending)
171
+ return fail();
172
+ const record = parsePreparedEvidenceHelperCompletionRecord(raw);
173
+ if (record.pending_digest !== pendingDigest(pending))
174
+ return fail();
175
+ return this.#publish(key, "complete", record, createPreparedEvidenceHelperCompletionBytes, parsePreparedEvidenceHelperCompletionRecord);
176
+ }
177
+ async #read(key, phase, parser) {
178
+ if (!/^[a-f0-9]{64}$/u.test(key))
179
+ return fail();
180
+ const file = path.join(this.#root, `${key}.${phase}.json`);
181
+ const complete = await readFile(file, [1, 2]);
182
+ if (complete === null)
183
+ return null;
184
+ try {
185
+ return parser(JSON.parse(complete));
186
+ }
187
+ catch {
188
+ return fail();
189
+ }
190
+ }
191
+ async #publish(key, phase, raw, bytesFor, parser) {
192
+ if (!/^[a-f0-9]{64}$/u.test(key))
193
+ return fail();
194
+ const bytes = bytesFor(raw);
195
+ const existing = await this.#read(key, phase, parser);
196
+ if (existing) {
197
+ await syncRoot(this.#root);
198
+ return bytesFor(existing) === bytes ? existing : fail();
199
+ }
200
+ const file = path.join(this.#root, `${key}.${phase}.json`);
201
+ const stage = path.join(this.#root, `.${key}.${phase}.${randomBytes(12).toString("hex")}.stage`);
202
+ let handle;
203
+ try {
204
+ handle = await open(stage, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | constants.O_NOFOLLOW, 0o600);
205
+ await handle.writeFile(bytes, "utf8");
206
+ await handle.sync();
207
+ await handle.close();
208
+ handle = undefined;
209
+ await syncRoot(this.#root);
210
+ await link(stage, file);
211
+ await syncRoot(this.#root);
212
+ await unlink(stage);
213
+ await syncRoot(this.#root);
214
+ }
215
+ catch {
216
+ await handle?.close().catch(() => undefined);
217
+ const published = await this.#read(key, phase, parser);
218
+ if (!published || bytesFor(published) !== bytes)
219
+ return fail();
220
+ await syncRoot(this.#root);
221
+ }
222
+ finally {
223
+ await unlink(stage).catch(() => undefined);
224
+ }
225
+ return (await this.#read(key, phase, parser)) ?? fail();
226
+ }
227
+ }
228
+ export const initializePreparedEvidenceHelperAuthorityStore = async (privateRoot) => new PreparedEvidenceHelperAuthorityStore(await root(privateRoot));
@@ -0,0 +1,10 @@
1
+ import { type PreparedEvidenceHelperReceipt } from "./preparedAuthority.js";
2
+ import type { PrepareEvidenceHelperInput } from "./preparedBuilderTypes.js";
3
+ export type { PrepareEvidenceHelperInput } from "./preparedBuilderTypes.js";
4
+ /** Re-attests a completion-bound local config identity or rebuilds an absent exact config. */
5
+ export declare const prepareEvidenceExportHelper: (input: PrepareEvidenceHelperInput) => Promise<PreparedEvidenceHelperReceipt>;
6
+ /** Private target lowering resolves the config digest only after receipt-correlated reattestation. */
7
+ export declare const resolvePreparedEvidenceHelperImage: (input: PrepareEvidenceHelperInput, receipt: PreparedEvidenceHelperReceipt) => Promise<{
8
+ readonly configDigest: `sha256:${string}`;
9
+ readonly imageReference: string;
10
+ }>;