spawnfile 0.1.33 → 0.1.34

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 (585) hide show
  1. package/README.md +1 -1
  2. package/dist/auth/trainingAuth.d.ts +2 -5
  3. package/dist/cli/devCommands.d.ts +1 -1
  4. package/dist/cli/devCommands.js +0 -66
  5. package/dist/cli/runCli.d.ts +1 -4
  6. package/dist/cli/runCli.js +2 -2
  7. package/dist/cli/trainCommand.js +9 -15
  8. package/dist/cli/trainingBooted.d.ts +7 -0
  9. package/dist/cli/trainingBooted.js +41 -0
  10. package/dist/cli/trainingExecution.d.ts +4 -7
  11. package/dist/cli/trainingExecution.js +4 -32
  12. package/dist/compiler/containerArtifacts.js +0 -5
  13. package/dist/compiler/containerBackedMountRender.js +5 -1
  14. package/dist/compiler/containerDaimonBrokerRender.d.ts +5 -50
  15. package/dist/compiler/containerDaimonBrokerRender.js +7 -88
  16. package/dist/compiler/containerDaimonGatewayRender.d.ts +50 -0
  17. package/dist/compiler/containerDaimonGatewayRender.js +157 -0
  18. package/dist/compiler/containerDaimonGrokWorkerProvisioning.d.ts +2 -10
  19. package/dist/compiler/containerDaimonGrokWorkerProvisioning.js +13 -25
  20. package/dist/compiler/containerDaimonGrokWorkerRender.d.ts +11 -49
  21. package/dist/compiler/containerDaimonGrokWorkerRender.js +15 -39
  22. package/dist/compiler/containerDaimonStartupSupervision.d.ts +8 -0
  23. package/dist/compiler/containerDaimonStartupSupervision.js +39 -0
  24. package/dist/compiler/containerDaimonUidEntrypointRender.d.ts +1 -2
  25. package/dist/compiler/containerDaimonUidEntrypointRender.js +26 -46
  26. package/dist/compiler/containerRuntimeReadinessRender.js +1 -1
  27. package/dist/compiler/memoryArtifacts.js +0 -1
  28. package/dist/compiler/moltnetArtifacts.js +1 -17
  29. package/dist/compiler/moltnetClientConfig.js +1 -1
  30. package/dist/compiler/moltnetRuntimeConfig.js +0 -10
  31. package/dist/compiler/runProject.d.ts +1 -0
  32. package/dist/compiler/runProject.js +9 -3
  33. package/dist/compiler/runProjectAuth.js +2 -17
  34. package/dist/compiler/training/contract.d.ts +0 -2
  35. package/dist/compiler/training/contract.js +0 -2
  36. package/dist/compiler/training/execution.d.ts +1 -128
  37. package/dist/compiler/training/execution.js +7 -68
  38. package/dist/compiler/training/index.d.ts +0 -8
  39. package/dist/compiler/training/index.js +0 -7
  40. package/dist/compiler/training/output.d.ts +1 -0
  41. package/dist/compiler/training/output.js +1 -1
  42. package/dist/compiler/training/trial/boot.d.ts +53 -0
  43. package/dist/compiler/training/trial/boot.js +147 -0
  44. package/dist/compiler/training/trial/docker.d.ts +8 -0
  45. package/dist/compiler/training/trial/docker.js +22 -0
  46. package/dist/compiler/training/trial/gateway.d.ts +42 -0
  47. package/dist/compiler/training/trial/gateway.js +98 -0
  48. package/dist/compiler/training/trial/index.d.ts +4 -0
  49. package/dist/compiler/training/trial/index.js +4 -0
  50. package/dist/compiler/training/trial/launcher.d.ts +32 -0
  51. package/dist/compiler/training/trial/launcher.js +49 -0
  52. package/dist/compiler/training/trial/project.d.ts +11 -0
  53. package/dist/compiler/training/trial/project.js +31 -0
  54. package/dist/compiler/upReceipt.d.ts +2 -17
  55. package/dist/compiler/upReceipt.js +2 -17
  56. package/dist/deployment/artifactsExportPlan.js +2 -18
  57. package/dist/deployment/privateArtifactsExport.js +1 -1
  58. package/dist/dev/docker.d.ts +0 -5
  59. package/dist/dev/docker.js +0 -46
  60. package/dist/dev/index.d.ts +0 -1
  61. package/dist/dev/index.js +0 -1
  62. package/dist/dev/project.d.ts +0 -16
  63. package/dist/dev/project.js +1 -128
  64. package/dist/distribution/distributionReportSchema.js +1 -1
  65. package/dist/distribution/imageRuntimeAuth.js +3 -2
  66. package/dist/release/drainControl.d.ts +5 -19
  67. package/dist/release/drainControl.js +12 -67
  68. package/dist/report/types.d.ts +3 -6
  69. package/dist/runtime/common.d.ts +1 -1
  70. package/dist/runtime/common.js +1 -1
  71. package/dist/runtime/container.d.ts +2 -2
  72. package/dist/runtime/container.js +1 -39
  73. package/dist/runtime/daimon/config.js +6 -12
  74. package/dist/runtime/daimon/contractManifest.js +0 -1
  75. package/dist/runtime/daimon/contractManifestSchema.js +0 -1
  76. package/dist/runtime/daimon/control.d.ts +31 -0
  77. package/dist/runtime/daimon/control.js +83 -0
  78. package/dist/runtime/daimon/engineDescriptorSchema.js +0 -1
  79. package/dist/runtime/daimon/engineDescriptors.generated.d.ts +1 -1
  80. package/dist/runtime/daimon/engineDescriptors.generated.js +1 -2
  81. package/dist/runtime/daimon/engines.js +0 -1
  82. package/dist/runtime/daimon/gateway.d.ts +62 -0
  83. package/dist/runtime/daimon/gateway.js +77 -0
  84. package/dist/runtime/daimon/grokWorkerContract.d.ts +0 -5
  85. package/dist/runtime/daimon/grokWorkerContract.js +1 -13
  86. package/dist/runtime/daimon/index.d.ts +2 -0
  87. package/dist/runtime/daimon/index.js +2 -1
  88. package/dist/runtime/daimon/memory.js +1 -1
  89. package/dist/runtime/daimon/packageName.js +0 -1
  90. package/dist/runtime/daimon/runAuth.js +7 -4
  91. package/dist/runtime/daimon/runtimeIdentity.d.ts +2 -0
  92. package/dist/runtime/daimon/runtimeIdentity.js +2 -0
  93. package/dist/runtime/daimon/subscriptionRealms.d.ts +9 -3
  94. package/dist/runtime/daimon/subscriptionRealms.js +22 -13
  95. package/dist/runtime/daimon/testHelpers.d.ts +2 -0
  96. package/dist/runtime/{pi → daimon}/testHelpers.js +3 -3
  97. package/dist/runtime/daimon/training/booted/adapter.d.ts +46 -0
  98. package/dist/runtime/daimon/training/booted/adapter.js +59 -0
  99. package/dist/runtime/daimon/training/booted/adapter.js.map +1 -0
  100. package/dist/runtime/daimon/training/booted/index.d.ts +2 -0
  101. package/dist/runtime/daimon/training/booted/index.js +2 -0
  102. package/dist/runtime/daimon/training/booted/index.js.map +1 -0
  103. package/dist/runtime/daimon/training/index.d.ts +5 -0
  104. package/dist/runtime/daimon/training/index.js +8 -4
  105. package/dist/runtime/daimon/training/index.js.map +1 -1
  106. package/dist/runtime/daimon/training/providers/codex-subscription/index.js.map +1 -0
  107. package/dist/runtime/daimon/training/providers/codex-subscription/protocol.js.map +1 -0
  108. package/dist/runtime/daimon/training/providers/codex-subscription/provider.js.map +1 -0
  109. package/dist/runtime/daimon/training/providers/codex-subscription/strict-schema.js.map +1 -0
  110. package/dist/runtime/daimon/training/providers/grok-subscription/cli.d.ts +1 -3
  111. package/dist/runtime/daimon/training/providers/grok-subscription/cli.js +5 -5
  112. package/dist/runtime/daimon/training/providers/grok-subscription/cli.js.map +1 -1
  113. package/dist/runtime/daimon/training/providers/grok-subscription/index.d.ts +1 -2
  114. package/dist/runtime/daimon/training/providers/grok-subscription/index.js +0 -1
  115. package/dist/runtime/daimon/training/providers/grok-subscription/index.js.map +1 -1
  116. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.d.ts +5 -17
  117. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js +18 -31
  118. package/dist/runtime/daimon/training/providers/grok-subscription/protocol.js.map +1 -1
  119. package/dist/runtime/daimon/training/providers/grok-subscription/provider.js +1 -2
  120. package/dist/runtime/daimon/training/providers/grok-subscription/provider.js.map +1 -1
  121. package/dist/runtime/daimon/wakeMoments.js +0 -1
  122. package/dist/runtime/install.js +0 -21
  123. package/dist/runtime/registry.js +0 -2
  124. package/dist/runtime/trainingGraderProviders.js +1 -1
  125. package/dist/runtime/trainingProviders.d.ts +1 -2
  126. package/dist/runtime/trainingProviders.js +9 -19
  127. package/dist/runtime/trainingSubjects.d.ts +0 -121
  128. package/dist/runtime/trainingSubjects.js +2 -13
  129. package/dist/runtime/types.d.ts +1 -8
  130. package/dist/shared/errors.js +0 -1
  131. package/dist/status/lifecycleProbes.js +3 -6
  132. package/dist/status/moltnetWiringProbes.js +1 -17
  133. package/dist/training/subjects/index.d.ts +0 -1
  134. package/dist/training/subjects/index.js +0 -1
  135. package/dist/training/subjects/index.js.map +1 -1
  136. package/examples/README.md +0 -1
  137. package/examples/daimon-org/agents/mapper/Spawnfile +4 -1
  138. package/examples/daimon-org/teams/review/agents/reviewer/Spawnfile +4 -1
  139. package/examples/jungian-daimon-org/teams/luna/agents/animus/Spawnfile +5 -8
  140. package/examples/jungian-daimon-org/teams/luna/agents/representative/Spawnfile +1 -1
  141. package/examples/jungian-daimon-org/teams/luna/agents/shadow/Spawnfile +5 -8
  142. package/examples/jungian-daimon-org/teams/selene/agents/animus/Spawnfile +5 -8
  143. package/examples/jungian-daimon-org/teams/selene/agents/representative/Spawnfile +5 -8
  144. package/examples/jungian-daimon-org/teams/selene/agents/shadow/Spawnfile +1 -1
  145. package/examples/mixed-runtime-org/agents/localist/Spawnfile +7 -7
  146. package/package.json +4 -13
  147. package/runtimes.yaml +5 -15
  148. package/dist/compiler/containerDaimonGrokTaskClock.d.ts +0 -5
  149. package/dist/compiler/containerDaimonGrokTaskClock.js +0 -29
  150. package/dist/compiler/daimonTelemetryArtifacts.d.ts +0 -22
  151. package/dist/compiler/daimonTelemetryArtifacts.js +0 -56
  152. package/dist/compiler/training/broker/clockProbe.d.ts +0 -6
  153. package/dist/compiler/training/broker/clockProbe.js +0 -27
  154. package/dist/compiler/training/broker/declaration.d.ts +0 -54
  155. package/dist/compiler/training/broker/declaration.js +0 -70
  156. package/dist/compiler/training/broker/entrypoint.d.ts +0 -39
  157. package/dist/compiler/training/broker/entrypoint.js +0 -124
  158. package/dist/compiler/training/broker/evaluatorSecrets.d.ts +0 -2
  159. package/dist/compiler/training/broker/evaluatorSecrets.js +0 -62
  160. package/dist/compiler/training/broker/index.d.ts +0 -12
  161. package/dist/compiler/training/broker/index.js +0 -12
  162. package/dist/compiler/training/broker/main.d.ts +0 -2
  163. package/dist/compiler/training/broker/main.js +0 -14
  164. package/dist/compiler/training/broker/paths.d.ts +0 -236
  165. package/dist/compiler/training/broker/paths.js +0 -249
  166. package/dist/compiler/training/broker/processes.d.ts +0 -51
  167. package/dist/compiler/training/broker/processes.js +0 -102
  168. package/dist/compiler/training/broker/projection.d.ts +0 -61
  169. package/dist/compiler/training/broker/projection.js +0 -109
  170. package/dist/compiler/training/broker/provisioning.d.ts +0 -78
  171. package/dist/compiler/training/broker/provisioning.js +0 -231
  172. package/dist/compiler/training/broker/receipt.d.ts +0 -77
  173. package/dist/compiler/training/broker/receipt.js +0 -110
  174. package/dist/compiler/training/broker/recycleClient.d.ts +0 -33
  175. package/dist/compiler/training/broker/recycleClient.js +0 -112
  176. package/dist/compiler/training/broker/registration.d.ts +0 -46
  177. package/dist/compiler/training/broker/registration.js +0 -113
  178. package/dist/compiler/training/broker/reset.d.ts +0 -9
  179. package/dist/compiler/training/broker/reset.js +0 -71
  180. package/dist/compiler/training/broker/rootScript.d.ts +0 -32
  181. package/dist/compiler/training/broker/rootScript.js +0 -33
  182. package/dist/compiler/training/broker/runtime.d.ts +0 -22
  183. package/dist/compiler/training/broker/runtime.js +0 -128
  184. package/dist/compiler/training/broker/seccompRoutes.d.ts +0 -31
  185. package/dist/compiler/training/broker/seccompRoutes.js +0 -36
  186. package/dist/compiler/training/broker/supervisor.d.ts +0 -108
  187. package/dist/compiler/training/broker/supervisor.js +0 -172
  188. package/dist/compiler/training/broker/taskClock.d.ts +0 -5
  189. package/dist/compiler/training/broker/taskClock.js +0 -41
  190. package/dist/compiler/training/container/contract.d.ts +0 -54
  191. package/dist/compiler/training/container/contract.js +0 -52
  192. package/dist/compiler/training/container/evaluators.d.ts +0 -48
  193. package/dist/compiler/training/container/evaluators.js +0 -50
  194. package/dist/compiler/training/container/grokWriteback.d.ts +0 -8
  195. package/dist/compiler/training/container/grokWriteback.js +0 -26
  196. package/dist/compiler/training/container/index.d.ts +0 -5
  197. package/dist/compiler/training/container/index.js +0 -3
  198. package/dist/compiler/training/container/launch.d.ts +0 -21
  199. package/dist/compiler/training/container/launch.js +0 -280
  200. package/dist/compiler/training/container/nativeSlots.d.ts +0 -14
  201. package/dist/compiler/training/container/nativeSlots.js +0 -13
  202. package/dist/compiler/training/container/outputCopy.d.ts +0 -2
  203. package/dist/compiler/training/container/outputCopy.js +0 -72
  204. package/dist/compiler/training/container/outputVolume.d.ts +0 -28
  205. package/dist/compiler/training/container/outputVolume.js +0 -185
  206. package/dist/compiler/training/container/prepare.d.ts +0 -10
  207. package/dist/compiler/training/container/prepare.js +0 -125
  208. package/dist/compiler/training/container/process.d.ts +0 -14
  209. package/dist/compiler/training/container/process.js +0 -70
  210. package/dist/compiler/training/container/security.d.ts +0 -38
  211. package/dist/compiler/training/container/security.js +0 -68
  212. package/dist/compiler/training/container/subjectIsolation.d.ts +0 -5
  213. package/dist/compiler/training/container/subjectIsolation.js +0 -16
  214. package/dist/compiler/training/preparation/assets/Dockerfile +0 -100
  215. package/dist/compiler/training/preparation/assets/package-lock.json +0 -5483
  216. package/dist/compiler/training/preparation/broker.d.ts +0 -30
  217. package/dist/compiler/training/preparation/broker.js +0 -68
  218. package/dist/compiler/training/preparation/contextModes.d.ts +0 -12
  219. package/dist/compiler/training/preparation/contextModes.js +0 -38
  220. package/dist/compiler/training/preparation/contract.d.ts +0 -203
  221. package/dist/compiler/training/preparation/contract.js +0 -114
  222. package/dist/compiler/training/preparation/copyAssets.d.ts +0 -1
  223. package/dist/compiler/training/preparation/copyAssets.js +0 -8
  224. package/dist/compiler/training/preparation/daimonParent.d.ts +0 -42
  225. package/dist/compiler/training/preparation/daimonParent.js +0 -114
  226. package/dist/compiler/training/preparation/files.d.ts +0 -29
  227. package/dist/compiler/training/preparation/files.js +0 -146
  228. package/dist/compiler/training/preparation/image.d.ts +0 -28
  229. package/dist/compiler/training/preparation/image.js +0 -105
  230. package/dist/compiler/training/preparation/index.d.ts +0 -3
  231. package/dist/compiler/training/preparation/index.js +0 -2
  232. package/dist/compiler/training/preparation/inputs.d.ts +0 -24
  233. package/dist/compiler/training/preparation/inputs.js +0 -101
  234. package/dist/compiler/training/preparation/prepare.d.ts +0 -38
  235. package/dist/compiler/training/preparation/prepare.js +0 -224
  236. package/dist/compiler/training/preparation/scratch.d.ts +0 -8
  237. package/dist/compiler/training/preparation/scratch.js +0 -114
  238. package/dist/compiler/training/repair/compatibility.d.ts +0 -11
  239. package/dist/compiler/training/repair/compatibility.js +0 -45
  240. package/dist/compiler/training/repair/contract.d.ts +0 -832
  241. package/dist/compiler/training/repair/contract.js +0 -34
  242. package/dist/compiler/training/repair/index.d.ts +0 -3
  243. package/dist/compiler/training/repair/index.js +0 -3
  244. package/dist/compiler/training/repair/prepare.d.ts +0 -378
  245. package/dist/compiler/training/repair/prepare.js +0 -84
  246. package/dist/compiler/training/repair/witness.d.ts +0 -348
  247. package/dist/compiler/training/repair/witness.js +0 -62
  248. package/dist/compiler/training/subjectDeclaration.d.ts +0 -26
  249. package/dist/compiler/training/subjectDeclaration.js +0 -54
  250. package/dist/compiler/training/subjectLease.d.ts +0 -115
  251. package/dist/compiler/training/subjectLease.js +0 -179
  252. package/dist/dev/activity.d.ts +0 -14
  253. package/dist/dev/activity.js +0 -48
  254. package/dist/runtime/codex-exec/training/adapter.d.ts +0 -13
  255. package/dist/runtime/codex-exec/training/adapter.js +0 -101
  256. package/dist/runtime/codex-exec/training/adapter.js.map +0 -1
  257. package/dist/runtime/codex-exec/training/environment.d.ts +0 -3
  258. package/dist/runtime/codex-exec/training/environment.js +0 -26
  259. package/dist/runtime/codex-exec/training/environment.js.map +0 -1
  260. package/dist/runtime/codex-exec/training/index.d.ts +0 -2
  261. package/dist/runtime/codex-exec/training/index.js +0 -3
  262. package/dist/runtime/codex-exec/training/index.js.map +0 -1
  263. package/dist/runtime/codex-exec/training/protocol.d.ts +0 -15
  264. package/dist/runtime/codex-exec/training/protocol.js +0 -102
  265. package/dist/runtime/codex-exec/training/protocol.js.map +0 -1
  266. package/dist/runtime/codex-exec/training/providers/codex-subscription/index.js.map +0 -1
  267. package/dist/runtime/codex-exec/training/providers/codex-subscription/protocol.js.map +0 -1
  268. package/dist/runtime/codex-exec/training/providers/codex-subscription/provider.js.map +0 -1
  269. package/dist/runtime/codex-exec/training/providers/codex-subscription/strict-schema.js.map +0 -1
  270. package/dist/runtime/daimon/contractManifest.js.map +0 -1
  271. package/dist/runtime/daimon/contractManifestSchema.js.map +0 -1
  272. package/dist/runtime/daimon/engineDescriptorSchema.js.map +0 -1
  273. package/dist/runtime/daimon/engineDescriptors.generated.js.map +0 -1
  274. package/dist/runtime/daimon/engines.js.map +0 -1
  275. package/dist/runtime/daimon/index.js.map +0 -1
  276. package/dist/runtime/daimon/packageName.js.map +0 -1
  277. package/dist/runtime/daimon/training/legacy/adapter.d.ts +0 -11
  278. package/dist/runtime/daimon/training/legacy/adapter.js +0 -175
  279. package/dist/runtime/daimon/training/legacy/adapter.js.map +0 -1
  280. package/dist/runtime/daimon/training/legacy/index.d.ts +0 -2
  281. package/dist/runtime/daimon/training/legacy/index.js +0 -3
  282. package/dist/runtime/daimon/training/legacy/index.js.map +0 -1
  283. package/dist/runtime/daimon/training/legacy/public.d.ts +0 -49
  284. package/dist/runtime/daimon/training/legacy/public.js +0 -16
  285. package/dist/runtime/daimon/training/legacy/public.js.map +0 -1
  286. package/dist/runtime/daimon/training/native/adapter.d.ts +0 -18
  287. package/dist/runtime/daimon/training/native/adapter.js +0 -252
  288. package/dist/runtime/daimon/training/native/adapter.js.map +0 -1
  289. package/dist/runtime/daimon/training/native/admission.d.ts +0 -7
  290. package/dist/runtime/daimon/training/native/admission.js +0 -52
  291. package/dist/runtime/daimon/training/native/admission.js.map +0 -1
  292. package/dist/runtime/daimon/training/native/child/arguments.d.ts +0 -16
  293. package/dist/runtime/daimon/training/native/child/arguments.js +0 -70
  294. package/dist/runtime/daimon/training/native/child/arguments.js.map +0 -1
  295. package/dist/runtime/daimon/training/native/child/deferred-trial.d.ts +0 -24
  296. package/dist/runtime/daimon/training/native/child/deferred-trial.js +0 -63
  297. package/dist/runtime/daimon/training/native/child/deferred-trial.js.map +0 -1
  298. package/dist/runtime/daimon/training/native/child/diagnostics.d.ts +0 -58
  299. package/dist/runtime/daimon/training/native/child/diagnostics.js +0 -215
  300. package/dist/runtime/daimon/training/native/child/diagnostics.js.map +0 -1
  301. package/dist/runtime/daimon/training/native/child/fixture.d.ts +0 -16
  302. package/dist/runtime/daimon/training/native/child/fixture.js +0 -159
  303. package/dist/runtime/daimon/training/native/child/fixture.js.map +0 -1
  304. package/dist/runtime/daimon/training/native/child/grok.d.ts +0 -14
  305. package/dist/runtime/daimon/training/native/child/grok.js +0 -47
  306. package/dist/runtime/daimon/training/native/child/grok.js.map +0 -1
  307. package/dist/runtime/daimon/training/native/child/index.d.ts +0 -7
  308. package/dist/runtime/daimon/training/native/child/index.js +0 -5
  309. package/dist/runtime/daimon/training/native/child/index.js.map +0 -1
  310. package/dist/runtime/daimon/training/native/child/lifecycle.d.ts +0 -40
  311. package/dist/runtime/daimon/training/native/child/lifecycle.js +0 -400
  312. package/dist/runtime/daimon/training/native/child/lifecycle.js.map +0 -1
  313. package/dist/runtime/daimon/training/native/child/probe.d.ts +0 -2
  314. package/dist/runtime/daimon/training/native/child/probe.js +0 -11
  315. package/dist/runtime/daimon/training/native/child/probe.js.map +0 -1
  316. package/dist/runtime/daimon/training/native/child/sandbox.d.ts +0 -4
  317. package/dist/runtime/daimon/training/native/child/sandbox.js +0 -76
  318. package/dist/runtime/daimon/training/native/child/sandbox.js.map +0 -1
  319. package/dist/runtime/daimon/training/native/child/types.d.ts +0 -15
  320. package/dist/runtime/daimon/training/native/child/types.js +0 -2
  321. package/dist/runtime/daimon/training/native/child/types.js.map +0 -1
  322. package/dist/runtime/daimon/training/native/container/docker.d.ts +0 -29
  323. package/dist/runtime/daimon/training/native/container/docker.js +0 -105
  324. package/dist/runtime/daimon/training/native/container/docker.js.map +0 -1
  325. package/dist/runtime/daimon/training/native/container/grok-slot.d.ts +0 -22
  326. package/dist/runtime/daimon/training/native/container/grok-slot.js +0 -38
  327. package/dist/runtime/daimon/training/native/container/grok-slot.js.map +0 -1
  328. package/dist/runtime/daimon/training/native/container/index.d.ts +0 -6
  329. package/dist/runtime/daimon/training/native/container/index.js +0 -6
  330. package/dist/runtime/daimon/training/native/container/index.js.map +0 -1
  331. package/dist/runtime/daimon/training/native/container/lifecycle.d.ts +0 -8
  332. package/dist/runtime/daimon/training/native/container/lifecycle.js +0 -111
  333. package/dist/runtime/daimon/training/native/container/lifecycle.js.map +0 -1
  334. package/dist/runtime/daimon/training/native/container/manifest.d.ts +0 -17
  335. package/dist/runtime/daimon/training/native/container/manifest.js +0 -164
  336. package/dist/runtime/daimon/training/native/container/manifest.js.map +0 -1
  337. package/dist/runtime/daimon/training/native/container/native-preflight.d.ts +0 -8
  338. package/dist/runtime/daimon/training/native/container/native-preflight.js +0 -40
  339. package/dist/runtime/daimon/training/native/container/native-preflight.js.map +0 -1
  340. package/dist/runtime/daimon/training/native/container/preflight.d.ts +0 -15
  341. package/dist/runtime/daimon/training/native/container/preflight.js +0 -79
  342. package/dist/runtime/daimon/training/native/container/preflight.js.map +0 -1
  343. package/dist/runtime/daimon/training/native/container/slot.d.ts +0 -4
  344. package/dist/runtime/daimon/training/native/container/slot.js +0 -58
  345. package/dist/runtime/daimon/training/native/container/slot.js.map +0 -1
  346. package/dist/runtime/daimon/training/native/external.d.ts +0 -37
  347. package/dist/runtime/daimon/training/native/external.js +0 -75
  348. package/dist/runtime/daimon/training/native/external.js.map +0 -1
  349. package/dist/runtime/daimon/training/native/grants/authority.d.ts +0 -36
  350. package/dist/runtime/daimon/training/native/grants/authority.js +0 -49
  351. package/dist/runtime/daimon/training/native/grants/authority.js.map +0 -1
  352. package/dist/runtime/daimon/training/native/grants/index.d.ts +0 -2
  353. package/dist/runtime/daimon/training/native/grants/index.js +0 -3
  354. package/dist/runtime/daimon/training/native/grants/index.js.map +0 -1
  355. package/dist/runtime/daimon/training/native/grants/pins.d.ts +0 -30
  356. package/dist/runtime/daimon/training/native/grants/pins.js +0 -20
  357. package/dist/runtime/daimon/training/native/grants/pins.js.map +0 -1
  358. package/dist/runtime/daimon/training/native/grants/test-socket.d.ts +0 -6
  359. package/dist/runtime/daimon/training/native/grants/test-socket.js +0 -35
  360. package/dist/runtime/daimon/training/native/grants/test-socket.js.map +0 -1
  361. package/dist/runtime/daimon/training/native/grok-fixtures.d.ts +0 -34
  362. package/dist/runtime/daimon/training/native/grok-fixtures.js +0 -179
  363. package/dist/runtime/daimon/training/native/grok-fixtures.js.map +0 -1
  364. package/dist/runtime/daimon/training/native/index.d.ts +0 -38
  365. package/dist/runtime/daimon/training/native/index.js +0 -27
  366. package/dist/runtime/daimon/training/native/index.js.map +0 -1
  367. package/dist/runtime/daimon/training/native/live-checkout.d.ts +0 -2
  368. package/dist/runtime/daimon/training/native/live-checkout.js +0 -15
  369. package/dist/runtime/daimon/training/native/live-checkout.js.map +0 -1
  370. package/dist/runtime/daimon/training/native/observations.d.ts +0 -51
  371. package/dist/runtime/daimon/training/native/observations.js +0 -217
  372. package/dist/runtime/daimon/training/native/observations.js.map +0 -1
  373. package/dist/runtime/daimon/training/native/outcome.d.ts +0 -13
  374. package/dist/runtime/daimon/training/native/outcome.js +0 -37
  375. package/dist/runtime/daimon/training/native/outcome.js.map +0 -1
  376. package/dist/runtime/daimon/training/native/preparation/engine-config.d.ts +0 -21
  377. package/dist/runtime/daimon/training/native/preparation/engine-config.js +0 -30
  378. package/dist/runtime/daimon/training/native/preparation/engine-config.js.map +0 -1
  379. package/dist/runtime/daimon/training/native/preparation/fixtures.d.ts +0 -17
  380. package/dist/runtime/daimon/training/native/preparation/fixtures.js +0 -52
  381. package/dist/runtime/daimon/training/native/preparation/fixtures.js.map +0 -1
  382. package/dist/runtime/daimon/training/native/preparation/index.d.ts +0 -7
  383. package/dist/runtime/daimon/training/native/preparation/index.js +0 -5
  384. package/dist/runtime/daimon/training/native/preparation/index.js.map +0 -1
  385. package/dist/runtime/daimon/training/native/preparation/layout.d.ts +0 -66
  386. package/dist/runtime/daimon/training/native/preparation/layout.js +0 -87
  387. package/dist/runtime/daimon/training/native/preparation/layout.js.map +0 -1
  388. package/dist/runtime/daimon/training/native/preparation/subject.d.ts +0 -14
  389. package/dist/runtime/daimon/training/native/preparation/subject.js +0 -67
  390. package/dist/runtime/daimon/training/native/preparation/subject.js.map +0 -1
  391. package/dist/runtime/daimon/training/native/preparation/types.d.ts +0 -69
  392. package/dist/runtime/daimon/training/native/preparation/types.js +0 -2
  393. package/dist/runtime/daimon/training/native/preparation/types.js.map +0 -1
  394. package/dist/runtime/daimon/training/native/receipt/artifacts.d.ts +0 -25
  395. package/dist/runtime/daimon/training/native/receipt/artifacts.js +0 -32
  396. package/dist/runtime/daimon/training/native/receipt/artifacts.js.map +0 -1
  397. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.d.ts +0 -129
  398. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js +0 -45
  399. package/dist/runtime/daimon/training/native/receipt/grok-clocked-pins.js.map +0 -1
  400. package/dist/runtime/daimon/training/native/receipt/grok.d.ts +0 -246
  401. package/dist/runtime/daimon/training/native/receipt/grok.js +0 -195
  402. package/dist/runtime/daimon/training/native/receipt/grok.js.map +0 -1
  403. package/dist/runtime/daimon/training/native/receipt/index.d.ts +0 -11
  404. package/dist/runtime/daimon/training/native/receipt/index.js +0 -8
  405. package/dist/runtime/daimon/training/native/receipt/index.js.map +0 -1
  406. package/dist/runtime/daimon/training/native/receipt/paths.d.ts +0 -3
  407. package/dist/runtime/daimon/training/native/receipt/paths.js +0 -18
  408. package/dist/runtime/daimon/training/native/receipt/paths.js.map +0 -1
  409. package/dist/runtime/daimon/training/native/receipt/sandbox.d.ts +0 -42
  410. package/dist/runtime/daimon/training/native/receipt/sandbox.js +0 -35
  411. package/dist/runtime/daimon/training/native/receipt/sandbox.js.map +0 -1
  412. package/dist/runtime/daimon/training/native/receipt/schema.d.ts +0 -490
  413. package/dist/runtime/daimon/training/native/receipt/schema.js +0 -138
  414. package/dist/runtime/daimon/training/native/receipt/schema.js.map +0 -1
  415. package/dist/runtime/daimon/training/native/receipt/subscription.d.ts +0 -13
  416. package/dist/runtime/daimon/training/native/receipt/subscription.js +0 -13
  417. package/dist/runtime/daimon/training/native/receipt/subscription.js.map +0 -1
  418. package/dist/runtime/daimon/training/native/receipt/task-clock.d.ts +0 -19
  419. package/dist/runtime/daimon/training/native/receipt/task-clock.js +0 -49
  420. package/dist/runtime/daimon/training/native/receipt/task-clock.js.map +0 -1
  421. package/dist/runtime/daimon/training/native/sealed-usage.d.ts +0 -218
  422. package/dist/runtime/daimon/training/native/sealed-usage.js +0 -261
  423. package/dist/runtime/daimon/training/native/sealed-usage.js.map +0 -1
  424. package/dist/runtime/daimon/training/native/test-fixtures.d.ts +0 -27
  425. package/dist/runtime/daimon/training/native/test-fixtures.js +0 -162
  426. package/dist/runtime/daimon/training/native/test-fixtures.js.map +0 -1
  427. package/dist/runtime/daimon/training/native/transcript.d.ts +0 -96
  428. package/dist/runtime/daimon/training/native/transcript.js +0 -239
  429. package/dist/runtime/daimon/training/native/transcript.js.map +0 -1
  430. package/dist/runtime/daimon/training/native/transport/delivery.d.ts +0 -27
  431. package/dist/runtime/daimon/training/native/transport/delivery.js +0 -98
  432. package/dist/runtime/daimon/training/native/transport/delivery.js.map +0 -1
  433. package/dist/runtime/daimon/training/native/transport/http.d.ts +0 -3
  434. package/dist/runtime/daimon/training/native/transport/http.js +0 -81
  435. package/dist/runtime/daimon/training/native/transport/http.js.map +0 -1
  436. package/dist/runtime/daimon/training/native/transport/index.d.ts +0 -4
  437. package/dist/runtime/daimon/training/native/transport/index.js +0 -3
  438. package/dist/runtime/daimon/training/native/transport/index.js.map +0 -1
  439. package/dist/runtime/daimon/training/native/transport/types.d.ts +0 -15
  440. package/dist/runtime/daimon/training/native/transport/types.js +0 -2
  441. package/dist/runtime/daimon/training/native/transport/types.js.map +0 -1
  442. package/dist/runtime/daimon/training/native/worker/cli.d.ts +0 -1
  443. package/dist/runtime/daimon/training/native/worker/cli.js +0 -17
  444. package/dist/runtime/daimon/training/native/worker/cli.js.map +0 -1
  445. package/dist/runtime/daimon/training/native/worker/control.d.ts +0 -20
  446. package/dist/runtime/daimon/training/native/worker/control.js +0 -266
  447. package/dist/runtime/daimon/training/native/worker/control.js.map +0 -1
  448. package/dist/runtime/daimon/training/native/worker/deliveries.d.ts +0 -38
  449. package/dist/runtime/daimon/training/native/worker/deliveries.js +0 -91
  450. package/dist/runtime/daimon/training/native/worker/deliveries.js.map +0 -1
  451. package/dist/runtime/daimon/training/native/worker/evidence/collect.d.ts +0 -54
  452. package/dist/runtime/daimon/training/native/worker/evidence/collect.js +0 -278
  453. package/dist/runtime/daimon/training/native/worker/evidence/collect.js.map +0 -1
  454. package/dist/runtime/daimon/training/native/worker/evidence/execution.d.ts +0 -102
  455. package/dist/runtime/daimon/training/native/worker/evidence/execution.js +0 -191
  456. package/dist/runtime/daimon/training/native/worker/evidence/execution.js.map +0 -1
  457. package/dist/runtime/daimon/training/native/worker/evidence/index.d.ts +0 -3
  458. package/dist/runtime/daimon/training/native/worker/evidence/index.js +0 -4
  459. package/dist/runtime/daimon/training/native/worker/evidence/index.js.map +0 -1
  460. package/dist/runtime/daimon/training/native/worker/evidence/io.d.ts +0 -20
  461. package/dist/runtime/daimon/training/native/worker/evidence/io.js +0 -130
  462. package/dist/runtime/daimon/training/native/worker/evidence/io.js.map +0 -1
  463. package/dist/runtime/daimon/training/native/worker/evidence/seal.d.ts +0 -3
  464. package/dist/runtime/daimon/training/native/worker/evidence/seal.js +0 -67
  465. package/dist/runtime/daimon/training/native/worker/evidence/seal.js.map +0 -1
  466. package/dist/runtime/daimon/training/native/worker/index.d.ts +0 -11
  467. package/dist/runtime/daimon/training/native/worker/index.js +0 -8
  468. package/dist/runtime/daimon/training/native/worker/index.js.map +0 -1
  469. package/dist/runtime/daimon/training/native/worker/profile.d.ts +0 -23
  470. package/dist/runtime/daimon/training/native/worker/profile.js +0 -149
  471. package/dist/runtime/daimon/training/native/worker/profile.js.map +0 -1
  472. package/dist/runtime/daimon/training/native/worker/public.d.ts +0 -53
  473. package/dist/runtime/daimon/training/native/worker/public.js +0 -22
  474. package/dist/runtime/daimon/training/native/worker/public.js.map +0 -1
  475. package/dist/runtime/daimon/training/native/worker/sandbox.d.ts +0 -4
  476. package/dist/runtime/daimon/training/native/worker/sandbox.js +0 -54
  477. package/dist/runtime/daimon/training/native/worker/sandbox.js.map +0 -1
  478. package/dist/runtime/daimon/training/native/worker/server.d.ts +0 -4
  479. package/dist/runtime/daimon/training/native/worker/server.js +0 -102
  480. package/dist/runtime/daimon/training/native/worker/server.js.map +0 -1
  481. package/dist/runtime/daimon/training/native/worker/types.d.ts +0 -318
  482. package/dist/runtime/daimon/training/native/worker/types.js +0 -2
  483. package/dist/runtime/daimon/training/native/worker/types.js.map +0 -1
  484. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.d.ts +0 -4
  485. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js +0 -4
  486. package/dist/runtime/daimon/training/native/worker/wake-delivery/index.js.map +0 -1
  487. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.d.ts +0 -3
  488. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js +0 -16
  489. package/dist/runtime/daimon/training/native/worker/wake-delivery/source.js.map +0 -1
  490. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.d.ts +0 -4
  491. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js +0 -52
  492. package/dist/runtime/daimon/training/native/worker/wake-delivery/terminal.js.map +0 -1
  493. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.d.ts +0 -21
  494. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js +0 -198
  495. package/dist/runtime/daimon/training/native/worker/wake-delivery/transport.js.map +0 -1
  496. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.d.ts +0 -91
  497. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js +0 -2
  498. package/dist/runtime/daimon/training/native/worker/wake-delivery/types.js.map +0 -1
  499. package/dist/runtime/daimon/training/native/worker/worker.d.ts +0 -1
  500. package/dist/runtime/daimon/training/native/worker/worker.js +0 -105
  501. package/dist/runtime/daimon/training/native/worker/worker.js.map +0 -1
  502. package/dist/runtime/daimon/training/providers/grok-broker/broker.d.ts +0 -20
  503. package/dist/runtime/daimon/training/providers/grok-broker/broker.js +0 -55
  504. package/dist/runtime/daimon/training/providers/grok-broker/broker.js.map +0 -1
  505. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.d.ts +0 -15
  506. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js +0 -29
  507. package/dist/runtime/daimon/training/providers/grok-broker/grant-fixtures.js.map +0 -1
  508. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.d.ts +0 -16
  509. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js +0 -60
  510. package/dist/runtime/daimon/training/providers/grok-broker/grant-home.js.map +0 -1
  511. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.d.ts +0 -81
  512. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js +0 -221
  513. package/dist/runtime/daimon/training/providers/grok-broker/grant-pool.js.map +0 -1
  514. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.d.ts +0 -31
  515. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js +0 -78
  516. package/dist/runtime/daimon/training/providers/grok-broker/grant-releases.js.map +0 -1
  517. package/dist/runtime/daimon/training/providers/grok-broker/grants.d.ts +0 -63
  518. package/dist/runtime/daimon/training/providers/grok-broker/grants.js +0 -20
  519. package/dist/runtime/daimon/training/providers/grok-broker/grants.js.map +0 -1
  520. package/dist/runtime/daimon/training/providers/grok-broker/index.d.ts +0 -3
  521. package/dist/runtime/daimon/training/providers/grok-broker/index.js +0 -4
  522. package/dist/runtime/daimon/training/providers/grok-broker/index.js.map +0 -1
  523. package/dist/runtime/daimon/training/public.d.ts +0 -6
  524. package/dist/runtime/daimon/training/public.js +0 -5
  525. package/dist/runtime/daimon/training/public.js.map +0 -1
  526. package/dist/runtime/daimon/training/services/account-lease.d.ts +0 -7
  527. package/dist/runtime/daimon/training/services/account-lease.js +0 -76
  528. package/dist/runtime/daimon/training/services/account-lease.js.map +0 -1
  529. package/dist/runtime/daimon/training/services/freshness.d.ts +0 -15
  530. package/dist/runtime/daimon/training/services/freshness.js +0 -19
  531. package/dist/runtime/daimon/training/services/freshness.js.map +0 -1
  532. package/dist/runtime/daimon/training/services/index.d.ts +0 -4
  533. package/dist/runtime/daimon/training/services/index.js +0 -4
  534. package/dist/runtime/daimon/training/services/index.js.map +0 -1
  535. package/dist/runtime/daimon/training/services/slot-freshness.d.ts +0 -34
  536. package/dist/runtime/daimon/training/services/slot-freshness.js +0 -178
  537. package/dist/runtime/daimon/training/services/slot-freshness.js.map +0 -1
  538. package/dist/runtime/daimon/wakeMoments.js.map +0 -1
  539. package/dist/runtime/pi/adapter.d.ts +0 -3
  540. package/dist/runtime/pi/adapter.js +0 -230
  541. package/dist/runtime/pi/appActivitySource.d.ts +0 -1
  542. package/dist/runtime/pi/appActivitySource.js +0 -199
  543. package/dist/runtime/pi/appAgentConfig.d.ts +0 -11
  544. package/dist/runtime/pi/appAgentConfig.js +0 -264
  545. package/dist/runtime/pi/appCliEnginesSource.d.ts +0 -1
  546. package/dist/runtime/pi/appCliEnginesSource.js +0 -183
  547. package/dist/runtime/pi/appCliSource.d.ts +0 -1
  548. package/dist/runtime/pi/appCliSource.js +0 -353
  549. package/dist/runtime/pi/appControlSource.d.ts +0 -1
  550. package/dist/runtime/pi/appControlSource.js +0 -390
  551. package/dist/runtime/pi/appControlWakeIdentitySource.d.ts +0 -1
  552. package/dist/runtime/pi/appControlWakeIdentitySource.js +0 -19
  553. package/dist/runtime/pi/appCoreSource.d.ts +0 -4
  554. package/dist/runtime/pi/appCoreSource.js +0 -244
  555. package/dist/runtime/pi/appPreludeSource.d.ts +0 -1
  556. package/dist/runtime/pi/appPreludeSource.js +0 -192
  557. package/dist/runtime/pi/appScheduleSource.d.ts +0 -1
  558. package/dist/runtime/pi/appScheduleSource.js +0 -84
  559. package/dist/runtime/pi/appScriptedEngine.d.ts +0 -31
  560. package/dist/runtime/pi/appScriptedEngine.js +0 -42
  561. package/dist/runtime/pi/appSource.d.ts +0 -4
  562. package/dist/runtime/pi/appSource.js +0 -12
  563. package/dist/runtime/pi/appTemplate.d.ts +0 -14
  564. package/dist/runtime/pi/appTemplate.js +0 -28
  565. package/dist/runtime/pi/appTemplateTypes.d.ts +0 -64
  566. package/dist/runtime/pi/appTemplateTypes.js +0 -18
  567. package/dist/runtime/pi/appWakeContextSource.d.ts +0 -1
  568. package/dist/runtime/pi/appWakeContextSource.js +0 -398
  569. package/dist/runtime/pi/containerTargets.d.ts +0 -4
  570. package/dist/runtime/pi/containerTargets.js +0 -63
  571. package/dist/runtime/pi/runAuth.d.ts +0 -2
  572. package/dist/runtime/pi/runAuth.js +0 -185
  573. package/dist/runtime/pi/testHelpers.d.ts +0 -2
  574. package/dist/shared/errors.js.map +0 -1
  575. package/dist/training/subjects/environment.d.ts +0 -2
  576. package/dist/training/subjects/environment.js +0 -14
  577. package/dist/training/subjects/environment.js.map +0 -1
  578. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/index.d.ts +0 -0
  579. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/index.js +0 -0
  580. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/protocol.d.ts +0 -0
  581. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/protocol.js +0 -0
  582. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/provider.d.ts +0 -0
  583. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/provider.js +0 -0
  584. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/strict-schema.d.ts +0 -0
  585. /package/dist/runtime/{codex-exec → daimon}/training/providers/codex-subscription/strict-schema.js +0 -0
