@playcraft/common 0.1.56-beta → 0.1.57-beta
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/build-progress.d.ts +46 -0
- package/dist/build-progress.d.ts.map +1 -0
- package/dist/build-progress.js +31 -0
- package/dist/build-progress.js.map +1 -0
- package/dist/build-size.d.ts +16 -0
- package/dist/build-size.d.ts.map +1 -0
- package/dist/build-size.js +27 -0
- package/dist/build-size.js.map +1 -0
- package/dist/cloud-workspace/model-output.d.ts +9 -0
- package/dist/cloud-workspace/model-output.d.ts.map +1 -0
- package/dist/cloud-workspace/model-output.js +334 -0
- package/dist/cloud-workspace/model-output.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-connection.d.ts +1 -1
- package/dist/cloud-workspace/runtime/agent-generation-provenance.d.ts +65 -0
- package/dist/cloud-workspace/runtime/agent-generation-provenance.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-generation-provenance.js +26 -0
- package/dist/cloud-workspace/runtime/agent-generation-provenance.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-generation.d.ts +33 -0
- package/dist/cloud-workspace/runtime/agent-generation.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/agent-generation.js +21 -0
- package/dist/cloud-workspace/runtime/agent-generation.js.map +1 -0
- package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts +1 -1
- package/dist/cloud-workspace/runtime/agent-opencode.d.ts +1 -1
- package/dist/cloud-workspace/runtime/agent-source-project.d.ts +1 -1
- package/dist/cloud-workspace/runtime/animation-editor.d.ts +1 -0
- package/dist/cloud-workspace/runtime/animation-editor.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/artifacts.d.ts +2 -2
- package/dist/cloud-workspace/runtime/asset-generation-tools.d.ts +148 -19
- package/dist/cloud-workspace/runtime/asset-generation-tools.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/asset-generation-tools.js +3 -0
- package/dist/cloud-workspace/runtime/asset-generation-tools.js.map +1 -1
- package/dist/cloud-workspace/runtime/asset-generation.d.ts +351 -35
- package/dist/cloud-workspace/runtime/asset-generation.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/asset-generation.js +101 -21
- package/dist/cloud-workspace/runtime/asset-generation.js.map +1 -1
- package/dist/cloud-workspace/runtime/asset-library-save.d.ts +6 -2
- package/dist/cloud-workspace/runtime/asset-library-save.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/asset-library-save.js +1 -1
- package/dist/cloud-workspace/runtime/asset-library-save.js.map +1 -1
- package/dist/cloud-workspace/runtime/batch-runs.d.ts +9 -0
- package/dist/cloud-workspace/runtime/batch-runs.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/batch-runs.js +8 -0
- package/dist/cloud-workspace/runtime/batch-runs.js.map +1 -1
- package/dist/cloud-workspace/runtime/image-limits.d.ts +12 -0
- package/dist/cloud-workspace/runtime/image-limits.d.ts.map +1 -0
- package/dist/cloud-workspace/runtime/image-limits.js +19 -0
- package/dist/cloud-workspace/runtime/image-limits.js.map +1 -0
- package/dist/cloud-workspace/runtime/index.d.ts +3 -0
- package/dist/cloud-workspace/runtime/index.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/index.js +3 -0
- package/dist/cloud-workspace/runtime/index.js.map +1 -1
- package/dist/cloud-workspace/runtime/platform-endpoints.d.ts +2 -0
- package/dist/cloud-workspace/runtime/platform-endpoints.d.ts.map +1 -1
- package/dist/cloud-workspace/runtime/platform-endpoints.js +2 -0
- package/dist/cloud-workspace/runtime/platform-endpoints.js.map +1 -1
- package/dist/cloud-workspace/runtime/previews.d.ts +1 -1
- package/dist/cloud-workspace/runtime/variant-workspace.d.ts +2 -2
- package/dist/cloud-workspace/runtime/workspace-notifications.d.ts +1 -1
- package/dist/cloud-workspace/runtime/workspace-ui.d.ts +2 -2
- package/package.json +13 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stages of a platform export, carried in the build's `progress` (0–100) so they survive a reload
|
|
3
|
+
* and reach the browser over the existing build stream without a new column. The orchestrator writes
|
|
4
|
+
* a stage's milestone when the stage starts; readers map any progress back to its stage.
|
|
5
|
+
*/
|
|
6
|
+
export declare const BUILD_PROGRESS_STAGES: readonly [{
|
|
7
|
+
readonly id: "prepare";
|
|
8
|
+
readonly progress: 5;
|
|
9
|
+
}, {
|
|
10
|
+
readonly id: "source";
|
|
11
|
+
readonly progress: 15;
|
|
12
|
+
}, {
|
|
13
|
+
readonly id: "install";
|
|
14
|
+
readonly progress: 30;
|
|
15
|
+
}, {
|
|
16
|
+
readonly id: "package";
|
|
17
|
+
readonly progress: 50;
|
|
18
|
+
}, {
|
|
19
|
+
readonly id: "finalize";
|
|
20
|
+
readonly progress: 90;
|
|
21
|
+
}];
|
|
22
|
+
export type BuildProgressStage = (typeof BUILD_PROGRESS_STAGES)[number]['id'];
|
|
23
|
+
/** Shared setup is done and this channel waits for its turn to package. */
|
|
24
|
+
export declare const BUILD_PROGRESS_PACKAGE_WAITING = 45;
|
|
25
|
+
export declare function buildProgressForStage(stage: BuildProgressStage): number;
|
|
26
|
+
/**
|
|
27
|
+
* The stage a running build is in. Progress below the first milestone (a build just marked
|
|
28
|
+
* running) is the first stage; the gap before packaging means the channel is waiting its turn.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildStageAt(progress: number | null | undefined): {
|
|
31
|
+
stage: BuildProgressStage;
|
|
32
|
+
waiting: boolean;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Why an export stopped, kept on the build (`artifacts.failure`) so a person or the Agent can fix
|
|
36
|
+
* it from the record alone. Output tails are redacted and bounded; `command` never carries
|
|
37
|
+
* credentials.
|
|
38
|
+
*/
|
|
39
|
+
export type BuildFailure = {
|
|
40
|
+
stage: BuildProgressStage;
|
|
41
|
+
command?: string;
|
|
42
|
+
exitCode?: number;
|
|
43
|
+
stderrTail?: string;
|
|
44
|
+
stdoutTail?: string;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=build-progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-progress.d.ts","sourceRoot":"","sources":["../src/build-progress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;EAMxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAE9E,2EAA2E;AAC3E,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAMjH;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stages of a platform export, carried in the build's `progress` (0–100) so they survive a reload
|
|
3
|
+
* and reach the browser over the existing build stream without a new column. The orchestrator writes
|
|
4
|
+
* a stage's milestone when the stage starts; readers map any progress back to its stage.
|
|
5
|
+
*/
|
|
6
|
+
export const BUILD_PROGRESS_STAGES = [
|
|
7
|
+
{ id: 'prepare', progress: 5 },
|
|
8
|
+
{ id: 'source', progress: 15 },
|
|
9
|
+
{ id: 'install', progress: 30 },
|
|
10
|
+
{ id: 'package', progress: 50 },
|
|
11
|
+
{ id: 'finalize', progress: 90 },
|
|
12
|
+
];
|
|
13
|
+
/** Shared setup is done and this channel waits for its turn to package. */
|
|
14
|
+
export const BUILD_PROGRESS_PACKAGE_WAITING = 45;
|
|
15
|
+
export function buildProgressForStage(stage) {
|
|
16
|
+
return BUILD_PROGRESS_STAGES.find((item) => item.id === stage).progress;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The stage a running build is in. Progress below the first milestone (a build just marked
|
|
20
|
+
* running) is the first stage; the gap before packaging means the channel is waiting its turn.
|
|
21
|
+
*/
|
|
22
|
+
export function buildStageAt(progress) {
|
|
23
|
+
const value = typeof progress === 'number' && Number.isFinite(progress) ? progress : 0;
|
|
24
|
+
let stage = BUILD_PROGRESS_STAGES[0].id;
|
|
25
|
+
for (const item of BUILD_PROGRESS_STAGES)
|
|
26
|
+
if (value >= item.progress)
|
|
27
|
+
stage = item.id;
|
|
28
|
+
const waiting = value >= BUILD_PROGRESS_PACKAGE_WAITING && value < buildProgressForStage('package');
|
|
29
|
+
return { stage: waiting ? 'package' : stage, waiting };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=build-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-progress.js","sourceRoot":"","sources":["../src/build-progress.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;IAC9B,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/B,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC/B,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;CACxB,CAAC;AAIX,2EAA2E;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC7D,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAE,CAAC,QAAQ,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAmC;IAC9D,MAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,IAAI,KAAK,GAAuB,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,qBAAqB;QAAE,IAAI,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;IACtF,MAAM,OAAO,GAAG,KAAK,IAAI,8BAA8B,IAAI,KAAK,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACpG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a delivered package is made of: bytes per category as they count toward the channel limit
|
|
3
|
+
* (compressed sizes inside a ZIP), summing to `total`. The sandbox build runner keeps its own copy
|
|
4
|
+
* of the categories.
|
|
5
|
+
*/
|
|
6
|
+
export declare const BUILD_SIZE_CATEGORIES: readonly ["image", "audio", "video", "model", "font", "code", "other"];
|
|
7
|
+
export type BuildSizeCategory = (typeof BUILD_SIZE_CATEGORIES)[number];
|
|
8
|
+
export type BuildSizeBreakdown = {
|
|
9
|
+
total: number;
|
|
10
|
+
/** A compressed file mixing categories (a single HTML inside a ZIP) was split by proportion. */
|
|
11
|
+
estimated: boolean;
|
|
12
|
+
categories: Partial<Record<BuildSizeCategory, number>>;
|
|
13
|
+
};
|
|
14
|
+
/** Accepts a breakdown only when every value is a known category with a non-negative byte count. */
|
|
15
|
+
export declare function parseBuildSizeBreakdown(value: unknown): BuildSizeBreakdown | undefined;
|
|
16
|
+
//# sourceMappingURL=build-size.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-size.d.ts","sourceRoot":"","sources":["../src/build-size.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,wEAAyE,CAAC;AAE5G,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD,CAAC;AAEF,oGAAoG;AACpG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAYtF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a delivered package is made of: bytes per category as they count toward the channel limit
|
|
3
|
+
* (compressed sizes inside a ZIP), summing to `total`. The sandbox build runner keeps its own copy
|
|
4
|
+
* of the categories.
|
|
5
|
+
*/
|
|
6
|
+
export const BUILD_SIZE_CATEGORIES = ['image', 'audio', 'video', 'model', 'font', 'code', 'other'];
|
|
7
|
+
/** Accepts a breakdown only when every value is a known category with a non-negative byte count. */
|
|
8
|
+
export function parseBuildSizeBreakdown(value) {
|
|
9
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
10
|
+
return undefined;
|
|
11
|
+
const { total, estimated, categories } = value;
|
|
12
|
+
if (typeof total !== 'number' || !Number.isFinite(total) || total < 0)
|
|
13
|
+
return undefined;
|
|
14
|
+
if (!categories || typeof categories !== 'object' || Array.isArray(categories))
|
|
15
|
+
return undefined;
|
|
16
|
+
const parsed = {};
|
|
17
|
+
for (const [key, bytes] of Object.entries(categories)) {
|
|
18
|
+
if (!BUILD_SIZE_CATEGORIES.includes(key))
|
|
19
|
+
return undefined;
|
|
20
|
+
if (typeof bytes !== 'number' || !Number.isFinite(bytes) || bytes < 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
if (bytes > 0)
|
|
23
|
+
parsed[key] = bytes;
|
|
24
|
+
}
|
|
25
|
+
return { total, estimated: estimated === true, categories: parsed };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=build-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-size.js","sourceRoot":"","sources":["../src/build-size.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAW5G,oGAAoG;AACpG,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClF,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,KAAgC,CAAC;IAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACxF,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IACjG,MAAM,MAAM,GAAqC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,CAAE,qBAA2C,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QACxF,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,CAAC,GAAwB,CAAC,GAAG,KAAK,CAAC;IAC1D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const WORKSPACE_MODEL_EXTENSIONS: Readonly<Record<string, string>>;
|
|
2
|
+
/** Only portable package paths may be used as model dependencies. */
|
|
3
|
+
export declare function workspaceModelDependencyPath(value: string): string;
|
|
4
|
+
export declare function workspaceObjMaterialPaths(bytes: Uint8Array): string[];
|
|
5
|
+
export declare function workspaceMtlTexturePaths(bytes: Uint8Array): string[];
|
|
6
|
+
export declare function relativeDependency(parentPath: string, dependency: string): string;
|
|
7
|
+
/** Verifies a model delivery without fetching or executing external content. */
|
|
8
|
+
export declare function assertWorkspaceModelOutput(value: Uint8Array, mimeType: string): void;
|
|
9
|
+
//# sourceMappingURL=model-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-output.d.ts","sourceRoot":"","sources":["../../src/cloud-workspace/model-output.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGvE,CAAC;AAKF,qEAAqE;AACrE,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIlE;AAQD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAKrE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CASpE;AAmBD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQjF;AA8ID,gFAAgF;AAChF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAWpF"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { extractBundleArchive } from '../project-skills/bundle-archive.js';
|
|
2
|
+
import { assertSelfContainedGlb } from './runtime/self-contained-glb.js';
|
|
3
|
+
import { BINARY_WORKSPACE_FILE_MAX_BYTES } from './runtime/files.js';
|
|
4
|
+
export const WORKSPACE_MODEL_EXTENSIONS = {
|
|
5
|
+
'model/gltf-binary': 'glb', 'model/stl': 'stl', 'model/fbx': 'fbx',
|
|
6
|
+
'model/vnd.usdz+zip': 'usdz', 'application/gzip': 'tar.gz',
|
|
7
|
+
};
|
|
8
|
+
const invalid = () => { throw new Error('asset_generation_invalid_model'); };
|
|
9
|
+
const decoder = new TextDecoder('utf-8', { fatal: true });
|
|
10
|
+
const text = (value) => { try {
|
|
11
|
+
return decoder.decode(value);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return invalid();
|
|
15
|
+
} };
|
|
16
|
+
/** Only portable package paths may be used as model dependencies. */
|
|
17
|
+
export function workspaceModelDependencyPath(value) {
|
|
18
|
+
if (!value || value.length > 240 || value.includes('\\') || /[\0-\x1f?#:%]/.test(value) || value.startsWith('/') ||
|
|
19
|
+
value.split('/').some(part => !part || part === '..' || part === '.' || ['.git', '.playcraft', 'node_modules'].includes(part.toLowerCase())))
|
|
20
|
+
invalid();
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
function dependencyReference(value) {
|
|
24
|
+
if (!value || value.length > 240 || value.includes('\\') || /[\0-\x1f?#:%]/.test(value) || value.startsWith('/') ||
|
|
25
|
+
value.split('/').some(part => !part || ['.git', '.playcraft', 'node_modules'].includes(part.toLowerCase())))
|
|
26
|
+
invalid();
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
export function workspaceObjMaterialPaths(bytes) {
|
|
30
|
+
const source = text(bytes);
|
|
31
|
+
if (!/^\s*v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(source) || !/^\s*f\s+\d/m.test(source))
|
|
32
|
+
invalid();
|
|
33
|
+
return [...new Set([...source.matchAll(/^\s*mtllib\s+([^\r\n#]+)\s*$/gm)].flatMap(match => match[1].trim().split(/\s+/).map(dependencyReference)))];
|
|
34
|
+
}
|
|
35
|
+
export function workspaceMtlTexturePaths(bytes) {
|
|
36
|
+
const source = text(bytes);
|
|
37
|
+
if (!/^\s*newmtl\s+\S/m.test(source))
|
|
38
|
+
invalid();
|
|
39
|
+
return [...new Set([...source.matchAll(/^\s*(?:map_\w+|bump|disp|decal|norm|refl)\s+([^\r\n]+)$/gmi)].map(match => {
|
|
40
|
+
const value = match[1].replace(/\s+#.*$/, '').trim();
|
|
41
|
+
// Unsupported texture options are rejected rather than losing a referenced texture.
|
|
42
|
+
if (value.startsWith('-') || /\s/.test(value))
|
|
43
|
+
invalid();
|
|
44
|
+
return dependencyReference(value);
|
|
45
|
+
}))];
|
|
46
|
+
}
|
|
47
|
+
function assertModelPackage(bytes) {
|
|
48
|
+
const archive = extractBundleArchive(bytes, { maxArchiveBytes: BINARY_WORKSPACE_FILE_MAX_BYTES, maxExpandedBytes: BINARY_WORKSPACE_FILE_MAX_BYTES });
|
|
49
|
+
if (archive.issues.length || !archive.files.length || archive.files.length > 64)
|
|
50
|
+
invalid();
|
|
51
|
+
const files = new Map(archive.files.map(file => [workspaceModelDependencyPath(file.path), file.data]));
|
|
52
|
+
const models = archive.files.filter(file => /\.(obj|fbx)$/i.test(file.path));
|
|
53
|
+
if (models.length !== 1)
|
|
54
|
+
invalid();
|
|
55
|
+
if (models[0].path.toLowerCase().endsWith('.fbx')) {
|
|
56
|
+
assertFbx(models[0].data, new Set(archive.files.map(file => file.path)), models[0].path);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const material of workspaceObjMaterialPaths(models[0].data)) {
|
|
60
|
+
const materialPath = relativeDependency(models[0].path, material), content = files.get(materialPath);
|
|
61
|
+
if (!content)
|
|
62
|
+
invalid();
|
|
63
|
+
for (const texture of workspaceMtlTexturePaths(content))
|
|
64
|
+
if (!files.has(relativeDependency(materialPath, texture)))
|
|
65
|
+
invalid();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function relativeDependency(parentPath, dependency) {
|
|
69
|
+
const segments = workspaceModelDependencyPath(parentPath).split('/').slice(0, -1);
|
|
70
|
+
for (const segment of dependencyReference(dependency).split('/')) {
|
|
71
|
+
if (segment === '.')
|
|
72
|
+
continue;
|
|
73
|
+
if (segment === '..') {
|
|
74
|
+
if (!segments.length)
|
|
75
|
+
invalid();
|
|
76
|
+
segments.pop();
|
|
77
|
+
}
|
|
78
|
+
else
|
|
79
|
+
segments.push(segment);
|
|
80
|
+
}
|
|
81
|
+
return workspaceModelDependencyPath(segments.join('/'));
|
|
82
|
+
}
|
|
83
|
+
function assertStl(bytes) {
|
|
84
|
+
if (bytes.length >= 84 && 84 + bytes.readUInt32LE(80) * 50 === bytes.length && bytes.readUInt32LE(80) > 0) {
|
|
85
|
+
for (let offset = 84; offset < bytes.length; offset += 50)
|
|
86
|
+
for (let component = 0; component < 12; component++)
|
|
87
|
+
if (!Number.isFinite(bytes.readFloatLE(offset + component * 4)))
|
|
88
|
+
invalid();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const source = text(bytes).trim();
|
|
92
|
+
if (!/^solid(?:\s|$)/.test(source) || !/\bendsolid(?:\s.*)?$/.test(source))
|
|
93
|
+
invalid();
|
|
94
|
+
const facets = [...source.matchAll(/facet\s+normal\s+([-+.\deE]+)\s+([-+.\deE]+)\s+([-+.\deE]+)\s+outer\s+loop\s+vertex\s+([-+.\deE]+)\s+([-+.\deE]+)\s+([-+.\deE]+)\s+vertex\s+([-+.\deE]+)\s+([-+.\deE]+)\s+([-+.\deE]+)\s+vertex\s+([-+.\deE]+)\s+([-+.\deE]+)\s+([-+.\deE]+)\s+endloop\s+endfacet/g)];
|
|
95
|
+
if (!facets.length || facets.some(facet => facet.slice(1).some(value => !Number.isFinite(Number(value)))))
|
|
96
|
+
invalid();
|
|
97
|
+
}
|
|
98
|
+
function assertUsdz(bytes) {
|
|
99
|
+
// USDZ (Universal Scene Description Zip, 通用场景描述归档) stores entries uncompressed.
|
|
100
|
+
let offset = 0;
|
|
101
|
+
const entries = new Map(), localOffsets = new Map();
|
|
102
|
+
while (offset + 30 <= bytes.length && bytes.readUInt32LE(offset) === 0x04034b50) {
|
|
103
|
+
const flags = bytes.readUInt16LE(offset + 6), method = bytes.readUInt16LE(offset + 8);
|
|
104
|
+
const size = bytes.readUInt32LE(offset + 18), expandedSize = bytes.readUInt32LE(offset + 22);
|
|
105
|
+
const nameLength = bytes.readUInt16LE(offset + 26), extraLength = bytes.readUInt16LE(offset + 28);
|
|
106
|
+
const start = offset + 30 + nameLength + extraLength, end = start + size;
|
|
107
|
+
if (flags & 0x0009 || method !== 0 || size !== expandedSize || end > bytes.length || !nameLength || entries.size >= 64)
|
|
108
|
+
invalid();
|
|
109
|
+
const name = workspaceModelDependencyPath(text(bytes.subarray(offset + 30, offset + 30 + nameLength)));
|
|
110
|
+
if (entries.has(name) || !/\.(usd|usda|usdc|png|jpe?g|exr|hdr|tiff?|bmp|webp)$/i.test(name))
|
|
111
|
+
invalid();
|
|
112
|
+
const data = bytes.subarray(start, end);
|
|
113
|
+
if (crc32(data) !== bytes.readUInt32LE(offset + 14))
|
|
114
|
+
invalid();
|
|
115
|
+
entries.set(name, data);
|
|
116
|
+
localOffsets.set(name, offset);
|
|
117
|
+
offset = end;
|
|
118
|
+
}
|
|
119
|
+
if (!entries.size || offset + 4 > bytes.length || bytes.readUInt32LE(offset) !== 0x02014b50)
|
|
120
|
+
invalid();
|
|
121
|
+
const centralStart = offset, seen = new Set();
|
|
122
|
+
while (offset + 46 <= bytes.length && bytes.readUInt32LE(offset) === 0x02014b50) {
|
|
123
|
+
const nameLength = bytes.readUInt16LE(offset + 28), next = offset + 46 + nameLength + bytes.readUInt16LE(offset + 30) + bytes.readUInt16LE(offset + 32);
|
|
124
|
+
if (next > bytes.length)
|
|
125
|
+
invalid();
|
|
126
|
+
const name = workspaceModelDependencyPath(text(bytes.subarray(offset + 46, offset + 46 + nameLength))), data = entries.get(name);
|
|
127
|
+
const unixMode = bytes.readUInt32LE(offset + 38) >>> 16;
|
|
128
|
+
if (!data || seen.has(name) || bytes.readUInt16LE(offset + 8) & 0x0009 || bytes.readUInt16LE(offset + 10) !== 0 ||
|
|
129
|
+
bytes.readUInt32LE(offset + 20) !== data.length || bytes.readUInt32LE(offset + 24) !== data.length ||
|
|
130
|
+
bytes.readUInt32LE(offset + 16) !== crc32(data) || bytes.readUInt32LE(offset + 42) !== localOffsets.get(name) ||
|
|
131
|
+
(unixMode & 0xf000) !== 0 && (unixMode & 0xf000) !== 0x8000)
|
|
132
|
+
invalid();
|
|
133
|
+
seen.add(name);
|
|
134
|
+
offset = next;
|
|
135
|
+
}
|
|
136
|
+
if (seen.size !== entries.size || offset + 22 > bytes.length || bytes.readUInt32LE(offset) !== 0x06054b50 ||
|
|
137
|
+
bytes.readUInt16LE(offset + 4) || bytes.readUInt16LE(offset + 6) ||
|
|
138
|
+
bytes.readUInt16LE(offset + 8) !== entries.size || bytes.readUInt16LE(offset + 10) !== entries.size ||
|
|
139
|
+
bytes.readUInt32LE(offset + 12) !== offset - centralStart || bytes.readUInt32LE(offset + 16) !== centralStart ||
|
|
140
|
+
offset + 22 + bytes.readUInt16LE(offset + 20) !== bytes.length)
|
|
141
|
+
invalid();
|
|
142
|
+
const first = entries.keys().next().value;
|
|
143
|
+
if (!/\.(usd|usda|usdc)$/.test(first))
|
|
144
|
+
invalid();
|
|
145
|
+
for (const [name, data] of entries) {
|
|
146
|
+
if (!/\.(usd|usda|usdc)$/.test(name))
|
|
147
|
+
continue;
|
|
148
|
+
// Crate dependency tables require a real USD parser; a magic header cannot prove portability.
|
|
149
|
+
if (data.subarray(0, 8).toString() === 'PXR-USDC')
|
|
150
|
+
invalid();
|
|
151
|
+
const source = text(data);
|
|
152
|
+
if (!source.startsWith('#usda '))
|
|
153
|
+
invalid();
|
|
154
|
+
for (const reference of source.matchAll(/@([^@]+)@/g)) {
|
|
155
|
+
const path = relativeDependency(name, reference[1]);
|
|
156
|
+
if (!entries.has(path))
|
|
157
|
+
invalid();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function crc32(bytes) {
|
|
162
|
+
let crc = 0xffffffff;
|
|
163
|
+
for (const byte of bytes) {
|
|
164
|
+
crc ^= byte;
|
|
165
|
+
for (let bit = 0; bit < 8; bit++)
|
|
166
|
+
crc = crc & 1 ? crc >>> 1 ^ 0xedb88320 : crc >>> 1;
|
|
167
|
+
}
|
|
168
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
169
|
+
}
|
|
170
|
+
function assertFbx(bytes, packaged = new Set(), modelPath = 'model.fbx') {
|
|
171
|
+
const contained = (reference, embedded = new Set()) => {
|
|
172
|
+
const normalized = reference.replace(/\\/g, '/');
|
|
173
|
+
if (embedded.has(normalized))
|
|
174
|
+
return true;
|
|
175
|
+
try {
|
|
176
|
+
return packaged.has(relativeDependency(modelPath, normalized));
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
if (bytes.subarray(0, 23).toString('binary') !== 'Kaydara FBX Binary \0\x1a\0') {
|
|
183
|
+
const source = text(bytes);
|
|
184
|
+
if (!/^;\s*FBX\s/m.test(source) || !/\bGeometry\s*:/.test(source))
|
|
185
|
+
invalid();
|
|
186
|
+
// Keep property groups separate so one object's relative filename cannot mask another object's missing texture.
|
|
187
|
+
const groups = [], stack = [''];
|
|
188
|
+
let quoted = false, escaped = false, comment = false;
|
|
189
|
+
for (const character of source) {
|
|
190
|
+
if (comment) {
|
|
191
|
+
if (character === '\n')
|
|
192
|
+
comment = false;
|
|
193
|
+
else
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (!quoted && character === ';') {
|
|
197
|
+
comment = true;
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (!quoted && character === '{') {
|
|
201
|
+
if (stack.length >= 64)
|
|
202
|
+
invalid();
|
|
203
|
+
stack.push('');
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (!quoted && character === '}') {
|
|
207
|
+
if (stack.length < 2)
|
|
208
|
+
invalid();
|
|
209
|
+
groups.push(stack.pop());
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
stack[stack.length - 1] += character;
|
|
213
|
+
if (character === '"' && !escaped)
|
|
214
|
+
quoted = !quoted;
|
|
215
|
+
escaped = quoted && character === '\\' && !escaped;
|
|
216
|
+
}
|
|
217
|
+
if (quoted || stack.length !== 1)
|
|
218
|
+
invalid();
|
|
219
|
+
groups.push(stack[0]);
|
|
220
|
+
for (const group of groups) {
|
|
221
|
+
const relative = [...group.matchAll(/\bRelativeFilename\s*:\s*"((?:\\.|[^"\\])*)"/g)].map(match => match[1].replace(/\\([\\"])/g, '$1')).filter(Boolean);
|
|
222
|
+
const absolute = [...group.matchAll(/\b(?:FileName|Filename)\s*:\s*"((?:\\.|[^"\\])*)"/g)].map(match => match[1].replace(/\\([\\"])/g, '$1')).filter(Boolean);
|
|
223
|
+
for (const reference of relative.length ? relative : absolute)
|
|
224
|
+
if (!contained(reference))
|
|
225
|
+
invalid();
|
|
226
|
+
}
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (bytes.length < 40)
|
|
230
|
+
invalid();
|
|
231
|
+
const wide = bytes.readUInt32LE(23) >= 7500, header = wide ? 25 : 13;
|
|
232
|
+
const unsigned = (offset) => {
|
|
233
|
+
const value = wide ? Number(bytes.readBigUInt64LE(offset)) : bytes.readUInt32LE(offset);
|
|
234
|
+
if (!Number.isSafeInteger(value))
|
|
235
|
+
invalid();
|
|
236
|
+
return value;
|
|
237
|
+
};
|
|
238
|
+
const references = [], embedded = new Set();
|
|
239
|
+
let nodes = 0;
|
|
240
|
+
const parse = (start, limit, depth) => {
|
|
241
|
+
if (start + header > limit || depth > 64 || ++nodes > 100000)
|
|
242
|
+
invalid();
|
|
243
|
+
if (bytes.subarray(start, start + header).every(byte => byte === 0))
|
|
244
|
+
return undefined;
|
|
245
|
+
const end = unsigned(start), count = unsigned(start + (wide ? 8 : 4)), length = unsigned(start + (wide ? 16 : 8));
|
|
246
|
+
const nameLength = bytes[start + header - 1], properties = start + header + nameLength, propertyEnd = properties + length;
|
|
247
|
+
if (end <= start || end > limit || propertyEnd > end || count > 100000)
|
|
248
|
+
invalid();
|
|
249
|
+
const node = { name: text(bytes.subarray(start + header, properties)), values: [], children: [] };
|
|
250
|
+
let at = properties;
|
|
251
|
+
for (let index = 0; index < count; index++) {
|
|
252
|
+
if (at >= propertyEnd)
|
|
253
|
+
invalid();
|
|
254
|
+
const kind = String.fromCharCode(bytes[at++]);
|
|
255
|
+
const fixed = { Y: 2, C: 1, I: 4, F: 4, D: 8, L: 8 };
|
|
256
|
+
if (fixed[kind])
|
|
257
|
+
at += fixed[kind];
|
|
258
|
+
else if (kind === 'S' || kind === 'R') {
|
|
259
|
+
if (at + 4 > propertyEnd)
|
|
260
|
+
invalid();
|
|
261
|
+
const size = bytes.readUInt32LE(at);
|
|
262
|
+
at += 4;
|
|
263
|
+
if (at + size > propertyEnd)
|
|
264
|
+
invalid();
|
|
265
|
+
const data = bytes.subarray(at, at + size);
|
|
266
|
+
node.values.push(kind === 'S' ? text(data) : data);
|
|
267
|
+
at += size;
|
|
268
|
+
}
|
|
269
|
+
else if ('fdlicb'.includes(kind)) {
|
|
270
|
+
if (at + 12 > propertyEnd)
|
|
271
|
+
invalid();
|
|
272
|
+
at += 12 + bytes.readUInt32LE(at + 8);
|
|
273
|
+
}
|
|
274
|
+
else
|
|
275
|
+
invalid();
|
|
276
|
+
if (at > propertyEnd)
|
|
277
|
+
invalid();
|
|
278
|
+
}
|
|
279
|
+
if (at !== propertyEnd)
|
|
280
|
+
invalid();
|
|
281
|
+
at = propertyEnd;
|
|
282
|
+
while (at + header <= end) {
|
|
283
|
+
const child = parse(at, end, depth + 1);
|
|
284
|
+
if (!child)
|
|
285
|
+
break;
|
|
286
|
+
node.children.push(child.node);
|
|
287
|
+
at = child.end;
|
|
288
|
+
}
|
|
289
|
+
const fields = node.children.filter(child => ['RelativeFilename', 'FileName', 'Filename'].includes(child.name));
|
|
290
|
+
const filenames = (fields) => fields.flatMap(child => child.values.filter((value) => typeof value === 'string' && Boolean(value)).map(value => value.replace(/\\/g, '/')));
|
|
291
|
+
const relative = filenames(fields.filter(child => child.name === 'RelativeFilename'));
|
|
292
|
+
references.push(...(relative.length ? relative : filenames(fields)));
|
|
293
|
+
if (node.name === 'Video' && node.children.some(child => child.name === 'Content' && child.values.some(value => Buffer.isBuffer(value) && value.length)))
|
|
294
|
+
for (const reference of filenames(fields))
|
|
295
|
+
embedded.add(reference);
|
|
296
|
+
return { node, end };
|
|
297
|
+
};
|
|
298
|
+
let at = 27, geometry = false;
|
|
299
|
+
const containsGeometry = (node) => node.name === 'Geometry' || node.children.some(containsGeometry);
|
|
300
|
+
while (at + header <= bytes.length) {
|
|
301
|
+
const result = parse(at, bytes.length, 0);
|
|
302
|
+
if (!result)
|
|
303
|
+
break;
|
|
304
|
+
geometry ||= containsGeometry(result.node);
|
|
305
|
+
at = result.end;
|
|
306
|
+
}
|
|
307
|
+
if (!geometry || references.some(reference => !contained(reference, embedded)))
|
|
308
|
+
invalid();
|
|
309
|
+
}
|
|
310
|
+
/** Verifies a model delivery without fetching or executing external content. */
|
|
311
|
+
export function assertWorkspaceModelOutput(value, mimeType) {
|
|
312
|
+
const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
313
|
+
if (!bytes.length || bytes.length > BINARY_WORKSPACE_FILE_MAX_BYTES)
|
|
314
|
+
invalid();
|
|
315
|
+
switch (mimeType) {
|
|
316
|
+
case 'model/gltf-binary':
|
|
317
|
+
assertSelfContainedGlb(bytes);
|
|
318
|
+
return;
|
|
319
|
+
case 'model/stl':
|
|
320
|
+
assertStl(bytes);
|
|
321
|
+
return;
|
|
322
|
+
case 'model/fbx':
|
|
323
|
+
assertFbx(bytes);
|
|
324
|
+
return;
|
|
325
|
+
case 'model/vnd.usdz+zip':
|
|
326
|
+
assertUsdz(bytes);
|
|
327
|
+
return;
|
|
328
|
+
case 'application/gzip':
|
|
329
|
+
assertModelPackage(bytes);
|
|
330
|
+
return;
|
|
331
|
+
default: invalid();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=model-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-output.js","sourceRoot":"","sources":["../../src/cloud-workspace/model-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ export declare const agentConnectionRequestSchema: z.ZodObject<{
|
|
|
13
13
|
writerEpoch: z.ZodNumber;
|
|
14
14
|
workspaceId: z.ZodString;
|
|
15
15
|
kind: z.ZodEnum<{
|
|
16
|
-
session: "session";
|
|
17
16
|
execution: "execution";
|
|
17
|
+
session: "session";
|
|
18
18
|
manager: "manager";
|
|
19
19
|
}>;
|
|
20
20
|
runId: z.ZodOptional<z.ZodString>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const AGENT_GENERATION_PROVENANCE_HEADER = "x-playcraft-agent-provenance";
|
|
3
|
+
export declare const ASSET_GENERATION_SOURCE_TOOLS: readonly ["generate-image", "generate-sfx", "generate-bgm", "generate-3d", "generate-texture", "generate-motion", "generate-avatar", "assets generate"];
|
|
4
|
+
/** Public attribution is produced by the runtime after verifying controlled execution. */
|
|
5
|
+
export declare const agentGenerationSourceSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
6
|
+
kind: z.ZodLiteral<"web">;
|
|
7
|
+
tool: z.ZodOptional<z.ZodEnum<{
|
|
8
|
+
"generate-image": "generate-image";
|
|
9
|
+
"generate-sfx": "generate-sfx";
|
|
10
|
+
"generate-bgm": "generate-bgm";
|
|
11
|
+
"generate-3d": "generate-3d";
|
|
12
|
+
"generate-texture": "generate-texture";
|
|
13
|
+
"generate-motion": "generate-motion";
|
|
14
|
+
"generate-avatar": "generate-avatar";
|
|
15
|
+
"assets generate": "assets generate";
|
|
16
|
+
}>>;
|
|
17
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
18
|
+
kind: z.ZodLiteral<"cli">;
|
|
19
|
+
tool: z.ZodOptional<z.ZodEnum<{
|
|
20
|
+
"generate-image": "generate-image";
|
|
21
|
+
"generate-sfx": "generate-sfx";
|
|
22
|
+
"generate-bgm": "generate-bgm";
|
|
23
|
+
"generate-3d": "generate-3d";
|
|
24
|
+
"generate-texture": "generate-texture";
|
|
25
|
+
"generate-motion": "generate-motion";
|
|
26
|
+
"generate-avatar": "generate-avatar";
|
|
27
|
+
"assets generate": "assets generate";
|
|
28
|
+
}>>;
|
|
29
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
30
|
+
kind: z.ZodLiteral<"agent">;
|
|
31
|
+
tool: z.ZodOptional<z.ZodEnum<{
|
|
32
|
+
"generate-image": "generate-image";
|
|
33
|
+
"generate-sfx": "generate-sfx";
|
|
34
|
+
"generate-bgm": "generate-bgm";
|
|
35
|
+
"generate-3d": "generate-3d";
|
|
36
|
+
"generate-texture": "generate-texture";
|
|
37
|
+
"generate-motion": "generate-motion";
|
|
38
|
+
"generate-avatar": "generate-avatar";
|
|
39
|
+
"assets generate": "assets generate";
|
|
40
|
+
}>>;
|
|
41
|
+
sessionId: z.ZodString;
|
|
42
|
+
operationId: z.ZodString;
|
|
43
|
+
nativeThreadId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
nativeTurnId: z.ZodOptional<z.ZodString>;
|
|
45
|
+
}, z.core.$strict>], "kind">;
|
|
46
|
+
/** The control process supplies these bindings; they are never accepted as browser ownership. */
|
|
47
|
+
export declare const agentGenerationProvenanceRequestSchema: z.ZodObject<{
|
|
48
|
+
runtimeId: z.ZodString;
|
|
49
|
+
generation: z.ZodNumber;
|
|
50
|
+
runtimeEpoch: z.ZodNumber;
|
|
51
|
+
workspaceId: z.ZodString;
|
|
52
|
+
directoryName: z.ZodUnion<readonly [z.ZodString, z.ZodLiteral<"root">]>;
|
|
53
|
+
sessionId: z.ZodString;
|
|
54
|
+
sessionClientRequestId: z.ZodString;
|
|
55
|
+
nativeThreadId: z.ZodString;
|
|
56
|
+
nativeTurnId: z.ZodString;
|
|
57
|
+
toolPath: z.ZodEnum<{
|
|
58
|
+
[x: string]: string;
|
|
59
|
+
}>;
|
|
60
|
+
toolRequestId: z.ZodString;
|
|
61
|
+
payloadHash: z.ZodString;
|
|
62
|
+
}, z.core.$strict>;
|
|
63
|
+
export type AgentGenerationSource = z.infer<typeof agentGenerationSourceSchema>;
|
|
64
|
+
export type AgentGenerationProvenanceRequest = z.infer<typeof agentGenerationProvenanceRequestSchema>;
|
|
65
|
+
//# sourceMappingURL=agent-generation-provenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-generation-provenance.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/agent-generation-provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,kCAAkC,iCAAiC,CAAC;AACjF,eAAO,MAAM,6BAA6B,yJAA0D,CAAC;AAGrG,0FAA0F;AAC1F,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAOtC,CAAC;AAEH,iGAAiG;AACjG,eAAO,MAAM,sCAAsC;;;;;;;;;;;;;;;kBAOxC,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAChF,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AGENT_GENERATION_TOOLS } from './agent-generation.js';
|
|
3
|
+
import { workspaceSessionScopeSchema } from './workspace-directories.js';
|
|
4
|
+
const identifier = z.string().trim().min(1).max(128);
|
|
5
|
+
export const AGENT_GENERATION_PROVENANCE_HEADER = 'x-playcraft-agent-provenance';
|
|
6
|
+
export const ASSET_GENERATION_SOURCE_TOOLS = [...AGENT_GENERATION_TOOLS, 'assets generate'];
|
|
7
|
+
const tool = z.enum(ASSET_GENERATION_SOURCE_TOOLS).optional();
|
|
8
|
+
/** Public attribution is produced by the runtime after verifying controlled execution. */
|
|
9
|
+
export const agentGenerationSourceSchema = z.discriminatedUnion('kind', [
|
|
10
|
+
z.object({ kind: z.literal('web'), tool }).strict(),
|
|
11
|
+
z.object({ kind: z.literal('cli'), tool }).strict(),
|
|
12
|
+
z.object({
|
|
13
|
+
kind: z.literal('agent'), tool, sessionId: identifier, operationId: identifier,
|
|
14
|
+
nativeThreadId: identifier.optional(), nativeTurnId: identifier.optional(),
|
|
15
|
+
}).strict(),
|
|
16
|
+
]);
|
|
17
|
+
/** The control process supplies these bindings; they are never accepted as browser ownership. */
|
|
18
|
+
export const agentGenerationProvenanceRequestSchema = z.object({
|
|
19
|
+
runtimeId: identifier, generation: z.number().int().positive(), runtimeEpoch: z.number().int().nonnegative(),
|
|
20
|
+
workspaceId: z.string().uuid(), directoryName: workspaceSessionScopeSchema,
|
|
21
|
+
sessionId: identifier, sessionClientRequestId: identifier,
|
|
22
|
+
nativeThreadId: identifier, nativeTurnId: identifier,
|
|
23
|
+
toolPath: z.enum(['/agent/tools/workspace-assets', ...AGENT_GENERATION_TOOLS.map(name => `/agent/tools/${name}`)]),
|
|
24
|
+
toolRequestId: identifier, payloadHash: z.string().regex(/^[a-f0-9]{64}$/),
|
|
25
|
+
}).strict();
|
|
26
|
+
//# sourceMappingURL=agent-generation-provenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-generation-provenance.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/agent-generation-provenance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAEzE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,kCAAkC,GAAG,8BAA8B,CAAC;AACjF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,sBAAsB,EAAE,iBAAiB,CAAU,CAAC;AACrG,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,QAAQ,EAAE,CAAC;AAE9D,0FAA0F;AAC1F,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACtE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IACnD,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU;QAC9E,cAAc,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,UAAU,CAAC,QAAQ,EAAE;KAC3E,CAAC,CAAC,MAAM,EAAE;CACZ,CAAC,CAAC;AAEH,iGAAiG;AACjG,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7D,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC5G,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,2BAA2B;IAC1E,SAAS,EAAE,UAAU,EAAE,sBAAsB,EAAE,UAAU;IACzD,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU;IACpD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,+BAA+B,EAAE,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAU,CAAC;IAC3H,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC;CAC3E,CAAC,CAAC,MAAM,EAAE,CAAC"}
|