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
package/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Spawnfile
2
2
 
3
- > A spec and compiler for autonomous agent runtimes. Write your agent once, compile for any runtime.
3
+ > Write your agent team once. Compile it for different runtimes.
4
4
 
5
5
  <p align="center">
6
6
  <a href="https://www.npmjs.com/package/spawnfile"><img src="https://img.shields.io/npm/v/spawnfile?style=flat-square&color=d4604a&label=npm" alt="npm"></a>
7
7
  <a href="https://www.npmjs.com/package/spawnfile"><img src="https://img.shields.io/npm/dm/spawnfile?style=flat-square&color=d4604a" alt="downloads"></a>
8
- <a href="#from-source"><img src="https://img.shields.io/node/v/spawnfile?style=flat-square&color=d4604a" alt="node"></a>
8
+ <a href="#try-it"><img src="https://img.shields.io/node/v/spawnfile?style=flat-square&color=d4604a" alt="node"></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/npm/l/spawnfile?style=flat-square&color=d4604a" alt="MIT"></a>
10
10
  <a href="https://spawnfile.com"><img src="https://img.shields.io/website?url=https%3A%2F%2Fspawnfile.com&style=flat-square&label=spawnfile.com&color=d4604a" alt="website"></a>
11
11
  </p>
@@ -14,195 +14,96 @@
14
14
  <img src="website/public/new-claw-images.png" alt="Spawnfile compiles one agent source into multiple runtimes" width="420" />
15
15
  </p>
16
16
 
17
- Spawnfile is a **portable source format** for autonomous agents and teams. You write one canonical project — identity docs, skills, MCP connections, model and sandbox intent, team structure, and declared communication surfaces — and `spawnfile compile` lowers it into the runtime-specific config and workspace each adapter needs.
17
+ Describe your agents, give them identities and tools, and keep the whole team in one source project. Spawnfile compiles that project into the configuration and workspaces their runtimes need, then builds and deploys it with Docker.
18
18
 
