spawnfile 0.1.28 → 0.1.30

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 (154) hide show
  1. package/dist/auth/index.d.ts +1 -0
  2. package/dist/auth/index.js +1 -0
  3. package/dist/auth/trainingAuth.js +3 -0
  4. package/dist/auth/trainingCodexAuthority.d.ts +8 -0
  5. package/dist/auth/trainingCodexAuthority.js +40 -0
  6. package/dist/compiler/containerDaimonGrokWorkerRender.js +4 -0
  7. package/dist/compiler/training/container/launch.js +8 -0
  8. package/dist/compiler/training/container/outputVolume.d.ts +1 -0
  9. package/dist/compiler/training/container/outputVolume.js +27 -3
  10. package/dist/compiler/training/execution.d.ts +3 -3
  11. package/dist/compiler/training/plan/contract.d.ts +7 -7
  12. package/dist/compiler/training/preparation/assets/package-lock.json +10 -10
  13. package/dist/compiler/training/repair/contract.d.ts +8 -8
  14. package/dist/compiler/training/rewind/contract.d.ts +16 -16
  15. package/dist/compiler/training/rewind/memorySchemas.d.ts +1 -1
  16. package/dist/compiler/training/rewind/snapshotManifest.d.ts +1 -1
  17. package/dist/compiler/training/subjectLease.d.ts +1 -1
  18. package/dist/compiler/training/subjectLease.js +11 -11
  19. package/dist/deployment/organizationReady.d.ts +1 -1
  20. package/dist/deployment/record.d.ts +5 -5
  21. package/dist/deployment/record.js +2 -2
  22. package/dist/deployment/resourceLog.d.ts +3 -3
  23. package/dist/deployment/resourceLog.js +4 -3
  24. package/dist/deployment/upReceiptTypes.d.ts +2 -2
  25. package/dist/distribution/consumeImage.js +4 -3
  26. package/dist/distribution/consumeImageDaimonContract.d.ts +432 -0
  27. package/dist/distribution/consumeImageDaimonContract.js +36 -0
  28. package/dist/distribution/consumeImageDaimonDocker.d.ts +5 -1
  29. package/dist/distribution/consumeImageDaimonDocker.js +10 -9
  30. package/dist/distribution/daimonImageContract.test-fixtures.d.ts +2 -0
  31. package/dist/distribution/daimonImageContract.test-fixtures.js +16 -0
  32. package/dist/distribution/imageRuntimeAuth.d.ts +3 -1
  33. package/dist/distribution/imageRuntimeAuth.js +20 -13
  34. package/dist/manifest/trainingDataSchemas.d.ts +2 -2
  35. package/dist/manifest/trainingDataSchemas.js +2 -1
  36. package/dist/recording/moment.d.ts +6 -6
  37. package/dist/recording/parse.js +2 -1
  38. package/dist/runtime/daimon/adapter.js +1 -1
  39. package/dist/runtime/daimon/config.js +5 -2
  40. package/dist/runtime/daimon/contract-manifest.json +1 -1
  41. package/dist/runtime/daimon/contract-manifest.sha256 +1 -1
  42. package/dist/runtime/daimon/contractManifest.d.ts +13 -3
  43. package/dist/runtime/daimon/contractManifest.js +29 -11
  44. package/dist/runtime/daimon/contractManifest.js.map +1 -1
  45. package/dist/runtime/daimon/contractManifestSchema.d.ts +1555 -1
  46. package/dist/runtime/daimon/contractManifestSchema.js +10 -1
  47. package/dist/runtime/daimon/contractManifestSchema.js.map +1 -1
  48. package/dist/runtime/daimon/engineDescriptorSchema.d.ts +44 -2
  49. package/dist/runtime/daimon/engineDescriptorSchema.js +4 -2
  50. package/dist/runtime/daimon/engineDescriptorSchema.js.map +1 -1
  51. package/dist/runtime/daimon/engineDescriptors.generated.d.ts +11 -3
  52. package/dist/runtime/daimon/engineDescriptors.generated.js +2 -2
  53. package/dist/runtime/daimon/engineDescriptors.generated.js.map +1 -1
  54. package/dist/runtime/daimon/engines.d.ts +25 -1
  55. package/dist/runtime/daimon/engines.js +2 -1
  56. package/dist/runtime/daimon/engines.js.map +1 -1
  57. package/dist/runtime/daimon/runAuth.d.ts +3 -2
  58. package/dist/runtime/daimon/runAuth.js +16 -12
  59. package/dist/runtime/daimon/subscriptionRealms.d.ts +9 -0
  60. package/dist/runtime/daimon/subscriptionRealms.js +18 -0
  61. package/dist/runtime/daimon/training/native/adapter.js +28 -7
  62. package/dist/runtime/daimon/training/native/adapter.js.map +1 -1
  63. package/dist/runtime/daimon/training/native/child/arguments.js +3 -2
  64. package/dist/runtime/daimon/training/native/child/arguments.js.map +1 -1
  65. package/dist/runtime/daimon/training/native/child/fixture.js +2 -0
  66. package/dist/runtime/daimon/training/native/child/fixture.js.map +1 -1
  67. package/dist/runtime/daimon/training/native/child/lifecycle.js +14 -5
  68. package/dist/runtime/daimon/training/native/child/lifecycle.js.map +1 -1
  69. package/dist/runtime/daimon/training/native/container/lifecycle.js +2 -1
  70. package/dist/runtime/daimon/training/native/container/lifecycle.js.map +1 -1
  71. package/dist/runtime/daimon/training/native/container/manifest.d.ts +2 -2
  72. package/dist/runtime/daimon/training/native/container/manifest.js +25 -5
  73. package/dist/runtime/daimon/training/native/container/manifest.js.map +1 -1
  74. package/dist/runtime/daimon/training/native/preparation/fixtures.js +4 -2
  75. package/dist/runtime/daimon/training/native/preparation/fixtures.js.map +1 -1
  76. package/dist/runtime/daimon/training/native/receipt/grok.d.ts +1 -1
  77. package/dist/runtime/daimon/training/native/receipt/index.d.ts +1 -0
  78. package/dist/runtime/daimon/training/native/receipt/index.js +1 -0
  79. package/dist/runtime/daimon/training/native/receipt/index.js.map +1 -1
  80. package/dist/runtime/daimon/training/native/receipt/sandbox.d.ts +1 -1
  81. package/dist/runtime/daimon/training/native/receipt/schema.d.ts +8 -4
  82. package/dist/runtime/daimon/training/native/receipt/schema.js +1 -1
  83. package/dist/runtime/daimon/training/native/receipt/schema.js.map +1 -1
  84. package/dist/runtime/daimon/training/native/receipt/subscription.d.ts +13 -0
  85. package/dist/runtime/daimon/training/native/receipt/subscription.js +13 -0
  86. package/dist/runtime/daimon/training/native/receipt/subscription.js.map +1 -0
  87. package/dist/runtime/daimon/training/native/test-fixtures.js +6 -2
  88. package/dist/runtime/daimon/training/native/test-fixtures.js.map +1 -1
  89. package/dist/runtime/daimon/training/native/worker/public.d.ts +12 -0
  90. package/dist/runtime/daimon/training/native/worker/public.js.map +1 -1
  91. package/dist/runtime/daimon/training/native/worker/sandbox.js +4 -2
  92. package/dist/runtime/daimon/training/native/worker/sandbox.js.map +1 -1
  93. package/dist/runtime/daimon/training/native/worker/worker.js +4 -2
  94. package/dist/runtime/daimon/training/native/worker/worker.js.map +1 -1
  95. package/dist/runtime/daimon/training/services/account-lease.d.ts +7 -0
  96. package/dist/runtime/daimon/training/services/account-lease.js +76 -0
  97. package/dist/runtime/daimon/training/services/account-lease.js.map +1 -0
  98. package/dist/runtime/daimon/training/services/index.d.ts +1 -0
  99. package/dist/runtime/daimon/training/services/index.js +1 -0
  100. package/dist/runtime/daimon/training/services/index.js.map +1 -1
  101. package/dist/shared/trainingLegacy/index.d.ts +1 -0
  102. package/dist/shared/trainingLegacy/index.js +1 -0
  103. package/dist/shared/trainingLegacy/index.js.map +1 -1
  104. package/dist/shared/trainingLegacy/trainingLegacyDateTime.d.ts +5 -0
  105. package/dist/shared/trainingLegacy/trainingLegacyDateTime.js +7 -0
  106. package/dist/shared/trainingLegacy/trainingLegacyDateTime.js.map +1 -0
  107. package/dist/shared/trainingLegacy/trainingLegacyWire.d.ts +1 -1
  108. package/dist/training/cli/commands.js +2 -2
  109. package/dist/training/cli/commands.js.map +1 -1
  110. package/dist/training/cli/datasets.js +1 -1
  111. package/dist/training/cli/datasets.js.map +1 -1
  112. package/dist/training/cli/grader/atomic/files.d.ts +3 -3
  113. package/dist/training/cli/grader/backend.js +3 -1
  114. package/dist/training/cli/grader/backend.js.map +1 -1
  115. package/dist/training/cli/spawnfile/moments.d.ts +2 -2
  116. package/dist/training/cli/spawnfile/moments.js +2 -1
  117. package/dist/training/cli/spawnfile/moments.js.map +1 -1
  118. package/dist/training/cli/training/bridge-command.d.ts +2 -0
  119. package/dist/training/cli/training/bridge-command.js +28 -0
  120. package/dist/training/cli/training/bridge-command.js.map +1 -0
  121. package/dist/training/cli/training/index.d.ts +1 -0
  122. package/dist/training/cli/training/index.js +1 -0
  123. package/dist/training/cli/training/index.js.map +1 -1
  124. package/dist/training/experiments/repair/receipt.d.ts +1 -1
  125. package/dist/training/experiments/replay/schema.d.ts +1 -1
  126. package/dist/training/graders/atomic/format.d.ts +1 -1
  127. package/dist/training/graders/decomposition/format.d.ts +10 -10
  128. package/dist/training/graders/decomposition/format.js +3 -3
  129. package/dist/training/graders/decomposition/format.js.map +1 -1
  130. package/dist/training/graders/decomposition/transport.d.ts +2 -2
  131. package/dist/training/graders/format/grader.d.ts +2 -2
  132. package/dist/training/graders/format/label-import.d.ts +1 -1
  133. package/dist/training/graders/format/labels.d.ts +1 -1
  134. package/dist/training/graders/identity.d.ts +1 -1
  135. package/dist/training/inference/decision/typesafe/index.js +3 -2
  136. package/dist/training/inference/decision/typesafe/index.js.map +1 -1
  137. package/dist/training/inference/decision/typesafe/transport.js +8 -7
  138. package/dist/training/inference/decision/typesafe/transport.js.map +1 -1
  139. package/dist/training/inference/evaluator/ledger.d.ts +2 -2
  140. package/dist/training/inference/evaluator/ledger.js +2 -1
  141. package/dist/training/inference/evaluator/ledger.js.map +1 -1
  142. package/dist/training/inference/evaluator/policy.js +6 -3
  143. package/dist/training/inference/evaluator/policy.js.map +1 -1
  144. package/dist/training/inference/evaluator/provider.js +2 -1
  145. package/dist/training/inference/evaluator/provider.js.map +1 -1
  146. package/dist/training/inference/index.d.ts +1 -0
  147. package/dist/training/inference/index.js +1 -0
  148. package/dist/training/inference/index.js.map +1 -1
  149. package/dist/training/inference/safe-diagnostic.d.ts +6 -0
  150. package/dist/training/inference/safe-diagnostic.js +7 -0
  151. package/dist/training/inference/safe-diagnostic.js.map +1 -0
  152. package/dist/training/optimization/protocol.d.ts +11 -11
  153. package/package.json +4 -4
  154. package/runtimes.yaml +6 -6
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { SpawnfileError } from "../shared/errors.js";
3
3
  import { DAIMON_DOCKER_RUNTIME_SECURITY_ARGS, daimonEngineDockerSecurityArgsForConfigs, materializeDaimonGrokSeccompProfile } from "../shared/daimonCodexDocker.js";
