spawnfile 0.1.33 → 0.1.35

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 (606) hide show
  1. package/README.md +1 -1
  2. package/dist/audit/readAudit.d.ts +3 -3
  3. package/dist/auth/profileStore.d.ts +3 -1
  4. package/dist/auth/profileStore.js +31 -30
  5. package/dist/auth/trainingAuth.d.ts +2 -5
  6. package/dist/auth/types.d.ts +16 -0
  7. package/dist/cli/authCommands.d.ts +1 -1
  8. package/dist/cli/authCommands.js +21 -1
  9. package/dist/cli/devCommands.d.ts +1 -1
  10. package/dist/cli/devCommands.js +0 -66
  11. package/dist/cli/runCli.d.ts +3 -4
  12. package/dist/cli/runCli.js +4 -3
  13. package/dist/cli/trainCommand.js +9 -15
  14. package/dist/cli/trainingBooted.d.ts +9 -0
  15. package/dist/cli/trainingBooted.js +45 -0
  16. package/dist/cli/trainingExecution.d.ts +4 -7
  17. package/dist/cli/trainingExecution.js +4 -32
  18. package/dist/compiler/containerArtifacts.js +0 -5
  19. package/dist/compiler/containerBackedMountRender.js +5 -1
  20. package/dist/compiler/containerDaimonBrokerRender.d.ts +5 -50
  21. package/dist/compiler/containerDaimonBrokerRender.js +19 -90
  22. package/dist/compiler/containerDaimonGatewayRender.d.ts +50 -0
  23. package/dist/compiler/containerDaimonGatewayRender.js +161 -0
  24. package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +2 -10
  25. package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +13 -25
  26. package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +11 -49
  27. package/dist/compiler/containerDaimonGrokWorkerRender.js +15 -39
  28. package/dist/compiler/containerDaimonStartupSupervision.d.ts +8 -0
  29. package/dist/compiler/containerDaimonStartupSupervision.js +39 -0
  30. package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +1 -2
  31. package/dist/compiler/containerDaimonUidEntrypointRender.js +29 -47
  32. package/dist/compiler/containerRuntimeReadinessRender.js +1 -1
  33. package/dist/compiler/memoryArtifacts.js +0 -1
  34. package/dist/compiler/moltnetArtifacts.js +1 -17
  35. package/dist/compiler/moltnetClientConfig.js +1 -1
  36. package/dist/compiler/moltnetRuntimeConfig.js +0 -10
  37. package/dist/compiler/runProject.d.ts +3 -0
  38. package/dist/compiler/runProject.js +12 -5
  39. package/dist/compiler/runProjectAuth.js +6 -18
  40. package/dist/compiler/training/contract.d.ts +0 -2
  41. package/dist/compiler/training/contract.js +0 -2
  42. package/dist/compiler/training/execution.d.ts +1 -128
  43. package/dist/compiler/training/execution.js +7 -68
  44. package/dist/compiler/training/index.d.ts +0 -8
  45. package/dist/compiler/training/index.js +0 -7
  46. package/dist/compiler/training/output.d.ts +1 -0
  47. package/dist/compiler/training/output.js +1 -1
  48. package/dist/compiler/training/rewind/contract.d.ts +6 -6
  49. package/dist/compiler/training/trial/boot.d.ts +72 -0
  50. package/dist/compiler/training/trial/boot.js +225 -0
  51. package/dist/compiler/training/trial/docker.d.ts +10 -0
  52. package/dist/compiler/training/trial/docker.js +22 -0
  53. package/dist/compiler/training/trial/gateway.d.ts +47 -0
  54. package/dist/compiler/training/trial/gateway.js +113 -0
  55. package/dist/compiler/training/trial/homeLogin.d.ts +31 -0
  56. package/dist/compiler/training/trial/homeLogin.js +69 -0
  57. package/dist/compiler/training/trial/index.d.ts +8 -0
  58. package/dist/compiler/training/trial/index.js +8 -0
  59. package/dist/compiler/training/trial/judge.d.ts +15 -0
  60. package/dist/compiler/training/trial/judge.js +42 -0
  61. package/dist/compiler/training/trial/launcher.d.ts +47 -0
  62. package/dist/compiler/training/trial/launcher.js +193 -0
  63. package/dist/compiler/training/trial/login.d.ts +35 -0
  64. package/dist/compiler/training/trial/login.js +85 -0
  65. package/dist/compiler/training/trial/project.d.ts +11 -0
  66. package/dist/compiler/training/trial/project.js +31 -0
  67. package/dist/compiler/training/trial/realmTurns.d.ts +20 -0
  68. package/dist/compiler/training/trial/realmTurns.js +69 -0
  69. package/dist/compiler/upReceipt.d.ts +2 -17
  70. package/dist/compiler/upReceipt.js +2 -17
  71. package/dist/deployment/artifactsExportPlan.js +2 -18
  72. package/dist/deployment/privateArtifactsExport.js +1 -1
  73. package/dist/dev/docker.d.ts +0 -5
  74. package/dist/dev/docker.js +0 -46
  75. package/dist/dev/index.d.ts +0 -1
  76. package/dist/dev/index.js +0 -1
  77. package/dist/dev/project.d.ts +0 -16
  78. package/dist/dev/project.js +1 -128
  79. package/dist/distribution/distributionReportSchema.js +1 -1
  80. package/dist/distribution/imageRuntimeAuth.js +3 -2
  81. package/dist/manifest/renderSpawnfile.js +2 -1
  82. package/dist/release/drainControl.d.ts +5 -19
  83. package/dist/release/drainControl.js +12 -67
  84. package/dist/report/types.d.ts +3 -6
  85. package/dist/runtime/common.d.ts +1 -1
  86. package/dist/runtime/common.js +1 -1
  87. package/dist/runtime/container.d.ts +2 -2
  88. package/dist/runtime/container.js +1 -39
  89. package/dist/runtime/daimon/config.js +8 -14
  90. package/dist/runtime/daimon/contractManifest.js +0 -1
  91. package/dist/runtime/daimon/contractManifestSchema.js +0 -1
  92. package/dist/runtime/daimon/control.d.ts +31 -0
  93. package/dist/runtime/daimon/control.js +83 -0
  94. package/dist/runtime/daimon/engineDescriptorSchema.js +0 -1
  95. package/dist/runtime/daimon/engineDescriptors.generated.d.ts +1 -1
  96. package/dist/runtime/daimon/engineDescriptors.generated.js +1 -2
  97. package/dist/runtime/daimon/engines.js +0 -1
  98. package/dist/runtime/daimon/gateway.d.ts +62 -0
  99. package/dist/runtime/daimon/gateway.js +77 -0
  100. package/dist/runtime/daimon/grokWorkerContract.d.ts +0 -5
  101. package/dist/runtime/daimon/grokWorkerContract.js +1 -13
  102. package/dist/runtime/daimon/index.d.ts +2 -0
  103. package/dist/runtime/daimon/index.js +2 -1
  104. package/dist/runtime/daimon/memory.js +1 -1
  105. package/dist/runtime/daimon/packageName.js +0 -1
  106. package/dist/runtime/daimon/runAuth.js +15 -4
  107. package/dist/runtime/daimon/runtimeIdentity.d.ts +2 -0
  108. package/dist/runtime/daimon/runtimeIdentity.js +2 -0
  109. package/dist/runtime/daimon/subscriptionRealms.d.ts +27 -3
  110. package/dist/runtime/daimon/subscriptionRealms.js +35 -13
  111. package/dist/runtime/daimon/testHelpers.d.ts +2 -0
  112. package/dist/runtime/{pi → daimon}/testHelpers.js +3 -3
  113. package/dist/runtime/daimon/training/booted/adapter.d.ts +50 -0
  114. package/dist/runtime/daimon/training/booted/adapter.js +60 -0
  115. package/dist/runtime/daimon/training/booted/adapter.js.map +1 -0
  116. package/dist/runtime/daimon/training/booted/index.d.ts +4 -0
  117. package/dist/runtime/daimon/training/booted/index.js +3 -0
  118. package/dist/runtime/daimon/training/booted/index.js.map +1 -0
  119. package/dist/runtime/daimon/training/booted/judge.d.ts +39 -0
  120. package/dist/runtime/daimon/training/booted/judge.js +122 -0
  121. package/dist/runtime/daimon/training/booted/judge.js.map +1 -0
  122. package/dist/runtime/daimon/training/index.d.ts +5 -0
  123. package/dist/runtime/daimon/training/index.js +8 -4
  124. package/dist/runtime/daimon/training/index.js.map +1 -1
  125. package/dist/runtime/daimon/wakeMoments.js +0 -1
  126. package/dist/runtime/install.js +0 -21
  127. package/dist/runtime/registry.js +0 -2
  128. package/dist/runtime/trainingGraderProviders.js +10 -4
  129. package/dist/runtime/trainingProviders.d.ts +5 -3
  130. package/dist/runtime/trainingProviders.js +21 -24
  131. package/dist/runtime/trainingSubjects.d.ts +0 -121
  132. package/dist/runtime/trainingSubjects.js +2 -13
  133. package/dist/runtime/types.d.ts +1 -8
  134. package/dist/runtime/usageRequestLedger.d.ts +2 -0
  135. package/dist/runtime/usageRequestLedger.js +3 -1
  136. package/dist/shared/errors.js +0 -1
  137. package/dist/shared/trainingLegacy/trainingLegacyHashDomains.d.ts +1 -0
  138. package/dist/shared/trainingLegacy/trainingLegacyHashDomains.js +1 -0
  139. package/dist/shared/trainingLegacy/trainingLegacyHashDomains.js.map +1 -1
  140. package/dist/status/lifecycleProbes.js +3 -6
  141. package/dist/status/moltnetWiringProbes.js +1 -17
  142. package/dist/training/subjects/index.d.ts +0 -1
  143. package/dist/training/subjects/index.js +0 -1
  144. package/dist/training/subjects/index.js.map +1 -1
  145. package/examples/README.md +0 -1
  146. package/examples/daimon-org/agents/mapper/Spawnfile +4 -1
  147. package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +4 -1
  148. package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +5 -8
  149. package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +1 -1
  150. package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +5 -8
  151. package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +5 -8
  152. package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +5 -8
  153. package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +1 -1
  154. package/examples/mixed-runtime-org/agents/localist/Spawnfile +7 -7
  155. package/package.json +4 -13
  156. package/runtimes.yaml +5 -15
  157. package/dist/compiler/containerDaimonGrokTaskClock.d.ts +0 -5
  158. package/dist/compiler/containerDaimonGrokTaskClock.js +0 -29
  159. package/dist/compiler/daimonTelemetryArtifacts.d.ts +0 -22
  160. package/dist/compiler/daimonTelemetryArtifacts.js +0 -56
  161. package/dist/compiler/training/broker/clockProbe.d.ts +0 -6
  162. package/dist/compiler/training/broker/clockProbe.js +0 -27
  163. package/dist/compiler/training/broker/declaration.d.ts +0 -54
  164. package/dist/compiler/training/broker/declaration.js +0 -70
  165. package/dist/compiler/training/broker/entrypoint.d.ts +0 -39
  166. package/dist/compiler/training/broker/entrypoint.js +0 -124
  167. package/dist/compiler/training/broker/evaluatorSecrets.d.ts +0 -2
  168. package/dist/compiler/training/broker/evaluatorSecrets.js +0 -62
  169. package/dist/compiler/training/broker/index.d.ts +0 -12
  170. package/dist/compiler/training/broker/index.js +0 -12
  171. package/dist/compiler/training/broker/main.d.ts +0 -2
  172. package/dist/compiler/training/broker/main.js +0 -14
  173. package/dist/compiler/training/broker/paths.d.ts +0 -236
  174. package/dist/compiler/training/broker/paths.js +0 -249
  175. package/dist/compiler/training/broker/processes.d.ts +0 -51
  176. package/dist/compiler/training/broker/processes.js +0 -102
  177. package/dist/compiler/training/broker/projection.d.ts +0 -61
  178. package/dist/compiler/training/broker/projection.js +0 -109
  179. package/dist/compiler/training/broker/provisioning.d.ts +0 -78
  180. package/dist/compiler/training/broker/provisioning.js +0 -231
  181. package/dist/compiler/training/broker/receipt.d.ts +0 -77
  182. package/dist/compiler/training/broker/receipt.js +0 -110
  183. package/dist/compiler/training/broker/recycleClient.d.ts +0 -33
  184. package/dist/compiler/training/broker/recycleClient.js +0 -112
  185. package/dist/compiler/training/broker/registration.d.ts +0 -46
  186. package/dist/compiler/training/broker/registration.js +0 -113
  187. package/dist/compiler/training/broker/reset.d.ts +0 -9
  188. package/dist/compiler/training/broker/reset.js +0 -71
  189. package/dist/compiler/training/broker/rootScript.d.ts +0 -32
  190. package/dist/compiler/training/broker/rootScript.js +0 -33
  191. package/dist/compiler/training/broker/runtime.d.ts +0 -22
  192. package/dist/compiler/training/broker/runtime.js +0 -128
  193. package/dist/compiler/training/broker/seccompRoutes.d.ts +0 -31
  194. package/dist/compiler/training/broker/seccompRoutes.js +0 -36
  195. package/dist/compiler/training/broker/supervisor.d.ts +0 -108
  196. package/dist/compiler/training/broker/supervisor.js +0 -172
  197. package/dist/compiler/training/broker/taskClock.d.ts +0 -5
  198. package/dist/compiler/training/broker/taskClock.js +0 -41
  199. package/dist/compiler/training/container/contract.d.ts +0 -54
  200. package/dist/compiler/training/container/contract.js +0 -52
  201. package/dist/compiler/training/container/evaluators.d.ts +0 -48
  202. package/dist/compiler/training/container/evaluators.js +0 -50
  203. package/dist/compiler/training/container/grokWriteback.d.ts +0 -8
  204. package/dist/compiler/training/container/grokWriteback.js +0 -26
  205. package/dist/compiler/training/container/index.d.ts +0 -5
  206. package/dist/compiler/training/container/index.js +0 -3
  207. package/dist/compiler/training/container/launch.d.ts +0 -21
  208. package/dist/compiler/training/container/launch.js +0 -280
  209. package/dist/compiler/training/container/nativeSlots.d.ts +0 -14
  210. package/dist/compiler/training/container/nativeSlots.js +0 -13
  211. package/dist/compiler/training/container/outputCopy.d.ts +0 -2
  212. package/dist/compiler/training/container/outputCopy.js +0 -72
  213. package/dist/compiler/training/container/outputVolume.d.ts +0 -28
  214. package/dist/compiler/training/container/outputVolume.js +0 -185
  215. package/dist/compiler/training/container/prepare.d.ts +0 -10
  216. package/dist/compiler/training/container/prepare.js +0 -125
  217. package/dist/compiler/training/container/process.d.ts +0 -14
  218. package/dist/compiler/training/container/process.js +0 -70
  219. package/dist/compiler/training/container/security.d.ts +0 -38
  220. package/dist/compiler/training/container/security.js +0 -68
  221. package/dist/compiler/training/container/subjectIsolation.d.ts +0 -5
  222. package/dist/compiler/training/container/subjectIsolation.js +0 -16
  223. package/dist/compiler/training/preparation/assets/Dockerfile +0 -100
  224. package/dist/compiler/training/preparation/assets/package-lock.json +0 -5483
  225. package/dist/compiler/training/preparation/broker.d.ts +0 -30
  226. package/dist/compiler/training/preparation/broker.js +0 -68
  227. package/dist/compiler/training/preparation/contextModes.d.ts +0 -12
  228. package/dist/compiler/training/preparation/contextModes.js +0 -38
  229. package/dist/compiler/training/preparation/contract.d.ts +0 -203
  230. package/dist/compiler/training/preparation/contract.js +0 -114
  231. package/dist/compiler/training/preparation/copyAssets.d.ts +0 -1
  232. package/dist/compiler/training/preparation/copyAssets.js +0 -8
  233. package/dist/compiler/training/preparation/daimonParent.d.ts +0 -42
  234. package/dist/compiler/training/preparation/daimonParent.js +0 -114
  235. package/dist/compiler/training/preparation/files.d.ts +0 -29
  236. package/dist/compiler/training/preparation/files.js +0 -146
  237. package/dist/compiler/training/preparation/image.d.ts +0 -28
  238. package/dist/compiler/training/preparation/image.js +0 -105
  239. package/dist/compiler/training/preparation/index.d.ts +0 -3
  240. package/dist/compiler/training/preparation/index.js +0 -2
  241. package/dist/compiler/training/preparation/inputs.d.ts +0 -24
  242. package/dist/compiler/training/preparation/inputs.js +0 -101
  243. package/dist/compiler/training/preparation/prepare.d.ts +0 -38
  244. package/dist/compiler/training/preparation/prepare.js +0 -224
  245. package/dist/compiler/training/preparation/scratch.d.ts +0 -8
  246. package/dist/compiler/training/preparation/scratch.js +0 -114
  247. package/dist/compiler/training/repair/compatibility.d.ts +0 -11
  248. package/dist/compiler/training/repair/compatibility.js +0 -45
  249. package/dist/compiler/training/repair/contract.d.ts +0 -832
  250. package/dist/compiler/training/repair/contract.js +0 -34
  251. package/dist/compiler/training/repair/index.d.ts +0 -3
  252. package/dist/compiler/training/repair/index.js +0 -3
  253. package/dist/compiler/training/repair/prepare.d.ts +0 -378
  254. package/dist/compiler/training/repair/prepare.js +0 -84
  255. package/dist/compiler/training/repair/witness.d.ts +0 -348
  256. package/dist/compiler/training/repair/witness.js +0 -62
  257. package/dist/compiler/training/subjectDeclaration.d.ts +0 -26
  258. package/dist/compiler/training/subjectDeclaration.js +0 -54
  259. package/dist/compiler/training/subjectLease.d.ts +0 -115
  260. package/dist/compiler/training/subjectLease.js +0 -179
  261. package/dist/dev/activity.d.ts +0 -14
  262. package/dist/dev/activity.js +0 -48
  263. package/dist/runtime/codex-exec/training/adapter.d.ts +0 -13
  264. package/dist/runtime/codex-exec/training/adapter.js +0 -101
  265. package/dist/runtime/codex-exec/training/adapter.js.map +0 -1
  266. package/dist/runtime/codex-exec/training/environment.d.ts +0 -3
  267. package/dist/runtime/codex-exec/training/environment.js +0 -26
  268. package/dist/runtime/codex-exec/training/environment.js.map +0 -1
  269. package/dist/runtime/codex-exec/training/index.d.ts +0 -2
  270. package/dist/runtime/codex-exec/training/index.js +0 -3
  271. package/dist/runtime/codex-exec/training/index.js.map +0 -1
  272. package/dist/runtime/codex-exec/training/protocol.d.ts +0 -15
  273. package/dist/runtime/codex-exec/training/protocol.js +0 -102
  274. package/dist/runtime/codex-exec/training/protocol.js.map +0 -1
  275. package/dist/runtime/codex-exec/training/providers/codex-subscription/index.d.ts +0 -1
  276. package/dist/runtime/codex-exec/training/providers/codex-subscription/index.js +0 -2
  277. package/dist/runtime/codex-exec/training/providers/codex-subscription/index.js.map +0 -1
  278. package/dist/runtime/codex-exec/training/providers/codex-subscription/protocol.d.ts +0 -17
  279. package/dist/runtime/codex-exec/training/providers/codex-subscription/protocol.js +0 -80
  280. package/dist/runtime/codex-exec/training/providers/codex-subscription/protocol.js.map +0 -1
  281. package/dist/runtime/codex-exec/training/providers/codex-subscription/provider.d.ts +0 -12
  282. package/dist/runtime/codex-exec/training/providers/codex-subscription/provider.js +0 -125
  283. package/dist/runtime/codex-exec/training/providers/codex-subscription/provider.js.map +0 -1
  284. package/dist/runtime/codex-exec/training/providers/codex-subscription/strict-schema.d.ts +0 -6
  285. package/dist/runtime/codex-exec/training/providers/codex-subscription/strict-schema.js +0 -219
  286. package/dist/runtime/codex-exec/training/providers/codex-subscription/strict-schema.js.map +0 -1
  287. package/dist/runtime/daimon/contractManifest.js.map +0 -1
  288. package/dist/runtime/daimon/contractManifestSchema.js.map +0 -1
  289. package/dist/runtime/daimon/engineDescriptorSchema.js.map +0 -1
  290. package/dist/runtime/daimon/engineDescriptors.generated.js.map +0 -1
  291. package/dist/runtime/daimon/engines.js.map +0 -1
  292. package/dist/runtime/daimon/index.js.map +0 -1
  293. package/dist/runtime/daimon/packageName.js.map +0 -1
  294. package/dist/runtime/daimon/training/legacy/adapter.d.ts +0 -11
  295. package/dist/runtime/daimon/training/legacy/adapter.js +0 -175
  296. package/dist/runtime/daimon/training/legacy/adapter.js.map +0 -1
  297. package/dist/runtime/daimon/training/legacy/index.d.ts +0 -2
  298. package/dist/runtime/daimon/training/legacy/index.js +0 -3
  299. package/dist/runtime/daimon/training/legacy/index.js.map +0 -1
  300. package/dist/runtime/daimon/training/legacy/public.d.ts +0 -49
  301. package/dist/runtime/daimon/training/legacy/public.js +0 -16
  302. package/dist/runtime/daimon/training/legacy/public.js.map +0 -1
  303. package/dist/runtime/daimon/training/native/adapter.d.ts +0 -18
  304. package/dist/runtime/daimon/training/native/adapter.js +0 -252
  305. package/dist/runtime/daimon/training/native/adapter.js.map +0 -1
  306. package/dist/runtime/daimon/training/native/admission.d.ts +0 -7
  307. package/dist/runtime/daimon/training/native/admission.js +0 -52
  308. package/dist/runtime/daimon/training/native/admission.js.map +0 -1
  309. package/dist/runtime/daimon/training/native/child/arguments.d.ts +0 -16
  310. package/dist/runtime/daimon/training/native/child/arguments.js +0 -70
  311. package/dist/runtime/daimon/training/native/child/arguments.js.map +0 -1
  312. package/dist/runtime/daimon/training/native/child/deferred-trial.d.ts +0 -24
  313. package/dist/runtime/daimon/training/native/child/deferred-trial.js +0 -63
  314. package/dist/runtime/daimon/training/native/child/deferred-trial.js.map +0 -1
  315. package/dist/runtime/daimon/training/native/child/diagnostics.d.ts +0 -58
  316. package/dist/runtime/daimon/training/native/child/diagnostics.js +0 -215
  317. package/dist/runtime/daimon/training/native/child/diagnostics.js.map +0 -1
  318. package/dist/runtime/daimon/training/native/child/fixture.d.ts +0 -16
  319. package/dist/runtime/daimon/training/native/child/fixture.js +0 -159
  320. package/dist/runtime/daimon/training/native/child/fixture.js.map +0 -1
  321. package/dist/runtime/daimon/training/native/child/grok.d.ts +0 -14
  322. package/dist/runtime/daimon/training/native/child/grok.js +0 -47
  323. package/dist/runtime/daimon/training/native/child/grok.js.map +0 -1
  324. package/dist/runtime/daimon/training/native/child/index.d.ts +0 -7
  325. package/dist/runtime/daimon/training/native/child/index.js +0 -5
  326. package/dist/runtime/daimon/training/native/child/index.js.map +0 -1
  327. package/dist/runtime/daimon/training/native/child/lifecycle.d.ts +0 -40
  328. package/dist/runtime/daimon/training/native/child/lifecycle.js +0 -400
  329. package/dist/runtime/daimon/training/native/child/lifecycle.js.map +0 -1
  330. package/dist/runtime/daimon/training/native/child/probe.d.ts +0 -2
  331. package/dist/runtime/daimon/training/native/child/probe.js +0 -11
  332. package/dist/runtime/daimon/training/native/child/probe.js.map +0 -1
  333. package/dist/runtime/daimon/training/native/child/sandbox.d.ts +0 -4
  334. package/dist/runtime/daimon/training/native/child/sandbox.js +0 -76
  335. package/dist/runtime/daimon/training/native/child/sandbox.js.map +0 -1
  336. package/dist/runtime/daimon/training/native/child/types.d.ts +0 -15
  337. package/dist/runtime/daimon/training/native/child/types.js +0 -2
  338. package/dist/runtime/daimon/training/native/child/types.js.map +0 -1
  339. package/dist/runtime/daimon/training/native/container/docker.d.ts +0 -29
  340. package/dist/runtime/daimon/training/native/container/docker.js +0 -105
  341. package/dist/runtime/daimon/training/native/container/docker.js.map +0 -1
  342. package/dist/runtime/daimon/training/native/container/grok-slot.d.ts +0 -22
  343. package/dist/runtime/daimon/training/native/container/grok-slot.js +0 -38
  344. package/dist/runtime/daimon/training/native/container/grok-slot.js.map +0 -1
  345. package/dist/runtime/daimon/training/native/container/index.d.ts +0 -6
  346. package/dist/runtime/daimon/training/native/container/index.js +0 -6
  347. package/dist/runtime/daimon/training/native/container/index.js.map +0 -1
  348. package/dist/runtime/daimon/training/native/container/lifecycle.d.ts +0 -8
  349. package/dist/runtime/daimon/training/native/container/lifecycle.js +0 -111
  350. package/dist/runtime/daimon/training/native/container/lifecycle.js.map +0 -1
  351. package/dist/runtime/daimon/training/native/container/manifest.d.ts +0 -17
  352. package/dist/runtime/daimon/training/native/container/manifest.js +0 -164
  353. package/dist/runtime/daimon/training/native/container/manifest.js.map +0 -1
  354. package/dist/runtime/daimon/training/native/container/native-preflight.d.ts +0 -8
  355. package/dist/runtime/daimon/training/native/container/native-preflight.js +0 -40
  356. package/dist/runtime/daimon/training/native/container/native-preflight.js.map +0 -1
  357. package/dist/runtime/daimon/training/native/container/preflight.d.ts +0 -15
  358. package/dist/runtime/daimon/training/native/container/preflight.js +0 -79
  359. package/dist/runtime/daimon/training/native/container/preflight.js.map +0 -1
  360. package/dist/runtime/daimon/training/native/container/slot.d.ts +0 -4
  361. package/dist/runtime/daimon/training/native/container/slot.js +0 -58
  362. package/dist/runtime/daimon/training/native/container/slot.js.map +0 -1
  363. package/dist/runtime/daimon/training/native/external.d.ts +0 -37
  364. package/dist/runtime/daimon/training/native/external.js +0 -75
  365. package/dist/runtime/daimon/training/native/external.js.map +0 -1
  366. package/dist/runtime/daimon/training/native/grants/authority.d.ts +0 -36
  367. package/dist/runtime/daimon/training/native/grants/authority.js +0 -49
  368. package/dist/runtime/daimon/training/native/grants/authority.js.map +0 -1
  369. package/dist/runtime/daimon/training/native/grants/index.d.ts +0 -2
  370. package/dist/runtime/daimon/training/native/grants/index.js +0 -3
  371. package/dist/runtime/daimon/training/native/grants/index.js.map +0 -1
  372. package/dist/runtime/daimon/training/native/grants/pins.d.ts +0 -30
  373. package/dist/runtime/daimon/training/native/grants/pins.js +0 -20
  374. package/dist/runtime/daimon/training/native/grants/pins.js.map +0 -1
  375. package/dist/runtime/daimon/training/native/grants/test-socket.d.ts +0 -6
  376. package/dist/runtime/daimon/training/native/grants/test-socket.js +0 -35
  377. package/dist/runtime/daimon/training/native/grants/test-socket.js.map +0 -1
  378. package/dist/runtime/daimon/training/native/grok-fixtures.d.ts +0 -34
  379. package/dist/runtime/daimon/training/native/grok-fixtures.js +0 -179
  380. package/dist/runtime/daimon/training/native/grok-fixtures.js.map +0 -1
  381. package/dist/runtime/daimon/training/native/index.d.ts +0 -38
  382. package/dist/runtime/daimon/training/native/index.js +0 -27
  383. package/dist/runtime/daimon/training/native/index.js.map +0 -1
  384. package/dist/runtime/daimon/training/native/live-checkout.d.ts +0 -2
  385. package/dist/runtime/daimon/training/native/live-checkout.js +0 -15
  386. package/dist/runtime/daimon/training/native/live-checkout.js.map +0 -1
  387. package/dist/runtime/daimon/training/native/observations.d.ts +0 -51
  388. package/dist/runtime/daimon/training/native/observations.js +0 -217
  389. package/dist/runtime/daimon/training/native/observations.js.map +0 -1
  390. package/dist/runtime/daimon/training/native/outcome.d.ts +0 -13
  391. package/dist/runtime/daimon/training/native/outcome.js +0 -37
  392. package/dist/runtime/daimon/training/native/outcome.js.map +0 -1
  393. package/dist/runtime/daimon/training/native/preparation/engine-config.d.ts +0 -21
  394. package/dist/runtime/daimon/training/native/preparation/engine-config.js +0 -30
  395. package/dist/runtime/daimon/training/native/preparation/engine-config.js.map +0 -1
  396. package/dist/runtime/daimon/training/native/preparation/fixtures.d.ts +0 -17
  397. package/dist/runtime/daimon/training/native/preparation/fixtures.js +0 -52
  398. package/dist/runtime/daimon/training/native/preparation/fixtures.js.map +0 -1
  399. package/dist/runtime/daimon/training/native/preparation/index.d.ts +0 -7
  400. package/dist/runtime/daimon/training/native/preparation/index.js +0 -5
  401. package/dist/runtime/daimon/training/native/preparation/index.js.map +0 -1
  402. package/dist/runtime/daimon/training/native/preparation/layout.d.ts +0 -66
  403. package/dist/runtime/daimon/training/native/preparation/layout.js +0 -87
  404. package/dist/runtime/daimon/training/native/preparation/layout.js.map +0 -1
  405. package/dist/runtime/daimon/training/native/preparation/subject.d.ts +0 -14
  406. package/dist/runtime/daimon/training/native/preparation/subject.js +0 -67
  407. package/dist/runtime/daimon/training/native/preparation/subject.js.map +0 -1
  408. package/dist/runtime/daimon/training/native/preparation/types.d.ts +0 -69
  409. package/dist/runtime/daimon/training/native/preparation/types.js +0 -2
  410. package/dist/runtime/daimon/training/native/preparation/types.js.map +0 -1
  411. package/dist/runtime/daimon/training/native/receipt/artifacts.d.ts +0 -25
  412. package/dist/runtime/daimon/training/native/receipt/artifacts.js +0 -32
  413. package/dist/runtime/daimon/training/native/receipt/artifacts.js.map +0 -1
  414. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.d.ts +0 -129
  415. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js +0 -45
  416. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js.map +0 -1
  417. package/dist/runtime/daimon/training/native/receipt/grok.d.ts +0 -246
  418. package/dist/runtime/daimon/training/native/receipt/grok.js +0 -195
  419. package/dist/runtime/daimon/training/native/receipt/grok.js.map +0 -1
  420. package/dist/runtime/daimon/training/native/receipt/index.d.ts +0 -11
  421. package/dist/runtime/daimon/training/native/receipt/index.js +0 -8
  422. package/dist/runtime/daimon/training/native/receipt/index.js.map +0 -1
  423. package/dist/runtime/daimon/training/native/receipt/paths.d.ts +0 -3
  424. package/dist/runtime/daimon/training/native/receipt/paths.js +0 -18
  425. package/dist/runtime/daimon/training/native/receipt/paths.js.map +0 -1
  426. package/dist/runtime/daimon/training/native/receipt/sandbox.d.ts +0 -42
  427. package/dist/runtime/daimon/training/native/receipt/sandbox.js +0 -35
  428. package/dist/runtime/daimon/training/native/receipt/sandbox.js.map +0 -1
  429. package/dist/runtime/daimon/training/native/receipt/schema.d.ts +0 -490
  430. package/dist/runtime/daimon/training/native/receipt/schema.js +0 -138
  431. package/dist/runtime/daimon/training/native/receipt/schema.js.map +0 -1
  432. package/dist/runtime/daimon/training/native/receipt/subscription.d.ts +0 -13
  433. package/dist/runtime/daimon/training/native/receipt/subscription.js +0 -13
  434. package/dist/runtime/daimon/training/native/receipt/subscription.js.map +0 -1
  435. package/dist/runtime/daimon/training/native/receipt/task-clock.d.ts +0 -19
  436. package/dist/runtime/daimon/training/native/receipt/task-clock.js +0 -49
  437. package/dist/runtime/daimon/training/native/receipt/task-clock.js.map +0 -1
  438. package/dist/runtime/daimon/training/native/sealed-usage.d.ts +0 -218
  439. package/dist/runtime/daimon/training/native/sealed-usage.js +0 -261
  440. package/dist/runtime/daimon/training/native/sealed-usage.js.map +0 -1
  441. package/dist/runtime/daimon/training/native/test-fixtures.d.ts +0 -27
  442. package/dist/runtime/daimon/training/native/test-fixtures.js +0 -162
  443. package/dist/runtime/daimon/training/native/test-fixtures.js.map +0 -1
  444. package/dist/runtime/daimon/training/native/transcript.d.ts +0 -96
  445. package/dist/runtime/daimon/training/native/transcript.js +0 -239
  446. package/dist/runtime/daimon/training/native/transcript.js.map +0 -1
  447. package/dist/runtime/daimon/training/native/transport/delivery.d.ts +0 -27
  448. package/dist/runtime/daimon/training/native/transport/delivery.js +0 -98
  449. package/dist/runtime/daimon/training/native/transport/delivery.js.map +0 -1
  450. package/dist/runtime/daimon/training/native/transport/http.d.ts +0 -3
  451. package/dist/runtime/daimon/training/native/transport/http.js +0 -81
  452. package/dist/runtime/daimon/training/native/transport/http.js.map +0 -1
  453. package/dist/runtime/daimon/training/native/transport/index.d.ts +0 -4
  454. package/dist/runtime/daimon/training/native/transport/index.js +0 -3
  455. package/dist/runtime/daimon/training/native/transport/index.js.map +0 -1
  456. package/dist/runtime/daimon/training/native/transport/types.d.ts +0 -15
  457. package/dist/runtime/daimon/training/native/transport/types.js +0 -2
  458. package/dist/runtime/daimon/training/native/transport/types.js.map +0 -1
  459. package/dist/runtime/daimon/training/native/worker/cli.d.ts +0 -1
  460. package/dist/runtime/daimon/training/native/worker/cli.js +0 -17
  461. package/dist/runtime/daimon/training/native/worker/cli.js.map +0 -1
  462. package/dist/runtime/daimon/training/native/worker/control.d.ts +0 -20
  463. package/dist/runtime/daimon/training/native/worker/control.js +0 -266
  464. package/dist/runtime/daimon/training/native/worker/control.js.map +0 -1
  465. package/dist/runtime/daimon/training/native/worker/deliveries.d.ts +0 -38
  466. package/dist/runtime/daimon/training/native/worker/deliveries.js +0 -91
  467. package/dist/runtime/daimon/training/native/worker/deliveries.js.map +0 -1
  468. package/dist/runtime/daimon/training/native/worker/evidence/collect.d.ts +0 -54
  469. package/dist/runtime/daimon/training/native/worker/evidence/collect.js +0 -278
  470. package/dist/runtime/daimon/training/native/worker/evidence/collect.js.map +0 -1
  471. package/dist/runtime/daimon/training/native/worker/evidence/execution.d.ts +0 -102
  472. package/dist/runtime/daimon/training/native/worker/evidence/execution.js +0 -191
  473. package/dist/runtime/daimon/training/native/worker/evidence/execution.js.map +0 -1
  474. package/dist/runtime/daimon/training/native/worker/evidence/index.d.ts +0 -3
  475. package/dist/runtime/daimon/training/native/worker/evidence/index.js +0 -4
  476. package/dist/runtime/daimon/training/native/worker/evidence/index.js.map +0 -1
  477. package/dist/runtime/daimon/training/native/worker/evidence/io.d.ts +0 -20
  478. package/dist/runtime/daimon/training/native/worker/evidence/io.js +0 -130
  479. package/dist/runtime/daimon/training/native/worker/evidence/io.js.map +0 -1
  480. package/dist/runtime/daimon/training/native/worker/evidence/seal.d.ts +0 -3
  481. package/dist/runtime/daimon/training/native/worker/evidence/seal.js +0 -67
  482. package/dist/runtime/daimon/training/native/worker/evidence/seal.js.map +0 -1
  483. package/dist/runtime/daimon/training/native/worker/index.d.ts +0 -11
  484. package/dist/runtime/daimon/training/native/worker/index.js +0 -8
  485. package/dist/runtime/daimon/training/native/worker/index.js.map +0 -1
  486. package/dist/runtime/daimon/training/native/worker/profile.d.ts +0 -23
  487. package/dist/runtime/daimon/training/native/worker/profile.js +0 -149
  488. package/dist/runtime/daimon/training/native/worker/profile.js.map +0 -1
  489. package/dist/runtime/daimon/training/native/worker/public.d.ts +0 -53
  490. package/dist/runtime/daimon/training/native/worker/public.js +0 -22
  491. package/dist/runtime/daimon/training/native/worker/public.js.map +0 -1
  492. package/dist/runtime/daimon/training/native/worker/sandbox.d.ts +0 -4
  493. package/dist/runtime/daimon/training/native/worker/sandbox.js +0 -54
  494. package/dist/runtime/daimon/training/native/worker/sandbox.js.map +0 -1
  495. package/dist/runtime/daimon/training/native/worker/server.d.ts +0 -4
  496. package/dist/runtime/daimon/training/native/worker/server.js +0 -102
  497. package/dist/runtime/daimon/training/native/worker/server.js.map +0 -1
  498. package/dist/runtime/daimon/training/native/worker/types.d.ts +0 -318
  499. package/dist/runtime/daimon/training/native/worker/types.js +0 -2
  500. package/dist/runtime/daimon/training/native/worker/types.js.map +0 -1
  501. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.d.ts +0 -4
  502. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js +0 -4
  503. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js.map +0 -1
  504. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.d.ts +0 -3
  505. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js +0 -16
  506. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js.map +0 -1
  507. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.d.ts +0 -4
  508. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js +0 -52
  509. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js.map +0 -1
  510. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.d.ts +0 -21
  511. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js +0 -198
  512. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js.map +0 -1
  513. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.d.ts +0 -91
  514. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js +0 -2
  515. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js.map +0 -1
  516. package/dist/runtime/daimon/training/native/worker/worker.d.ts +0 -1
  517. package/dist/runtime/daimon/training/native/worker/worker.js +0 -105
  518. package/dist/runtime/daimon/training/native/worker/worker.js.map +0 -1
  519. package/dist/runtime/daimon/training/providers/grok-broker/broker.d.ts +0 -20
  520. package/dist/runtime/daimon/training/providers/grok-broker/broker.js +0 -55
  521. package/dist/runtime/daimon/training/providers/grok-broker/broker.js.map +0 -1
  522. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.d.ts +0 -15
  523. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js +0 -29
  524. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js.map +0 -1
  525. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.d.ts +0 -16
  526. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js +0 -60
  527. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js.map +0 -1
  528. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.d.ts +0 -81
  529. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js +0 -221
  530. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js.map +0 -1
  531. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.d.ts +0 -31
  532. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js +0 -78
  533. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js.map +0 -1
  534. package/dist/runtime/daimon/training/providers/grok-broker/grants.d.ts +0 -63
  535. package/dist/runtime/daimon/training/providers/grok-broker/grants.js +0 -20
  536. package/dist/runtime/daimon/training/providers/grok-broker/grants.js.map +0 -1
  537. package/dist/runtime/daimon/training/providers/grok-broker/index.d.ts +0 -3
  538. package/dist/runtime/daimon/training/providers/grok-broker/index.js +0 -4
  539. package/dist/runtime/daimon/training/providers/grok-broker/index.js.map +0 -1
  540. package/dist/runtime/daimon/training/providers/grok-subscription/cli.d.ts +0 -21
  541. package/dist/runtime/daimon/training/providers/grok-subscription/cli.js +0 -81
  542. package/dist/runtime/daimon/training/providers/grok-subscription/cli.js.map +0 -1
  543. package/dist/runtime/daimon/training/providers/grok-subscription/index.d.ts +0 -4
  544. package/dist/runtime/daimon/training/providers/grok-subscription/index.js +0 -5
  545. package/dist/runtime/daimon/training/providers/grok-subscription/index.js.map +0 -1
  546. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.d.ts +0 -26
  547. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js +0 -102
  548. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js.map +0 -1
  549. package/dist/runtime/daimon/training/providers/grok-subscription/provider.d.ts +0 -9
  550. package/dist/runtime/daimon/training/providers/grok-subscription/provider.js +0 -38
  551. package/dist/runtime/daimon/training/providers/grok-subscription/provider.js.map +0 -1
  552. package/dist/runtime/daimon/training/public.d.ts +0 -6
  553. package/dist/runtime/daimon/training/public.js +0 -5
  554. package/dist/runtime/daimon/training/public.js.map +0 -1
  555. package/dist/runtime/daimon/training/services/account-lease.d.ts +0 -7
  556. package/dist/runtime/daimon/training/services/account-lease.js +0 -76
  557. package/dist/runtime/daimon/training/services/account-lease.js.map +0 -1
  558. package/dist/runtime/daimon/training/services/freshness.d.ts +0 -15
  559. package/dist/runtime/daimon/training/services/freshness.js +0 -19
  560. package/dist/runtime/daimon/training/services/freshness.js.map +0 -1
  561. package/dist/runtime/daimon/training/services/index.d.ts +0 -4
  562. package/dist/runtime/daimon/training/services/index.js +0 -4
  563. package/dist/runtime/daimon/training/services/index.js.map +0 -1
  564. package/dist/runtime/daimon/training/services/slot-freshness.d.ts +0 -34
  565. package/dist/runtime/daimon/training/services/slot-freshness.js +0 -178
  566. package/dist/runtime/daimon/training/services/slot-freshness.js.map +0 -1
  567. package/dist/runtime/daimon/wakeMoments.js.map +0 -1
  568. package/dist/runtime/pi/adapter.d.ts +0 -3
  569. package/dist/runtime/pi/adapter.js +0 -230
  570. package/dist/runtime/pi/appActivitySource.d.ts +0 -1
  571. package/dist/runtime/pi/appActivitySource.js +0 -199
  572. package/dist/runtime/pi/appAgentConfig.d.ts +0 -11
  573. package/dist/runtime/pi/appAgentConfig.js +0 -264
  574. package/dist/runtime/pi/appCliEnginesSource.d.ts +0 -1
  575. package/dist/runtime/pi/appCliEnginesSource.js +0 -183
  576. package/dist/runtime/pi/appCliSource.d.ts +0 -1
  577. package/dist/runtime/pi/appCliSource.js +0 -353
  578. package/dist/runtime/pi/appControlSource.d.ts +0 -1
  579. package/dist/runtime/pi/appControlSource.js +0 -390
  580. package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +0 -1
  581. package/dist/runtime/pi/appControlWakeIdentitySource.js +0 -19
  582. package/dist/runtime/pi/appCoreSource.d.ts +0 -4
  583. package/dist/runtime/pi/appCoreSource.js +0 -244
  584. package/dist/runtime/pi/appPreludeSource.d.ts +0 -1
  585. package/dist/runtime/pi/appPreludeSource.js +0 -192
  586. package/dist/runtime/pi/appScheduleSource.d.ts +0 -1
  587. package/dist/runtime/pi/appScheduleSource.js +0 -84
  588. package/dist/runtime/pi/appScriptedEngine.d.ts +0 -31
  589. package/dist/runtime/pi/appScriptedEngine.js +0 -42
  590. package/dist/runtime/pi/appSource.d.ts +0 -4
  591. package/dist/runtime/pi/appSource.js +0 -12
  592. package/dist/runtime/pi/appTemplate.d.ts +0 -14
  593. package/dist/runtime/pi/appTemplate.js +0 -28
  594. package/dist/runtime/pi/appTemplateTypes.d.ts +0 -64
  595. package/dist/runtime/pi/appTemplateTypes.js +0 -18
  596. package/dist/runtime/pi/appWakeContextSource.d.ts +0 -1
  597. package/dist/runtime/pi/appWakeContextSource.js +0 -398
  598. package/dist/runtime/pi/containerTargets.d.ts +0 -4
  599. package/dist/runtime/pi/containerTargets.js +0 -63
  600. package/dist/runtime/pi/runAuth.d.ts +0 -2
  601. package/dist/runtime/pi/runAuth.js +0 -185
  602. package/dist/runtime/pi/testHelpers.d.ts +0 -2
  603. package/dist/shared/errors.js.map +0 -1
  604. package/dist/training/subjects/environment.d.ts +0 -2
  605. package/dist/training/subjects/environment.js +0 -14
  606. package/dist/training/subjects/environment.js.map +0 -1
