@skenora/scene-plan 0.1.2
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/README.md +114 -0
- package/dist/check/check-scene-input.d.ts +38 -0
- package/dist/check/check-scene-input.d.ts.map +1 -0
- package/dist/check/check-scene-input.js +209 -0
- package/dist/check/check-scene-input.js.map +1 -0
- package/dist/compilation/compile.d.ts +4 -0
- package/dist/compilation/compile.d.ts.map +1 -0
- package/dist/compilation/compile.js +498 -0
- package/dist/compilation/compile.js.map +1 -0
- package/dist/description/example-recipes.d.ts +66 -0
- package/dist/description/example-recipes.d.ts.map +1 -0
- package/dist/description/example-recipes.js +1097 -0
- package/dist/description/example-recipes.js.map +1 -0
- package/dist/description/examples.d.ts +18 -0
- package/dist/description/examples.d.ts.map +1 -0
- package/dist/description/examples.js +58 -0
- package/dist/description/examples.js.map +1 -0
- package/dist/description/information.d.ts +415 -0
- package/dist/description/information.d.ts.map +1 -0
- package/dist/description/information.js +980 -0
- package/dist/description/information.js.map +1 -0
- package/dist/description/recipes.d.ts +20 -0
- package/dist/description/recipes.d.ts.map +1 -0
- package/dist/description/recipes.js +163 -0
- package/dist/description/recipes.js.map +1 -0
- package/dist/description/scene-fields.d.ts +11 -0
- package/dist/description/scene-fields.d.ts.map +1 -0
- package/dist/description/scene-fields.js +471 -0
- package/dist/description/scene-fields.js.map +1 -0
- package/dist/diagnostics/diagnostics.d.ts +79 -0
- package/dist/diagnostics/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics/diagnostics.js +91 -0
- package/dist/diagnostics/diagnostics.js.map +1 -0
- package/dist/generated/example-gallery.d.ts +2897 -0
- package/dist/generated/example-gallery.d.ts.map +1 -0
- package/dist/generated/example-gallery.js +3290 -0
- package/dist/generated/example-gallery.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/model/json.d.ts +14 -0
- package/dist/model/json.d.ts.map +1 -0
- package/dist/model/json.js +60 -0
- package/dist/model/json.js.map +1 -0
- package/dist/model/types.d.ts +329 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +5 -0
- package/dist/model/types.js.map +1 -0
- package/dist/normalization/normalize.d.ts +7 -0
- package/dist/normalization/normalize.d.ts.map +1 -0
- package/dist/normalization/normalize.js +145 -0
- package/dist/normalization/normalize.js.map +1 -0
- package/dist/parsing/parse.d.ts +5 -0
- package/dist/parsing/parse.d.ts.map +1 -0
- package/dist/parsing/parse.js +330 -0
- package/dist/parsing/parse.js.map +1 -0
- package/dist/patch/patch.d.ts +6 -0
- package/dist/patch/patch.d.ts.map +1 -0
- package/dist/patch/patch.js +319 -0
- package/dist/patch/patch.js.map +1 -0
- package/dist/validation/validate.d.ts +16 -0
- package/dist/validation/validate.d.ts.map +1 -0
- package/dist/validation/validate.js +704 -0
- package/dist/validation/validate.js.map +1 -0
- package/package.json +31 -0
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# @skenora/scene-plan
|
|
2
|
+
|
|
3
|
+
Pure SceneBlueprint and ScenePatch contracts, validation, normalization, and
|
|
4
|
+
compilation for Skenora.
|
|
5
|
+
|
|
6
|
+
> This package is not currently published to npm; install examples describe the
|
|
7
|
+
> intended release. The procedural V1 sections describe current repository
|
|
8
|
+
> source and are not covered by the 2026-08-28 package/browser evidence.
|
|
9
|
+
|
|
10
|
+
This package is intentionally separate from @skenora/editor and @skenora/sdk:
|
|
11
|
+
|
|
12
|
+
- it contains serializable Blueprint/Patch data, parsing, normalization,
|
|
13
|
+
validation, diagnostics, and compilation;
|
|
14
|
+
- it does not create an Editor, Runtime, Babylon scene, DOM element, or AI
|
|
15
|
+
runtime;
|
|
16
|
+
- it does not own resource acquisition, workspace writes, approval, or policy;
|
|
17
|
+
- it compiles to the existing SceneDocumentData source of truth.
|
|
18
|
+
|
|
19
|
+
The package boundary and execution split are documented in:
|
|
20
|
+
|
|
21
|
+
- [Scene Plan](https://github.com/zhangjiadi225/skenora/blob/main/docs/SCENE_PLAN.md);
|
|
22
|
+
- [Scene Plan execution](https://github.com/zhangjiadi225/skenora/blob/main/docs/SCENE_PLAN_EXECUTION.md);
|
|
23
|
+
- [Scene Plan modules](https://github.com/zhangjiadi225/skenora/blob/main/docs/SCENE_PLAN_MODULES.md);
|
|
24
|
+
- [AI scene skill contract](https://github.com/zhangjiadi225/skenora/blob/main/docs/AI_SCENE_SKILL.md).
|
|
25
|
+
|
|
26
|
+
The SDK scene-plan executor may expose Gateway operations as a composition
|
|
27
|
+
entry point, but the pure package must remain usable without a Canvas, DOM,
|
|
28
|
+
Editor, Runtime, Workspace, or resource locator.
|
|
29
|
+
|
|
30
|
+
## Public information and examples
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import {
|
|
34
|
+
getScenePlanInformation,
|
|
35
|
+
getSceneBlueprintExamples,
|
|
36
|
+
getSceneBlueprintJsonSchema,
|
|
37
|
+
applySceneRecipe,
|
|
38
|
+
compileSceneBlueprint,
|
|
39
|
+
toPublicScenePlanDiagnostics,
|
|
40
|
+
} from "@skenora/scene-plan";
|
|
41
|
+
|
|
42
|
+
// Data only: no Canvas, engine, model provider, resource acquisition or Editor.
|
|
43
|
+
const information = getScenePlanInformation();
|
|
44
|
+
const schema = getSceneBlueprintJsonSchema();
|
|
45
|
+
const example = getSceneBlueprintExamples()[0].blueprint;
|
|
46
|
+
const compiled = compileSceneBlueprint(example, {
|
|
47
|
+
// Obtained from an initialized Runtime/Renderer or the host deployment.
|
|
48
|
+
capabilityAvailability: observedHostCapabilities,
|
|
49
|
+
});
|
|
50
|
+
if (!compiled.ok) {
|
|
51
|
+
console.log(toPublicScenePlanDiagnostics(compiled.diagnostics));
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`checkSceneInput(input)` is the single pure preflight for native SceneDocument,
|
|
56
|
+
Blueprint, and Patch input. It parses JSON once, returns stable shared
|
|
57
|
+
diagnostics, capability requirements and counts, and marks whether a Blueprint
|
|
58
|
+
was fully compiled. Resource-bearing Blueprints are not compiled until the host
|
|
59
|
+
supplies resource bindings.
|
|
60
|
+
|
|
61
|
+
The information bundle includes versioned capability descriptions, input and
|
|
62
|
+
normalized-Blueprint schemas, native defaults, examples, safe repair guidance
|
|
63
|
+
and the `neutral-v1` / `studio-v1` recipe descriptions. The getters return
|
|
64
|
+
detached serializable source data. A new development package build will emit
|
|
65
|
+
them into `dist`; the checked-in pre-procedural `dist` is stale and is not
|
|
66
|
+
evidence for these additions. A host can select descriptions by `domains` or
|
|
67
|
+
`capabilityIds` and serialize only the relevant information for its own AI.
|
|
68
|
+
|
|
69
|
+
Do not turn `information.capabilities` into an availability snapshot. It
|
|
70
|
+
describes accepted syntax; it does not prove that a backend is installed,
|
|
71
|
+
enabled, or compatible with the active device.
|
|
72
|
+
|
|
73
|
+
The information bundle includes dedicated
|
|
74
|
+
`skenora.entity.procedural@1` and `skenora.material.program@1` descriptions,
|
|
75
|
+
their JSON Schemas, limits, diagnostics, and the complete `procedural-ai`
|
|
76
|
+
Blueprint example. A procedural Blueprint needs no resource binding when it
|
|
77
|
+
uses no assets, but declared required capabilities still need a matching host
|
|
78
|
+
capability snapshot.
|
|
79
|
+
|
|
80
|
+
`listSkenoraExamples()`, `searchSkenoraExamples()`, and
|
|
81
|
+
`getSkenoraExample()` expose the immutable generated public gallery. Blueprint
|
|
82
|
+
and Recipe entries contain ordinary Blueprint data; Renderer Lab entries carry
|
|
83
|
+
a bounded `SimulationProgram` and are intentionally excluded from persistent
|
|
84
|
+
scene compilation. The information bundle describes the simulation schema but
|
|
85
|
+
does not claim device availability.
|
|
86
|
+
|
|
87
|
+
`SceneBlueprintInput` expresses omitted arrays/settings; normalization fills
|
|
88
|
+
Blueprint defaults, then compilation fills native settings and owned materials.
|
|
89
|
+
Schema validation does not resolve references or prove rendering compatibility.
|
|
90
|
+
When known, pass the current host's `capabilityAvailability` snapshot in the
|
|
91
|
+
compiler context; unknown/disabled capabilities cannot satisfy required usage.
|
|
92
|
+
|
|
93
|
+
`applySceneRecipe(input, "studio-v1", options)` expands ordinary fields without
|
|
94
|
+
fetching assets. Explicit fields win, including a supplied empty light array.
|
|
95
|
+
Use `options.bounds` with world-space meters for pure camera framing; otherwise
|
|
96
|
+
let the renderer frame loaded geometry. Environment resources must be declared
|
|
97
|
+
and bound explicitly by the host.
|
|
98
|
+
|
|
99
|
+
New PBR input opts in with `creation: { version: 1, family: "pbr" }` and uses
|
|
100
|
+
explicit `materialBindings`. Legacy material overrides remain supported. Group
|
|
101
|
+
entities without `sourceNode` provide transform-only composition.
|
|
102
|
+
|
|
103
|
+
Owned PBR also accepts versioned `effects` and local `animations`. The metadata
|
|
104
|
+
contains their exact property allowlists, interpolation/loop rules and render-pass
|
|
105
|
+
restrictions. Public examples include `gradient-rim`, `animated-dissolve`,
|
|
106
|
+
`flow-material-animation`, `texture-motion`, `presentation-atoms`, and a grouped
|
|
107
|
+
tube/wall/polygon/polyline composition, plus `procedural-ai`. The host chooses
|
|
108
|
+
which information to give its AI; no provider, prompt runner or model
|
|
109
|
+
connection is included.
|
|
110
|
+
|
|
111
|
+
Contract tests, actual development-package imports, public declarations and
|
|
112
|
+
12 public WebGL2 rendering examples passed verification on 2026-08-28. This does
|
|
113
|
+
not cover the later procedural-program additions, claim other GPU/browser
|
|
114
|
+
support, or mean that an updated package was published.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type ScenePlanDiagnostic } from "../diagnostics/diagnostics.js";
|
|
2
|
+
import { type ScenePatchContext } from "../model/types.js";
|
|
3
|
+
export type SceneCheckInputKind = "scene" | "blueprint" | "patch";
|
|
4
|
+
export interface SceneCheckOptions {
|
|
5
|
+
readonly inputKind?: "auto" | SceneCheckInputKind;
|
|
6
|
+
readonly context?: ScenePatchContext;
|
|
7
|
+
/** Compile a valid blueprint when every resource has a supplied binding. */
|
|
8
|
+
readonly compile?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface SceneCheckRequirement {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly version: string;
|
|
13
|
+
readonly required: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface SceneCheckSummary {
|
|
16
|
+
readonly id?: string;
|
|
17
|
+
readonly name?: string;
|
|
18
|
+
readonly resources: number;
|
|
19
|
+
readonly entities: number;
|
|
20
|
+
readonly materials: number;
|
|
21
|
+
readonly materialBindings: number;
|
|
22
|
+
readonly flows: number;
|
|
23
|
+
readonly operations: number;
|
|
24
|
+
readonly compiled: boolean;
|
|
25
|
+
readonly planHash?: string;
|
|
26
|
+
}
|
|
27
|
+
/** Pure, deterministic scene input preflight used by SDK and tooling surfaces. */
|
|
28
|
+
export interface SceneCheckReport {
|
|
29
|
+
readonly version: 1;
|
|
30
|
+
readonly status: "valid" | "invalid";
|
|
31
|
+
readonly inputKind: SceneCheckInputKind | "unknown";
|
|
32
|
+
readonly source: "object" | "json-string";
|
|
33
|
+
readonly diagnostics: readonly ScenePlanDiagnostic[];
|
|
34
|
+
readonly requirements: readonly SceneCheckRequirement[];
|
|
35
|
+
readonly summary: SceneCheckSummary;
|
|
36
|
+
}
|
|
37
|
+
export declare function checkSceneInput(input: unknown, options?: SceneCheckOptions): SceneCheckReport;
|
|
38
|
+
//# sourceMappingURL=check-scene-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-scene-input.d.ts","sourceRoot":"","sources":["../../src/check/check-scene-input.ts"],"names":[],"mappings":"AAKA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAKL,KAAK,iBAAiB,EAEvB,MAAM,gBAAgB,CAAC;AAMxB,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC;IAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAYD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA+ClB"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { getSceneDocumentCapabilityUsages, normalizeSceneDocument, } from "@skenora/contracts";
|
|
2
|
+
import { createDiagnostic, finalizeDiagnostics, hasErrors, } from "../diagnostics/diagnostics.js";
|
|
3
|
+
import { SCENE_BLUEPRINT_SCHEMA, SCENE_PATCH_SCHEMA, } from "../model/types.js";
|
|
4
|
+
import { compileSceneBlueprint } from "../compilation/compile.js";
|
|
5
|
+
import { validateScenePatch } from "../patch/patch.js";
|
|
6
|
+
import { validateSceneBlueprint } from "../validation/validate.js";
|
|
7
|
+
import { validateNativeDocumentShape } from "../validation/validate.js";
|
|
8
|
+
const EMPTY_SUMMARY = Object.freeze({
|
|
9
|
+
resources: 0,
|
|
10
|
+
entities: 0,
|
|
11
|
+
materials: 0,
|
|
12
|
+
materialBindings: 0,
|
|
13
|
+
flows: 0,
|
|
14
|
+
operations: 0,
|
|
15
|
+
compiled: false,
|
|
16
|
+
});
|
|
17
|
+
export function checkSceneInput(input, options = {}) {
|
|
18
|
+
const parsed = parseInput(input);
|
|
19
|
+
if (!parsed.ok) {
|
|
20
|
+
return createReport("unknown", parsed.source, parsed.diagnostics, [], EMPTY_SUMMARY);
|
|
21
|
+
}
|
|
22
|
+
const detected = detectInputKind(parsed.value);
|
|
23
|
+
const requested = options.inputKind ?? "auto";
|
|
24
|
+
if (detected === "unknown" ||
|
|
25
|
+
(requested !== "auto" && requested !== detected)) {
|
|
26
|
+
const expected = requested === "auto" ? "a supported Skenora schema" : requested;
|
|
27
|
+
return createReport(detected, parsed.source, [
|
|
28
|
+
createDiagnostic({
|
|
29
|
+
code: "invalid-schema",
|
|
30
|
+
stage: "validate",
|
|
31
|
+
path: ["schema"],
|
|
32
|
+
message: `Expected ${expected} input`,
|
|
33
|
+
recoverable: false,
|
|
34
|
+
}),
|
|
35
|
+
], [], EMPTY_SUMMARY);
|
|
36
|
+
}
|
|
37
|
+
switch (detected) {
|
|
38
|
+
case "scene":
|
|
39
|
+
return checkNativeScene(parsed.value, parsed.source);
|
|
40
|
+
case "blueprint":
|
|
41
|
+
return checkBlueprint(parsed.value, parsed.source, options);
|
|
42
|
+
case "patch":
|
|
43
|
+
return checkPatch(parsed.value, parsed.source, options.context ?? {});
|
|
44
|
+
default:
|
|
45
|
+
return assertNever(detected);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function checkNativeScene(input, source) {
|
|
49
|
+
const normalized = normalizeSceneDocument(input);
|
|
50
|
+
const validation = validateNativeDocumentShape(normalized);
|
|
51
|
+
if (!validation.valid) {
|
|
52
|
+
return createReport("scene", source, validation.diagnostics, [], EMPTY_SUMMARY);
|
|
53
|
+
}
|
|
54
|
+
const document = normalized;
|
|
55
|
+
const requirements = dedupeRequirements(getSceneDocumentCapabilityUsages(document).map((usage) => ({
|
|
56
|
+
id: usage.id,
|
|
57
|
+
version: usage.version,
|
|
58
|
+
required: true,
|
|
59
|
+
})));
|
|
60
|
+
return createReport("scene", source, validation.diagnostics, requirements, {
|
|
61
|
+
id: document.id,
|
|
62
|
+
name: document.name,
|
|
63
|
+
resources: Object.keys(document.assets).length,
|
|
64
|
+
entities: Object.keys(document.entities).length,
|
|
65
|
+
materials: Object.keys(document.materials).length,
|
|
66
|
+
materialBindings: Object.keys(document.materialBindings).length,
|
|
67
|
+
flows: Object.keys(document.flows).length,
|
|
68
|
+
operations: 0,
|
|
69
|
+
compiled: true,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function checkBlueprint(input, source, options) {
|
|
73
|
+
const context = options.context ?? {};
|
|
74
|
+
const hasCapabilityContext = context.capabilities !== undefined ||
|
|
75
|
+
context.capabilityAvailability !== undefined;
|
|
76
|
+
const validationContext = hasCapabilityContext
|
|
77
|
+
? context
|
|
78
|
+
: { ...context, capabilities: readDeclaredCapabilities(input) };
|
|
79
|
+
const validation = validateSceneBlueprint(input, validationContext);
|
|
80
|
+
const blueprint = validation.normalized;
|
|
81
|
+
if (!blueprint) {
|
|
82
|
+
return createReport("blueprint", source, validation.diagnostics, [], EMPTY_SUMMARY);
|
|
83
|
+
}
|
|
84
|
+
const canCompile = validation.valid &&
|
|
85
|
+
options.compile !== false &&
|
|
86
|
+
(blueprint.requires.length === 0 || hasCapabilityContext) &&
|
|
87
|
+
(blueprint.resources.length === 0 ||
|
|
88
|
+
context.resourceBindings !== undefined);
|
|
89
|
+
const compilation = canCompile
|
|
90
|
+
? compileSceneBlueprint(blueprint, context)
|
|
91
|
+
: undefined;
|
|
92
|
+
const diagnostics = compilation?.diagnostics ?? validation.diagnostics;
|
|
93
|
+
return createReport("blueprint", source, diagnostics, blueprint.requires.map((requirement) => ({
|
|
94
|
+
id: requirement.id,
|
|
95
|
+
version: requirement.version,
|
|
96
|
+
required: requirement.required,
|
|
97
|
+
})), blueprintSummary(blueprint, compilation?.ok === true, compilation?.planHash));
|
|
98
|
+
}
|
|
99
|
+
function readDeclaredCapabilities(input) {
|
|
100
|
+
if (!isRecord(input) || !Array.isArray(input.requires))
|
|
101
|
+
return [];
|
|
102
|
+
return input.requires.flatMap((requirement) => isRecord(requirement) &&
|
|
103
|
+
typeof requirement.id === "string" &&
|
|
104
|
+
requirement.id.length > 0 &&
|
|
105
|
+
typeof requirement.version === "string" &&
|
|
106
|
+
requirement.version.length > 0
|
|
107
|
+
? [{ id: requirement.id, version: requirement.version }]
|
|
108
|
+
: []);
|
|
109
|
+
}
|
|
110
|
+
function checkPatch(input, source, context) {
|
|
111
|
+
const validation = validateScenePatch(input, context);
|
|
112
|
+
const patch = validation.normalized;
|
|
113
|
+
return createReport("patch", source, validation.diagnostics, [], patch ? patchSummary(patch) : EMPTY_SUMMARY);
|
|
114
|
+
}
|
|
115
|
+
function blueprintSummary(blueprint, compiled, planHash) {
|
|
116
|
+
return {
|
|
117
|
+
id: blueprint.scene.id,
|
|
118
|
+
name: blueprint.scene.name,
|
|
119
|
+
resources: blueprint.resources.length,
|
|
120
|
+
entities: blueprint.entities.length,
|
|
121
|
+
materials: blueprint.materials.length,
|
|
122
|
+
materialBindings: blueprint.materialBindings.length,
|
|
123
|
+
flows: blueprint.flows.length,
|
|
124
|
+
operations: 0,
|
|
125
|
+
compiled,
|
|
126
|
+
...(planHash === undefined ? {} : { planHash }),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function patchSummary(patch) {
|
|
130
|
+
return {
|
|
131
|
+
id: patch.target.sceneId,
|
|
132
|
+
resources: 0,
|
|
133
|
+
entities: 0,
|
|
134
|
+
materials: 0,
|
|
135
|
+
materialBindings: 0,
|
|
136
|
+
flows: 0,
|
|
137
|
+
operations: patch.operations.length,
|
|
138
|
+
compiled: false,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function createReport(inputKind, source, diagnostics, requirements, summary) {
|
|
142
|
+
const finalized = finalizeDiagnostics(diagnostics);
|
|
143
|
+
return Object.freeze({
|
|
144
|
+
version: 1,
|
|
145
|
+
status: hasErrors(finalized) ? "invalid" : "valid",
|
|
146
|
+
inputKind,
|
|
147
|
+
source,
|
|
148
|
+
diagnostics: finalized,
|
|
149
|
+
requirements: Object.freeze(dedupeRequirements(requirements)),
|
|
150
|
+
summary: Object.freeze({ ...summary }),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function dedupeRequirements(requirements) {
|
|
154
|
+
const byIdentity = new Map();
|
|
155
|
+
for (const requirement of requirements) {
|
|
156
|
+
const key = `${requirement.id}@${requirement.version}`;
|
|
157
|
+
const previous = byIdentity.get(key);
|
|
158
|
+
byIdentity.set(key, {
|
|
159
|
+
...requirement,
|
|
160
|
+
required: requirement.required || previous?.required === true,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
return [...byIdentity.values()].sort((left, right) => `${left.id}@${left.version}`.localeCompare(`${right.id}@${right.version}`));
|
|
164
|
+
}
|
|
165
|
+
function parseInput(input) {
|
|
166
|
+
if (typeof input !== "string")
|
|
167
|
+
return { ok: true, source: "object", value: input, diagnostics: [] };
|
|
168
|
+
try {
|
|
169
|
+
return {
|
|
170
|
+
ok: true,
|
|
171
|
+
source: "json-string",
|
|
172
|
+
value: JSON.parse(input),
|
|
173
|
+
diagnostics: [],
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return {
|
|
178
|
+
ok: false,
|
|
179
|
+
source: "json-string",
|
|
180
|
+
diagnostics: [
|
|
181
|
+
createDiagnostic({
|
|
182
|
+
code: "invalid-json",
|
|
183
|
+
stage: "parse",
|
|
184
|
+
path: [],
|
|
185
|
+
message: error instanceof Error ? error.message : "Invalid JSON",
|
|
186
|
+
recoverable: false,
|
|
187
|
+
}),
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function detectInputKind(input) {
|
|
193
|
+
if (!isRecord(input))
|
|
194
|
+
return "unknown";
|
|
195
|
+
if (input.schema === "skenora.scene")
|
|
196
|
+
return "scene";
|
|
197
|
+
if (input.schema === SCENE_BLUEPRINT_SCHEMA)
|
|
198
|
+
return "blueprint";
|
|
199
|
+
if (input.schema === SCENE_PATCH_SCHEMA)
|
|
200
|
+
return "patch";
|
|
201
|
+
return "unknown";
|
|
202
|
+
}
|
|
203
|
+
function isRecord(value) {
|
|
204
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
205
|
+
}
|
|
206
|
+
function assertNever(value) {
|
|
207
|
+
throw new Error(`Unsupported check input kind: ${String(value)}`);
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=check-scene-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-scene-input.js","sourceRoot":"","sources":["../../src/check/check-scene-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type SceneBlueprintCompilationResult } from "../diagnostics/diagnostics.js";
|
|
2
|
+
import type { ScenePlanContext } from "../model/types.js";
|
|
3
|
+
export declare function compileSceneBlueprint(input: unknown, context?: ScenePlanContext): SceneBlueprintCompilationResult;
|
|
4
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/compilation/compile.ts"],"names":[],"mappings":"AAYA,OAAO,EAIL,KAAK,+BAA+B,EAGrC,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAKV,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AAaxB,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,gBAAqB,GAC7B,+BAA+B,CAsHjC"}
|