@@ -0,0 +1,50 @@
1
+ import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
2
+ import { type DaimonGatewayedDescriptor } from "../runtime/daimon/gateway.js";
3
+ import { DAIMON_GATEWAY_UID } from "../runtime/daimon/runtimeIdentity.js";
4
+ export { DAIMON_GATEWAY_UID };
5
+ export declare const DAIMON_GATEWAY_STARTUP_TIMEOUT_SECONDS = 60;
6
+ /** Gatewayed engines this container's Daimon organization runs; empty means no gateway. */
7
+ export declare const resolveDaimonGatewayEngines: (plans: readonly RuntimeTargetPlan[]) => DaimonGatewayedDescriptor[];
8
+ /** Persistent realm volumes the gateway, not the organization uid, owns. */
9
+ export declare const resolveDaimonGatewayRealmPaths: (plans: readonly RuntimeTargetPlan[]) => string[];
10
+ /**
11
+ * Root provisioning of the gateway's private state, before any engine process
12
+ * starts: the digest-only key table and config under `root:<gateway> 0440`,
13
+ * each realm re-owned to the gateway uid at `0700`, and a gateway-owned copy of
14
+ * each bootstrap leaf, whose bind mount sits under a root-only directory the
15
+ * organization uid cannot reach. Reads the key from `$daimon_gateway_key`.
16
+ * Root holds `CAP_CHOWN` and `CAP_DAC_READ_SEARCH` but not `CAP_FOWNER`, so
17
+ * every chmod happens while root owns the path. Shared by the in-container
18
+ * placement and the training sidecar (`host` is the only difference).
19
+ */
20
+ export declare const renderDaimonGatewayStateProvisioning: (descriptors: readonly DaimonGatewayedDescriptor[], host?: string) => string[];
21
+ /**
22
+ * The organization's gateway placement, decided at boot. With
23
+ * `DAIMON_GATEWAY_URL` (and its key) in the container environment, an external
24
+ * gateway (the training sidecar) serves this organization: nothing is
25
+ * provisioned, no gateway starts and no realm is mounted. Otherwise root
26
+ * generates a fresh 32-byte key per start (so no key exists in the image or the
27
+ * compile output) and provisions the in-container gateway. Either way the
28
+ * runtime gets the same two variables: one agent contract.
29
+ */
30
+ export declare const renderDaimonGatewayProvisioning: (plans: readonly RuntimeTargetPlan[]) => string[];
31
+ /**
32
+ * Starts the gateway as its own uid with no capabilities, after proving the
33
+ * organization uid (and a broker uid) cannot read any gateway-held path, then waits for its uid,
34
+ * bounding set and loopback port. Uses the shared startup supervision helpers.
35
+ */
36
+ export declare const renderDaimonGatewayLaunch: (plans: readonly RuntimeTargetPlan[], runtimeRoot: string) => string[];
37
+ /** Env assignments prefixed onto the organization runtime launch; empty without a gateway. */
38
+ export declare const renderDaimonGatewayRuntimeEnv: (plans: readonly RuntimeTargetPlan[]) => string;
39
+ /** The training sidecar answers on its run's private network under this alias. */
40
+ export declare const DAIMON_GATEWAY_SIDECAR_ALIAS = "daimon-gateway";
41
+ export declare const DAIMON_GATEWAY_SIDECAR_URL = "http://daimon-gateway:43200";
42
+ /** Env name carrying the run's 64-hex gateway key into the sidecar's root shell; unset before anything else starts. */
43
+ export declare const DAIMON_GATEWAY_SIDECAR_KEY_ENV = "SPAWNFILE_DAIMON_GATEWAY_KEY";
44
+ /**
45
+ * Root script for the sidecar placement: the same binary, state provisioning
46
+ * and uid as the in-container gateway, bound to the run's private network
47
+ * instead of loopback, with the run's key supplied rather than generated.
48
+ * Trials reach it at {@link DAIMON_GATEWAY_SIDECAR_URL} with that key.
49
+ */
50
+ export declare const renderDaimonGatewaySidecarScript: (engines: readonly string[], runtimeRoot: string) => string;
@@ -0,0 +1,157 @@
1
+ import path from "node:path";
2
+ import { DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_CONFIG, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_KEY_ENV, DAIMON_GATEWAY_KEY_TABLE, DAIMON_GATEWAY_KEY_TABLE_VERSION, DAIMON_GATEWAY_PORT, DAIMON_GATEWAY_PRINCIPAL, DAIMON_GATEWAY_RUN, DAIMON_GATEWAY_URL, DAIMON_GATEWAY_URL_ENV, DAIMON_GATEWAY_HOST, daimonGatewayBootstrapCopyPath, daimonGatewayBootstrapMountPath, daimonGatewayedEngines, daimonGatewayRealmPath, daimonGatewayRefreshScratchPath, renderDaimonGatewayConfig } from "../runtime/daimon/gateway.js";
3
+ import { DAIMON_BROKER_UID, DAIMON_GATEWAY_UID, DAIMON_ORGANIZATION_UID } from "../runtime/daimon/runtimeIdentity.js";
4
+ export { DAIMON_GATEWAY_UID };
5
+ export const DAIMON_GATEWAY_STARTUP_TIMEOUT_SECONDS = 60;
6
+ /** Root-shell variable holding this start's key; never exported, passed only to the runtime launch. */
7
+ const KEY_VARIABLE = "daimon_gateway_key";
8
+ /** Root-shell variable holding the gateway URL this start hands the runtime. */
9
+ const URL_VARIABLE = "daimon_gateway_url";
10
+ /** `1` when an external gateway was supplied at boot. */
11
+ const EXTERNAL_VARIABLE = "daimon_gateway_external";
12
+ const drop = (uid) => `setpriv --clear-groups --reuid ${uid} --regid ${uid} --inh-caps=-all --ambient-caps=-all --bounding-set=-all --`;
13
+ /** Gatewayed engines this container's Daimon organization runs; empty means no gateway. */
14
+ export const resolveDaimonGatewayEngines = (plans) => daimonGatewayedEngines(plans.filter((plan) => plan.runtimeName === "daimon")
15
+ .flatMap((plan) => Object.values(plan.engineByNodeId ?? {})));
16
+ /** Persistent realm volumes the gateway, not the organization uid, owns. */
17
+ export const resolveDaimonGatewayRealmPaths = (plans) => resolveDaimonGatewayEngines(plans).map(daimonGatewayRealmPath);
18
+ /**
19
+ * Root provisioning of the gateway's private state, before any engine process
20
+ * starts: the digest-only key table and config under `root:<gateway> 0440`,
21
+ * each realm re-owned to the gateway uid at `0700`, and a gateway-owned copy of
22
+ * each bootstrap leaf, whose bind mount sits under a root-only directory the
23
+ * organization uid cannot reach. Reads the key from `$daimon_gateway_key`.
24
+ * Root holds `CAP_CHOWN` and `CAP_DAC_READ_SEARCH` but not `CAP_FOWNER`, so
25
+ * every chmod happens while root owns the path. Shared by the in-container
26
+ * placement and the training sidecar (`host` is the only difference).
27
+ */
28
+ export const renderDaimonGatewayStateProvisioning = (descriptors, host = DAIMON_GATEWAY_HOST) => {
29
+ const realms = descriptors.map((descriptor) => ({
30
+ bootstrap: daimonGatewayBootstrapMountPath(descriptor.auth.realm),
31
+ copy: daimonGatewayBootstrapCopyPath(descriptor.auth.realm),
32
+ durable: daimonGatewayRealmPath(descriptor),
33
+ maxBytes: descriptor.auth.realm.maxCredentialBytes,
34
+ scratch: daimonGatewayRefreshScratchPath(descriptor) ?? null
35
+ }));
36
+ const program = [
37
+ "const crypto = require('node:crypto'); const fs = require('node:fs'); const { constants } = fs;",
38
+ `const gateway = ${DAIMON_GATEWAY_UID}; const realms = ${JSON.stringify(realms)};`,
39
+ `const key = process.env.SPAWNFILE_DAIMON_GATEWAY_KEY ?? ''; if (!/^[0-9a-f]{64}$/.test(key)) throw new Error('gateway key generation failed');`,
40
+ "const privateWrite = (target, bytes, mode, uid, gid) => { const fd = fs.openSync(target, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600); try { let written = 0; while (written < bytes.length) written += fs.writeSync(fd, bytes, written, bytes.length - written, written); fs.fchmodSync(fd, mode); fs.fchownSync(fd, uid, gid); fs.fsyncSync(fd); } finally { fs.closeSync(fd); } };",
41
+ `const table = { version: '${DAIMON_GATEWAY_KEY_TABLE_VERSION}', keys: { [crypto.createHash('sha256').update(key, 'utf8').digest('hex')]: { agent_id: '${DAIMON_GATEWAY_PRINCIPAL}', engines: ${JSON.stringify(descriptors.map(({ id }) => id))} } } };`,
42
+ `privateWrite('${DAIMON_GATEWAY_KEY_TABLE}', Buffer.from(JSON.stringify(table) + '\\n'), 0o440, 0, gateway);`,
43
+ `privateWrite('${DAIMON_GATEWAY_CONFIG}', Buffer.from(${JSON.stringify(renderDaimonGatewayConfig(descriptors, host))}), 0o440, 0, gateway);`,
44
+ "for (const realm of realms) {",
45
+ " const info = fs.lstatSync(realm.durable); if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('gateway realm is not a directory');",
46
+ " fs.chownSync(realm.durable, 0, 0); fs.chmodSync(realm.durable, 0o700);",
47
+ // Re-own the whole tree: a migrated broker realm also holds its legacy journal and turn directories.
48
+ " const reown = (target) => { for (const name of fs.readdirSync(target)) { const entry = `${target}/${name}`, stat = fs.lstatSync(entry); if (stat.isDirectory()) { fs.chownSync(entry, 0, 0); fs.chmodSync(entry, stat.mode & 0o700); reown(entry); } else if (!stat.isFile() || stat.nlink !== 1) throw new Error('gateway realm holds an unsafe entry'); else { fs.chownSync(entry, 0, 0); fs.chmodSync(entry, stat.mode & 0o700); } fs.chownSync(entry, gateway, gateway); } };",
49
+ " reown(realm.durable); fs.chownSync(realm.durable, gateway, gateway);",
50
+ " if (realm.scratch !== null) { fs.mkdirSync(realm.scratch, { mode: 0o700 }); fs.chownSync(realm.scratch, gateway, gateway); }",
51
+ " let source; try { source = fs.lstatSync(realm.bootstrap); } catch (error) { if (error.code !== 'ENOENT') throw error; }",
52
+ " if (source === undefined) continue;",
53
+ " if (!source.isFile() || source.size < 2 || source.size > realm.maxBytes) throw new Error('gateway bootstrap leaf is unsafe');",
54
+ " const fd = fs.openSync(realm.bootstrap, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK); let bytes; try { const opened = fs.fstatSync(fd); if (opened.dev !== source.dev || opened.ino !== source.ino) throw new Error('gateway bootstrap leaf changed'); bytes = fs.readFileSync(fd); } finally { fs.closeSync(fd); }",
55
+ " try { privateWrite(realm.copy, bytes, 0o600, gateway, gateway); } finally { bytes.fill(0); }",
56
+ "}"
57
+ ].join("\n");
58
+ return [
59
+ `if [ -d ${DAIMON_GATEWAY_ETC} ]; then chmod u+rwx ${DAIMON_GATEWAY_ETC}; fi`,
60
+ `if [ -d ${DAIMON_GATEWAY_RUN} ]; then chmod u+rwx ${DAIMON_GATEWAY_RUN}; fi`,
61
+ `rm -rf ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`,
62
+ `install -d -o root -g root -m 0700 ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`,
63
+ `if [ ! -d ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} ]; then install -d -o root -g root -m 0700 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}; fi`,
64
+ `test -d ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} && test ! -L ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}`,
65
+ `chown 0:0 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT} && chmod 0700 ${DAIMON_GATEWAY_BOOTSTRAP_ROOT}`,
66
+ `SPAWNFILE_DAIMON_GATEWAY_KEY="$${KEY_VARIABLE}" node <<'SPAWNFILE_DAIMON_GATEWAY_PROVISION'`,
67
+ program,
68
+ "SPAWNFILE_DAIMON_GATEWAY_PROVISION",
69
+ `chmod 0750 ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN} && chown 0:${DAIMON_GATEWAY_UID} ${DAIMON_GATEWAY_ETC} ${DAIMON_GATEWAY_RUN}`
70
+ ];
71
+ };
72
+ /**
73
+ * The organization's gateway placement, decided at boot. With
74
+ * `DAIMON_GATEWAY_URL` (and its key) in the container environment, an external
75
+ * gateway (the training sidecar) serves this organization: nothing is
76
+ * provisioned, no gateway starts and no realm is mounted. Otherwise root
77
+ * generates a fresh 32-byte key per start (so no key exists in the image or the
78
+ * compile output) and provisions the in-container gateway. Either way the
79
+ * runtime gets the same two variables: one agent contract.
80
+ */
81
+ export const renderDaimonGatewayProvisioning = (plans) => {
82
+ const descriptors = resolveDaimonGatewayEngines(plans);
83
+ if (descriptors.length === 0)
84
+ return [];
85
+ return [
86
+ `if [ -n "\${${DAIMON_GATEWAY_URL_ENV}:-}" ]; then`,
87
+ ` ${EXTERNAL_VARIABLE}=1 ${URL_VARIABLE}=$${DAIMON_GATEWAY_URL_ENV}`,
88
+ ` ${KEY_VARIABLE}=\${${DAIMON_GATEWAY_KEY_ENV}:?${DAIMON_GATEWAY_KEY_ENV} must accompany ${DAIMON_GATEWAY_URL_ENV}}`,
89
+ // Only the runtime and broker launches below get them, as with the in-container gateway.
90
+ ` export -n ${DAIMON_GATEWAY_URL_ENV} ${DAIMON_GATEWAY_KEY_ENV}`,
91
+ "else",
92
+ ` ${EXTERNAL_VARIABLE}=0 ${URL_VARIABLE}=${DAIMON_GATEWAY_URL}`,
93
+ // Rotated every start: 32 random bytes as lowercase hex, held only in this root shell.
94
+ ` ${KEY_VARIABLE}=$(od -An -vtx1 -N32 /dev/urandom | tr -d ' \\n')`,
95
+ ...renderDaimonGatewayStateProvisioning(descriptors),
96
+ "fi"
97
+ ];
98
+ };
99
+ /**
100
+ * Starts the gateway as its own uid with no capabilities, after proving the
101
+ * organization uid (and a broker uid) cannot read any gateway-held path, then waits for its uid,
102
+ * bounding set and loopback port. Uses the shared startup supervision helpers.
103
+ */
104
+ export const renderDaimonGatewayLaunch = (plans, runtimeRoot) => {
105
+ const descriptors = resolveDaimonGatewayEngines(plans);
106
+ if (descriptors.length === 0)
107
+ return [];
108
+ const realmPaths = descriptors.map(daimonGatewayRealmPath);
109
+ const hidden = [...realmPaths, DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN];
110
+ // Neither the organization uid nor a broker (which reaches the gateway only by key) may read the login.
111
+ const outsiders = [DAIMON_ORGANIZATION_UID, ...(descriptors.some((descriptor) => descriptor.broker !== null) ? [DAIMON_BROKER_UID] : [])];
112
+ return [
113
+ `if [ "$${EXTERNAL_VARIABLE}" = 0 ]; then`,
114
+ ...outsiders.flatMap((uid) => hidden.map((target) => `${drop(uid)} bash -ceu '! test -r ${target} && ! test -x ${target}'`)),
115
+ ...realmPaths.map((target) => `${drop(DAIMON_GATEWAY_UID)} bash -ceu 'probe=${target}/.daimon-gateway-probe; umask 077; : > "$probe"; rm "$probe"'`),
116
+ `${drop(DAIMON_GATEWAY_UID)} env -i PATH="$PATH" HOME=/nonexistent LANG=C.UTF-8 ${path.posix.join(runtimeRoot, "bin/daimon-runtime")} gateway --config ${DAIMON_GATEWAY_CONFIG} &`,
117
+ "gateway_pid=$!",
118
+ "startup_children+=(\"$gateway_pid\")",
119
+ `wait_for_broker_identity "$gateway_pid" ${DAIMON_GATEWAY_UID} 0000000000000000 "auth gateway"`,
120
+ "until (exec 3<>/dev/tcp/127.0.0.1/" + DAIMON_GATEWAY_PORT + ") 2>/dev/null; do",
121
+ " if ! kill -0 \"$gateway_pid\" 2>/dev/null; then echo \"auth gateway exited before readiness\" >&2; exit 1; fi",
122
+ " if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"auth gateway readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; exit 1; fi",
123
+ " sleep \"$broker_startup_poll_seconds\"",
124
+ "done",
125
+ "fi"
126
+ ];
127
+ };
128
+ /** Env assignments prefixed onto the organization runtime launch; empty without a gateway. */
129
+ export const renderDaimonGatewayRuntimeEnv = (plans) => resolveDaimonGatewayEngines(plans).length === 0
130
+ ? ""
131
+ : `${DAIMON_GATEWAY_URL_ENV}="$${URL_VARIABLE}" ${DAIMON_GATEWAY_KEY_ENV}="$${KEY_VARIABLE}" `;
132
+ /** The training sidecar answers on its run's private network under this alias. */
133
+ export const DAIMON_GATEWAY_SIDECAR_ALIAS = "daimon-gateway";
134
+ export const DAIMON_GATEWAY_SIDECAR_URL = `http://${DAIMON_GATEWAY_SIDECAR_ALIAS}:${DAIMON_GATEWAY_PORT}`;
135
+ /** Env name carrying the run's 64-hex gateway key into the sidecar's root shell; unset before anything else starts. */
136
+ export const DAIMON_GATEWAY_SIDECAR_KEY_ENV = "SPAWNFILE_DAIMON_GATEWAY_KEY";
137
+ /**
138
+ * Root script for the sidecar placement: the same binary, state provisioning
139
+ * and uid as the in-container gateway, bound to the run's private network
140
+ * instead of loopback, with the run's key supplied rather than generated.
141
+ * Trials reach it at {@link DAIMON_GATEWAY_SIDECAR_URL} with that key.
142
+ */
143
+ export const renderDaimonGatewaySidecarScript = (engines, runtimeRoot) => {
144
+ const descriptors = daimonGatewayedEngines(engines);
145
+ if (descriptors.length === 0)
146
+ throw new Error("the auth gateway sidecar needs at least one gatewayed engine");
147
+ return [
148
+ "set -euo pipefail",
149
+ `if ! getent group ${DAIMON_GATEWAY_UID} >/dev/null; then groupadd -K GID_MIN=1 --gid ${DAIMON_GATEWAY_UID} daimon-${DAIMON_GATEWAY_UID}; fi`,
150
+ `if ! getent passwd ${DAIMON_GATEWAY_UID} >/dev/null; then useradd -K UID_MIN=1 --no-create-home --no-log-init --uid ${DAIMON_GATEWAY_UID} --gid ${DAIMON_GATEWAY_UID} --home-dir /nonexistent --shell /usr/sbin/nologin daimon-${DAIMON_GATEWAY_UID}; fi`,
151
+ `${KEY_VARIABLE}=\${${DAIMON_GATEWAY_SIDECAR_KEY_ENV}:?the gateway sidecar needs its run key}`,
152
+ `unset ${DAIMON_GATEWAY_SIDECAR_KEY_ENV}`,
153
+ ...renderDaimonGatewayStateProvisioning(descriptors, "0.0.0.0"),
154
+ `unset ${KEY_VARIABLE}`,
155
+ `exec ${drop(DAIMON_GATEWAY_UID)} env -i PATH="$PATH" HOME=/nonexistent LANG=C.UTF-8 ${path.posix.join(runtimeRoot, "bin/daimon-runtime")} gateway --config ${DAIMON_GATEWAY_CONFIG}`
156
+ ].join("\n") + "\n";
157
+ };
@@ -1,4 +1,4 @@
1
- import { type DaimonGrokRegistration, type DaimonGrokServiceConfigOptions } from "./containerDaimonGrokWorkerRender.js";
1
+ import { type DaimonGrokRegistration } from "./containerDaimonGrokWorkerRender.js";
2
2
  /**
3
3
  * Root provisioning for every brokered Grok worker, as lines of the broker's
4
4
  * node provisioning program (which already defines `crypto`, `fs`, and
@@ -18,15 +18,7 @@ import { type DaimonGrokRegistration, type DaimonGrokServiceConfigOptions } from
18
18
  * the wrong inode. Root chmods only paths it owns at that moment (no
19
19
  * `CAP_FOWNER`): reclaim, mode, then hand over.
20
20
  */
