@kumwe/studio-core 0.1.0-alpha.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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -0
  3. package/dist/canonical.d.ts +20 -0
  4. package/dist/canonical.d.ts.map +1 -0
  5. package/dist/canonical.js +100 -0
  6. package/dist/canonical.js.map +1 -0
  7. package/dist/clone.d.ts +2 -0
  8. package/dist/clone.d.ts.map +1 -0
  9. package/dist/clone.js +4 -0
  10. package/dist/clone.js.map +1 -0
  11. package/dist/commands.d.ts +12 -0
  12. package/dist/commands.d.ts.map +1 -0
  13. package/dist/commands.js +679 -0
  14. package/dist/commands.js.map +1 -0
  15. package/dist/contributions.d.ts +65 -0
  16. package/dist/contributions.d.ts.map +1 -0
  17. package/dist/contributions.js +302 -0
  18. package/dist/contributions.js.map +1 -0
  19. package/dist/entry-commands.d.ts +3 -0
  20. package/dist/entry-commands.d.ts.map +1 -0
  21. package/dist/entry-commands.js +36 -0
  22. package/dist/entry-commands.js.map +1 -0
  23. package/dist/history.d.ts +13 -0
  24. package/dist/history.d.ts.map +1 -0
  25. package/dist/history.js +63 -0
  26. package/dist/history.js.map +1 -0
  27. package/dist/index.d.ts +15 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +15 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/migrations.d.ts +47 -0
  32. package/dist/migrations.d.ts.map +1 -0
  33. package/dist/migrations.js +83 -0
  34. package/dist/migrations.js.map +1 -0
  35. package/dist/model-commands.d.ts +3 -0
  36. package/dist/model-commands.d.ts.map +1 -0
  37. package/dist/model-commands.js +21 -0
  38. package/dist/model-commands.js.map +1 -0
  39. package/dist/negotiation.d.ts +23 -0
  40. package/dist/negotiation.d.ts.map +1 -0
  41. package/dist/negotiation.js +65 -0
  42. package/dist/negotiation.js.map +1 -0
  43. package/dist/recipes.d.ts +15 -0
  44. package/dist/recipes.d.ts.map +1 -0
  45. package/dist/recipes.js +34 -0
  46. package/dist/recipes.js.map +1 -0
  47. package/dist/registry.d.ts +17 -0
  48. package/dist/registry.d.ts.map +1 -0
  49. package/dist/registry.js +56 -0
  50. package/dist/registry.js.map +1 -0
  51. package/dist/schema-profile.d.ts +9 -0
  52. package/dist/schema-profile.d.ts.map +1 -0
  53. package/dist/schema-profile.js +387 -0
  54. package/dist/schema-profile.js.map +1 -0
  55. package/dist/semver.d.ts +20 -0
  56. package/dist/semver.d.ts.map +1 -0
  57. package/dist/semver.js +128 -0
  58. package/dist/semver.js.map +1 -0
  59. package/dist/session.d.ts +33 -0
  60. package/dist/session.d.ts.map +1 -0
  61. package/dist/session.js +113 -0
  62. package/dist/session.js.map +1 -0
  63. package/dist/validation.d.ts +13 -0
  64. package/dist/validation.d.ts.map +1 -0
  65. package/dist/validation.js +398 -0
  66. package/dist/validation.js.map +1 -0
  67. package/package.json +40 -0