19
- It's not a runtime-to-runtime translator. The compiler starts from the canonical source, emits each declared adapter's output, and reports per-capability support as `supported`, `degraded`, or `unsupported`.
20
-
21
- Pairs with [**Moltnet**](https://moltnet.dev) as the first provider for `team.networks[]`, letting compiled agents share declared rooms, DMs, and history across runtimes without Spawnfile injecting its own message router.
22
-
23
- For a Simfile linked to a Spawnfile, the product entrypoint is owned by
24
- Simfile:
25
-
26
- ```bash
27
- simfile run ./Simfile --view
28
- ```
29
-
30
- That command delegates only organization lifecycle operations to Spawnfile's
31
- public CLI and versioned receipts. Spawnfile prepares target resources,
32
- deploys the organization, records the pinned Pi-bridge Moltnet identity,
33
- exports evidence, and cleans up; it does not carry simulation behavior or
34
- trigger cognition. The world reaches paused/pristine readiness first, the
35
- organization starts second, and one attested activation releases independent
36
- world ticks and organization-owned schedules. A separately manifested
37
- `simfile.world-decision-claim.v1` capability may extend the base world-sidecar
38
- ABI without changing it. See
39
- [`specs/ECOSYSTEM_RUNTIME_BOUNDARIES.md`](specs/ECOSYSTEM_RUNTIME_BOUNDARIES.md)
40
- for ownership and [`specs/TARGETS.md`](specs/TARGETS.md) for target, auth,
41
- Moltnet pinning, recovery, and cleanup contracts.
42
-
43
- ## Install
44
-
45
- ```bash
46
- npm install -g spawnfile
47
- spawnfile --version
48
- spawnfile --help
19
+ ```text
20
+ Spawnfile + workspace ─→ compile ─→ runtime files
49
21
  ```
50
22
 
51
- Node.js 22+ required. See [source install](#from-source) for local development.
23
+ ## Try it
52
24
 
53
- ## The happy path
25
+ Start with one agent. Requires **Node.js 22.19+**; compilation needs no Docker or model credentials.
54
26
 
55
27
  ```bash
56
- spawnfile init # scaffold an agent (defaults to openclaw)
57
- spawnfile validate # check the graph
58
- spawnfile view . # read-only graph view; writes no files
59
- spawnfile compile # lower to runtime-native output
60
- spawnfile status . # read declared/compiled status
61
- spawnfile auth sync --profile dev --env-file .env
62
- spawnfile build --tag my-agent # compile + docker build
63
- spawnfile up . --context gpu-4090 --detach # build and run on a Docker context
64
- spawnfile dev up . --auth-profile dev # detached dev loop in .spawn-dev
65
- spawnfile dev apply . --agent researcher # hot-add/reload one Pi agent
66
- spawnfile dev activity . --agent researcher # inspect buffered Pi activity events
67
- spawnfile run --tag my-agent --auth-profile dev --detach
68
- spawnfile status . --live # inspect the detached deployment
69
- spawnfile publish . --tag you/my-agent:1.0.0 # compile + build + verify + push
28
+ npm install -g spawnfile
29
+ spawnfile init my-agent
30
+ cd my-agent
31
+ spawnfile validate
32
+ spawnfile compile
70
33
  ```
71
34
 
72
- Compiled output lands under `.spawn/` by default, including a `Dockerfile`, `entrypoint.sh`, `.env.example`, and a prebuilt `container/rootfs/` tree. `spawnfile build` uses the pinned runtime artifacts from `runtimes.yaml`; it does not rebuild runtimes from source. Daimon, OpenClaw, and PicoClaw use published copyable artifact images by default, so normal prompt/config edits reuse their dependency layers. To test a local runtime artifact instead, set `SPAWNFILE_DAIMON_RUNTIME_IMAGE`, `SPAWNFILE_OPENCLAW_RUNTIME_IMAGE`, or `SPAWNFILE_PICOCLAW_RUNTIME_IMAGE` to a local image tag. For `build`/`up` on a docker `--context`, Moltnet release assets are staged for that context's architecture (`amd64` or `arm64`); for local-only manual compile targeting a fixed architecture, set `SPAWNFILE_MOLTNET_TARGET_ARCH=amd64|arm64`.
73
-
74
- `spawnfile status` is read-only. By default it shows authored and compiled state without Docker, runtime, or Moltnet calls. With `--live`, it reads the selected detached deployment record, inspects the recorded Docker target, runs adapter-owned runtime probes, and checks Moltnet metadata without reading message bodies. Add `--logs` for a redacted Docker log tail, or `--watch` to refresh status continuously. For a remote Docker context where the local record is missing, pass `--context <name>` with `--live` to recover the deployment from Spawnfile container labels.
75
-
76
- `spawnfile dev` is the source-backed interactive loop. It uses `.spawn-dev/` by default, starts a detached dev deployment with `spawnfile dev up`, and can hot-apply one Daimon runtime agent with `spawnfile dev apply --agent <id>` without restarting the rest of the org. Hot apply recompiles source, copies the selected agent workspace, Daimon config, matching Moltnet node configs, and managed Moltnet server configs into the running container, loads it through the Daimon control endpoint, and starts only that agent's Moltnet bridges when it is new. `spawnfile dev activity` reads the generated Daimon app's bounded activity buffer as JSON lines so operators can see queued wakes, turn starts/completions, runtime event types, output completions, and errors without mixing those diagnostics into Moltnet chat. Running managed Moltnet servers keep their current in-memory room membership until an operator-token `moltnet apply` or server restart reconciles the copied server config.
35
+ `init` creates an OpenClaw project with `IDENTITY.md`, `SOUL.md`, and `AGENTS.md`. `compile` writes runtime configuration, the generated workspace, and container files into `.spawn/`. Read `spawnfile-report.json` there to see how your source was compiled. **The agent is configured, but has not started.**
77
36
 
78
- Compiled images are self-describing: `spawnfile publish` pushes one to any OCI registry, and anyone can run it with no source — `spawnfile up you/my-agent:1.0.0 --deployment prod --detach --auth-profile me` — or inspect what it needs first with `spawnfile status you/my-agent:1.0.0`. See [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md).
37
+ Edit the Markdown files to define who the agent is and what it should do, then compile again. Keep the source in Git; `.spawn/` is generated and ignored.
79
38
 
80
- ### Target adapter CLI
39
+ ## From one agent to a team
81
40
 
82
- `spawnfile target` is the explicit, non-interactive target-adapter boundary for
83
- an external orchestrator. It takes one absolute request JSON file and one
84
- strict private configuration object on standard input — never a configuration
85
- path or inline configuration:
41
+ A team has its own `Spawnfile`, which references the member agent projects. Create its directory with `spawnfile init my-team --team`. Once you have two projects with distinct agent names under `my-team/agents/`, put their references in `my-team/Spawnfile`:
86
42
 
87
- ```bash
88
- target-config-producer | spawnfile target --config - create_data_network /absolute/path/request.json
43
+ ```yaml
44
+ spawnfile_version: "0.1"
45
+ kind: team
46
+ name: research-team
47
+ mode: swarm
48
+ members:
49
+ - id: researcher
50
+ ref: ./agents/researcher
51
+ - id: writer
52
+ ref: ./agents/writer
89
53
  ```
90
54
 
91
- On success it writes exactly one canonical JSON receipt followed by a newline.
92
-
93
- For a crash-safe machine caller handoff, project-mode `up --json`, `artifacts export
94
- --json`, and `down --json` accept `--lifecycle-invocation lci_<stable-id>`. Spawnfile
95
- binds that id to the exact operation, correlation, and request policy, atomically stores
96
- the exact JSON bytes after the owner returns and before stdout, and rejects reuse with
97
- drift. `spawnfile lifecycle lookup <id>` is read-only and returns one versioned state:
98
- `not_applied`, `pending`, `completed`, or `ambiguous`, without Docker/provider
99
- inspection. Recovery only resumes an operation when that command verifies exact durable
100
- evidence that resumption is safe; otherwise it seals `ambiguous` and fails closed.
101
- It writes no secret values to output or diagnostics. The full verb list,
102
- request/receipt contract, and exit behavior are in [`specs/TARGETS.md`](specs/TARGETS.md).
103
- `target lookup_operation` accepts the original mutation request with a minimal
104
- read-only context config and reports `completed`, `pending`, or `not_applied`
105
- without calling the target provider or changing its journal.
106
-
107
- Declare external credentials in `secrets:` and provide values through an ignored env file or the shell environment. `spawnfile auth sync --env-file .env` stores declared model auth and project secrets in a local auth profile; `spawnfile run --env-file .env` can inject the same values directly for a single run. This is the intended pattern for credentials like `GH_TOKEN`, MCP tokens, and provider API keys.
108
-
109
- ## Project structure
55
+ Each member has its own Spawnfile, identity, and runtime. Teams can share instructions and resources, contain nested teams, and declare [Moltnet](https://moltnet.dev) rooms. The [team guide](https://spawnfile.com/guides/teams/) covers the full setup; [examples](examples/) show complete projects.
110
56
 
111
- A Spawnfile project is either an `agent` or a `team`.
57
+ ## What travels with your team
112
58
 
113
- **Agent**
59
+ - **Agents:** Identity documents, instructions, skills, workspace resources, and each agent’s wake schedule.
60
+ - **Tools and models:** MCP connections, model selection, and declared secret requirements.
61
+ - **Team structure:** Members, nested teams, and shared resources.
62
+ - **Communication:** Declared [Moltnet](https://moltnet.dev) networks and rooms for agents to exchange messages across runtimes.
63
+ - **Deployment:** Runtime configuration, container files, and a capability report built from the same source.
114
64
 
115
- ```text
116
- my-agent/
117
- ├── Spawnfile
118
- ├── IDENTITY.md # who the agent is
119
- ├── SOUL.md # tone and personality
120
- ├── AGENTS.md # system prompt
121
- ├── MEMORY.md # long-lived memory
122
- ├── HEARTBEAT.md # periodic prompt for scheduled wakes
123
- ├── skills/
124
- │ └── web_search/SKILL.md
125
- └── subagents/
126
- └── researcher/Spawnfile
127
- ```
65
+ A team declaration alone does not create a conversation or a useful division of work. Give the agents a task, configure their communication, and choose how they wake. Start with the [team guide](https://spawnfile.com/guides/teams/) and [example projects](examples/).
128
66
 
129
- **Team**
67
+ ## Run and share it
130
68
 
131
- ```text
132
- my-team/
133
- ├── Spawnfile
134
- ├── TEAM.md
135
- ├── shared/skills/...
136
- └── agents/
137
- ├── orchestrator/Spawnfile
138
- ├── researcher/Spawnfile
139
- └── writer/Spawnfile
140
- ```
69
+ Once the prompts and configuration are ready:
141
70
 
142
- Team members may target different runtimes; the compiler resolves each member independently. Subagents are internal helpers owned by a parent agent — not the same thing as team members. Team coordination is through shared declared agent surfaces and declared team networks, not a Spawnfile-owned router.
71
+ 1. **Provide credentials.** Import an existing subscription login or configure provider credentials with [auth profiles](https://spawnfile.com/guides/docker/). Keep secret values out of Git.
72
+ 2. **Build and start.** With Docker available, `spawnfile up . --detach --auth-profile <profile>` compiles, builds, and starts the project. A Docker context can target another machine.
73
+ 3. **Check the deployment.** `spawnfile status . --live` probes the running deployment; `spawnfile status .` reads only local declared and compiled state.
74
+ 4. **Share an image.** `spawnfile publish` packages the project for an OCI registry so another operator can run it without the source, using their own credentials.
143
75
 
144
- Not every file is required. Spawnfile names the portable roles; adapters decide how to lower them into runtime-native surfaces. See [`specs/SPEC.md`](specs/SPEC.md) for the full shape.
76
+ See [container deployment](specs/CONTAINERS.md), [status](specs/STATUS.md), and [image distribution](specs/DISTRIBUTION.md) for complete commands and requirements.
145
77
 
146
78
  ## Runtime support
147
79
 
148
- v0.1 targets autonomous agent runtimes that share a markdown workspace identity model.
149
-
150
- | Runtime | Status | Default | Surfaces |
151
- |-----------|---------------|---------|-----------------------------------------------|
152
- | OpenClaw | active | ✅ | Discord, Telegram, WhatsApp, Slack |
153
- | PicoClaw | active | | Discord, Telegram, Slack (WhatsApp blocked) |
154
- | Pi | active | | Embedded org app, Moltnet client config |
155
- | OpenFang | exploratory | | No active adapter yet |
156
- | Hermes Agent | exploratory | | No active adapter yet |
157
- | OpenCode | exploratory | | No active adapter yet |
158
-
159
- Each adapter maps the portable schema into its native forms. The compiler reports a machine-readable `spawnfile-report.json` with the resolved graph, chosen runtimes, and capability outcomes (`supported`, `degraded`, `unsupported`). See [`specs/RUNTIMES.md`](specs/RUNTIMES.md) for the live matrix and pinned versions, or [`runtimes.yaml`](runtimes.yaml) for the registry source of truth.
160
-
161
- ## Why
162
-
163
- Autonomous agent runtimes already share a meaningful core: markdown workspace identity, skill folders, MCP, model selection, sandboxing. Today that core is re-authored by hand for each runtime. Spawnfile makes it canonical so one source project can ship to any compatible runtime.
164
-
165
- ## Docs
80
+ | Runtime | Use it for |
81
+ |---|---|
82
+ | **Daimon** | Agents using subscription CLI engines such as Codex and Claude Code, with Moltnet and memory integration. |
83
+ | **OpenClaw** | OpenClaw agents and their native messaging surfaces. The default agent scaffold. |
84
+ | **PicoClaw** | PicoClaw agents and their native messaging surfaces. |
166
85
 
167
- Hosted docs with rendered specs, runtime guides, and a capability matrix: **[spawnfile.com](https://spawnfile.com)** — start at [Introduction](https://spawnfile.com/introduction/), [Quickstart](https://spawnfile.com/quickstart/), or the [Runtimes overview](https://spawnfile.com/runtimes/overview/).
86
+ Daimon requires a pinned runtime image matching the compiler contract. The older `pi` adapter remains available for existing projects.
168
87
 
169
- The source-of-truth specs live in this repo:
88
+ Portability is capability-specific: the compiler reports each feature as **supported**, **degraded**, or **unsupported**. Read that report before switching runtimes. Exact versions live in [runtimes.yaml](runtimes.yaml); the [runtime specification](specs/RUNTIMES.md) describes the adapter model.
170
89
 
171
- - [`specs/INDEX.md`](specs/INDEX.md) — map of all specs
172
- - [`specs/SPEC.md`](specs/SPEC.md) — canonical source format
173
- - [`specs/COMPILER.md`](specs/COMPILER.md) — compiler architecture and adapter contract
174
- - [`specs/CONTAINERS.md`](specs/CONTAINERS.md) — container compilation
175
- - [`specs/RUNTIMES.md`](specs/RUNTIMES.md) — runtime registry and version pinning
176
- - [`specs/SURFACES.md`](specs/SURFACES.md) — messaging surface model
177
- - [`specs/STATUS.md`](specs/STATUS.md) — static and live operational status
178
- - [`specs/DISTRIBUTION.md`](specs/DISTRIBUTION.md) — image distribution, publish, and sourceless run
179
- - [`test/fixtures/`](test/fixtures/) — canonical example projects
180
-
181
- ## From source
182
-
183
- ```bash
184
- git clone https://github.com/noopolis/spawnfile.git
185
- cd spawnfile
186
- nvm use
187
- npm install
188
- npm run build
189
- npm link
190
- ```
191
-
192
- For local development without linking globally:
193
-
194
- ```bash
195
- npm run dev -- validate test/fixtures/single-agent
196
- ```
90
+ ## Go further
197
91
 
198
- ## Contributing
92
+ | I want to… | Read |
93
+ |---|---|
94
+ | Understand the source format | [Spawnfile specification](specs/SPEC.md) |
95
+ | Explore complete projects | [Examples](examples/) |
96
+ | Add an adapter or contribute | [Contributing](CONTRIBUTING.md) |
97
+ | Integrate with deployment tooling | [Target and lifecycle contracts](specs/TARGETS.md) |
98
+ | Plan isolated agent training | [Paideia training handoff](specs/TRAINING.md) |
99
+ | Find a detailed contract | [Specification index](specs/INDEX.md) |
199
100
 
200
- See [CONTRIBUTING.md](CONTRIBUTING.md) for local setup, tests, and the runtime adapter contract.
101
+ Spawnfile is part of [Noopolis](https://github.com/noopolis). [Moltnet](https://moltnet.dev) supplies messaging; [Daimon](https://github.com/noopolis/daimon) runs individual agents; [Simfile](https://simfile.org) builds simulation worlds around organizations. You can use Spawnfile on its own.
201
102
 
202
103
  ## License
203
104
 
204
- MIT — see [LICENSE](LICENSE).
105
+ [MIT](LICENSE)
205
106
 
206
107
  ---
207
108
 
208
- **[spawnfile.com](https://spawnfile.com)** · **[github.com/noopolis/spawnfile](https://github.com/noopolis/spawnfile)**
109
+ **[spawnfile.com](https://spawnfile.com)** · **[Examples](examples/)** · **[Contributing](CONTRIBUTING.md)**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Evidence input types and small pure helpers shared by every check function
3
3
  * in checks.ts. Split out purely to keep checks.ts under the repo's 400-line
4
- * cap (see /Users/apresmoi/Documents/spawnfile/CLAUDE.md) — nothing here is
4
+ * cap (see the repo CLAUDE.md) — nothing here is
5
5
  * a different layer or a different contract, it is checks.ts's own
6
6
  * plumbing. No I/O, same as checks.ts itself.
7
7
  */
@@ -4,5 +4,15 @@ interface ClaudeCodeImportOptions {
4
4
  export declare const parseEnvFile: (content: string) => Record<string, string>;
5
5
  export declare const importEnvFile: (profileName: string, envFilePath: string) => Promise<import("./types.js").ResolvedAuthProfile>;
6
6
  export declare const importCodexAuth: (profileName: string, sourceDirectory?: string) => Promise<import("./types.js").ResolvedAuthProfile>;
7
+ /**
8
+ * Imports a **dedicated** Grok login into a profile.
9
+ *
10
+ * Unlike Codex, the source is always explicit: training rotates the credential
11
+ * it is given, so defaulting to `~/.grok` would let a routine training run
12
+ * invalidate the developer's own desktop session, and the refreshed token
13
+ * would land on container tmpfs rather than back in `~/.grok` (D2). The
14
+ * desktop home is refused outright, by resolved path and through `GROK_HOME`.
15
+ */
16
+ export declare const importGrokAuth: (profileName: string, sourceDirectory: string | undefined) => Promise<import("./types.js").ResolvedAuthProfile>;
7
17
  export declare const importClaudeCodeAuth: (profileName: string, sourceDirectory?: string, options?: ClaudeCodeImportOptions) => Promise<import("./types.js").ResolvedAuthProfile>;
8
18
  export {};
@@ -1,6 +1,6 @@
1
1
  import path from "node:path";
2
2
  import os from "node:os";
3
- import { ensureDirectory, fileExists, readUtf8File, writeUtf8File } from "../filesystem/index.js";
3
+ import { fileExists, readUtf8File, writePrivateUtf8File } from "../filesystem/index.js";
4
4
  import { SpawnfileError } from "../shared/index.js";
5
5
  import { registerImportedAuth, setAuthProfileEnv } from "./profileStore.js";
6
6
  const ENV_LINE_PATTERN = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/;
@@ -67,7 +67,33 @@ export const importCodexAuth = async (profileName, sourceDirectory) => {
67
67
  throw new SpawnfileError("validation_error", `Codex auth file does not exist: ${authFilePath}`);
68
68
  }
69
69
  const { directory, profile } = await registerImportedAuth(profileName, "codex");
70
- await writeUtf8File(path.join(directory, "auth.json"), await readUtf8File(authFilePath));
70
+ await writePrivateUtf8File(path.join(directory, "auth.json"), await readUtf8File(authFilePath));
71
+ return profile;
72
+ };
73
+ /**
74
+ * Imports a **dedicated** Grok login into a profile.
75
+ *
76
+ * Unlike Codex, the source is always explicit: training rotates the credential
77
+ * it is given, so defaulting to `~/.grok` would let a routine training run
78
+ * invalidate the developer's own desktop session, and the refreshed token
79
+ * would land on container tmpfs rather than back in `~/.grok` (D2). The
80
+ * desktop home is refused outright, by resolved path and through `GROK_HOME`.
81
+ */
82
+ export const importGrokAuth = async (profileName, sourceDirectory) => {
83
+ if (!sourceDirectory) {
84
+ throw new SpawnfileError("validation_error", "Grok import requires --from <directory> holding a dedicated training login; training never uses the desktop ~/.grok");
85
+ }
86
+ const resolvedSource = path.resolve(sourceDirectory);
87
+ const desktop = path.resolve(process.env.GROK_HOME ?? path.join(os.homedir(), ".grok"));
88
+ if (resolvedSource === desktop || resolvedSource === path.join(os.homedir(), ".grok")) {
89
+ throw new SpawnfileError("validation_error", `Refusing the desktop Grok home ${resolvedSource}; a training run rotates the credential it imports`);
90
+ }
91
+ const authFilePath = path.join(resolvedSource, "auth.json");
92
+ if (!(await fileExists(authFilePath))) {
93
+ throw new SpawnfileError("validation_error", `Grok auth file does not exist: ${authFilePath}`);
94
+ }
95
+ const { directory, profile } = await registerImportedAuth(profileName, "grok");
96
+ await writePrivateUtf8File(path.join(directory, "auth.json"), await readUtf8File(authFilePath));
71
97
  return profile;
72
98
  };
73
99
  export const importClaudeCodeAuth = async (profileName, sourceDirectory, options = {}) => {
@@ -87,7 +113,6 @@ export const importClaudeCodeAuth = async (profileName, sourceDirectory, options
87
113
  throw new SpawnfileError("validation_error", `Claude Code credentials file does not exist: ${credentialsPath} and macOS Keychain service ${CLAUDE_CODE_KEYCHAIN_SERVICE} was unavailable`);
88
114
  }
89
115
  const { directory, profile } = await registerImportedAuth(profileName, "claude-code");
90
- await ensureDirectory(directory);
91
- await writeUtf8File(path.join(directory, ".credentials.json"), credentialsContent);
116
+ await writePrivateUtf8File(path.join(directory, ".credentials.json"), credentialsContent);
92
117
  return profile;
93
118
  };
@@ -10,3 +10,5 @@ export * from "./credentialProvisioningRequest.js";
10
10
  export * from "./credentialWorldBindings.js";
11
11
  export * from "./targetSecretSourceLifecycle.js";
12
12
  export * from "./targetSecretSourceResolver.js";
13
+ export { stageTrainingAuth } from "./trainingAuth.js";
14
+ export type { TrainingAuthStageOptions, TrainingAuthProvider } from "./trainingAuth.js";
@@ -10,3 +10,4 @@ export * from "./credentialProvisioningRequest.js";
10
10
  export * from "./credentialWorldBindings.js";
11
11
  export * from "./targetSecretSourceLifecycle.js";
12
12
  export * from "./targetSecretSourceResolver.js";
13
+ export { stageTrainingAuth } from "./trainingAuth.js";
@@ -3,7 +3,7 @@ export declare const resolveAuthHome: () => string;
3
3
  export declare const resolveProfilesRoot: () => string;
4
4
  export declare const resolveProfileDirectory: (profileName: string) => string;
5
5
  export declare const resolveProfilePath: (profileName: string) => string;
6
- export declare const resolveImportedAuthDirectory: (profileName: string, kind: "claude-code" | "codex") => string;
6
+ export declare const resolveImportedAuthDirectory: (profileName: string, kind: "claude-code" | "codex" | "grok") => string;
7
7
  export declare const resolveTargetSecretsRoot: () => string;
8
8
  export declare const resolveTargetSecretVersionsDirectory: () => string;
9
9
  export declare const resolveTargetSecretVersionPath: (versionKey: string) => string;
@@ -1,8 +1,8 @@
1
1
  import path from "node:path";
2
2
  import { z } from "zod";
3
- import { ensureDirectory, fileExists, readUtf8File, removeDirectory, writeUtf8File } from "../filesystem/index.js";
3
+ import { ensurePrivateDirectory, fileExists, readUtf8File, removeDirectory, writePrivateUtf8File } from "../filesystem/index.js";
4
4
  import { SpawnfileError } from "../shared/index.js";
5
- import { resolveAuthHome, resolveImportedAuthDirectory, resolveProfileDirectory, resolveProfilePath } from "./paths.js";
5
+ import { resolveAuthHome, resolveImportedAuthDirectory, resolveProfileDirectory, resolveProfilePath, resolveProfilesRoot } from "./paths.js";
6
6
  const importedAuthEntrySchema = z.object({
7
7
  kind: z.enum(["claude-code", "codex"]),
8
8
  relativePath: z.string().min(1)
@@ -68,15 +68,14 @@ export const ensureAuthProfile = async (profileName) => {
68
68
  if (existing) {
69
69
  return existing;
70
70
  }
71
- const profileDirectory = resolveProfileDirectory(profileName);
72
- await ensureDirectory(profileDirectory);
73
- await writeUtf8File(resolveProfilePath(profileName), `${JSON.stringify(createEmptyProfile(), null, 2)}\n`);
74
- return createResolvedAuthProfile(profileName, createEmptyProfile());
71
+ return writeProfile(profileName, createEmptyProfile());
75
72
  };
76
73
  const writeProfile = async (profileName, profile) => {
77
74
  const profileDirectory = resolveProfileDirectory(profileName);
78
- await ensureDirectory(profileDirectory);
79
- await writeUtf8File(resolveProfilePath(profileName), `${JSON.stringify(profile, null, 2)}\n`);
75
+ await ensurePrivateDirectory(resolveAuthHome());
76
+ await ensurePrivateDirectory(resolveProfilesRoot());
77
+ await ensurePrivateDirectory(profileDirectory);
78
+ await writePrivateUtf8File(resolveProfilePath(profileName), `${JSON.stringify(profile, null, 2)}\n`);
80
79
  return createResolvedAuthProfile(profileName, profile);
81
80
  };
82
81
  export const setAuthProfileEnv = async (profileName, env) => {
@@ -99,8 +98,9 @@ export const setAuthProfileEnv = async (profileName, env) => {
99
98
  export const registerImportedAuth = async (profileName, kind) => {
100
99
  const current = (await loadAuthProfile(profileName)) ?? (await ensureAuthProfile(profileName));
101
100
  const importDirectory = resolveImportedAuthDirectory(profileName, kind);
101
+ await ensurePrivateDirectory(path.dirname(importDirectory));
102
102
  await removeDirectory(importDirectory);
103
- await ensureDirectory(importDirectory);
103
+ await ensurePrivateDirectory(importDirectory);
104
104
  const nextProfile = {
105
105
  env: { ...current.env },
106
106
  imports: {
@@ -0,0 +1,40 @@
1
+ import { type BigIntStats } from "node:fs";
2
+ export type DirectoryIdentity = Readonly<{
3
+ birthtimeNs: bigint;
4
+ dev: bigint;
5
+ ino: bigint;
6
+ mode: bigint;
7
+ uid: bigint;
8
+ }>;
9
+ export type FileIdentity = Readonly<{
10
+ birthtimeNs: bigint;
11
+ ctimeNs: bigint;
12
+ dev: bigint;
13
+ ino: bigint;
14
+ mode: bigint;
15
+ nlink: bigint;
16
+ size: number;
17
+ uid: bigint;
18
+ }>;
19
+ /** Validates one mode-`0700` owner-held directory and reduces it to its identity. */
20
+ export declare const directoryIdentityOf: (info: BigIntStats, owner: number) => DirectoryIdentity;
21
+ /** Validates one mode-`0600` owner-held regular file and reduces it to its identity. */
22
+ export declare const fileIdentityOf: (info: BigIntStats, owner: number, links: readonly number[], maxBytes: number, zero?: boolean) => FileIdentity;
23
+ /**
24
+ * Same directory node. Never compares ctime: the publisher mutates the leaf
25
+ * directory's ctime itself every time it links or unlinks an election name.
26
+ */
27
+ export declare const sameDirectory: (left: DirectoryIdentity, right: DirectoryIdentity) => boolean;
28
+ /** Same file, unchanged in every observable field including ctime and size. */
29
+ export declare const sameFileExact: (left: FileIdentity, right: FileIdentity) => boolean;
30
+ /**
31
+ * Same file node, allowing the size and ctime to move. This is the growing
32
+ * final: an identical writer may legitimately append the rest of the record
33
+ * between two observations, which changes both.
34
+ */
35
+ export declare const sameFileNode: (left: FileIdentity, right: FileIdentity) => boolean;
36
+ /**
37
+ * Same inode, allowing the link count and ctime to move. This is the zero-byte
38
+ * token or claim while an identical publisher links or unlinks the other name.
39
+ */
40
+ export declare const sameFileInode: (left: FileIdentity, right: FileIdentity) => boolean;
@@ -0,0 +1,42 @@
1
+ import { TARGET_SECRET_SOURCE_ERROR } from "./targetSecretSourceRecordCommon.js";
2
+ const fail = () => { throw new Error(TARGET_SECRET_SOURCE_ERROR); };
3
+ /** Validates one mode-`0700` owner-held directory and reduces it to its identity. */
4
+ export const directoryIdentityOf = (info, owner) => {
5
+ if (!info.isDirectory() || info.isSymbolicLink() || info.uid !== BigInt(owner) || (info.mode & 4095n) !== 448n)
6
+ fail();
7
+ return { birthtimeNs: info.birthtimeNs, dev: info.dev, ino: info.ino, mode: info.mode, uid: info.uid };
8
+ };
9
+ /** Validates one mode-`0600` owner-held regular file and reduces it to its identity. */
10
+ export const fileIdentityOf = (info, owner, links, maxBytes, zero = false) => {
11
+ if (!info.isFile() || info.isSymbolicLink() || info.uid !== BigInt(owner)
12
+ || !links.some((link) => info.nlink === BigInt(link)) || (info.mode & 4095n) !== 384n
13
+ || info.size < 0n || info.size > BigInt(maxBytes) || (zero && info.size !== 0n))
14
+ fail();
15
+ return {
16
+ birthtimeNs: info.birthtimeNs, ctimeNs: info.ctimeNs, dev: info.dev, ino: info.ino,
17
+ mode: info.mode, nlink: info.nlink, size: Number(info.size), uid: info.uid
18
+ };
19
+ };
20
+ /**
21
+ * Same directory node. Never compares ctime: the publisher mutates the leaf
22
+ * directory's ctime itself every time it links or unlinks an election name.
23
+ */
24
+ export const sameDirectory = (left, right) => left.birthtimeNs === right.birthtimeNs && left.dev === right.dev && left.ino === right.ino
25
+ && left.mode === right.mode && left.uid === right.uid;
26
+ /** Same file, unchanged in every observable field including ctime and size. */
27
+ export const sameFileExact = (left, right) => left.birthtimeNs === right.birthtimeNs && left.ctimeNs === right.ctimeNs && left.dev === right.dev
28
+ && left.ino === right.ino && left.mode === right.mode && left.nlink === right.nlink
29
+ && left.size === right.size && left.uid === right.uid;
30
+ /**
31
+ * Same file node, allowing the size and ctime to move. This is the growing
32
+ * final: an identical writer may legitimately append the rest of the record
33
+ * between two observations, which changes both.
34
+ */
35
+ export const sameFileNode = (left, right) => left.birthtimeNs === right.birthtimeNs && left.dev === right.dev && left.ino === right.ino
36
+ && left.mode === right.mode && left.nlink === right.nlink && left.uid === right.uid;
37
+ /**
38
+ * Same inode, allowing the link count and ctime to move. This is the zero-byte
39
+ * token or claim while an identical publisher links or unlinks the other name.
40
+ */
41
+ export const sameFileInode = (left, right) => left.birthtimeNs === right.birthtimeNs && left.dev === right.dev && left.ino === right.ino
42
+ && left.mode === right.mode && left.size === right.size && left.uid === right.uid;
@@ -6,6 +6,8 @@ export interface TargetSecretSourceFsPublishInput {
6
6
  readonly private_metadata: Pick<TargetSecretSourcePrivateVersionMetadata, "publication_handle" | "source_version_handle">;
7
7
  }
8
8
  export interface TargetSecretSourceFsPublishOptions {
9
+ readonly contentionForTest?: (reason: string, attempt: number) => void;
10
+ readonly errorForTest?: (error: unknown) => void;
9
11
  readonly hookForTest?: (phase: TargetSecretSourceFsPublishPhase, path: string) => Promise<void> | void;
10
12
  readonly maxWriteBytesForTest?: number;
11
13
  }
@@ -13,6 +13,7 @@ export const initializeTargetSecretSourceFsPublish = async (options = {}) => {
13
13
  resolveTargetSecretsRoot(),
14
14
  resolveTargetSecretVersionsDirectory()
15
15
  ],
16
+ contentionForTest: options.contentionForTest,
16
17
  hookForTest: options.hookForTest,
17
18
  maxWriteBytesForTest: options.maxWriteBytesForTest
18
19
  });
@@ -41,7 +42,8 @@ export const initializeTargetSecretSourceFsPublish = async (options = {}) => {
41
42
  }
42
43
  });
43
44
  }
44
- catch {
45
+ catch (error) {
46
+ options.errorForTest?.(error);
45
47
  fail();
46
48
  }
47
49
  };
@@ -1,4 +1,4 @@
1
- export type TargetSecretSourceFsPublishImmutablePhase = "after_token_create" | "after_claim_link" | "after_claim_snapshot" | "after_mismatch_snapshot" | "after_exact_token_snapshot" | "after_final_create" | "after_partial_write" | "after_file_sync" | "before_directory_sync" | "after_directory_sync" | "after_token_cleanup" | "after_claim_cleanup";
1
+ export type TargetSecretSourceFsPublishImmutablePhase = "after_token_create" | "after_claim_link" | "after_claim_snapshot" | "after_mismatch_snapshot" | "after_exact_token_snapshot" | "after_final_create" | "after_partial_write" | "after_file_sync" | "before_directory_sync" | "after_directory_sync" | "after_token_cleanup" | "after_claim_cleanup" | "after_zero_lstat" | "after_final_lstat" | "after_token_open" | "after_token_sync" | "after_final_open" | "before_unlink_exact" | "before_contention_retry";
2
2
  export interface TargetSecretSourceFsPublishImmutableInput {
3
3
  readonly bytes: Uint8Array;
4
4
  readonly final_path: string;
@@ -7,6 +7,7 @@ export interface TargetSecretSourceFsPublishImmutableInput {
7
7
  }
8
8
  export interface TargetSecretSourceFsPublishImmutableOptions {
9
9
  readonly directory_chain: readonly string[];
10
+ readonly contentionForTest?: (reason: string, attempt: number) => void;
10
11
  readonly hookForTest?: (phase: TargetSecretSourceFsPublishImmutablePhase, path: string) => Promise<void> | void;
11
12
  readonly maxWriteBytesForTest?: number;
12
13
  }