21
- export declare const renderDaimonGrokWorkerProvisioning: (registrations: readonly DaimonGrokRegistration[], serviceOptions?: DaimonGrokServiceConfigOptions,
22
- /**
23
- * Deny targets this program creates root-owned `0700` when they are absent,
24
- * so every mask always has an inode. The default is the production
25
- * container's set; the training container passes its own, because its roots
26
- * are tmpfs mounts and `/run/secrets` and the shared state roots do not
27
- * exist there at all.
28
- */
29
- optionalDenyPaths?: readonly string[], scope?: "container" | "slot") => string[];
21
+ export declare const renderDaimonGrokWorkerProvisioning: (registrations: readonly DaimonGrokRegistration[]) => string[];
30
22
  /**
31
23
  * Grok 1.0.34 runs every sandbox profile inside bubblewrap, which needs
32
24
  * unprivileged user namespaces. Ubuntu 24.04+ hosts (and Colima's default VM)
@@ -1,6 +1,5 @@
1
- import { renderDaimonGrokTaskClockProvisioning } from "./containerDaimonGrokTaskClock.js";
2
1
  import { DAIMON_GROK_ENGINE_BROKER } from "../runtime/daimon/contractManifest.js";
3
- import { resolveDaimonGrokClockedWorkerConfig, resolveDaimonGrokWorkerConfig } from "../runtime/daimon/grokWorkerContract.js";
2
+ import { resolveDaimonGrokWorkerConfig } from "../runtime/daimon/grokWorkerContract.js";
4
3
  import { DAIMON_BROKER_UID, DAIMON_ORGANIZATION_UID } from "../runtime/daimon/runtimeIdentity.js";
5
4
  import { DAIMON_GROK_DENIED_STATE_ROOTS, DAIMON_GROK_OPTIONAL_DENY_PATHS, DAIMON_GROK_WORKER_READ_ONLY_FILES, DAIMON_WORKER_ROOT, renderDaimonGrokServiceConfig } from "./containerDaimonGrokWorkerRender.js";
6
5
  /** Only the bytes the program writes; everything else it needs is recomputed or checked in place. */