4
+ import { readDaimonImageContract } from "./consumeImageDaimonContract.js";
4
5
  import { extractSingleFileFromTar } from "./tarReader.js";
5
6
  const DAIMON_CONFIG_SIZE_CAP_BYTES = 4 * 1024 * 1024;
6
7
  const daimonInstancesFrom = (report) => report.runtime_instances.filter((instance) => instance.runtime === "daimon");
@@ -10,7 +11,7 @@ const assertAbsoluteConfigPath = (instance) => {
10
11
  }
11
12
  return instance.config_path;
12
13
  };
13
- const readDaimonConfigSourcesFromImage = async (imageRef, instances, runDocker) => {
14
+ const readDaimonConfigSourcesFromImage = async (imageRef, instances, runDocker, securityDirectory) => {
14
15
  const helperName = `spawnfile-daimon-config-${randomUUID()}`;
15
16
  await runDocker(["create", "--name", helperName, imageRef]);
16
17
  try {
@@ -27,19 +28,19 @@ const readDaimonConfigSourcesFromImage = async (imageRef, instances, runDocker)
27
28
  }
28
29
  sources.push(extractSingleFileFromTar(tar, { maxBytes: DAIMON_CONFIG_SIZE_CAP_BYTES }).toString("utf8"));
29
30
  }
30
- return sources;
31
+ return { sources, engineDescriptors: await readDaimonImageContract(helperName, runDocker, securityDirectory) };
31
32
  }