@@ -0,0 +1,22 @@
1
+ import { execFile } from "node:child_process";
2
+ import { SpawnfileError } from "../../../shared/index.js";
3
+ export const createTrialDocker = (dockerCommand = "docker") => (args, options = {}) => new Promise((resolve, reject) => {
4
+ const child = execFile(dockerCommand, [...args], { maxBuffer: 16 * 1024 * 1024, timeout: options.timeoutMs ?? 120_000 }, (error, stdout, stderr) => error
5
+ ? reject(new SpawnfileError("runtime_error", `docker ${args[0]} ${args[1] ?? ""} failed: ${String(stderr).replace(/\s+/gu, " ").slice(-400)}`))
6
+ : resolve(`${stdout}${options.combined ? stderr : ""}`.trim()));
7
+ if (options.stdin !== undefined)
8
+ child.stdin?.end(options.stdin);
9
+ else
10
+ child.stdin?.end();
11
+ });
12
+ /** Poll `probe` until it resolves true, or fail after `timeoutMs`. */
13
+ export const waitFor = async (probe, timeoutMs, label, pollMs = 500) => {
14
+ const deadline = Date.now() + timeoutMs;
15
+ for (;;) {
16
+ if (await probe())
17
+ return;
18
+ if (Date.now() >= deadline)
19
+ throw new SpawnfileError("runtime_error", `${label} timed out after ${timeoutMs}ms`);
20
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
21
+ }
22
+ };
@@ -0,0 +1,47 @@
1
+ import type { ResolvedAuthProfile } from "../../../auth/index.js";
2
+ import { type TrialDocker } from "./docker.js";
3
+ export interface TrainingGatewayOptions {
4
+ /** Any compiled image of the subject: it carries the pinned Daimon runtime the gateway binary comes from. */
5
+ image: string;
6
+ runtimeRoot: string;
7
+ engines: readonly string[];
8
+ authProfile: ResolvedAuthProfile;
9
+ /** Training run identity; names the run's networks and labels every resource. */
10
+ runId: string;
11
+ docker?: TrialDocker;
12
+ /** Overrides the rendered sidecar script (tests and diagnostics only). */
13
+ script?: (script: string) => string;
14
+ readyTimeoutMs?: number;
15
+ }
16
+ /** What a trial needs to boot against the sidecar: one agent contract, never a login. */
17
+ export interface TrainingGatewayAccess {
18
+ url: string;
19
+ key: string;
20
+ /** Internal (no egress) network the trials join; only the gateway reaches the internet. */
21
+ network: string;
22
+ }
23
+ export interface TrainingGateway extends TrainingGatewayAccess {
24
+ container: string;
25
+ realmVolumes: readonly string[];
26
+ /** Stops and removes the sidecar and both networks. The realm volumes stay: they are the login. */
27
+ stop(): Promise<void>;
28
+ /** Replaces a dead or stuck sidecar in place: same key, networks and realm, so booted trials keep working. */
29
+ restart(script?: (script: string) => string): Promise<void>;
30
+ }
31
+ /**
32
+ * The gatewayed engines whose login the auth profile holds: the run's gateway
33
+ * serves all of them, so subject and judges may run on any of these engines.
34
+ */
35
+ export declare const trainingGatewayLogins: (profile: ResolvedAuthProfile) => string[];
36
+ /** One durable realm volume per auth profile and engine: the gateway is its sole holder (exclusive flock). */
37
+ export declare const trainingGatewayRealmVolume: (profile: string, engine: string) => string;
38
+ /**
39
+ * Places Daimon's auth gateway as a sidecar for one training run: a container
40
+ * from the subject's own compiled image (the pinned Daimon runtime is a
41
+ * scratch copy source and runs nothing by itself), with the production Docker
42
+ * security posture, owning the engine realm volume, on a dedicated egress
43
+ * network plus the run's internal network that the trials join. Nothing is
44
+ * published to the host. The bootstrap leaf of the selected auth profile is
45
+ * staged through the same gate as `spawnfile up`.
46
+ */
47
+ export declare const startTrainingGateway: (options: TrainingGatewayOptions) => Promise<TrainingGateway>;
@@ -0,0 +1,113 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { mkdtemp, rm, writeFile } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { DAIMON_GATEWAY_PORT, daimonGatewayBootstrapMountPath, daimonGatewayedEngines, daimonGatewayRealmPath } from "../../../runtime/daimon/gateway.js";
6
+ import { assertSafeDaimonSourceFile } from "../../../runtime/daimon/runAuth.js";
7
+ import { DAIMON_DOCKER_RUNTIME_SECURITY_ARGS, SpawnfileError } from "../../../shared/index.js";
8
+ import { createDockerTargetExecutors } from "../../../target/dockerCommandExecutor.js";
9
+ import { removeExactDockerResource } from "../../../target/dockerResources.js";
10
+ import { createDockerResourceSpec, executeDockerResource } from "../../../target/dockerResourcesProvider.js";
11
+ import { parseOpaqueTargetHandle } from "../../../target/contracts.js";
12
+ import { DAIMON_GATEWAY_SIDECAR_ALIAS, DAIMON_GATEWAY_SIDECAR_KEY_ENV, DAIMON_GATEWAY_SIDECAR_URL, renderDaimonGatewaySidecarScript } from "../../containerDaimonGatewayRender.js";
13
+ import { slugify } from "../../helpers.js";
14
+ import { createTrialDocker, waitFor } from "./docker.js";
15
+ const hex = (value) => createHash("sha256").update(value).digest("hex");
16
+ const opaque = (value) => parseOpaqueTargetHandle(`opaque_${hex(value)}`);
17
+ const LABEL = "spawnfile.training-gateway";
18
+ /**
19
+ * The gatewayed engines whose login the auth profile holds: the run's gateway
20
+ * serves all of them, so subject and judges may run on any of these engines.
21
+ */
22
+ export const trainingGatewayLogins = (profile) => daimonGatewayedEngines(Object.keys(profile.imports)).map(({ id }) => id);
23
+ /**
24
+ * The bootstrap leaf comes only from the profile's own import: a training
25
+ * gateway never falls back to the operator's personal engine home.
26
+ */
27
+ const trainingGatewaySource = (profile, engine, fileName) => {
28
+ const imported = profile.imports[engine];
29
+ if (!imported)
30
+ throw new SpawnfileError("validation_error", `Auth profile ${profile.name} has no imported ${engine} login`);
31
+ return path.join(imported.path, fileName);
32
+ };
33
+ /** One durable realm volume per auth profile and engine: the gateway is its sole holder (exclusive flock). */
34
+ export const trainingGatewayRealmVolume = (profile, engine) => `spawnfile-training-${slugify(profile) || "profile"}-${engine}-realm`;
35
+ /**
36
+ * Places Daimon's auth gateway as a sidecar for one training run: a container
37
+ * from the subject's own compiled image (the pinned Daimon runtime is a
38
+ * scratch copy source and runs nothing by itself), with the production Docker
39
+ * security posture, owning the engine realm volume, on a dedicated egress
40
+ * network plus the run's internal network that the trials join. Nothing is
41
+ * published to the host. The bootstrap leaf of the selected auth profile is
42
+ * staged through the same gate as `spawnfile up`.
43
+ */
44
+ export const startTrainingGateway = async (options) => {
45
+ const docker = options.docker ?? createTrialDocker();
46
+ const descriptors = daimonGatewayedEngines(options.engines);
47
+ if (descriptors.length === 0)
48
+ throw new SpawnfileError("validation_error", "Training gateway needs a gatewayed engine");
49
+ const context = await docker(["context", "show"]);
50
+ const executor = createDockerTargetExecutors().resource;
51
+ const internal = createDockerResourceSpec({
52
+ kind: "data_network", operationHandle: opaque(`${options.runId}\0network`), requestDigest: `sha256:${hex(options.runId)}`,
53
+ runId: options.runId, selectedTargetHandle: opaque(context)
54
+ });
55
+ const suffix = hex(options.runId).slice(0, 16);
56
+ const egress = `spawnfile-training-egress-${suffix}`;
57
+ const container = `spawnfile-training-gateway-${suffix}`;
58
+ const key = randomBytes(32).toString("hex");
59
+ const mounts = [];
60
+ const realmVolumes = [];
61
+ for (const descriptor of descriptors) {
62
+ const source = trainingGatewaySource(options.authProfile, descriptor.id, descriptor.auth.fileName);
63
+ await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor.id);
64
+ const volume = trainingGatewayRealmVolume(options.authProfile.name, descriptor.id);
65
+ realmVolumes.push(volume);
66
+ mounts.push("--mount", `type=volume,source=${volume},target=${daimonGatewayRealmPath(descriptor)}`, "-v", `${source}:${daimonGatewayBootstrapMountPath(descriptor.auth.realm)}:ro`);
67
+ }
68
+ const stop = async () => {
69
+ await docker(["rm", "-f", container]).catch(() => undefined);
70
+ await docker(["network", "rm", egress]).catch(() => undefined);
71
+ await removeExactDockerResource(internal, { context, executor, timeoutMs: 30_000 }).catch(() => undefined);
72
+ };
73
+ const launch = async (wrap = options.script) => {
74
+ const support = await mkdtemp(path.join(os.tmpdir(), "spawnfile-training-gateway-"));
75
+ try {
76
+ const envFile = path.join(support, "gateway.env");
77
+ await writeFile(envFile, `${DAIMON_GATEWAY_SIDECAR_KEY_ENV}=${key}\n`, { mode: 0o600 });
78
+ const script = renderDaimonGatewaySidecarScript(options.engines, options.runtimeRoot);
79
+ await docker(["create", "--name", container, "--restart", "no", "--network", egress, "--label", `${LABEL}=${suffix}`,
80
+ ...DAIMON_DOCKER_RUNTIME_SECURITY_ARGS, ...mounts, "--env-file", envFile,
81
+ "--entrypoint", "bash", options.image, "-ceu", wrap ? wrap(script) : script]);
82
+ }
83
+ finally {
84
+ await rm(support, { recursive: true, force: true });
85
+ }
86
+ await docker(["network", "connect", "--alias", DAIMON_GATEWAY_SIDECAR_ALIAS, internal.name, container]);
87
+ await docker(["start", container]);
88
+ await waitFor(async () => {
89
+ const state = await docker(["inspect", "--format", "{{.State.Running}}", container]);
90
+ if (state !== "true") {
91
+ const logs = await docker(["logs", "--tail", "20", container], { combined: true }).catch(() => "");
92
+ throw new SpawnfileError("runtime_error", `training auth gateway exited before readiness: ${logs.replace(/\s+/gu, " ").slice(-400)}`);
93
+ }
94
+ return docker(["exec", container, "bash", "-c", `(exec 3<>/dev/tcp/127.0.0.1/${DAIMON_GATEWAY_PORT})`]).then(() => true, () => false);
95
+ }, options.readyTimeoutMs ?? 60_000, "training auth gateway readiness");
96
+ };
97
+ try {
98
+ await executeDockerResource({ args: ["--context", context, ...internal.args], executor, timeoutMs: 30_000 });
99
+ await docker(["network", "create", "--label", `${LABEL}=${suffix}`, egress]);
100
+ await launch();
101
+ }
102
+ catch (error) {
103
+ await stop();
104
+ throw error;
105
+ }
106
+ return {
107
+ container, key, network: internal.name, realmVolumes, stop, url: DAIMON_GATEWAY_SIDECAR_URL,
108
+ restart: async (wrap) => {
109
+ await docker(["rm", "-f", container]);
110
+ await launch(wrap);
111
+ }
112
+ };
113
+ };
@@ -0,0 +1,31 @@
1
+ import type { TrialDocker } from "./docker.js";
2
+ /**
3
+ * The login files an engine with a volume-held login keeps in its runtime home,
4
+ * relative to that home. AGY's OAuth token (which AGY rewrites when it
5
+ * refreshes), its installation id and its onboarded project: nothing else, so
6
+ * no conversation, history or knowledge ever passes between trials.
7
+ */
8
+ export declare const HOME_LOGIN_FILES: Readonly<Record<string, readonly string[]>>;
9
+ /** One organization's runtime home and the profile volume its login files persist in. */
10
+ export interface HomeLogin {
11
+ /** The organization's own runtime home volume and where it is mounted. */
12
+ homeVolume: string;
13
+ homeMountPath: string;
14
+ /** The profile's volume holding only the login files. */
15
+ loginVolume: string;
16
+ files: readonly string[];
17
+ }
18
+ /**
19
+ * Copies each listed file that exists from the profile's login root into the
20
+ * runtime home (`seed`) or back (`save`), as the organization uid: regular
21
+ * single-link files only, no link anywhere on either path, written beside the
22
+ * target and renamed over it, identical files left alone. Started as root only
23
+ * to hand the destination root to the uid and to enter the home, whose image
24
+ * ancestors the uid cannot traverse until the organization's entrypoint opens
25
+ * them; the bytes are never printed.
26
+ */
27
+ export declare const HOME_LOGIN_PROGRAM: string;
28
+ /** Seeds the profile's login files into the organization's fresh runtime home, before it boots. */
29
+ export declare const seedHomeLogin: (docker: TrialDocker, image: string, login: HomeLogin) => Promise<string>;
30
+ /** Writes the login files the engine wrote or rewrote (a refreshed token) back to the profile, after the container stops. */
31
+ export declare const saveHomeLogin: (docker: TrialDocker, image: string, login: HomeLogin) => Promise<string>;
@@ -0,0 +1,69 @@
1
+ import { DAIMON_ORGANIZATION_UID } from "../../../runtime/daimon/runtimeIdentity.js";
2
+ /**
3
+ * The login files an engine with a volume-held login keeps in its runtime home,
4
+ * relative to that home. AGY's OAuth token (which AGY rewrites when it
5
+ * refreshes), its installation id and its onboarded project: nothing else, so
6
+ * no conversation, history or knowledge ever passes between trials.
7
+ */
8
+ export const HOME_LOGIN_FILES = {
9
+ agy: [
10
+ ".gemini/antigravity-cli/antigravity-oauth-token",
11
+ ".gemini/antigravity-cli/installation_id",
12
+ ".gemini/antigravity-cli/cache/default_project_id.txt",
13
+ ".gemini/antigravity-cli/cache/onboarding.json"
14
+ ]
15
+ };
16
+ const LOGIN_ROOT = "/spawnfile-home-login";
17
+ /**
18
+ * Copies each listed file that exists from the profile's login root into the
19
+ * runtime home (`seed`) or back (`save`), as the organization uid: regular
20
+ * single-link files only, no link anywhere on either path, written beside the
21
+ * target and renamed over it, identical files left alone. Started as root only
22
+ * to hand the destination root to the uid and to enter the home, whose image
23
+ * ancestors the uid cannot traverse until the organization's entrypoint opens
24
+ * them; the bytes are never printed.
25
+ */
26
+ export const HOME_LOGIN_PROGRAM = [
27
+ "const fs = require('node:fs'), path = require('node:path'), { constants } = fs;",
28
+ "const [uidText, direction, home, login, ...files] = process.argv.slice(1); const uid = Number(uidText);",
29
+ "const fail = (message) => { console.error(message); process.exit(3); };",
30
+ "if (direction !== 'seed' && direction !== 'save') fail('invalid direction');",
31
+ "process.chdir(home); const [from, to] = direction === 'seed' ? [login, '.'] : ['.', login];",
32
+ "if (process.getuid() === 0) {",
33
+ " const root = fs.lstatSync(to); if (!root.isDirectory()) fail('login destination is not a directory');",
34
+ " if (root.uid !== uid || (root.mode & 0o777) !== 0o700) { fs.chmodSync(to, 0o700); fs.chownSync(to, uid, uid); }",
35
+ " process.setgroups([]); process.setgid(uid); process.setuid(uid);",
36
+ "}",
37
+ "const walk = (root, segments, create) => { let current = root; for (const segment of segments) { current = path.join(current, segment);",
38
+ " let entry; try { entry = fs.lstatSync(current); } catch (error) { if (error.code !== 'ENOENT') throw error; if (!create) return null; fs.mkdirSync(current, { mode: 0o700 }); entry = fs.lstatSync(current); }",
39
+ " if (!entry.isDirectory()) fail('login directory is not a directory'); } return current; };",
40
+ "for (const file of files) {",
41
+ " const segments = file.split('/'); if (path.isAbsolute(file) || segments.some((segment) => segment === '' || segment === '.' || segment === '..')) fail('invalid login file path');",
42
+ " if (walk(from, segments.slice(0, -1), false) === null) continue;",
43
+ " let fd; try { fd = fs.openSync(path.join(from, file), constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK); } catch (error) { if (error.code === 'ENOENT') continue; fail('login file is unreadable or a link'); }",
44
+ " const entry = fs.fstatSync(fd); if (!entry.isFile() || entry.nlink !== 1) fail('login file is not a regular file');",
45
+ " const bytes = fs.readFileSync(fd); fs.closeSync(fd); const mode = entry.mode & 0o777;",
46
+ " const directory = walk(to, segments.slice(0, -1), true), target = path.join(directory, segments.at(-1));",
47
+ " let current = null; try { const existing = fs.lstatSync(target); if (!existing.isFile()) fail('login target is not a regular file'); current = fs.readFileSync(target); } catch (error) { if (error.code !== 'ENOENT') throw error; }",
48
+ " if (current !== null && current.equals(bytes) && (fs.lstatSync(target).mode & 0o777) === mode) { bytes.fill(0); current.fill(0); continue; }",
49
+ " current?.fill(0); const temporary = `${target}.spawnfile-${process.pid}`;",
50
+ " const out = fs.openSync(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, mode);",
51
+ " let offset = 0; while (offset < bytes.length) offset += fs.writeSync(out, bytes, offset, bytes.length - offset, offset);",
52
+ " bytes.fill(0); fs.fchmodSync(out, mode); fs.fsyncSync(out); fs.closeSync(out); fs.renameSync(temporary, target);",
53
+ " const parent = fs.openSync(directory, constants.O_RDONLY); fs.fsyncSync(parent); fs.closeSync(parent);",
54
+ "}"
55
+ ].join("\n");
56
+ const copy = (docker, image, login, direction) => docker([
57
+ "run", "--rm", "--network", "none", "--user", "0:0", "--cap-drop", "ALL",
58
+ // DAC_READ_SEARCH: root enters a home the organization already made its own (0700) to save from it.
59
+ "--cap-add", "CHOWN", "--cap-add", "DAC_READ_SEARCH", "--cap-add", "FOWNER", "--cap-add", "SETUID", "--cap-add", "SETGID",
60
+ "--security-opt", "no-new-privileges", "--entrypoint", "node",
61
+ "--mount", `type=volume,source=${login.loginVolume},target=${LOGIN_ROOT}`,
62
+ // Mounted where the organization mounts it, so a fresh home gets the image's own preimage first.
63
+ "--mount", `type=volume,source=${login.homeVolume},target=${login.homeMountPath}`,
64
+ image, "-e", HOME_LOGIN_PROGRAM, String(DAIMON_ORGANIZATION_UID), direction, login.homeMountPath, LOGIN_ROOT, ...login.files
65
+ ]);
66
+ /** Seeds the profile's login files into the organization's fresh runtime home, before it boots. */
67
+ export const seedHomeLogin = (docker, image, login) => copy(docker, image, login, "seed");
68
+ /** Writes the login files the engine wrote or rewrote (a refreshed token) back to the profile, after the container stops. */
69
+ export const saveHomeLogin = (docker, image, login) => copy(docker, image, login, "save");
@@ -0,0 +1,8 @@
1
+ export { TRAINING_TRIAL_LINEAGE_NAMESPACE, prepareTrial, type BootedTrial, type PreparedTrial, type TrialOptions, type TrialWake } from "./boot.js";
2
+ export { startTrainingGateway, trainingGatewayLogins, trainingGatewayRealmVolume, type TrainingGateway, type TrainingGatewayAccess, type TrainingGatewayOptions } from "./gateway.js";
3
+ export { HOME_LOGIN_FILES, saveHomeLogin, seedHomeLogin, type HomeLogin } from "./homeLogin.js";
4
+ export { JUDGE_INSTRUCTIONS, writeJudgeAgent, type JudgeSpec } from "./judge.js";
5
+ export { createBootedTrialRun, type BootedTrialLauncherOptions, type BootedTrialRun } from "./launcher.js";
6
+ export { TRIAL_INSTRUCTIONS_FILE, writeTrialProject } from "./project.js";
7
+ export { ensureSubscriptionRealmVolumes, loginSubscriptionRealm, subscriptionRealmBinding, type SubscriptionRealmLoginOptions, type SubscriptionRealmLoginResult } from "./login.js";
8
+ export { createRealmTurns, type RealmTurnOptions, type RealmTurns, type ReleaseRealmTurn } from "./realmTurns.js";
@@ -0,0 +1,8 @@
1
+ export { TRAINING_TRIAL_LINEAGE_NAMESPACE, prepareTrial } from "./boot.js";
2
+ export { startTrainingGateway, trainingGatewayLogins, trainingGatewayRealmVolume } from "./gateway.js";
3
+ export { HOME_LOGIN_FILES, saveHomeLogin, seedHomeLogin } from "./homeLogin.js";
4
+ export { JUDGE_INSTRUCTIONS, writeJudgeAgent } from "./judge.js";
5
+ export { createBootedTrialRun } from "./launcher.js";
6
+ export { TRIAL_INSTRUCTIONS_FILE, writeTrialProject } from "./project.js";
7
+ export { ensureSubscriptionRealmVolumes, loginSubscriptionRealm, subscriptionRealmBinding } from "./login.js";
8
+ export { createRealmTurns } from "./realmTurns.js";
@@ -0,0 +1,15 @@
1
+ /** One judge identity of a run: the engine, and the model and effort its compiled organization pins. */
2
+ export interface JudgeSpec {
3
+ engine: string;
4
+ model: string;
5
+ effort?: string;
6
+ }
7
+ /** The judge's system document: one self-contained judgment per wake, answered in the reply alone. */
8
+ export declare const JUDGE_INSTRUCTIONS: string;
9
+ /**
10
+ * Writes the judge's tool-free one-agent Daimon declaration: no skills, no
11
+ * MCP, no memory, no surfaces, no schedule. The model is pinned only where
12
+ * the engine's descriptor makes model selection configurable; otherwise the
13
+ * engine's own default model judges and the requested model is an assumption.
14
+ */
15
+ export declare const writeJudgeAgent: (spec: JudgeSpec, directory: string) => Promise<string>;
@@ -0,0 +1,42 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getDaimonEngineDescriptor } from "../../../runtime/daimon/index.js";
4
+ import { SpawnfileError } from "../../../shared/index.js";
5
+ /** The judge's system document: one self-contained judgment per wake, answered in the reply alone. */
6
+ export const JUDGE_INSTRUCTIONS = [
7
+ "You are a judge in a training run. Every message is one self-contained judging task.",
8
+ "Answer it directly in your reply. Never use a tool, command, file, memory, skill or the network:",
9
+ "a reply produced with any tool activity is discarded.",
10
+ "When the task gives a JSON Schema, reply with exactly one JSON value that matches it and nothing else."
11
+ ].join("\n");
12
+ /**
13
+ * Writes the judge's tool-free one-agent Daimon declaration: no skills, no
14
+ * MCP, no memory, no surfaces, no schedule. The model is pinned only where
15
+ * the engine's descriptor makes model selection configurable; otherwise the
16
+ * engine's own default model judges and the requested model is an assumption.
17
+ */
18
+ export const writeJudgeAgent = async (spec, directory) => {
19
+ const descriptor = getDaimonEngineDescriptor(spec.engine);
20
+ if (!descriptor)
21
+ throw new SpawnfileError("validation_error", `Judge engine ${spec.engine} is not a Daimon engine`);
22
+ const { provider, method } = descriptor.auth;
23
+ const pinned = descriptor.modelSelection.configurable && provider !== null && method !== null;
24
+ if (pinned && spec.effort !== undefined && !descriptor.modelSelection.reasoningEfforts.includes(spec.effort)) {
25
+ throw new SpawnfileError("validation_error", `Judge engine ${spec.engine} does not accept reasoning effort ${spec.effort}`);
26
+ }
27
+ const manifest = {
28
+ spawnfile_version: "0.1",
29
+ kind: "agent",
30
+ name: `judge-${spec.engine}`,
31
+ description: `Tool-free ${spec.engine} training judge`,
32
+ runtime: { name: "daimon", options: { engine: spec.engine } },
33
+ ...(pinned ? { execution: { model: { primary: {
34
+ provider, name: spec.model, auth: { method }, ...(spec.effort === undefined ? {} : { reasoning_effort: spec.effort })
35
+ } } } } : {})
36
+ };
37
+ await mkdir(directory, { recursive: true });
38
+ const manifestPath = path.join(directory, "Spawnfile");
39
+ // JSON is YAML; the trial project re-renders it with the judge instructions as its system document.
40
+ await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
41
+ return manifestPath;
42
+ };
@@ -0,0 +1,47 @@
1
+ import type { ResolvedAuthProfile } from "../../../auth/index.js";
2
+ import { prepareTrial, type BootedTrial, type TrialWake } from "./boot.js";
3
+ import { type TrialDocker } from "./docker.js";
4
+ import { type JudgeSpec } from "./judge.js";
5
+ import { type RealmTurns } from "./realmTurns.js";
6
+ export interface BootedTrialLauncherOptions {
7
+ /** The subject agent's own Spawnfile. */
8
+ agentManifestPath: string;
9
+ authProfile: ResolvedAuthProfile;
10
+ /** Trial projects, compile outputs and boot env files live here, one fresh directory per trial. */
11
+ scratchRoot: string;
12
+ docker?: TrialDocker;
13
+ turns?: RealmTurns;
14
+ /** Compiles and builds one organization (tests only). */
15
+ prepare?: typeof prepareTrial;
16
+ /** Bound on a judge's wait for a volume-held login another container holds (default 30 minutes). */
17
+ judgeRealmWaitMs?: number;
18
+ }
19
+ type Wake = (text: string, options: {
20
+ deliveryId: string;
21
+ timeoutMs: number;
22
+ signal?: AbortSignal;
23
+ }) => Promise<TrialWake>;
24
+ type Booted = Pick<BootedTrial, "container" | "scanCredentials" | "teardown"> & {
25
+ wake: Wake;
26
+ };
27
+ export interface BootedTrialRun {
28
+ boot(input: {
29
+ trialId: string;
30
+ instructions: string;
31
+ signal?: AbortSignal;
32
+ }): Promise<Booted>;
33
+ /** The run's warm judge for this engine, model and effort: booted once, woken once per judgment. */
34
+ judge(spec: JudgeSpec): Promise<Omit<Booted, "teardown">>;
35
+ /** Tears down every judge, stops the run's gateway and removes its image and networks; the realm volumes stay. */
36
+ close(): Promise<void>;
37
+ }
38
+ /**
39
+ * One training run's containers: each trial boot compiles and starts the
40
+ * subject's one-agent organization, each judge is a tool-free one-agent
41
+ * organization booted the same way, and all of them share the run's single
42
+ * auth gateway, started from the first image on first use. The gateway holds
43
+ * every gatewayed login of the run's auth profile, so trials and judges on
44
+ * any engine reach it with one key.
45
+ */
46
+ export declare const createBootedTrialRun: (options: BootedTrialLauncherOptions) => BootedTrialRun;
47
+ export {};
@@ -0,0 +1,193 @@
1
+ import { mkdir, mkdtemp } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { daimonGatewayedEngines } from "../../../runtime/daimon/gateway.js";
4
+ import { getDaimonEngineDescriptor } from "../../../runtime/daimon/index.js";
5
+ import { ensureNoopolisRunId } from "../../../runtime/index.js";
6
+ import { SpawnfileError } from "../../../shared/index.js";
7
+ import { prepareTrial } from "./boot.js";
8
+ import { createTrialDocker } from "./docker.js";
9
+ import { startTrainingGateway, trainingGatewayLogins } from "./gateway.js";
10
+ import { JUDGE_INSTRUCTIONS, writeJudgeAgent } from "./judge.js";
11
+ import { HOME_LOGIN_FILES } from "./homeLogin.js";
12
+ import { createRealmTurns } from "./realmTurns.js";
13
+ /**
14
+ * One training run's containers: each trial boot compiles and starts the
15
+ * subject's one-agent organization, each judge is a tool-free one-agent
16
+ * organization booted the same way, and all of them share the run's single
17
+ * auth gateway, started from the first image on first use. The gateway holds
18
+ * every gatewayed login of the run's auth profile, so trials and judges on
19
+ * any engine reach it with one key.
20
+ */
21
+ export const createBootedTrialRun = (options) => {
22
+ const docker = options.docker ?? createTrialDocker();
23
+ const turns = options.turns ?? createRealmTurns();
24
+ const prepare = options.prepare ?? prepareTrial;
25
+ const runId = ensureNoopolisRunId();
26
+ const logins = trainingGatewayLogins(options.authProfile);
27
+ let gateway;
28
+ const judges = new Map();
29
+ let closed = false;
30
+ /** The gateway this organization needs (null: no gatewayed engine), started on first use. */
31
+ const gatewayFor = async (prepared) => {
32
+ const gatewayed = daimonGatewayedEngines(prepared.engines);
33
+ if (gatewayed.length === 0)
34
+ return null;
35
+ const missing = gatewayed.filter((descriptor) => !logins.includes(descriptor.id));
36
+ if (missing.length > 0) {
37
+ throw new SpawnfileError("validation_error", `Auth profile ${options.authProfile.name} has no ${missing.map(({ id }) => id).join(", ")} login; run \`spawnfile auth import <engine> --profile ${options.authProfile.name}\``);
38
+ }
39
+ gateway ??= (async () => {
40
+ const image = `spawnfile-training-gateway:${runId.replace(/[^A-Za-z0-9_.-]/gu, "-").slice(0, 100)}`;
41
+ await docker(["tag", prepared.image, image]);
42
+ return { image, gateway: await startTrainingGateway({ authProfile: options.authProfile, docker, engines: logins,
43
+ image, runId, runtimeRoot: prepared.runtimeRoot }) };
44
+ })();
45
+ return (await gateway).gateway;
46
+ };
47
+ /**
48
+ * The volume-held login (`spawnfile auth login`) this organization mounts,
49
+ * as a profile view that carries nothing else: no env, no imports.
50
+ */
51
+ const realmFor = (prepared) => {
52
+ const engine = prepared.engines.find((id) => getDaimonEngineDescriptor(id)?.auth.staging === "secret-service");
53
+ if (engine === undefined)
54
+ return undefined;
55
+ const binding = options.authProfile.realms?.[engine];
56
+ // A login recorded before its home login files were kept cannot enroll a fresh home.
57
+ if (!binding || (HOME_LOGIN_FILES[engine] !== undefined && binding.homeVolume === undefined)) {
58
+ throw new SpawnfileError("validation_error", `Auth profile ${options.authProfile.name} has no ${engine} login; run \`spawnfile auth login ${engine} --profile ${options.authProfile.name}\``);
59
+ }
60
+ return { volume: binding.realmVolume, profile: { ...options.authProfile, env: {}, imports: {}, realms: { [engine]: binding } } };
61
+ };
62
+ /** Boots one container, holding its login realm's turn (if any) until the container is gone. */
63
+ const bootContainer = async (prepared, turn = {}) => {
64
+ const access = await gatewayFor(prepared);
65
+ const realm = realmFor(prepared);
66
+ const release = realm ? await turns.take(realm.volume, turn) : undefined;
67
+ try {
68
+ const booted = await prepared.boot(access, realm ? { realms: realm.profile } : {});
69
+ return { ...booted, teardown: async () => { try {
70
+ await booted.teardown();
71
+ }
72
+ finally {
73
+ release?.();
74
+ } } };
75
+ }
76
+ catch (error) {
77
+ release?.();
78
+ throw error;
79
+ }
80
+ };
81
+ const start = async (prepared, signal) => {
82
+ try {
83
+ const booted = await bootContainer(prepared, signal ? { signal } : {});
84
+ return { ...booted, teardown: async () => { try {
85
+ await booted.teardown();
86
+ }
87
+ finally {
88
+ await prepared.dispose();
89
+ } } };
90
+ }
91
+ catch (error) {
92
+ await prepared.dispose();
93
+ throw error;
94
+ }
95
+ };
96
+ /**
97
+ * A judge on a volume-held login takes turns with the run's trials: it stays
98
+ * warm while nobody else waits for the realm, and hands the turn over (its
99
+ * container removed) after its current judgment once someone does. Its image
100
+ * is built once and kept.
101
+ */
102
+ const takeTurnsJudge = (prepared) => {
103
+ let booted;
104
+ let container = "";
105
+ let busy = 0;
106
+ let evict = false;
107
+ const down = async () => {
108
+ const current = booted;
109
+ booted = undefined;
110
+ evict = false;
111
+ await (await current?.catch(() => undefined))?.teardown();
112
+ };
113
+ const timeoutMs = options.judgeRealmWaitMs ?? 30 * 60_000;
114
+ return {
115
+ get container() { return container; },
116
+ scanCredentials: async () => (await booted?.catch(() => undefined))?.scanCredentials() ?? [],
117
+ wake: async (text, wakeOptions) => {
118
+ busy++;
119
+ try {
120
+ if (!booted) {
121
+ const pending = bootContainer(prepared, { timeoutMs, ...(wakeOptions.signal ? { signal: wakeOptions.signal } : {}),
122
+ onContended: () => { evict = true; if (busy === 0)
123
+ void down(); } });
124
+ booted = pending;
125
+ pending.then((judge) => { container = judge.container; }, () => { if (booted === pending)
126
+ booted = undefined; });
127
+ }
128
+ return await (await booted).wake(text, wakeOptions);
129
+ }
130
+ finally {
131
+ busy--;
132
+ if (evict && busy === 0)
133
+ await down();
134
+ }
135
+ },
136
+ teardown: async () => { try {
137
+ await down();
138
+ }
139
+ finally {
140
+ await prepared.dispose();
141
+ } }
142
+ };
143
+ };
144
+ const directory = async (prefix) => {
145
+ await mkdir(options.scratchRoot, { recursive: true });
146
+ return mkdtemp(path.join(options.scratchRoot, prefix));
147
+ };
148
+ return {
149
+ boot: async ({ trialId, instructions, signal }) => start(await prepare({
150
+ agentManifestPath: options.agentManifestPath, docker, instructions, trialId, directory: await directory("trial-")
151
+ }), signal),
152
+ judge: (spec) => {
153
+ if (closed)
154
+ return Promise.reject(new SpawnfileError("runtime_error", "the training run is closed"));
155
+ const key = JSON.stringify([spec.engine, spec.model, spec.effort ?? null]);
156
+ let judge = judges.get(key);
157
+ if (!judge) {
158
+ judge = (async () => {
159
+ const root = await directory("judge-");
160
+ const prepared = await prepare({
161
+ agentManifestPath: await writeJudgeAgent(spec, path.join(root, "source")), docker, instructions: JUDGE_INSTRUCTIONS,
162
+ trialId: `judge-${spec.engine}-${key}-${runId}`, directory: root
163
+ });
164
+ let turnTaking;
165
+ try {
166
+ turnTaking = realmFor(prepared) !== undefined;
167
+ }
168
+ catch (error) {
169
+ await prepared.dispose();
170
+ throw error;
171
+ }
172
+ return turnTaking ? takeTurnsJudge(prepared) : start(prepared);
173
+ })();
174
+ judges.set(key, judge);
175
+ // A failed boot is not cached: the next judgment retries it.
176
+ judge.catch(() => { if (judges.get(key) === judge)
177
+ judges.delete(key); });
178
+ }
179
+ return judge;
180
+ },
181
+ close: async () => {
182
+ closed = true;
183
+ const booted = await Promise.all([...judges.values()].map((judge) => judge.catch(() => undefined)));
184
+ judges.clear();
185
+ await Promise.all(booted.map((judge) => judge?.teardown().catch(() => undefined)));
186
+ const started = await gateway?.catch(() => undefined);
187
+ if (!started)
188
+ return;
189
+ await started.gateway.stop();
190
+ await docker(["image", "rm", "-f", started.image]).catch(() => undefined);
191
+ }
192
+ };
193
+ };
@@ -0,0 +1,35 @@
1
+ import { type ResolvedAuthProfile, type SubscriptionRealmBinding } from "../../../auth/index.js";
2
+ import { prepareTrial } from "./boot.js";
3
+ import { type TrialDocker } from "./docker.js";
4
+ export interface SubscriptionRealmLoginOptions {
5
+ profileName: string;
6
+ engine: string;
7
+ /** Prepare volumes and image and return the login command without running it or recording the login. */
8
+ dryRun?: boolean;
9
+ docker?: TrialDocker;
10
+ /** Where the throwaway login organization is compiled (default: a fresh temp directory). */
11
+ scratchRoot?: string;
12
+ /** Builds the throwaway one-agent organization the login runs in (tests only). */
13
+ prepare?: typeof prepareTrial;
14
+ }
15
+ export interface SubscriptionRealmLoginResult {
16
+ binding: SubscriptionRealmBinding;
17
+ /** The exact `docker run` argv the login uses. */
18
+ command: readonly string[];
19
+ profile: ResolvedAuthProfile;
20
+ }
21
+ /** The profile's volume names for an engine's volume-held login. */
22
+ export declare const subscriptionRealmBinding: (profileName: string, engine: string) => Required<SubscriptionRealmBinding>;
23
+ export declare const ensureSubscriptionRealmVolumes: (docker: TrialDocker, image: string, engine: string, binding: SubscriptionRealmBinding) => Promise<void>;
24
+ /**
25
+ * `spawnfile auth login <engine>`: gives an auth profile its own volume-held
26
+ * login for an engine that keeps its login in a Daimon secret-service realm
27
+ * (AGY). Creates the profile's realm, unlock and home login volumes, then runs
28
+ * Daimon's own interactive `auth <engine> login` in a throwaway,
29
+ * production-booted one-agent organization (a tool-free judge) attached to the
30
+ * operator's terminal, keeps the engine's login files from that throwaway home
31
+ * in the home login volume, and records the volume names on the profile once
32
+ * it succeeds.
33
+ * Spawnfile never reads the login or the unlock secret.
34
+ */
35
+ export declare const loginSubscriptionRealm: (options: SubscriptionRealmLoginOptions) => Promise<SubscriptionRealmLoginResult>;