@@ -64,22 +63,12 @@ const renderDaimonGrokWorkerSkillsProvisioning = (registrations) => registration
64
63
  * the wrong inode. Root chmods only paths it owns at that moment (no
65
64
  * `CAP_FOWNER`): reclaim, mode, then hand over.
66
65
  */
67
- export const renderDaimonGrokWorkerProvisioning = (registrations, serviceOptions = {},
68
- /**
69
- * Deny targets this program creates root-owned `0700` when they are absent,
70
- * so every mask always has an inode. The default is the production
71
- * container's set; the training container passes its own, because its roots
72
- * are tmpfs mounts and `/run/secrets` and the shared state roots do not
73
- * exist there at all.
74
- */
75
- optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_STATE_ROOTS], scope = "container") => [
66
+ export const renderDaimonGrokWorkerProvisioning = (registrations) => [
76
67
  `const grokWorkers = ${JSON.stringify(registrations.map(programRegistration))};`,
77
- `const optionalDenyPaths = new Set(${JSON.stringify([...optionalDenyPaths])});`,
68
+ // Deny targets created root-owned `0700` when absent, so every mask always has an inode.
69
+ `const optionalDenyPaths = new Set(${JSON.stringify([...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_STATE_ROOTS])});`,
78
70
  // Derive each expected hash from manifest-validated bytes, never from the registration's digest.
79
- // Clocked templates are pinned at slot zero, then specialized by the contract resolver.
80
- `const pinnedConfigSha256 = ${JSON.stringify(registrations.map(entry => (entry.configVariant === "clocked"
81
- ? resolveDaimonGrokClockedWorkerConfig(entry.model, entry.reasoningEffort, entry.slot)
82
- : resolveDaimonGrokWorkerConfig(entry.model, entry.reasoningEffort)).sha256))};`,
71
+ `const pinnedConfigSha256 = ${JSON.stringify(registrations.map(entry => resolveDaimonGrokWorkerConfig(entry.model, entry.reasoningEffort).sha256))};`,
83
72
  "const sha256Hex = (value) => crypto.createHash('sha256').update(value).digest('hex');",
84
73
  "for (const [index, entry] of grokWorkers.entries()) { if (sha256Hex(entry.config) !== entry.configSha256 || pinnedConfigSha256[index] !== entry.configSha256 || sha256Hex(entry.profile) !== entry.profileSha256 || entry.denyPaths.length === 0) throw new Error(`Grok worker contract bytes for ${entry.agentId} do not match their pins`); }",
85
74
  // Root holds no CAP_FOWNER: every mode change reclaims the inode, sets the mode, then restores or hands over ownership.
@@ -92,19 +81,18 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
92
81
  "const ensureDirectory = (target, uid, gid, mode) => { fs.mkdirSync(target, { recursive: true, mode: 0o700 }); const info = fs.lstatSync(target); if (!info.isDirectory() || info.isSymbolicLink()) throw new Error('unsafe worker runtime directory'); fs.chownSync(target, 0, 0); fs.chmodSync(target, mode); fs.chownSync(target, uid, gid); };",
93
82
  "const ensureExactFile = (target, content, mode) => { let info; try { info = fs.lstatSync(target); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.writeFileSync(target, content, { mode, flag: 'wx' }); info = fs.lstatSync(target); } if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1) throw new Error('unsafe worker runtime file'); if (fs.readFileSync(target, 'utf8') !== content) throw new Error(`worker runtime file identity mismatch: ${target}`); fs.chownSync(target, 0, 0); fs.chmodSync(target, mode); };",
94
83
  `const ensureEventsFile = (target, uid) => { let info; try { info = fs.lstatSync(target); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.writeFileSync(target, '', { mode: 0o640, flag: 'wx' }); info = fs.lstatSync(target); } if (!info.isFile() || info.isSymbolicLink() || info.nlink !== 1 || (info.uid !== uid && info.uid !== 0) || ![0, uid, ${DAIMON_BROKER_UID}].includes(info.gid) || ![0o600, 0o640, 0o644].includes(info.mode & 0o777)) throw new Error('unsafe worker attestation events'); fs.chownSync(target, 0, 0); fs.chmodSync(target, 0o640); fs.chownSync(target, uid, ${DAIMON_BROKER_UID}); };`,
95
- ...(scope === "slot" ? [] : renderDaimonGrokTaskClockProvisioning(registrations)),
96
- ...(scope === "slot" ? [] : [`fs.mkdirSync('${DAIMON_WORKER_ROOT}', { recursive: true, mode: 0o711 }); fs.chownSync('${DAIMON_WORKER_ROOT}', 0, 0); fs.chmodSync('${DAIMON_WORKER_ROOT}', 0o711); assertCanonical('${DAIMON_WORKER_ROOT}', 'worker root');`]),
84
+ `fs.mkdirSync('${DAIMON_WORKER_ROOT}', { recursive: true, mode: 0o711 }); fs.chownSync('${DAIMON_WORKER_ROOT}', 0, 0); fs.chmodSync('${DAIMON_WORKER_ROOT}', 0o711); assertCanonical('${DAIMON_WORKER_ROOT}', 'worker root');`,
97
85
  // Pass 1: every workspace and home exists, root-held, before any deny list is checked.
98
- `for (const entry of grokWorkers) { traversable(entry.workspace); secureWorkspace(entry.workspace, entry.uid); assertCanonical(entry.workspace, 'workspace'); ${scope === "container" ? "ensureDirectory(entry.home, 0, 0, 0o700);" : ""} ensureDirectory(entry.grokHome, 0, 0, 0o700); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, 0, 0o700); for (const target of [entry.home, entry.grokHome]) assertCanonical(target, 'home'); }`,
86
+ `for (const entry of grokWorkers) { traversable(entry.workspace); secureWorkspace(entry.workspace, entry.uid); assertCanonical(entry.workspace, 'workspace'); ensureDirectory(entry.home, 0, 0, 0o700); ensureDirectory(entry.grokHome, 0, 0, 0o700); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, 0, 0o700); for (const target of [entry.home, entry.grokHome]) assertCanonical(target, 'home'); }`,
99
87
  "for (const denied of optionalDenyPaths) { try { fs.lstatSync(denied); } catch (error) { if (error.code !== 'ENOENT') throw error; fs.mkdirSync(denied, { mode: 0o700 }); fs.chownSync(denied, 0, 0); fs.chmodSync(denied, 0o700); } }",
100
88
  "for (const entry of grokWorkers) for (const denied of entry.denyPaths) { try { assertCanonical(denied, 'deny path'); } catch (error) { if (error.code === 'ENOENT' && entry.deferredDenyPaths.includes(denied)) continue; if (error.code === 'ENOENT') throw new Error(`Grok worker deny path is missing: ${denied}`); throw error; } }",
101
89
  ...renderDaimonGrokWorkerSkillsProvisioning(registrations),
102
90
  // Pass 2: exact root-owned read-only files, the events file, then the final sticky modes.
103
- `for (const entry of grokWorkers) { ensureExactFile(\`\${entry.grokHome}/config.toml\`, entry.config, 0o444); ensureExactFile(entry.profilePath, entry.profile, 0o444); for (const name of ${JSON.stringify(DAIMON_GROK_WORKER_READ_ONLY_FILES.filter((name) => name !== "config.toml" && name !== "sandbox.toml"))}) ensureExactFile(\`\${entry.grokHome}/\${name}\`, '', 0o444); ensureEventsFile(entry.eventsPath, entry.uid); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, entry.uid, 0o1771); ensureDirectory(entry.grokHome, 0, entry.uid, 0o1771); ${scope === "container" ? `ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700); ensureDirectory(entry.home, entry.uid, ${DAIMON_BROKER_UID}, 0o710);` : ""} for (const target of [entry.profilePath, entry.eventsPath, \`\${entry.grokHome}/config.toml\`]) assertCanonical(target, 'home file'); }`,
91
+ `for (const entry of grokWorkers) { ensureExactFile(\`\${entry.grokHome}/config.toml\`, entry.config, 0o444); ensureExactFile(entry.profilePath, entry.profile, 0o444); for (const name of ${JSON.stringify(DAIMON_GROK_WORKER_READ_ONLY_FILES.filter((name) => name !== "config.toml" && name !== "sandbox.toml"))}) ensureExactFile(\`\${entry.grokHome}/\${name}\`, '', 0o444); ensureEventsFile(entry.eventsPath, entry.uid); ensureDirectory(\`\${entry.grokHome}/sessions\`, 0, entry.uid, 0o1771); ensureDirectory(entry.grokHome, 0, entry.uid, 0o1771); ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700); ensureDirectory(entry.home, entry.uid, ${DAIMON_BROKER_UID}, 0o710); for (const target of [entry.profilePath, entry.eventsPath, \`\${entry.grokHome}/config.toml\`]) assertCanonical(target, 'home file'); }`,
104
92
  // Worker-private temp: the launcher compiles TMPDIR=<home>/tmp, the only temp the worker may write. It is
105
93
  // created in the pass above, while the home is still root-owned: root here holds no CAP_DAC_OVERRIDE, so
106
94
  // once the home is `<worker>:<broker> 0710` root can no longer create anything inside it.
107
- `for (const entry of grokWorkers) { ${scope === "container" ? "ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700);" : ""} assertCanonical(entry.privateTmp, 'private temp'); }`,
95
+ `for (const entry of grokWorkers) { ensureDirectory(entry.privateTmp, entry.uid, entry.uid, 0o700); assertCanonical(entry.privateTmp, 'private temp'); }`,
108
96
  // Spills: <runtimeHome>/tool-output 2000:<worker> 2750 (setgid) under a runtime home the worker's group can
109
97
  // traverse. Root reclaims the runtime home before creating the spill directory: the compiler lists every
110
98
  // organization runtime home as a private directory, so the container's ownership pass has already handed
@@ -113,7 +101,7 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
113
101
  // `withMode` still narrows the home to its final `2000:<worker> 0710`, so the end state is unchanged.
114
102
  `for (const entry of grokWorkers) { traversable(entry.runtimeHome); fs.mkdirSync(entry.runtimeHome, { recursive: true, mode: 0o700 }); assertCanonical(entry.runtimeHome, 'runtime home'); reclaimForRoot(entry.runtimeHome); try { fs.mkdirSync(entry.spillDirectory, { mode: 0o700 }); } catch (error) { if (error.code !== 'EEXIST') throw error; } assertCanonical(entry.spillDirectory, 'spill directory'); withMode(entry.spillDirectory, 0o2750, ${DAIMON_ORGANIZATION_UID}, entry.uid); for (const mounted of entry.runtimeHomeMounts) { assertCanonical(mounted, 'runtime home mount'); withMode(mounted, 0o700, ${DAIMON_ORGANIZATION_UID}, ${DAIMON_ORGANIZATION_UID}); } withMode(entry.runtimeHome, 0o710, ${DAIMON_ORGANIZATION_UID}, entry.uid); }`,
115
103
  // Shared temp: Grok refuses a profile denying /tmp or /var/tmp, so modes close them: root:<org group> 1774 lets workers list names only.
116
- ...(scope === "slot" ? [] : [`for (const shared of ${JSON.stringify(DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.paths)}) { fs.mkdirSync(shared, { recursive: true, mode: 0o1777 }); assertCanonical(shared, 'shared temp'); withMode(shared, 0o${DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.mode.toString(8)}, 0, ${DAIMON_ORGANIZATION_UID}); }`]),
104
+ `for (const shared of ${JSON.stringify(DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.paths)}) { fs.mkdirSync(shared, { recursive: true, mode: 0o1777 }); assertCanonical(shared, 'shared temp'); withMode(shared, 0o${DAIMON_GROK_ENGINE_BROKER.worker.home.sharedTmp.mode.toString(8)}, 0, ${DAIMON_ORGANIZATION_UID}); }`,
117
105
  // Deny-path placement, asserted once every mode above is final. A resource backing the organization
118
106
  // entrypoint only materializes later is created here, empty and root-owned, rather than skipped: the
119
107
  // engine broker starts before that entrypoint runs and its own placement preflight refuses a deny target
@@ -131,9 +119,9 @@ optionalDenyPaths = [...DAIMON_GROK_OPTIONAL_DENY_PATHS, ...DAIMON_GROK_DENIED_S
131
119
  "const searches = (info, uid, gid) => info.uid === uid ? (info.mode & 0o100) !== 0 : info.gid === gid ? (info.mode & 0o010) !== 0 : (info.mode & 0o001) !== 0;",
132
120
  "const assertPlaceable = (denied, uid, gid) => { const parts = denied.split('/').slice(1); let at = ''; for (const part of parts.slice(0, -1)) { at += `/${part}`; let info; try { info = fs.lstatSync(at); } catch (error) { throw new Error(`Grok worker deny path ${denied} is not placeable: ${at} could not be read (${error.code})`); } if (!info.isDirectory() || info.isSymbolicLink()) throw new Error(`Grok worker deny path ${denied} is not placeable: ${at} is not a directory`); if (!searches(info, uid, gid)) throw new Error(`Grok worker deny path ${denied} is not placeable: worker uid ${uid} cannot search ${at} (${(info.mode & 0o7777).toString(8)} ${info.uid}:${info.gid}); deny that directory itself instead`); } };",
133
121
  "for (const entry of grokWorkers) for (const denied of entry.denyPaths) { if (entry.deferredDenyPaths.includes(denied)) { try { fs.lstatSync(denied); } catch (error) { if (error.code !== 'ENOENT') throw error; createDeferredDenyTarget(denied); } } assertPlaceable(denied, entry.uid, entry.uid); }",
134
- ...(scope === "slot" ? [] : [`const service = ${JSON.stringify(renderDaimonGrokServiceConfig(registrations, serviceOptions))};`,
135
- "for (const registration of service.registrations) { const entry = grokWorkers.find((worker) => worker.slot === registration.slot); if (!entry || registration.profileSha256 !== sha256Hex(fs.readFileSync(entry.profilePath, 'utf8'))) throw new Error('Grok broker service registration does not match its provisioned profile'); }",
136
- `fs.writeFileSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', \`\${JSON.stringify(service)}\\n\`, { mode: 0o440, flag: 'wx' }); fs.chownSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0, ${DAIMON_BROKER_UID}); fs.chmodSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0o440);`])
122
+ `const service = ${JSON.stringify(renderDaimonGrokServiceConfig(registrations))};`,
123
+ "for (const registration of service.registrations) { const entry = grokWorkers.find((worker) => worker.slot === registration.slot); if (!entry || registration.profileSha256 !== sha256Hex(fs.readFileSync(entry.profilePath, 'utf8'))) throw new Error('Grok broker service registration does not match its provisioned profile'); }",
124
+ `fs.writeFileSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', \`\${JSON.stringify(service)}\\n\`, { mode: 0o440, flag: 'wx' }); fs.chownSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0, ${DAIMON_BROKER_UID}); fs.chmodSync('${DAIMON_GROK_ENGINE_BROKER.serviceConfigPath}', 0o440);`
137
125
  ];
138
126
  const shellQuote = (value) => `'${value.replace(/'/g, `'"'"'`)}'`;
139
127
  /**
@@ -49,8 +49,6 @@ export interface DaimonGrokRegistration {
49
49
  agentId: string;
50
50
  config: string;
51
51
  configSha256: string;
52
- /** Selects trusted config bytes; production retains the unclocked default. */
53
- configVariant?: "unclocked" | "clocked";
54
52
  denyPaths: string[];
55
53
  /** Deny entries the main entrypoint materializes after root provisioning (workspace resource backings); absent is allowed there, a symlink never. */
56
54
  deferredDenyPaths: string[];
@@ -138,26 +136,20 @@ export declare const DAIMON_GROK_DENIED_STATE_ROOTS: readonly ["/var/lib/spawnfi
138
136
  */
139
137
  export declare const resolveDaimonGrokWorkerDenyPaths: (plans: readonly RuntimeTargetPlan[], plan: RuntimeTargetPlan, agentId: string, workerHomes: readonly string[], ownHome: string) => string[];
140
138
  export declare const resolveDaimonGrokRegistrations: (plans: RuntimeTargetPlan[]) => DaimonGrokRegistration[];
141
- export interface DaimonGrokServiceConfigOptions {
142
- /** Repeated agent IDs use v3 slot policies; production retains v2 by default. */
143
- version?: "v3";
144
- maxRunRequests?: number;
145
- runRequestStore?: string;
146
- /**
147
- * Where the broker keeps its durable turn registry. Production keeps it on
148
- * the realm volume beside the credential; training overrides it to per-slot
149
- * tmpfs so a recycled slot can never replay trial N's sealed turn in trial
150
- * N+1 (R2), and refuses any path on the realm volume for that reason.
151
- */
152
- turnStore?: string;
153
- /** `service.json` v2's optional evaluator inference ledger. Without it the broker refuses every grant. */
154
- inferenceLedgerPath?: string;
155
- }
156
139
  /** `service.json` v2, exactly the shape Daimon's strict `parseEngineBrokerServiceConfig` accepts. */
157
- export declare const renderDaimonGrokServiceConfig: (registrations: readonly DaimonGrokRegistration[], options?: DaimonGrokServiceConfigOptions) => {
158
- slotPolicies?: {
140
+ export declare const renderDaimonGrokServiceConfig: (registrations: readonly DaimonGrokRegistration[]) => {
141
+ version: "noopolis.daimon.engine-broker-service.v2";
142
+ credentialHome: "/var/lib/spawnfile/daimon/grok-subscription-realm";
143
+ turnStore: "/var/lib/spawnfile/daimon/grok-subscription-realm/turns";
144
+ registrations: {
159
145
  skillsSha256?: string | undefined;
146
+ agentId: string;
160
147
  slot: number;
148
+ workerUid: number;
149
+ workspace: string;
150
+ profilePath: string;
151
+ eventsPath: string;
152
+ profileSha256: string;
161
153
  usageLedgerPath: string;
162
154
  limits: {
163
155
  maxRequests: 32;
@@ -172,35 +164,5 @@ export declare const renderDaimonGrokServiceConfig: (registrations: readonly Dai
172
164
  id: "grok-4.6" | "grok-4.5" | "grok-build";
173
165
  reasoningEffort: "low" | "medium" | "high";
174
166
  };
175
- }[] | undefined;
176
- registrations: {
177
- skillsSha256?: string | undefined;
178
- usageLedgerPath?: string | undefined;
179
- limits?: {
180
- maxRequests: 32;
181
- maxTokens: 300000;
182
- timeoutMs: 240000;
183
- } | {
184
- maxRequests: number;
185
- maxTokens: number;
186
- timeoutMs: number;
187
- } | undefined;
188
- model?: {
189
- id: "grok-4.6" | "grok-4.5" | "grok-build";
190
- reasoningEffort: "low" | "medium" | "high";
191
- } | undefined;
192
- agentId: string;
193
- slot: number;
194
- workerUid: number;
195
- workspace: string;
196
- profilePath: string;
197
- eventsPath: string;
198
- profileSha256: string;
199
167
  }[];
200
- inferenceLedgerPath?: string | undefined;
201
- runRequestStore?: string | undefined;
202
- maxRunRequests?: number | undefined;
203
- version: "noopolis.daimon.engine-broker-service.v2" | "noopolis.daimon.engine-broker-service.v3";
204
- credentialHome: "/var/lib/spawnfile/daimon/grok-subscription-realm";
205
- turnStore: string;
206
168
  };
@@ -1,3 +1,4 @@
1
+ import { DAIMON_GATEWAY_BOOTSTRAP_ROOT, DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN, daimonGatewayRealmPath, isDaimonGatewayedEngine } from "../runtime/daimon/gateway.js";
1
2
  import { daimonEngineHasBroker, getDaimonEngineDescriptor } from "../runtime/daimon/index.js";
2
3
  import path from "node:path";
3
4
  import { SpawnfileError } from "../shared/index.js";
@@ -125,10 +126,13 @@ export const resolveDaimonGrokWorkerDenyPaths = (plans, plan, agentId, workerHom
125
126
  const peers = agents.filter(([id]) => id !== agentId).map(([id]) => nodeSlug(id));
126
127
  const daimonOwn = [
127
128
  ...[...new Set(agents.map(([, engine]) => engine))].flatMap((engine) => {
128
- const auth = getDaimonEngineDescriptor(engine)?.auth;
129
- return auth?.staging === "portable-realm" ? [auth.realm.bootstrapMountPath, auth.realm.durableMountPath] : [];
129
+ const descriptor = getDaimonEngineDescriptor(engine);
130
+ // A gatewayed bootstrap leaf sits under the root-only gateway root; mask that root, the realm and the gateway's state.
131
+ return isDaimonGatewayedEngine(descriptor)
132
+ ? [DAIMON_GATEWAY_BOOTSTRAP_ROOT, daimonGatewayRealmPath(descriptor), DAIMON_GATEWAY_ETC, DAIMON_GATEWAY_RUN]
133
+ : [];
130
134
  }),
131
- DAIMON_GROK_SUBSCRIPTION_REALM.bootstrapMountPath,
135
+ // The broker's local turn-state home (it holds no credential in gateway mode).
132
136
  DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath,
133
137
  ...(agents.some(([, engine]) => getDaimonEngineDescriptor(engine)?.auth.staging === "secret-service") ? [DAIMON_AGY_SUBSCRIPTION_REALM.unlockMountPath, DAIMON_AGY_SUBSCRIPTION_REALM.durableMountPath] : []),
134
138
  daimonGrokAcceptanceStoreDenyPath(instanceRoot),
@@ -242,33 +246,11 @@ export const resolveDaimonGrokRegistrations = (plans) => {
242
246
  };
243
247
  });
244
248
  };
245
- const resolveDaimonGrokTurnStore = (turnStore) => {
246
- if (turnStore === undefined)
247
- return DAIMON_GROK_ENGINE_BROKER.turnStorePath;
248
- assertCanonicalRegisteredPath("turn store", turnStore);
249
- if (turnStore === DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath || turnStore.startsWith(`${DAIMON_GROK_SUBSCRIPTION_REALM.durableMountPath}/`)) {
250
- fail(`Grok broker turn store ${turnStore} is on the durable credential realm; a recycled slot would replay the previous trial's sealed turns`);
251
- }
252
- return turnStore;
253
- };
254
- const resolveDaimonGrokInferenceLedger = (inferenceLedgerPath, registrations) => {
255
- assertCanonicalRegisteredPath("inference ledger", inferenceLedgerPath);
256
- if (!inferenceLedgerPath.endsWith(".jsonl"))
257
- fail(`Grok inference ledger must be a .jsonl path: ${inferenceLedgerPath}`);
258
- const subject = new Set([DAIMON_GROK_TURN_USAGE_LEDGER.filePath, path.posix.join(DAIMON_GROK_TURN_USAGE_LEDGER.directoryPath, "requests.jsonl"),
259
- ...registrations.flatMap((entry) => [entry.usageLedgerPath, path.posix.join(path.posix.dirname(entry.usageLedgerPath), "requests.jsonl")])]);
260
- if (subject.has(inferenceLedgerPath))
261
- fail(`Grok inference ledger ${inferenceLedgerPath} is a subject usage ledger; judge spend must never reach the wake fuse`);
262
- return inferenceLedgerPath;
263
- };
264
249
  /** `service.json` v2, exactly the shape Daimon's strict `parseEngineBrokerServiceConfig` accepts. */
265
- export const renderDaimonGrokServiceConfig = (registrations, options = {}) => ({
266
- version: DAIMON_GROK_ENGINE_BROKER.serviceConfigVersions[options.version === "v3" ? 2 : 1],
250
+ export const renderDaimonGrokServiceConfig = (registrations) => ({
251
+ version: DAIMON_GROK_ENGINE_BROKER.serviceConfigVersions[1],
267
252
  credentialHome: DAIMON_GROK_ENGINE_BROKER.credentialHomePath,
268
- turnStore: resolveDaimonGrokTurnStore(options.turnStore),
269
- ...(options.maxRunRequests === undefined ? {} : { maxRunRequests: options.maxRunRequests }),
270
- ...(options.runRequestStore === undefined ? {} : { runRequestStore: assertCanonicalRegisteredPath("run request store", options.runRequestStore) }),
271
- ...(options.inferenceLedgerPath === undefined ? {} : { inferenceLedgerPath: resolveDaimonGrokInferenceLedger(options.inferenceLedgerPath, registrations) }),
253
+ turnStore: DAIMON_GROK_ENGINE_BROKER.turnStorePath,
272
254
  registrations: registrations.map((entry) => ({
273
255
  agentId: entry.agentId,
274
256
  slot: entry.slot,
@@ -277,15 +259,9 @@ export const renderDaimonGrokServiceConfig = (registrations, options = {}) => ({
277
259
  profilePath: entry.profilePath,
278
260
  eventsPath: entry.eventsPath,
279
261
  profileSha256: entry.profileSha256,
280
- ...(options.version === "v3" ? {} : { usageLedgerPath: entry.usageLedgerPath,
281
- limits: { ...(entry.limits ?? DAIMON_GROK_ENGINE_BROKER.turnLimits.v1Defaults) },
282
- model: { id: entry.model, reasoningEffort: entry.reasoningEffort },
283
- ...(entry.skills ? { skillsSha256: entry.skills.sha256 } : {}) })
284
- })),
285
- ...(options.version === "v3" ? { slotPolicies: registrations.map(entry => ({
286
- slot: entry.slot, usageLedgerPath: entry.usageLedgerPath,
287
- limits: { ...(entry.limits ?? DAIMON_GROK_ENGINE_BROKER.turnLimits.v1Defaults) },
288
- model: { id: entry.model, reasoningEffort: entry.reasoningEffort },
289
- ...(entry.skills ? { skillsSha256: entry.skills.sha256 } : {})
290
- })) } : {})
262
+ usageLedgerPath: entry.usageLedgerPath,
263
+ limits: { ...(entry.limits ?? DAIMON_GROK_ENGINE_BROKER.turnLimits.v1Defaults) },
264
+ model: { id: entry.model, reasoningEffort: entry.reasoningEffort },
265
+ ...(entry.skills ? { skillsSha256: entry.skills.sha256 } : {})
266
+ }))
291
267
  });
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Root-side supervision for the privileged startup children (engine broker,
3
+ * relay, launcher and auth gateway): bounded readiness waits plus one EXIT
4
+ * trap that terminates every started child if startup fails.
5
+ */
6
+ export declare const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
7
+ export declare const renderDaimonBrokerSocketWait: (timeoutSeconds?: number, pollSeconds?: number) => string[];
8
+ export declare const renderDaimonStartupSupervision: () => string[];
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Root-side supervision for the privileged startup children (engine broker,
3
+ * relay, launcher and auth gateway): bounded readiness waits plus one EXIT
4
+ * trap that terminates every started child if startup fails.
5
+ */
6
+ export const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
7
+ export const renderDaimonBrokerSocketWait = (timeoutSeconds = DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS, pollSeconds = 0.1) => [
8
+ `broker_startup_timeout_seconds=${timeoutSeconds}`,
9
+ `broker_startup_poll_seconds=${pollSeconds}`,
10
+ "broker_startup_started=$SECONDS",
11
+ "broker_process_status_root=/proc",
12
+ "wait_for_broker_socket() {",
13
+ " socket=$1; child=$2; label=$3",
14
+ " while [ ! -S \"$socket\" ]; do",
15
+ " if ! kill -0 \"$child\" 2>/dev/null; then set +e; wait \"$child\"; child_status=$?; set -e; echo \"$label exited before readiness (status $child_status)\" >&2; return 1; fi",
16
+ " if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"$label readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; return 1; fi",
17
+ " sleep \"$broker_startup_poll_seconds\"",
18
+ " done",
19
+ "}",
20
+ "wait_for_broker_identity() {",
21
+ " child=$1; expected_uid=$2; expected_caps=$3; label=$4",
22
+ " while kill -0 \"$child\" 2>/dev/null; do",
23
+ " status_path=$broker_process_status_root/$child/status",
24
+ " observed_uid=$(awk '/^Uid:/{print $2}' \"$status_path\" 2>/dev/null || true)",
25
+ " observed_caps=$(awk '/^CapBnd:/{print $2}' \"$status_path\" 2>/dev/null || true)",
26
+ " if [ \"$observed_uid\" = \"$expected_uid\" ] && [ \"$observed_caps\" = \"$expected_caps\" ]; then return 0; fi",
27
+ " if [ $((SECONDS - broker_startup_started)) -ge \"$broker_startup_timeout_seconds\" ]; then echo \"$label identity readiness timed out after ${broker_startup_timeout_seconds}s\" >&2; return 1; fi",
28
+ " sleep \"$broker_startup_poll_seconds\"",
29
+ " done",
30
+ " set +e; wait \"$child\"; child_status=$?; set -e; echo \"$label exited before identity readiness (status $child_status)\" >&2; return 1",
31
+ "}"
32
+ ];
33
+ export const renderDaimonStartupSupervision = () => [
34
+ ...renderDaimonBrokerSocketWait(),
35
+ "startup_children=()",
36
+ "cleanup_broker_startup() { status=$?; trap - EXIT; for child in \"${startup_children[@]}\"; do kill -TERM \"$child\" 2>/dev/null || true; wait \"$child\" 2>/dev/null || true; done; return \"$status\"; }",
37
+ "trap cleanup_broker_startup EXIT",
38
+ "trap 'exit 143' TERM INT HUP"
39
+ ];
@@ -2,12 +2,11 @@ import type { RuntimeTargetPlan } from "./containerArtifactsTypes.js";
2
2
  import type { EntrypointOptions } from "./containerEntrypointRender.js";
3
3
  import { type BackedMountRequirement } from "./containerBackedMountRender.js";
4
4
  export { resolveDaimonVolumeIdentityFiles } from "./containerDaimonOwnershipGuardRender.js";
5
+ export { DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS, renderDaimonBrokerSocketWait } from "./containerDaimonStartupSupervision.js";
5
6
  export declare const DAIMON_AUTHORIZED_UID_ENV = "SPAWNFILE_DAIMON_AUTHORIZED_UID";
6
7
  export declare const DAIMON_RUNTIME_UID = 2000;
7
8
  export declare const DAIMON_UID_ENTRYPOINT_PATH = "/opt/spawnfile/daimon-uid-entrypoint.sh";
8
9
  export declare const DAIMON_RUNTIME_HOMES_DIRECTORY = "runtime-homes";
9
- export declare const DAIMON_BROKER_STARTUP_TIMEOUT_SECONDS = 60;
10
- export declare const renderDaimonBrokerSocketWait: (timeoutSeconds?: number, pollSeconds?: number) => string[];
11
10
  export declare const resolveDaimonUidEntrypointStateRoots: (runtimePlans: RuntimeTargetPlan[]) => string[];
12
11
  export interface DaimonUidEntrypointOwnershipPlan {
13
12
  creatablePrivateDirectories: Array<{