@@ -0,0 +1,113 @@
1
+ import { StudioCommandError } from './commands.js';
2
+ import { StudioHistory } from './history.js';
3
+ /**
4
+ * A deterministic editing session over one Blueprint document: bounded
5
+ * history, an explicit selection model, and the session-level guards the
6
+ * command contract requires before any reducer runs. Session generation,
7
+ * read-only state, and expected-revision checks fail closed; a rejected
8
+ * command changes neither the document nor the selection.
9
+ */
10
+ export class StudioSession {
11
+ #history;
12
+ #sessionGeneration;
13
+ #sessionState;
14
+ #savedRevision;
15
+ #savedStateVersion = 0;
16
+ #selection = [];
17
+ constructor(options) {
18
+ this.#history = new StudioHistory(options.document, options.maximumHistoryEntries ?? 100);
19
+ this.#sessionGeneration = options.sessionGeneration;
20
+ this.#sessionState = options.sessionState;
21
+ this.#savedRevision = options.document.revision;
22
+ }
23
+ get canRedo() {
24
+ return this.#history.canRedo;
25
+ }
26
+ get canUndo() {
27
+ return this.#history.canUndo;
28
+ }
29
+ get dirty() {
30
+ return this.#history.stateVersion !== this.#savedStateVersion;
31
+ }
32
+ get document() {
33
+ return this.#history.current;
34
+ }
35
+ get selection() {
36
+ return [...this.#selection];
37
+ }
38
+ get sessionState() {
39
+ return this.#sessionState;
40
+ }
41
+ get stateVersion() {
42
+ return this.#history.stateVersion;
43
+ }
44
+ execute(command) {
45
+ if (this.#sessionState === 'read-only') {
46
+ throw new StudioCommandError('read-only-session', 'A read-only session never applies a persistent command.');
47
+ }
48
+ if (command.sessionGeneration !== this.#sessionGeneration) {
49
+ throw new StudioCommandError('stale-generation', `Command generation ${command.sessionGeneration} does not match the active session generation.`);
50
+ }
51
+ if (command.expectedRevision !== undefined &&
52
+ command.expectedRevision !== this.#savedRevision) {
53
+ throw new StudioCommandError('stale-state', `Command expects revision ${command.expectedRevision}, but the session holds ${this.#savedRevision}.`);
54
+ }
55
+ const next = this.#history.execute(command);
56
+ this.#pruneSelection(next);
57
+ return next;
58
+ }
59
+ markSaved(revision) {
60
+ this.#savedRevision = revision;
61
+ this.#savedStateVersion = this.#history.stateVersion;
62
+ }
63
+ get savedRevision() {
64
+ return this.#savedRevision;
65
+ }
66
+ select(nodeIds) {
67
+ const document = this.#history.current;
68
+ const unique = [];
69
+ for (const nodeId of nodeIds) {
70
+ if (unique.includes(nodeId)) {
71
+ continue;
72
+ }
73
+ if (!containsNode(document.roots, nodeId)) {
74
+ throw new StudioCommandError('node-not-found', `Node ${nodeId} cannot be selected because it is not in the document.`);
75
+ }
76
+ unique.push(nodeId);
77
+ }
78
+ this.#selection = unique;
79
+ return this.selection;
80
+ }
81
+ clearSelection() {
82
+ this.#selection = [];
83
+ }
84
+ undo() {
85
+ const document = this.#history.undo();
86
+ this.#pruneSelection(document);
87
+ return document;
88
+ }
89
+ redo() {
90
+ const document = this.#history.redo();
91
+ this.#pruneSelection(document);
92
+ return document;
93
+ }
94
+ #pruneSelection(document) {
95
+ if (this.#selection.length > 0) {
96
+ this.#selection = this.#selection.filter((nodeId) => containsNode(document.roots, nodeId));
97
+ }
98
+ }
99
+ }
100
+ function containsNode(nodes, nodeId) {
101
+ for (const node of nodes) {
102
+ if (node.id === nodeId) {
103
+ return true;
104
+ }
105
+ for (const children of Object.values(node.slots)) {
106
+ if (containsNode(children, nodeId)) {
107
+ return true;
108
+ }
109
+ }
110
+ }
111
+ return false;
112
+ }
113
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAS7C;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACf,QAAQ,CAAgB;IACxB,kBAAkB,CAAW;IAC7B,aAAa,CAA2B;IACjD,cAAc,CAAW;IACzB,kBAAkB,GAAG,CAAC,CAAC;IACvB,UAAU,GAAa,EAAE,CAAC;IAE1B,YAAmB,OAAuC;QACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;QAC1F,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAClD,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,kBAAkB,CAAC;IAChE,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,IAAW,SAAS;QAClB,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;IACpC,CAAC;IAEM,OAAO,CAAC,OAAyB;QACtC,IAAI,IAAI,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;YACvC,MAAM,IAAI,kBAAkB,CAC1B,mBAAmB,EACnB,yDAAyD,CAC1D,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1D,MAAM,IAAI,kBAAkB,CAC1B,kBAAkB,EAClB,sBAAsB,OAAO,CAAC,iBAAiB,gDAAgD,CAChG,CAAC;QACJ,CAAC;QACD,IACE,OAAO,CAAC,gBAAgB,KAAK,SAAS;YACtC,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC,cAAc,EAChD,CAAC;YACD,MAAM,IAAI,kBAAkB,CAC1B,aAAa,EACb,4BAA4B,OAAO,CAAC,gBAAgB,2BAA2B,IAAI,CAAC,cAAc,GAAG,CACtG,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,SAAS,CAAC,QAAkB;QACjC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;IACvD,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,OAA0B;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACvC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,kBAAkB,CAC1B,gBAAgB,EAChB,QAAQ,MAAM,wDAAwD,CACvE,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAEM,IAAI;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,IAAI;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,eAAe,CAAC,QAA2B;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF;AAED,SAAS,YAAY,CAAC,KAA+B,EAAE,MAAc;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type StudioDiagnostic } from '@kumwe/studio-protocol';
2
+ import type { BlockRegistry } from './registry.js';
3
+ export interface BlueprintValidationOptions {
4
+ fieldPaths?: ReadonlySet<string>;
5
+ maximumDepth?: number;
6
+ maximumNodes?: number;
7
+ }
8
+ export interface BlueprintValidationResult {
9
+ diagnostics: StudioDiagnostic[];
10
+ valid: boolean;
11
+ }
12
+ export declare function validateBlueprint(document: unknown, registry: BlockRegistry, options?: BlueprintValidationOptions): BlueprintValidationResult;
13
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;CAChB;AAgCD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,GAAE,0BAA+B,GACvC,yBAAyB,CA+G3B"}
@@ -0,0 +1,398 @@
1
+ import { Ajv2020 } from 'ajv/dist/2020.js';
2
+ import { blueprintSchema, commonSchema, } from '@kumwe/studio-protocol';
3
+ const canonicalAjv = new Ajv2020({ allErrors: true, strict: true });
4
+ canonicalAjv.addSchema(commonSchema);
5
+ const validateBlueprintSchema = canonicalAjv.compile(blueprintSchema);
6
+ const propertyValidators = new WeakMap();
7
+ const MAX_BLUEPRINT_JSON_BYTES = 16 * 1_024 * 1_024;
8
+ const MAX_BLUEPRINT_JSON_DEPTH = 64;
9
+ const MAX_BLUEPRINT_JSON_VALUES = 1_000_000;
10
+ const MAX_JSON_CONTAINER_ENTRIES = 10_000;
11
+ export function validateBlueprint(document, registry, options = {}) {
12
+ const diagnostics = [];
13
+ const maximumDepth = validationLimit(options.maximumDepth, 32, 'maximumDepth');
14
+ const maximumNodes = validationLimit(options.maximumNodes, 5_000, 'maximumNodes');
15
+ const nodePreflightDiagnostics = preflightBlueprintNodes(document, maximumDepth, maximumNodes);
16
+ if (nodePreflightDiagnostics.length > 0) {
17
+ return { diagnostics: nodePreflightDiagnostics, valid: false };
18
+ }
19
+ const valuePreflightDiagnostic = preflightBlueprintJson(document);
20
+ if (valuePreflightDiagnostic !== undefined) {
21
+ return { diagnostics: [valuePreflightDiagnostic], valid: false };
22
+ }
23
+ if (!validateBlueprintSchema(document)) {
24
+ diagnostics.push(...schemaDiagnostics(validateBlueprintSchema.errors));
25
+ return { diagnostics, valid: false };
26
+ }
27
+ const blueprint = document;
28
+ const identifiers = new Set();
29
+ const blockLocks = indexBlockLocks(blueprint.dependencyLock.blocks, diagnostics);
30
+ let nodeCount = 0;
31
+ const stack = blueprint.roots.map((node) => ({ depth: 1, node })).reverse();
32
+ while (stack.length > 0) {
33
+ const frame = stack.pop();
34
+ if (frame === undefined) {
35
+ break;
36
+ }
37
+ const { depth, node } = frame;
38
+ nodeCount += 1;
39
+ if (nodeCount > maximumNodes) {
40
+ break;
41
+ }
42
+ if (depth > maximumDepth) {
43
+ diagnostics.push(diagnostic('maximum-depth', `Node depth exceeds the configured limit of ${maximumDepth}.`, node.id));
44
+ continue;
45
+ }
46
+ if (identifiers.has(node.id)) {
47
+ diagnostics.push(diagnostic('duplicate-node-id', `Node identifier ${node.id} is not unique.`, node.id));
48
+ }
49
+ identifiers.add(node.id);
50
+ const registration = registry.resolveRegistration(node.type, node.version);
51
+ if (registration === undefined) {
52
+ diagnostics.push(diagnostic('block-unavailable', `Block ${node.type}@${node.version} is not registered.`, node.id));
53
+ }
54
+ else {
55
+ validateBlockLock(node, registration.definition, registration.verifiedIntegrity, blockLocks.get(blockKey(node.type, node.version)), diagnostics);
56
+ validateNodeProperties(node, registration.definition, registry, diagnostics);
57
+ validateSlots(node, registration.definition, diagnostics);
58
+ }
59
+ validateBindings(node, options.fieldPaths, diagnostics);
60
+ const childCollections = Object.values(node.slots);
61
+ for (let collectionIndex = childCollections.length - 1; collectionIndex >= 0; collectionIndex -= 1) {
62
+ const children = childCollections[collectionIndex];
63
+ if (children === undefined) {
64
+ continue;
65
+ }
66
+ for (let childIndex = children.length - 1; childIndex >= 0; childIndex -= 1) {
67
+ const child = children[childIndex];
68
+ if (child !== undefined) {
69
+ stack.push({ depth: depth + 1, node: child });
70
+ }
71
+ }
72
+ }
73
+ }
74
+ if (nodeCount > maximumNodes) {
75
+ diagnostics.push(diagnostic('maximum-nodes', `Blueprint contains more than the configured limit of ${maximumNodes} nodes.`));
76
+ }
77
+ return {
78
+ diagnostics,
79
+ valid: diagnostics.every((entry) => entry.severity !== 'blocking' && entry.severity !== 'error'),
80
+ };
81
+ }
82
+ function preflightBlueprintNodes(document, maximumDepth, maximumNodes) {
83
+ if (!isRecord(document) || !Array.isArray(document.roots)) {
84
+ return [];
85
+ }
86
+ const roots = document.roots;
87
+ if (roots.length > maximumNodes) {
88
+ return [
89
+ diagnostic('maximum-nodes', `Blueprint contains more than the configured limit of ${maximumNodes} nodes.`),
90
+ ];
91
+ }
92
+ const seen = new WeakSet();
93
+ let scheduled = roots.length;
94
+ const stack = roots.map((value) => ({ depth: 1, value })).reverse();
95
+ while (stack.length > 0) {
96
+ const frame = stack.pop();
97
+ if (frame === undefined || !isRecord(frame.value)) {
98
+ continue;
99
+ }
100
+ if (seen.has(frame.value)) {
101
+ return [diagnostic('cyclic-blueprint', 'Blueprint nodes must form an acyclic JSON tree.')];
102
+ }
103
+ seen.add(frame.value);
104
+ if (frame.depth > maximumDepth) {
105
+ return [
106
+ diagnostic('maximum-depth', `Node depth exceeds the configured limit of ${maximumDepth}.`, typeof frame.value.id === 'string' ? frame.value.id : undefined),
107
+ ];
108
+ }
109
+ if (!isRecord(frame.value.slots)) {
110
+ continue;
111
+ }
112
+ for (const children of Object.values(frame.value.slots)) {
113
+ if (!Array.isArray(children)) {
114
+ continue;
115
+ }
116
+ scheduled += children.length;
117
+ if (scheduled > maximumNodes) {
118
+ return [
119
+ diagnostic('maximum-nodes', `Blueprint contains more than the configured limit of ${maximumNodes} nodes.`),
120
+ ];
121
+ }
122
+ for (let index = children.length - 1; index >= 0; index -= 1) {
123
+ stack.push({ depth: frame.depth + 1, value: children[index] });
124
+ }
125
+ }
126
+ }
127
+ return [];
128
+ }
129
+ function preflightBlueprintJson(document) {
130
+ const seen = new WeakSet();
131
+ const stack = [{ depth: 0, value: document }];
132
+ let approximateBytes = 0;
133
+ let valueCount = 0;
134
+ while (stack.length > 0) {
135
+ const frame = stack.pop();
136
+ if (frame === undefined) {
137
+ break;
138
+ }
139
+ valueCount += 1;
140
+ if (valueCount > MAX_BLUEPRINT_JSON_VALUES) {
141
+ return diagnostic('maximum-json-values', `Blueprint exceeds the fixed alpha limit of ${MAX_BLUEPRINT_JSON_VALUES} JSON values.`);
142
+ }
143
+ if (frame.depth > MAX_BLUEPRINT_JSON_DEPTH) {
144
+ return diagnostic('maximum-value-depth', `Blueprint JSON value depth exceeds the fixed alpha limit of ${MAX_BLUEPRINT_JSON_DEPTH}.`);
145
+ }
146
+ const { value } = frame;
147
+ if (value === null) {
148
+ approximateBytes += 4;
149
+ }
150
+ else if (typeof value === 'boolean') {
151
+ approximateBytes += value ? 4 : 5;
152
+ }
153
+ else if (typeof value === 'number' && Number.isFinite(value)) {
154
+ approximateBytes += String(value).length;
155
+ }
156
+ else if (typeof value === 'string') {
157
+ approximateBytes += jsonStringByteLength(value);
158
+ }
159
+ else if (Array.isArray(value)) {
160
+ if (!isDenseJsonArray(value)) {
161
+ return diagnostic('non-json-value', 'Blueprint arrays must be dense JSON arrays.');
162
+ }
163
+ if (value.length > MAX_JSON_CONTAINER_ENTRIES) {
164
+ return diagnostic('maximum-array-items', `Blueprint arrays cannot exceed ${MAX_JSON_CONTAINER_ENTRIES} items.`);
165
+ }
166
+ if (seen.has(value)) {
167
+ return diagnostic('cyclic-blueprint', 'Blueprint must be an acyclic JSON document.');
168
+ }
169
+ seen.add(value);
170
+ approximateBytes += value.length + 2;
171
+ for (let index = value.length - 1; index >= 0; index -= 1) {
172
+ stack.push({ depth: frame.depth + 1, value: value[index] });
173
+ }
174
+ }
175
+ else if (isJsonRecord(value)) {
176
+ if (seen.has(value)) {
177
+ return diagnostic('cyclic-blueprint', 'Blueprint must be an acyclic JSON document.');
178
+ }
179
+ seen.add(value);
180
+ const entries = Object.entries(value);
181
+ if (entries.length > MAX_JSON_CONTAINER_ENTRIES) {
182
+ return diagnostic('maximum-object-properties', `Blueprint objects cannot exceed ${MAX_JSON_CONTAINER_ENTRIES} properties.`);
183
+ }
184
+ approximateBytes += entries.length + 2;
185
+ for (let index = entries.length - 1; index >= 0; index -= 1) {
186
+ const entry = entries[index];
187
+ if (entry === undefined) {
188
+ continue;
189
+ }
190
+ const [key, child] = entry;
191
+ if (!isSafeJsonMemberName(key)) {
192
+ return diagnostic('unsafe-json-member', 'Blueprint contains an unsafe JSON object member name.');
193
+ }
194
+ approximateBytes += jsonStringByteLength(key) + 1;
195
+ stack.push({ depth: frame.depth + 1, value: child });
196
+ }
197
+ }
198
+ else {
199
+ return diagnostic('non-json-value', 'Blueprint must contain only JSON-compatible values.');
200
+ }
201
+ if (approximateBytes > MAX_BLUEPRINT_JSON_BYTES) {
202
+ return diagnostic('maximum-json-bytes', `Blueprint exceeds the fixed alpha limit of ${MAX_BLUEPRINT_JSON_BYTES} encoded bytes.`);
203
+ }
204
+ }
205
+ return undefined;
206
+ }
207
+ function isDenseJsonArray(value) {
208
+ if (Object.getPrototypeOf(value) !== Array.prototype ||
209
+ Object.getOwnPropertySymbols(value).length) {
210
+ return false;
211
+ }
212
+ const ownNames = Object.getOwnPropertyNames(value);
213
+ return (ownNames.length === value.length + 1 &&
214
+ ownNames[value.length] === 'length' &&
215
+ ownNames.slice(0, -1).every((name, index) => name === String(index)));
216
+ }
217
+ function isJsonRecord(value) {
218
+ if (!isRecord(value) || Object.getOwnPropertySymbols(value).length > 0) {
219
+ return false;
220
+ }
221
+ const prototype = Object.getPrototypeOf(value);
222
+ if (prototype !== Object.prototype && prototype !== null) {
223
+ return false;
224
+ }
225
+ return Object.getOwnPropertyNames(value).length === Object.keys(value).length;
226
+ }
227
+ function isSafeJsonMemberName(value) {
228
+ if (value.length === 0 ||
229
+ value.length > 200 ||
230
+ value === '__proto__' ||
231
+ value === 'prototype' ||
232
+ value === 'constructor') {
233
+ return false;
234
+ }
235
+ for (let index = 0; index < value.length; index += 1) {
236
+ const code = value.charCodeAt(index);
237
+ if (code <= 0x1f || code === 0x7f) {
238
+ return false;
239
+ }
240
+ }
241
+ return true;
242
+ }
243
+ function jsonStringByteLength(value) {
244
+ let bytes = 2;
245
+ for (let index = 0; index < value.length; index += 1) {
246
+ const code = value.charCodeAt(index);
247
+ if (code <= 0x1f) {
248
+ bytes += 6;
249
+ }
250
+ else if (code === 0x22 || code === 0x5c) {
251
+ bytes += 2;
252
+ }
253
+ else if (code <= 0x7f) {
254
+ bytes += 1;
255
+ }
256
+ else if (code <= 0x7ff) {
257
+ bytes += 2;
258
+ }
259
+ else if (code >= 0xd800 && code <= 0xdbff) {
260
+ const next = value.charCodeAt(index + 1);
261
+ if (next >= 0xdc00 && next <= 0xdfff) {
262
+ bytes += 4;
263
+ index += 1;
264
+ }
265
+ else {
266
+ bytes += 3;
267
+ }
268
+ }
269
+ else {
270
+ bytes += 3;
271
+ }
272
+ }
273
+ return bytes;
274
+ }
275
+ function validationLimit(value, fallback, name) {
276
+ const result = value ?? fallback;
277
+ if (!Number.isInteger(result) || result < 1) {
278
+ throw new RangeError(`${name} must be a positive integer.`);
279
+ }
280
+ return result;
281
+ }
282
+ function isRecord(value) {
283
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
284
+ }
285
+ function schemaDiagnostics(errors) {
286
+ return (errors ?? []).map((error) => diagnostic(`schema-${error.keyword}`, error.message ?? 'Blueprint does not satisfy its schema.', undefined, error.instancePath));
287
+ }
288
+ function validateNodeProperties(node, definition, registry, diagnostics) {
289
+ const key = `${definition.type}@${definition.version}`;
290
+ let cache = propertyValidators.get(registry);
291
+ if (cache === undefined) {
292
+ cache = {
293
+ ajv: new Ajv2020({ addUsedSchema: false, allErrors: true, strict: true }),
294
+ validators: new Map(),
295
+ };
296
+ propertyValidators.set(registry, cache);
297
+ }
298
+ let validator = cache.validators.get(key);
299
+ if (validator === undefined) {
300
+ const compiled = cache.ajv.compile(definition.propertySchema);
301
+ cache.validators.set(key, compiled);
302
+ validator = compiled;
303
+ }
304
+ if (!validator(node.properties)) {
305
+ diagnostics.push(...schemaDiagnostics(validator.errors).map((entry) => ({
306
+ ...entry,
307
+ code: `studio.validation/block-properties-${entry.code.split('/').at(-1) ?? 'invalid'}`,
308
+ location: { ...entry.location, nodeId: node.id },
309
+ })));
310
+ }
311
+ }
312
+ function indexBlockLocks(locks, diagnostics) {
313
+ const indexed = new Map();
314
+ for (const lock of locks) {
315
+ const key = blockKey(lock.type, lock.version);
316
+ if (indexed.has(key)) {
317
+ diagnostics.push(diagnostic('block-lock-duplicate', `Blueprint dependency lock repeats block ${lock.type}@${lock.version}.`));
318
+ }
319
+ else {
320
+ indexed.set(key, lock);
321
+ }
322
+ }
323
+ return indexed;
324
+ }
325
+ function validateBlockLock(node, definition, verifiedIntegrity, lock, diagnostics) {
326
+ if (lock === undefined) {
327
+ diagnostics.push(diagnostic('block-lock-missing', `Block ${node.type}@${node.version} is absent from the Blueprint dependency lock.`, node.id));
328
+ return;
329
+ }
330
+ if (lock.revision !== definition.revision) {
331
+ diagnostics.push(diagnostic('block-lock-revision-mismatch', `Block ${node.type}@${node.version} resolves to revision ${definition.revision}, not locked revision ${lock.revision}.`, node.id));
332
+ }
333
+ if (lock.integrity !== undefined && verifiedIntegrity === undefined) {
334
+ diagnostics.push(diagnostic('block-lock-integrity-unverified', `Block ${node.type}@${node.version} has a locked integrity value that the registry cannot verify.`, node.id));
335
+ }
336
+ else if (lock.integrity !== undefined && lock.integrity !== verifiedIntegrity) {
337
+ diagnostics.push(diagnostic('block-lock-integrity-mismatch', `Block ${node.type}@${node.version} does not match its locked integrity value.`, node.id));
338
+ }
339
+ }
340
+ function blockKey(type, version) {
341
+ return `${type}@${version}`;
342
+ }
343
+ function validateSlots(node, definition, diagnostics) {
344
+ const slots = new Map(definition.slots.map((slot) => [slot.id, slot]));
345
+ for (const [slotName, children] of Object.entries(node.slots)) {
346
+ const slot = slots.get(slotName);
347
+ if (slot === undefined) {
348
+ diagnostics.push(diagnostic('slot-unknown', `Slot ${slotName} is not declared by ${node.type}.`, node.id));
349
+ continue;
350
+ }
351
+ if (children.length > slot.maximum) {
352
+ diagnostics.push(diagnostic('slot-maximum', `Slot ${slotName} accepts at most ${slot.maximum} children.`, node.id));
353
+ }
354
+ for (const child of children) {
355
+ if (slot.accepts.types !== undefined && !slot.accepts.types.includes(child.type)) {
356
+ diagnostics.push(diagnostic('slot-rejects-type', `Slot ${slotName} does not accept ${child.type}.`, child.id));
357
+ }
358
+ }
359
+ }
360
+ for (const slot of slots.values()) {
361
+ const count = Object.hasOwn(node.slots, slot.id) ? (node.slots[slot.id]?.length ?? 0) : 0;
362
+ if (count < slot.minimum) {
363
+ diagnostics.push(diagnostic('slot-minimum', `Slot ${slot.id} requires at least ${slot.minimum} children.`, node.id));
364
+ }
365
+ }
366
+ }
367
+ function validateBindings(node, fieldPaths, diagnostics) {
368
+ if (fieldPaths === undefined) {
369
+ return;
370
+ }
371
+ for (const binding of Object.values(node.bindings)) {
372
+ if (binding.source.kind !== 'entry-field') {
373
+ continue;
374
+ }
375
+ const path = binding.source.fieldPath.join('.');
376
+ if (!fieldPaths.has(path)) {
377
+ diagnostics.push(diagnostic('field-unavailable', `Field ${path} is not available to this Studio configuration.`, node.id));
378
+ }
379
+ }
380
+ }
381
+ function diagnostic(name, message, nodeId, jsonPointer) {
382
+ const result = {
383
+ code: `studio.validation/${name}`,
384
+ message: { defaultMessage: message, key: `studio.validation/${name}` },
385
+ severity: 'error',
386
+ };
387
+ if (nodeId !== undefined || jsonPointer !== undefined) {
388
+ result.location = {};
389
+ if (nodeId !== undefined) {
390
+ result.location.nodeId = nodeId;
391
+ }
392
+ if (jsonPointer !== undefined) {
393
+ result.location.jsonPointer = jsonPointer;
394
+ }
395
+ }
396
+ return result;
397
+ }
398
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@kumwe/studio-core",
3
+ "version": "0.1.0-alpha.2",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/kumwe/studio.git",
7
+ "directory": "packages/core"
8
+ },
9
+ "homepage": "https://github.com/kumwe/studio/tree/main/packages/core#readme",
10
+ "bugs": "https://github.com/kumwe/studio/issues",
11
+ "description": "Framework-neutral Studio registry, validation, command, and history engine.",
12
+ "type": "module",
13
+ "sideEffects": false,
14
+ "files": [
15
+ "LICENSE",
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "scripts": {
26
+ "build": "tsc -b"
27
+ },
28
+ "dependencies": {
29
+ "@kumwe/studio-protocol": "0.1.0-alpha.2",
30
+ "ajv": "8.20.0"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public",
34
+ "provenance": true
35
+ },
36
+ "license": "MIT",
37
+ "engines": {
38
+ "node": ">=24.0.0"
39
+ }
40
+ }