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.
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/trainingAuth.js +3 -0
- package/dist/auth/trainingCodexAuthority.d.ts +8 -0
- package/dist/auth/trainingCodexAuthority.js +40 -0
- package/dist/compiler/containerDaimonGrokWorkerRender.js +4 -0
- package/dist/compiler/training/container/launch.js +8 -0
- package/dist/compiler/training/container/outputVolume.d.ts +1 -0
- package/dist/compiler/training/container/outputVolume.js +27 -3
- package/dist/compiler/training/execution.d.ts +3 -3
- package/dist/compiler/training/plan/contract.d.ts +7 -7
- package/dist/compiler/training/preparation/assets/package-lock.json +10 -10
- package/dist/compiler/training/repair/contract.d.ts +8 -8
- package/dist/compiler/training/rewind/contract.d.ts +16 -16
- package/dist/compiler/training/rewind/memorySchemas.d.ts +1 -1
- package/dist/compiler/training/rewind/snapshotManifest.d.ts +1 -1
- package/dist/compiler/training/subjectLease.d.ts +1 -1
- package/dist/compiler/training/subjectLease.js +11 -11
- package/dist/deployment/organizationReady.d.ts +1 -1
- package/dist/deployment/record.d.ts +5 -5
- package/dist/deployment/record.js +2 -2
- package/dist/deployment/resourceLog.d.ts +3 -3
- package/dist/deployment/resourceLog.js +4 -3
- package/dist/deployment/upReceiptTypes.d.ts +2 -2
- package/dist/distribution/consumeImage.js +4 -3
- package/dist/distribution/consumeImageDaimonContract.d.ts +432 -0
- package/dist/distribution/consumeImageDaimonContract.js +36 -0
- package/dist/distribution/consumeImageDaimonDocker.d.ts +5 -1
- package/dist/distribution/consumeImageDaimonDocker.js +10 -9
- package/dist/distribution/daimonImageContract.test-fixtures.d.ts +2 -0
- package/dist/distribution/daimonImageContract.test-fixtures.js +16 -0
- package/dist/distribution/imageRuntimeAuth.d.ts +3 -1
- package/dist/distribution/imageRuntimeAuth.js +20 -13
- package/dist/manifest/trainingDataSchemas.d.ts +2 -2
- package/dist/manifest/trainingDataSchemas.js +2 -1
- package/dist/recording/moment.d.ts +6 -6
- package/dist/recording/parse.js +2 -1
- package/dist/runtime/daimon/adapter.js +1 -1
- package/dist/runtime/daimon/config.js +5 -2
- package/dist/runtime/daimon/contract-manifest.json +1 -1
- package/dist/runtime/daimon/contract-manifest.sha256 +1 -1
- package/dist/runtime/daimon/contractManifest.d.ts +13 -3
- package/dist/runtime/daimon/contractManifest.js +29 -11
- package/dist/runtime/daimon/contractManifest.js.map +1 -1
- package/dist/runtime/daimon/contractManifestSchema.d.ts +1555 -1
- package/dist/runtime/daimon/contractManifestSchema.js +10 -1
- package/dist/runtime/daimon/contractManifestSchema.js.map +1 -1
- package/dist/runtime/daimon/engineDescriptorSchema.d.ts +44 -2
- package/dist/runtime/daimon/engineDescriptorSchema.js +4 -2
- package/dist/runtime/daimon/engineDescriptorSchema.js.map +1 -1
- package/dist/runtime/daimon/engineDescriptors.generated.d.ts +11 -3
- package/dist/runtime/daimon/engineDescriptors.generated.js +2 -2
- package/dist/runtime/daimon/engineDescriptors.generated.js.map +1 -1
- package/dist/runtime/daimon/engines.d.ts +25 -1
- package/dist/runtime/daimon/engines.js +2 -1
- package/dist/runtime/daimon/engines.js.map +1 -1
- package/dist/runtime/daimon/runAuth.d.ts +3 -2
- package/dist/runtime/daimon/runAuth.js +16 -12
- package/dist/runtime/daimon/subscriptionRealms.d.ts +9 -0
- package/dist/runtime/daimon/subscriptionRealms.js +18 -0
- package/dist/runtime/daimon/training/native/adapter.js +28 -7
- package/dist/runtime/daimon/training/native/adapter.js.map +1 -1
- package/dist/runtime/daimon/training/native/child/arguments.js +3 -2
- package/dist/runtime/daimon/training/native/child/arguments.js.map +1 -1
- package/dist/runtime/daimon/training/native/child/fixture.js +2 -0
- package/dist/runtime/daimon/training/native/child/fixture.js.map +1 -1
- package/dist/runtime/daimon/training/native/child/lifecycle.js +14 -5
- package/dist/runtime/daimon/training/native/child/lifecycle.js.map +1 -1
- package/dist/runtime/daimon/training/native/container/lifecycle.js +2 -1
- package/dist/runtime/daimon/training/native/container/lifecycle.js.map +1 -1
- package/dist/runtime/daimon/training/native/container/manifest.d.ts +2 -2
- package/dist/runtime/daimon/training/native/container/manifest.js +25 -5
- package/dist/runtime/daimon/training/native/container/manifest.js.map +1 -1
- package/dist/runtime/daimon/training/native/preparation/fixtures.js +4 -2
- package/dist/runtime/daimon/training/native/preparation/fixtures.js.map +1 -1
- package/dist/runtime/daimon/training/native/receipt/grok.d.ts +1 -1
- package/dist/runtime/daimon/training/native/receipt/index.d.ts +1 -0
- package/dist/runtime/daimon/training/native/receipt/index.js +1 -0
- package/dist/runtime/daimon/training/native/receipt/index.js.map +1 -1
- package/dist/runtime/daimon/training/native/receipt/sandbox.d.ts +1 -1
- package/dist/runtime/daimon/training/native/receipt/schema.d.ts +8 -4
- package/dist/runtime/daimon/training/native/receipt/schema.js +1 -1
- package/dist/runtime/daimon/training/native/receipt/schema.js.map +1 -1
- package/dist/runtime/daimon/training/native/receipt/subscription.d.ts +13 -0
- package/dist/runtime/daimon/training/native/receipt/subscription.js +13 -0
- package/dist/runtime/daimon/training/native/receipt/subscription.js.map +1 -0
- package/dist/runtime/daimon/training/native/test-fixtures.js +6 -2
- package/dist/runtime/daimon/training/native/test-fixtures.js.map +1 -1
- package/dist/runtime/daimon/training/native/worker/public.d.ts +12 -0
- package/dist/runtime/daimon/training/native/worker/public.js.map +1 -1
- package/dist/runtime/daimon/training/native/worker/sandbox.js +4 -2
- package/dist/runtime/daimon/training/native/worker/sandbox.js.map +1 -1
- package/dist/runtime/daimon/training/native/worker/worker.js +4 -2
- package/dist/runtime/daimon/training/native/worker/worker.js.map +1 -1
- package/dist/runtime/daimon/training/services/account-lease.d.ts +7 -0
- package/dist/runtime/daimon/training/services/account-lease.js +76 -0
- package/dist/runtime/daimon/training/services/account-lease.js.map +1 -0
- package/dist/runtime/daimon/training/services/index.d.ts +1 -0
- package/dist/runtime/daimon/training/services/index.js +1 -0
- package/dist/runtime/daimon/training/services/index.js.map +1 -1
- package/dist/shared/trainingLegacy/index.d.ts +1 -0
- package/dist/shared/trainingLegacy/index.js +1 -0
- package/dist/shared/trainingLegacy/index.js.map +1 -1
- package/dist/shared/trainingLegacy/trainingLegacyDateTime.d.ts +5 -0
- package/dist/shared/trainingLegacy/trainingLegacyDateTime.js +7 -0
- package/dist/shared/trainingLegacy/trainingLegacyDateTime.js.map +1 -0
- package/dist/shared/trainingLegacy/trainingLegacyWire.d.ts +1 -1
- package/dist/training/cli/commands.js +2 -2
- package/dist/training/cli/commands.js.map +1 -1
- package/dist/training/cli/datasets.js +1 -1
- package/dist/training/cli/datasets.js.map +1 -1
- package/dist/training/cli/grader/atomic/files.d.ts +3 -3
- package/dist/training/cli/grader/backend.js +3 -1
- package/dist/training/cli/grader/backend.js.map +1 -1
- package/dist/training/cli/spawnfile/moments.d.ts +2 -2
- package/dist/training/cli/spawnfile/moments.js +2 -1
- package/dist/training/cli/spawnfile/moments.js.map +1 -1
- package/dist/training/cli/training/bridge-command.d.ts +2 -0
- package/dist/training/cli/training/bridge-command.js +28 -0
- package/dist/training/cli/training/bridge-command.js.map +1 -0
- package/dist/training/cli/training/index.d.ts +1 -0
- package/dist/training/cli/training/index.js +1 -0
- package/dist/training/cli/training/index.js.map +1 -1
- package/dist/training/experiments/repair/receipt.d.ts +1 -1
- package/dist/training/experiments/replay/schema.d.ts +1 -1
- package/dist/training/graders/atomic/format.d.ts +1 -1
- package/dist/training/graders/decomposition/format.d.ts +10 -10
- package/dist/training/graders/decomposition/format.js +3 -3
- package/dist/training/graders/decomposition/format.js.map +1 -1
- package/dist/training/graders/decomposition/transport.d.ts +2 -2
- package/dist/training/graders/format/grader.d.ts +2 -2
- package/dist/training/graders/format/label-import.d.ts +1 -1
- package/dist/training/graders/format/labels.d.ts +1 -1
- package/dist/training/graders/identity.d.ts +1 -1
- package/dist/training/inference/decision/typesafe/index.js +3 -2
- package/dist/training/inference/decision/typesafe/index.js.map +1 -1
- package/dist/training/inference/decision/typesafe/transport.js +8 -7
- package/dist/training/inference/decision/typesafe/transport.js.map +1 -1
- package/dist/training/inference/evaluator/ledger.d.ts +2 -2
- package/dist/training/inference/evaluator/ledger.js +2 -1
- package/dist/training/inference/evaluator/ledger.js.map +1 -1
- package/dist/training/inference/evaluator/policy.js +6 -3
- package/dist/training/inference/evaluator/policy.js.map +1 -1
- package/dist/training/inference/evaluator/provider.js +2 -1
- package/dist/training/inference/evaluator/provider.js.map +1 -1
- package/dist/training/inference/index.d.ts +1 -0
- package/dist/training/inference/index.js +1 -0
- package/dist/training/inference/index.js.map +1 -1
- package/dist/training/inference/safe-diagnostic.d.ts +6 -0
- package/dist/training/inference/safe-diagnostic.js +7 -0
- package/dist/training/inference/safe-diagnostic.js.map +1 -0
- package/dist/training/optimization/protocol.d.ts +11 -11
- package/package.json +4 -4
- 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
|
|
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
|
-
|
|
43
|
-
|
|
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,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 {
|
|
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]) => !
|
|
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) =>
|
|
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
|
|
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
|
|
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 =
|
|
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<{
|
package/dist/recording/parse.js
CHANGED
|
@@ -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 =
|
|
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"
|