32
33
  finally {
33
34
  await runDocker(["rm", "-f", helperName]).catch(() => undefined);
34
35
  }
35
36
  };
36
- export const resolveDaimonDockerSecurityArgsForImage = async (imageRef, report, runDocker, securityDirectory) => {
37
+ export const resolveDaimonRuntimeForImage = async (imageRef, report, runDocker, securityDirectory) => {
37
38
  const daimonInstances = daimonInstancesFrom(report);
38
39
  if (daimonInstances.length === 0)
39
- return [];
40
- const sources = await readDaimonConfigSourcesFromImage(imageRef, daimonInstances, runDocker);
41
- return [
42
- ...DAIMON_DOCKER_RUNTIME_SECURITY_ARGS,
43
- ...(await daimonEngineDockerSecurityArgsForConfigs(sources, () => materializeDaimonGrokSeccompProfile(securityDirectory)))
44
- ];
40
+ return { securityArgs: [] };
41
+ const { sources, engineDescriptors } = await readDaimonConfigSourcesFromImage(imageRef, daimonInstances, runDocker, securityDirectory);
42
+ return { engineDescriptors, securityArgs: [
43
+ ...DAIMON_DOCKER_RUNTIME_SECURITY_ARGS,
44
+ ...(await daimonEngineDockerSecurityArgsForConfigs(sources, () => materializeDaimonGrokSeccompProfile(securityDirectory)))
45
+ ] };
45
46
  };
@@ -0,0 +1,2 @@
1
+ export declare const daimonImageManifestBytes: (version?: 5 | 6 | 7) => Buffer;
2
+ export declare const daimonImageContractFiles: (bytes?: Buffer<ArrayBufferLike>) => Record<string, Buffer>;
@@ -0,0 +1,16 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ // Historical bytes, unchanged: v5 a483f6e4, v6 bf61e6bb.
4
+ export const daimonImageManifestBytes = (version = 7) => readFileSync(new URL(version === 7 ? "../runtime/daimon/contract-manifest.json"
5
+ : `./daimon-contract-v${version}.fixture.json`, import.meta.url));
6
+ export const daimonImageContractFiles = (bytes = daimonImageManifestBytes()) => {
7
+ const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
8
+ const root = "/opt/spawnfile/runtime-installs/daimon";
9
+ return {
10
+ [`${root}/contract-manifest.json`]: bytes,
11
+ [`${root}/contract-manifest.sha256`]: Buffer.from(`${digest}\n`),
12
+ [`${root}/capability-receipt.json`]: Buffer.from(JSON.stringify({
13
+ version: "spawnfile.daimon-runtime-capability-receipt.v1", manifest_sha256: digest
14
+ }))
15
+ };
16
+ };
@@ -1,3 +1,4 @@
1
+ import type { DaimonEngineDescriptors } from "../runtime/daimon/engineDescriptorSchema.js";
1
2
  import type { ResolvedAuthProfile } from "../auth/index.js";
2
3
  import type { DistributionReport } from "./types.js";
3
4
  export interface ImageRuntimeAuthInput {
@@ -8,6 +9,7 @@ export interface ImageRuntimeAuthInput {
8
9
  * known to run under a different identity.
9
10
  */
10
11
  daimonContainerCredentialUid?: number;
12
+ daimonEngineDescriptors?: DaimonEngineDescriptors;
11
13
  report: DistributionReport;
12
14
  sourceEnvironment?: Record<string, string | undefined>;
13
15
  tempRoot: string;
@@ -16,7 +18,7 @@ export interface ImageRuntimeAuthResult {
16
18
  coveredModelSecrets: Set<string>;
17
19
  mountArgs: string[];
18
20
  }
19
- export declare const prepareDaimonImageAuthMounts: (instance: DistributionReport["runtime_instances"][number], environment: Record<string, string | undefined>, authProfile: ResolvedAuthProfile | null, containerCredentialUid?: number) => Promise<string[]>;
21
+ export declare const prepareDaimonImageAuthMounts: (instance: DistributionReport["runtime_instances"][number], environment: Record<string, string | undefined>, authProfile: ResolvedAuthProfile | null, containerCredentialUid?: number, inventory?: DaimonEngineDescriptors) => Promise<string[]>;
20
22
  /**
21
23
  * Builds the credential mounts for a sourceless image deployment that uses
22
24
  * import-based model auth. The OAuth-mode config is already baked into the
@@ -1,4 +1,4 @@
1
- import { getDaimonEngineDescriptor } from "../runtime/daimon/index.js";
1
+ import { DAIMON_ENGINE_DESCRIPTORS } from "../runtime/daimon/engines.js";
2
2
  import path from "node:path";
3
3
  import { loadImportedClaudeCodeCredential, loadImportedCodexCredential } from "../auth/index.js";
4
4
  import { fileExists } from "../filesystem/index.js";
@@ -10,13 +10,13 @@ const daimonNodeSlug = (nodeId) => nodeId.replace(/^agent:/u, "").toLowerCase()
10
10
  .replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "");
11
11
  const daimonInstanceRoot = (instance) => {
12
12
  const root = path.posix.join("/var/lib/spawnfile/instances/daimon", instance.id);
13
- if (instance.config_path !== path.posix.join(root, "daimon/daimon-organization-runtime.json")
13
+ if (instance.home_path !== null || instance.config_path !== path.posix.join(root, "daimon/daimon-organization-runtime.json")
14
14
  || instance.workspace_path !== path.posix.join(root, "workspace")) {
15
15
  throw new SpawnfileError("validation_error", "Daimon image runtime paths are not canonical");
16
16
  }
17
17
  return root;
18
18
  };
19
- export const prepareDaimonImageAuthMounts = async (instance, environment, authProfile, containerCredentialUid = DAIMON_CREDENTIAL_CONTAINER_UID) => {
19
+ export const prepareDaimonImageAuthMounts = async (instance, environment, authProfile, containerCredentialUid = DAIMON_CREDENTIAL_CONTAINER_UID, inventory = DAIMON_ENGINE_DESCRIPTORS) => {
20
20
  const engines = Object.entries(instance.engine_by_node_id ?? {}).sort(([left], [right]) => left.localeCompare(right));
21
21
  if (engines.length === 0) {
22
22
  throw new SpawnfileError("validation_error", "Daimon image report is missing its engine map");
@@ -25,7 +25,7 @@ export const prepareDaimonImageAuthMounts = async (instance, environment, authPr
25
25
  if (JSON.stringify(engineNodeIds) !== JSON.stringify([...instance.node_ids].sort())) {
26
26
  throw new SpawnfileError("validation_error", "Daimon image engine map does not match its declared agents");
27
27
  }
28
- if (engines.some(([, engine]) => !getDaimonEngineDescriptor(engine))) {
28
+ if (engines.some(([, engine]) => !Object.hasOwn(inventory, engine))) {
29
29
  throw new SpawnfileError("validation_error", "Daimon image report declares an unsupported engine");
30
30
  }
31
31
  const root = daimonInstanceRoot(instance);
@@ -38,14 +38,14 @@ export const prepareDaimonImageAuthMounts = async (instance, environment, authPr
38
38
  slugs.set(slug, nodeId);
39
39
  }
40
40
  const descriptors = [...new Set(engines.map(([, engine]) => engine))]
41
- .map((engine) => getDaimonEngineDescriptor(engine));
41
+ .map((engine) => inventory[engine]);
42
42
  // Keep portable leaves, broker bootstrap, then realm unlock mounts in the
43
43
  // existing order while resolving every engine's staging contract from data.
44
44
  for (const descriptor of descriptors) {
45
45
  if (descriptor.auth.staging !== "portable-file")
46
46
  continue;
47
- const source = daimonSourcePathForEngine(descriptor.id, environment, authProfile);
48
- const ownerUid = await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor.id);
47
+ const source = daimonSourcePathForEngine(descriptor.id, environment, authProfile, descriptor);
48
+ const ownerUid = await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor);
49
49
  assertDaimonCredentialContainerOwner(ownerUid, descriptor.id, containerCredentialUid);
50
50
  for (const [nodeId, engine] of engines) {
51
51
  if (engine !== descriptor.id)
@@ -54,13 +54,21 @@ export const prepareDaimonImageAuthMounts = async (instance, environment, authPr
54
54
  mounts.push("-v", `${source}:${target}:ro`);
55
55
  }
56
56
  }
57
+ for (const descriptor of descriptors) {
58
+ if (descriptor.auth.staging !== "portable-realm")
59
+ continue;
60
+ const source = daimonSourcePathForEngine(descriptor.id, environment, authProfile, descriptor);
61
+ const ownerUid = await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor);
62
+ assertDaimonCredentialContainerOwner(ownerUid, descriptor.id, containerCredentialUid);
63
+ mounts.push("-v", `${source}:${descriptor.auth.realm.bootstrapMountPath}:ro`);
64
+ }
57
65
  for (const descriptor of descriptors) {
58
66
  if (descriptor.auth.staging !== "broker-realm")
59
67
  continue;
60
68
  // Broker bootstrap leaves are read and staged by root, so they deliberately
61
69
  // do not require ownership by the eventual organization uid.
62
- const source = daimonSourcePathForEngine(descriptor.id, environment);
63
- await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor.id);
70
+ const source = daimonSourcePathForEngine(descriptor.id, environment, null, descriptor);
71
+ await assertSafeDaimonSourceFile(source, descriptor.id, descriptor.auth.maxCredentialBytes, descriptor);
64
72
  mounts.push("-v", `${source}:${descriptor.auth.realm.bootstrapMountPath}:ro`);
65
73
  }
66
74
  for (const descriptor of descriptors) {
@@ -88,13 +96,12 @@ export const prepareImageRuntimeAuthMounts = async (input) => {
88
96
  const mountArgs = [];
89
97
  const runtimeHomes = new Set();
90
98
  for (const instance of input.report.runtime_instances) {
91
- if (instance.home_path) {
92
- runtimeHomes.add(instance.home_path);
93
- }
94
99
  if (instance.runtime === "daimon") {
95
- mountArgs.push(...await prepareDaimonImageAuthMounts(instance, input.sourceEnvironment ?? process.env, input.authProfile, input.daimonContainerCredentialUid ?? DAIMON_CREDENTIAL_CONTAINER_UID));
100
+ mountArgs.push(...await prepareDaimonImageAuthMounts(instance, input.sourceEnvironment ?? process.env, input.authProfile, input.daimonContainerCredentialUid ?? DAIMON_CREDENTIAL_CONTAINER_UID, input.daimonEngineDescriptors));
96
101
  continue;
97
102
  }
103
+ if (instance.home_path)
104
+ runtimeHomes.add(instance.home_path);
98
105
  if (!input.authProfile)
99
106
  continue;
100
107
  const adapter = getRuntimeAdapter(instance.runtime);
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export declare const trainingInstantSchema: z.ZodISODateTime;
2
+ export declare const trainingInstantSchema: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
3
3
  export declare const trainingWakeSchema: z.ZodObject<{
4
4
  surface: z.ZodLiteral<"moltnet">;
5
5
  room: z.ZodString;
@@ -9,7 +9,7 @@ export declare const trainingWakeSchema: z.ZodObject<{
9
9
  export declare const trainingDatasetSchema: z.ZodObject<{
10
10
  examples: z.ZodArray<z.ZodObject<{
11
11
  id: z.ZodString;
12
- at: z.ZodISODateTime;
12
+ at: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
13
13
  wake: z.ZodObject<{
14
14
  surface: z.ZodLiteral<"moltnet">;
15
15
  room: z.ZodString;
@@ -1,3 +1,4 @@
1
+ import { compatibleIsoDateTimeSchema } from '../shared/index.js';
1
2
  import { z } from "zod";
2
3
  import { memoryBankSchema } from "./memorySchemas.js";
3
4
  import { teamNetworkSchema } from "./teamNetworkSchemas.js";
@@ -11,7 +12,7 @@ const uniqueIds = (entries, context) => {
11
12
  ids.add(entry.id);
12
13
  });
13
14
  };
14
- export const trainingInstantSchema = z.iso.datetime({ offset: true });
15
+ export const trainingInstantSchema = compatibleIsoDateTimeSchema({ offset: true });
15
16
  export const trainingWakeSchema = z.object({
16
17
  surface: z.literal("moltnet"),
17
18
  room: z.string(),
@@ -5,20 +5,20 @@ export declare const momentRecordSchema: z.ZodObject<{
5
5
  version: z.ZodLiteral<"spawnfile.moment-record.v1">;
6
6
  agent: z.ZodString;
7
7
  wake: z.ZodObject<{
8
- at: z.ZodISODateTime;
9
- startedAt: z.ZodISODateTime;
8
+ at: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
9
+ startedAt: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
10
10
  executionId: z.ZodString;
11
11
  deliveries: z.ZodArray<z.ZodObject<{
12
12
  deliveryId: z.ZodString;
13
13
  kind: z.ZodString;
14
- occurredAt: z.ZodISODateTime;
14
+ occurredAt: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
15
15
  }, z.core.$strict>>;
16
16
  surface: z.ZodOptional<z.ZodLiteral<"moltnet">>;
17
17
  room: z.ZodOptional<z.ZodString>;
18
18
  from: z.ZodOptional<z.ZodString>;
19
19
  messageId: z.ZodOptional<z.ZodString>;
20
20
  }, z.core.$strict>;
21
- recordedAt: z.ZodISODateTime;
21
+ recordedAt: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
22
22
  exact: z.ZodBoolean;
23
23
  errors: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
24
  resources: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -38,7 +38,7 @@ export declare const momentRecordSchema: z.ZodObject<{
38
38
  commit: z.ZodOptional<z.ZodString>;
39
39
  ref: z.ZodOptional<z.ZodString>;
40
40
  paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
- landedAt: z.ZodISODateTime;
41
+ landedAt: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
42
42
  period: z.ZodOptional<z.ZodString>;
43
43
  }, z.core.$strict>>;
44
44
  memory: z.ZodArray<z.ZodObject<{
@@ -49,7 +49,7 @@ export declare const momentRecordSchema: z.ZodObject<{
49
49
  }, z.core.$strict>>;
50
50
  moltnet: z.ZodArray<z.ZodObject<{
51
51
  network: z.ZodString;
52
- cursor: z.ZodISODateTime;
52
+ cursor: z.ZodUnion<readonly [z.ZodISODateTime, z.ZodISODateTime]>;
53
53
  messageIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
54
54
  }, z.core.$strict>>;
55
55
  volumes: z.ZodArray<z.ZodObject<{
@@ -1,7 +1,8 @@
1
+ import { compatibleIsoDateTimeSchema } from '../shared/index.js';
1
2
  import { z } from "zod";
2
3
  import { WAKE_MOMENT_VERSION } from "./types.js";
3
4
  const text = z.string().min(1);
4
- const instant = z.iso.datetime({ offset: true }).refine((value) => Number.isFinite(Date.parse(value)));
5
+ const instant = compatibleIsoDateTimeSchema({ offset: true }).refine((value) => Number.isFinite(Date.parse(value)));
5
6
  const count = z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER);
6
7
  const snapshot = z.object({
7
8
  id: text.regex(/^[A-Za-z0-9._-]{1,128}$/u),
@@ -105,7 +105,7 @@ const unsupportedAgentFeatures = (node) => {
105
105
  if (!descriptor.modelSelection.configurable && node.execution?.model) {
106
106
  throw new SpawnfileError("validation_error", "Daimon AGY agents must omit Spawnfile execution.model; their subscription auth and model selection are Daimon-owned");
107
107
  }
108
- if (descriptor.auth.staging === "portable-file" && node.execution?.model?.primary.auth?.method === getDaimonEngineDescriptor(DAIMON_BROKER_ENGINE_ID)?.auth.method) {
108
+ if ((descriptor.auth.staging === "portable-file" || descriptor.auth.staging === "portable-realm") && node.execution?.model?.primary.auth?.method === getDaimonEngineDescriptor(DAIMON_BROKER_ENGINE_ID)?.auth.method) {
109
109
  throw new SpawnfileError("validation_error", `Daimon Codex agent ${node.name} cannot declare Grok model auth`);
110
110
  }
111
111
  if (descriptor.broker)
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { CLI_ENGINE_SKILL_BASE_DIRECTORIES } from "../common.js";
3
3
  import { daimonGrokSkillsError } from "./grokSkillsSupport.js";
4
4
  import { daimonAgentSkillsFromResolved } from "./grokWorkerSkills.js";
5
+ import { daimonPortableSubscriptionRealms } from "./subscriptionRealms.js";
5
6
  import { parseEveryScheduleMs } from "../scheduleUtils.js";
6
7
  import { SpawnfileError } from "../../shared/index.js";
7
8
  import { DAIMON_AGY_SUBSCRIPTION_REALM, DAIMON_GROK_SUBSCRIPTION_REALM, DAIMON_GROK_TURN_USAGE_LEDGER } from "./contractManifest.js";
@@ -223,6 +224,7 @@ export const createDaimonContainerTargets = async (inputs) => {
223
224
  .map((input) => [input.id, daimonAgentSkillsFromResolved(input.value.skills)]));
224
225
  const hasAgy = configAgents.some((agent) => getDaimonEngineDescriptor(agent.engine.kind)?.auth.staging === "secret-service");
225
226
  const hasGrok = configAgents.some((agent) => daimonEngineHasBroker(agent.engine.kind));
227
+ const portableRealms = daimonPortableSubscriptionRealms(configAgents.map((agent) => agent.engine.kind));
226
228
  const agyRuntimeHomeMounts = configAgents
227
229
  .filter((agent) => getDaimonEngineDescriptor(agent.engine.kind)?.auth.staging === "secret-service")
228
230
  .map((agent) => ({
@@ -277,13 +279,14 @@ export const createDaimonContainerTargets = async (inputs) => {
277
279
  }
278
280
  ],
279
281
  id: DAIMON_ORGANIZATION_TARGET_ID,
280
- ...(hasAgy || hasGrok ? {
282
+ ...(hasAgy || hasGrok || portableRealms.opaqueMountTargets.length > 0 ? {
281
283
  opaqueMountTargets: [
284
+ ...portableRealms.opaqueMountTargets,
282
285
  ...(hasAgy ? [DAIMON_AGY_SUBSCRIPTION_REALM.unlockMountPath] : []),
283
286
  ...(hasGrok ? [DAIMON_GROK_SUBSCRIPTION_REALM.bootstrapMountPath] : [])
284
287
  ],
285
288
  } : {}),
286
- persistentMounts: [...portableEngineHomeMounts, ...toolStateMounts, ...recordingMounts, {
289
+ persistentMounts: [...portableRealms.persistentMounts, ...portableEngineHomeMounts, ...toolStateMounts, ...recordingMounts, {
287
290
  id: DAIMON_RUNTIME_ACCEPTANCE_STORE_MOUNT_ID,
288
291
  mountPath: `<instance-root>/${DAIMON_RUNTIME_ACCEPTANCE_STORE_DIRECTORY}`,
289
292
  reason: "Daimon organization durable wake acceptance store"