@miadi/ncp-story-studio 0.1.0

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 (126) hide show
  1. package/LICENSE +21 -0
  2. package/PHASES.md +160 -0
  3. package/README.md +140 -0
  4. package/assets/PROVENANCE.json +5 -0
  5. package/assets/examples/PROVENANCE.json +26 -0
  6. package/assets/examples/anora.json +228 -0
  7. package/assets/examples/example-story.json +112 -0
  8. package/assets/examples/the-shawshank-redemption.json +2068 -0
  9. package/assets/examples/weaver_of_words__the_catalyst_of_change_251101.json +1132 -0
  10. package/assets/ncp-schema.json +794 -0
  11. package/assets/terminology.json +2919 -0
  12. package/dist/agents/adapter.d.ts +60 -0
  13. package/dist/agents/adapter.d.ts.map +1 -0
  14. package/dist/agents/adapter.js +69 -0
  15. package/dist/agents/adapter.js.map +1 -0
  16. package/dist/agents/context.d.ts +19 -0
  17. package/dist/agents/context.d.ts.map +1 -0
  18. package/dist/agents/context.js +49 -0
  19. package/dist/agents/context.js.map +1 -0
  20. package/dist/agents/index.d.ts +5 -0
  21. package/dist/agents/index.d.ts.map +1 -0
  22. package/dist/agents/index.js +7 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/links.d.ts +41 -0
  25. package/dist/agents/links.d.ts.map +1 -0
  26. package/dist/agents/links.js +76 -0
  27. package/dist/agents/links.js.map +1 -0
  28. package/dist/agents/personas.d.ts +16 -0
  29. package/dist/agents/personas.d.ts.map +1 -0
  30. package/dist/agents/personas.js +34 -0
  31. package/dist/agents/personas.js.map +1 -0
  32. package/dist/fixtures/index.d.ts +27 -0
  33. package/dist/fixtures/index.d.ts.map +1 -0
  34. package/dist/fixtures/index.js +69 -0
  35. package/dist/fixtures/index.js.map +1 -0
  36. package/dist/graph/index.d.ts +60 -0
  37. package/dist/graph/index.d.ts.map +1 -0
  38. package/dist/graph/index.js +97 -0
  39. package/dist/graph/index.js.map +1 -0
  40. package/dist/graph/react/index.d.ts +2 -0
  41. package/dist/graph/react/index.d.ts.map +1 -0
  42. package/dist/graph/react/index.js +5 -0
  43. package/dist/graph/react/index.js.map +1 -0
  44. package/dist/graph/react/story-graph.d.ts +17 -0
  45. package/dist/graph/react/story-graph.d.ts.map +1 -0
  46. package/dist/graph/react/story-graph.js +26 -0
  47. package/dist/graph/react/story-graph.js.map +1 -0
  48. package/dist/graph/tones.d.ts +36 -0
  49. package/dist/graph/tones.d.ts.map +1 -0
  50. package/dist/graph/tones.js +38 -0
  51. package/dist/graph/tones.js.map +1 -0
  52. package/dist/index.d.ts +33 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +24 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/schema/constants.d.ts +3 -0
  57. package/dist/schema/constants.d.ts.map +1 -0
  58. package/dist/schema/constants.js +3 -0
  59. package/dist/schema/constants.js.map +1 -0
  60. package/dist/schema/extensions.d.ts +14 -0
  61. package/dist/schema/extensions.d.ts.map +1 -0
  62. package/dist/schema/extensions.js +61 -0
  63. package/dist/schema/extensions.js.map +1 -0
  64. package/dist/schema/generated-terms.d.ts +7 -0
  65. package/dist/schema/generated-terms.d.ts.map +1 -0
  66. package/dist/schema/generated-terms.js +518 -0
  67. package/dist/schema/generated-terms.js.map +1 -0
  68. package/dist/schema/generated.d.ts +64 -0
  69. package/dist/schema/generated.d.ts.map +1 -0
  70. package/dist/schema/generated.js +497 -0
  71. package/dist/schema/generated.js.map +1 -0
  72. package/dist/schema/index.d.ts +48 -0
  73. package/dist/schema/index.d.ts.map +1 -0
  74. package/dist/schema/index.js +92 -0
  75. package/dist/schema/index.js.map +1 -0
  76. package/dist/schema/normalize.d.ts +20 -0
  77. package/dist/schema/normalize.d.ts.map +1 -0
  78. package/dist/schema/normalize.js +88 -0
  79. package/dist/schema/normalize.js.map +1 -0
  80. package/dist/schema/read.d.ts +31 -0
  81. package/dist/schema/read.d.ts.map +1 -0
  82. package/dist/schema/read.js +640 -0
  83. package/dist/schema/read.js.map +1 -0
  84. package/dist/schema/terms.d.ts +11 -0
  85. package/dist/schema/terms.d.ts.map +1 -0
  86. package/dist/schema/terms.js +80 -0
  87. package/dist/schema/terms.js.map +1 -0
  88. package/dist/schema/types.d.ts +140 -0
  89. package/dist/schema/types.d.ts.map +1 -0
  90. package/dist/schema/types.js +2 -0
  91. package/dist/schema/types.js.map +1 -0
  92. package/dist/schema/validate.d.ts +54 -0
  93. package/dist/schema/validate.d.ts.map +1 -0
  94. package/dist/schema/validate.js +490 -0
  95. package/dist/schema/validate.js.map +1 -0
  96. package/dist/store/index.d.ts +76 -0
  97. package/dist/store/index.d.ts.map +1 -0
  98. package/dist/store/index.js +96 -0
  99. package/dist/store/index.js.map +1 -0
  100. package/dist/store/json.d.ts +35 -0
  101. package/dist/store/json.d.ts.map +1 -0
  102. package/dist/store/json.js +192 -0
  103. package/dist/store/json.js.map +1 -0
  104. package/dist/store/mutations.d.ts +45 -0
  105. package/dist/store/mutations.d.ts.map +1 -0
  106. package/dist/store/mutations.js +181 -0
  107. package/dist/store/mutations.js.map +1 -0
  108. package/dist/store/neon.d.ts +42 -0
  109. package/dist/store/neon.d.ts.map +1 -0
  110. package/dist/store/neon.js +167 -0
  111. package/dist/store/neon.js.map +1 -0
  112. package/dist/terminology/generated.d.ts +3 -0
  113. package/dist/terminology/generated.d.ts.map +1 -0
  114. package/dist/terminology/generated.js +2923 -0
  115. package/dist/terminology/generated.js.map +1 -0
  116. package/dist/terminology/index.d.ts +20 -0
  117. package/dist/terminology/index.d.ts.map +1 -0
  118. package/dist/terminology/index.js +71 -0
  119. package/dist/terminology/index.js.map +1 -0
  120. package/dist/terminology/types.d.ts +25 -0
  121. package/dist/terminology/types.d.ts.map +1 -0
  122. package/dist/terminology/types.js +2 -0
  123. package/dist/terminology/types.js.map +1 -0
  124. package/package.json +117 -0
  125. package/rispecs/README.rise.md +5 -0
  126. package/rispecs/RISPEC.md +9 -0
@@ -0,0 +1,490 @@
1
+ // Zero-dependency NCP validator. It reports what it checked and where, so a
2
+ // caller can show evidence rather than a score.
3
+ import { AUDIENCE_EXPERIENTIAL_POV, CANONICAL_REQUIRED, SEQUENCE_CONSTRAINTS, AUTHOR_STRUCTURAL_POV, DYNAMIC_KINDS, DYNAMIC_VECTORS, MOMENT_FABRIC_TYPES, STORYBEAT_APPRECIATIONS, STORYBEAT_NARRATIVE_FUNCTIONS, STORYPOINT_APPRECIATIONS, STORYPOINT_NARRATIVE_FUNCTIONS, TONE_ABSTRACTION, TONE_SPATIAL, TONE_TEMPORAL, } from './generated.js';
4
+ import { isDeclaredExtension } from './extensions.js';
5
+ const EMPTY_COUNTS = {
6
+ narratives: 0,
7
+ perspectives: 0,
8
+ players: 0,
9
+ dynamics: 0,
10
+ storypoints: 0,
11
+ storybeats: 0,
12
+ overviews: 0,
13
+ moments: 0,
14
+ };
15
+ class Collector {
16
+ options;
17
+ issues = [];
18
+ extensions = new Set();
19
+ counts = { ...EMPTY_COUNTS };
20
+ constructor(options) {
21
+ this.options = options;
22
+ }
23
+ add(issue) {
24
+ this.issues.push(issue);
25
+ }
26
+ error(path, code, message, extra) {
27
+ this.add({ path, code, severity: 'error', message, ...extra });
28
+ }
29
+ warn(path, code, message, extra) {
30
+ this.add({ path, code, severity: 'warning', message, ...extra });
31
+ }
32
+ requireString(value, path, field) {
33
+ const holder = value;
34
+ const found = holder?.[field];
35
+ if (found === undefined || found === null || found === '') {
36
+ this.error(`${path}.${field}`, 'missing_field', `\`${field}\` is required and must be a non-empty string.`);
37
+ return undefined;
38
+ }
39
+ if (typeof found !== 'string') {
40
+ this.error(`${path}.${field}`, 'wrong_type', `\`${field}\` must be a string.`, { received: found });
41
+ return undefined;
42
+ }
43
+ return found;
44
+ }
45
+ optionalEnum(holder, path, field, allowed, escapeHatch) {
46
+ const value = holder[field];
47
+ if (value === undefined || value === null)
48
+ return;
49
+ if (typeof value !== 'string') {
50
+ this.error(`${path}.${field}`, 'wrong_type', `\`${field}\` must be a string.`, { received: value });
51
+ return;
52
+ }
53
+ if (allowed.includes(value))
54
+ return;
55
+ const hatch = escapeHatch ? holder[escapeHatch.field] : undefined;
56
+ if (typeof hatch === 'string' && hatch.length > 0) {
57
+ this.warn(`${path}.${field}`, 'unknown_enum_value', `\`${value}\` is outside the canonical set, declared through \`${escapeHatch?.field}\`.`, { received: value });
58
+ return;
59
+ }
60
+ this.error(`${path}.${field}`, 'unknown_enum_value', escapeHatch
61
+ ? `\`${value}\` is outside the canonical set. Name it in \`${escapeHatch.field}\` to declare it deliberately.`
62
+ : `\`${value}\` is outside the canonical set.`, { expected: allowed, received: value });
63
+ }
64
+ extension(element, field, path, value) {
65
+ if (value === undefined || value === null)
66
+ return;
67
+ if (!isDeclaredExtension(element, field))
68
+ return;
69
+ const id = `${element}.${field}`;
70
+ this.extensions.add(id);
71
+ if (this.options.allowExtensions) {
72
+ this.warn(`${path}.${field}`, 'extension_in_use', `\`${id}\` is a declared extension, not canonical NCP.`);
73
+ }
74
+ else {
75
+ this.error(`${path}.${field}`, 'extension_not_allowed', `\`${id}\` is an extension and extensions are disallowed.`);
76
+ }
77
+ }
78
+ /**
79
+ * Report fields the canonical schema lists as required but this element does
80
+ * not carry. Only runs under `requireCanonicalFields`.
81
+ */
82
+ canonicalRequired(element, holder, path) {
83
+ if (!this.options.requireCanonicalFields)
84
+ return;
85
+ for (const field of CANONICAL_REQUIRED[element]) {
86
+ const value = holder[field];
87
+ const missing = value === undefined ||
88
+ value === null ||
89
+ (typeof value === 'string' && value.length === 0) ||
90
+ (Array.isArray(value) && value.length === 0);
91
+ if (missing) {
92
+ this.error(`${path}.${field}`, 'missing_field', `\`${field}\` is required by the canonical schema.`);
93
+ }
94
+ }
95
+ }
96
+ uniqueIds(items, path) {
97
+ const seen = new Set();
98
+ items.forEach((item, index) => {
99
+ const id = item?.['id'];
100
+ if (typeof id !== 'string' || id.length === 0)
101
+ return;
102
+ if (seen.has(id)) {
103
+ this.error(`${path}[${index}].id`, 'duplicate_id', `\`${id}\` is used more than once in this collection.`);
104
+ return;
105
+ }
106
+ seen.add(id);
107
+ });
108
+ return seen;
109
+ }
110
+ get opts() {
111
+ return this.options;
112
+ }
113
+ }
114
+ function asArray(value, path, field, c) {
115
+ const holder = value;
116
+ const found = holder?.[field];
117
+ if (found === undefined || found === null) {
118
+ c.error(`${path}.${field}`, 'missing_field', `\`${field}\` is required and must be an array.`);
119
+ return [];
120
+ }
121
+ if (!Array.isArray(found)) {
122
+ c.error(`${path}.${field}`, 'wrong_type', `\`${field}\` must be an array.`, { received: found });
123
+ return [];
124
+ }
125
+ return found;
126
+ }
127
+ function validateNarrative(raw, path, c) {
128
+ if (typeof raw !== 'object' || raw === null) {
129
+ c.error(path, 'wrong_type', 'A narrative must be an object.', { received: raw });
130
+ return;
131
+ }
132
+ const narrative = raw;
133
+ c.requireString(narrative, path, 'id');
134
+ c.requireString(narrative, path, 'title');
135
+ c.canonicalRequired('narrative', narrative, path);
136
+ const subtextRaw = narrative['subtext'];
137
+ if (typeof subtextRaw !== 'object' || subtextRaw === null) {
138
+ c.error(`${path}.subtext`, 'missing_field', '`subtext` is required and must be an object.');
139
+ return;
140
+ }
141
+ const subtext = subtextRaw;
142
+ const perspectives = asArray(subtext, `${path}.subtext`, 'perspectives', c);
143
+ const players = asArray(subtext, `${path}.subtext`, 'players', c);
144
+ const dynamics = asArray(subtext, `${path}.subtext`, 'dynamics', c);
145
+ const storypoints = asArray(subtext, `${path}.subtext`, 'storypoints', c);
146
+ const storybeats = asArray(subtext, `${path}.subtext`, 'storybeats', c);
147
+ c.counts.perspectives += perspectives.length;
148
+ c.counts.players += players.length;
149
+ c.counts.dynamics += dynamics.length;
150
+ c.counts.storypoints += storypoints.length;
151
+ c.counts.storybeats += storybeats.length;
152
+ const perspectiveIds = c.uniqueIds(perspectives, `${path}.subtext.perspectives`);
153
+ if (perspectives.length === 0) {
154
+ c.warn(`${path}.subtext.perspectives`, 'empty_collection', 'No perspectives: nothing states whose story this is.');
155
+ }
156
+ perspectives.forEach((raw, index) => {
157
+ const at = `${path}.subtext.perspectives[${index}]`;
158
+ if (typeof raw !== 'object' || raw === null) {
159
+ c.error(at, 'wrong_type', 'A perspective must be an object.', { received: raw });
160
+ return;
161
+ }
162
+ const perspective = raw;
163
+ c.requireString(perspective, at, 'id');
164
+ c.canonicalRequired('perspective', perspective, at);
165
+ c.optionalEnum(perspective, at, 'author_structural_pov', AUTHOR_STRUCTURAL_POV);
166
+ c.extension('perspective', 'throughline', at, perspective['throughline']);
167
+ });
168
+ c.uniqueIds(players, `${path}.subtext.players`);
169
+ players.forEach((raw, index) => {
170
+ const at = `${path}.subtext.players[${index}]`;
171
+ if (typeof raw !== 'object' || raw === null) {
172
+ c.error(at, 'wrong_type', 'A player must be an object.', { received: raw });
173
+ return;
174
+ }
175
+ const player = raw;
176
+ c.requireString(player, at, 'id');
177
+ c.requireString(player, at, 'name');
178
+ c.canonicalRequired('player', player, at);
179
+ if (!c.opts.requireCanonicalFields && (typeof player['role'] !== 'string' || player['role'].length === 0)) {
180
+ c.warn(`${at}.role`, 'missing_recommended', '`role` is empty: the canonical schema requires it.');
181
+ }
182
+ c.extension('player', 'motivations', at, player['motivations']);
183
+ validatePerspectiveRefs(player['perspectives'], at, perspectiveIds, c);
184
+ });
185
+ c.uniqueIds(dynamics, `${path}.subtext.dynamics`);
186
+ dynamics.forEach((raw, index) => {
187
+ const at = `${path}.subtext.dynamics[${index}]`;
188
+ if (typeof raw !== 'object' || raw === null) {
189
+ c.error(at, 'wrong_type', 'A dynamic must be an object.', { received: raw });
190
+ return;
191
+ }
192
+ const dynamic = raw;
193
+ c.requireString(dynamic, at, 'id');
194
+ c.canonicalRequired('dynamic', dynamic, at);
195
+ for (const [field, allowed, hatch] of [
196
+ ['dynamic', DYNAMIC_KINDS, 'custom_dynamic'],
197
+ ['vector', DYNAMIC_VECTORS, 'custom_vector'],
198
+ ]) {
199
+ const value = dynamic[field];
200
+ if (value === undefined || value === '') {
201
+ const declared = typeof dynamic[hatch] === 'string' && dynamic[hatch].length > 0;
202
+ const message = declared
203
+ ? `\`${field}\` is unset; \`${hatch}\` names what the source called it.`
204
+ : `\`${field}\` is unset and no \`${hatch}\` declares what the source called it.`;
205
+ if (c.opts.requireCanonicalFields && !declared)
206
+ c.error(`${at}.${field}`, 'missing_field', message);
207
+ else
208
+ c.warn(`${at}.${field}`, 'missing_recommended', message);
209
+ continue;
210
+ }
211
+ c.optionalEnum(dynamic, at, field, allowed, { element: 'dynamic', field: hatch });
212
+ }
213
+ c.extension('dynamic', 'custom_dynamic', at, dynamic['custom_dynamic']);
214
+ c.extension('dynamic', 'custom_vector', at, dynamic['custom_vector']);
215
+ });
216
+ c.uniqueIds(storypoints, `${path}.subtext.storypoints`);
217
+ storypoints.forEach((raw, index) => {
218
+ const at = `${path}.subtext.storypoints[${index}]`;
219
+ if (typeof raw !== 'object' || raw === null) {
220
+ c.error(at, 'wrong_type', 'A storypoint must be an object.', { received: raw });
221
+ return;
222
+ }
223
+ const storypoint = raw;
224
+ c.requireString(storypoint, at, 'id');
225
+ c.canonicalRequired('storypoint', storypoint, at);
226
+ c.optionalEnum(storypoint, at, 'appreciation', STORYPOINT_APPRECIATIONS, {
227
+ element: 'storypoint',
228
+ field: 'custom_appreciation',
229
+ });
230
+ c.optionalEnum(storypoint, at, 'narrative_function', STORYPOINT_NARRATIVE_FUNCTIONS, {
231
+ element: 'storypoint',
232
+ field: 'custom_narrative_function',
233
+ });
234
+ c.extension('storypoint', 'custom_appreciation', at, storypoint['custom_appreciation']);
235
+ c.extension('storypoint', 'custom_narrative_function', at, storypoint['custom_narrative_function']);
236
+ validatePerspectiveRefs(storypoint['perspectives'], at, perspectiveIds, c);
237
+ });
238
+ const beatIds = c.uniqueIds(storybeats, `${path}.subtext.storybeats`);
239
+ // Beat sequence numbers a series, not a narrative: each throughline carries
240
+ // its own signposts 1..4 and its own progressions 1..n. Uniqueness is checked
241
+ // per perspective scope and per appreciation, which is what a series is.
242
+ const sequencesByScope = new Map();
243
+ storybeats.forEach((raw, index) => {
244
+ const at = `${path}.subtext.storybeats[${index}]`;
245
+ if (typeof raw !== 'object' || raw === null) {
246
+ c.error(at, 'wrong_type', 'A storybeat must be an object.', { received: raw });
247
+ return;
248
+ }
249
+ const beat = raw;
250
+ c.requireString(beat, at, 'id');
251
+ c.canonicalRequired('storybeat', beat, at);
252
+ c.optionalEnum(beat, at, 'appreciation', STORYBEAT_APPRECIATIONS);
253
+ c.optionalEnum(beat, at, 'narrative_function', STORYBEAT_NARRATIVE_FUNCTIONS, {
254
+ element: 'storybeat',
255
+ field: 'custom_narrative_function',
256
+ });
257
+ c.extension('storybeat', 'custom_narrative_function', at, beat['custom_narrative_function']);
258
+ const sequence = beat['sequence'];
259
+ const minimum = typeof SEQUENCE_CONSTRAINTS.minimum === 'number' ? SEQUENCE_CONSTRAINTS.minimum : 1;
260
+ if (typeof sequence !== 'number' || !Number.isInteger(sequence) || sequence < minimum) {
261
+ c.error(`${at}.sequence`, sequence === undefined ? 'missing_field' : 'wrong_type', `\`sequence\` must be an integer of ${minimum} or more.`, { received: sequence });
262
+ }
263
+ else {
264
+ // Each appreciation has its own maximum in the canonical schema
265
+ // (signposts 1-4, progressions 1-16, events 1-64). Real exports do exceed
266
+ // them, so this is a note by default and an error under strict checking.
267
+ const appreciationValue = typeof beat['appreciation'] === 'string' ? beat['appreciation'] : '';
268
+ const range = SEQUENCE_CONSTRAINTS.ranges[appreciationValue];
269
+ if (range?.maximum != null && sequence > range.maximum) {
270
+ const message = `\`sequence\` ${sequence} is past the canonical maximum of ${range.maximum} for a \`${appreciationValue}\`.`;
271
+ if (c.opts.requireCanonicalFields)
272
+ c.error(`${at}.sequence`, 'sequence_out_of_range', message);
273
+ else
274
+ c.warn(`${at}.sequence`, 'sequence_out_of_range', message);
275
+ }
276
+ // `perspectives` is checked for shape below; here it may still be
277
+ // anything, and a wrong type must not crash the whole validation.
278
+ const refs = beat['perspectives'];
279
+ const scope = Array.isArray(refs)
280
+ ? refs
281
+ .map((ref) => (typeof ref === 'object' && ref !== null ? String(ref['perspective_id'] ?? '') : ''))
282
+ .filter((id) => id.length > 0)
283
+ .sort()
284
+ .join('+')
285
+ : '';
286
+ const series = typeof beat['appreciation'] === 'string' ? beat['appreciation'] : 'unknown';
287
+ const key = `${series}@${scope.length > 0 ? scope : 'unscoped'}`;
288
+ const list = sequencesByScope.get(key) ?? [];
289
+ list.push(sequence);
290
+ sequencesByScope.set(key, list);
291
+ }
292
+ const tones = beat['tones'];
293
+ if (tones === undefined || tones === null) {
294
+ const message = 'No tone object: the beat carries no abstraction/spatial/temporal signature.';
295
+ if (c.opts.requireTones)
296
+ c.error(`${at}.tones`, 'missing_recommended', message);
297
+ else
298
+ c.warn(`${at}.tones`, 'missing_recommended', message);
299
+ }
300
+ else if (typeof tones !== 'object') {
301
+ c.error(`${at}.tones`, 'wrong_type', '`tones` must be an object.', { received: tones });
302
+ }
303
+ else {
304
+ const toneHolder = tones;
305
+ for (const [field, allowed] of [
306
+ ['abstraction', TONE_ABSTRACTION],
307
+ ['spatial', TONE_SPATIAL],
308
+ ['temporal', TONE_TEMPORAL],
309
+ ]) {
310
+ if (toneHolder[field] === undefined) {
311
+ c.error(`${at}.tones.${field}`, 'missing_field', `\`tones.${field}\` is required when tones are present.`);
312
+ }
313
+ else {
314
+ c.optionalEnum(toneHolder, `${at}.tones`, field, allowed);
315
+ }
316
+ }
317
+ }
318
+ validatePerspectiveRefs(beat['perspectives'], at, perspectiveIds, c);
319
+ });
320
+ for (const [scope, sequences] of sequencesByScope) {
321
+ const seen = new Set();
322
+ const [series = 'unknown', perspectiveScope = 'unscoped'] = scope.split('@');
323
+ const scopeLabel = perspectiveScope === 'unscoped'
324
+ ? `the \`${series}\` series with no perspective`
325
+ : `the \`${series}\` series of perspective \`${perspectiveScope}\``;
326
+ for (const sequence of sequences) {
327
+ if (seen.has(sequence)) {
328
+ c.error(`${path}.subtext.storybeats`, 'duplicate_sequence', `Sequence ${sequence} is used twice within ${scopeLabel}; beat order is ambiguous there.`);
329
+ }
330
+ seen.add(sequence);
331
+ }
332
+ if (c.opts.checkSequenceContiguity && seen.size > 0) {
333
+ const sorted = [...seen].sort((a, b) => a - b);
334
+ const first = sorted[0];
335
+ const last = sorted[sorted.length - 1];
336
+ if (last - first + 1 !== sorted.length) {
337
+ c.warn(`${path}.subtext.storybeats`, 'sequence_not_contiguous', `Sequences run ${first}–${last} with ${sorted.length} beats in ${scopeLabel}, so the run has holes.`);
338
+ }
339
+ }
340
+ }
341
+ const storytellingRaw = narrative['storytelling'];
342
+ if (typeof storytellingRaw !== 'object' || storytellingRaw === null) {
343
+ c.error(`${path}.storytelling`, 'missing_field', '`storytelling` is required and must be an object.');
344
+ return;
345
+ }
346
+ const storytelling = storytellingRaw;
347
+ const overviews = asArray(storytelling, `${path}.storytelling`, 'overviews', c);
348
+ const moments = asArray(storytelling, `${path}.storytelling`, 'moments', c);
349
+ c.counts.overviews += overviews.length;
350
+ c.counts.moments += moments.length;
351
+ c.uniqueIds(moments, `${path}.storytelling.moments`);
352
+ moments.forEach((raw, index) => {
353
+ const at = `${path}.storytelling.moments[${index}]`;
354
+ if (typeof raw !== 'object' || raw === null) {
355
+ c.error(at, 'wrong_type', 'A moment must be an object.', { received: raw });
356
+ return;
357
+ }
358
+ const moment = raw;
359
+ c.requireString(moment, at, 'id');
360
+ c.canonicalRequired('moment', moment, at);
361
+ c.optionalEnum(moment, at, 'audience_experiential_pov', AUDIENCE_EXPERIENTIAL_POV);
362
+ const fabric = moment['fabric'];
363
+ if (Array.isArray(fabric)) {
364
+ fabric.forEach((entry, fabricIndex) => {
365
+ const fabricAt = `${at}.fabric[${fabricIndex}]`;
366
+ if (typeof entry !== 'object' || entry === null) {
367
+ c.error(fabricAt, 'wrong_type', 'A fabric entry must be an object.', { received: entry });
368
+ return;
369
+ }
370
+ const holder = entry;
371
+ c.optionalEnum(holder, fabricAt, 'type', MOMENT_FABRIC_TYPES);
372
+ if (holder['limit'] !== undefined && typeof holder['limit'] !== 'number') {
373
+ c.error(`${fabricAt}.limit`, 'wrong_type', '`limit` must be a number.', { received: holder['limit'] });
374
+ }
375
+ });
376
+ }
377
+ else if (fabric !== undefined && fabric !== null) {
378
+ c.error(`${at}.fabric`, 'wrong_type', '`fabric` must be an array.', { received: fabric });
379
+ }
380
+ const refs = moment['storybeats'];
381
+ if (Array.isArray(refs)) {
382
+ refs.forEach((entry, refIndex) => {
383
+ const refAt = `${at}.storybeats[${refIndex}]`;
384
+ if (typeof entry !== 'object' || entry === null) {
385
+ c.error(refAt, 'wrong_type', 'A storybeat reference must be an object.', { received: entry });
386
+ return;
387
+ }
388
+ const holder = entry;
389
+ const beatId = holder['storybeat_id'];
390
+ if (typeof beatId !== 'string' || beatId.length === 0) {
391
+ c.error(`${refAt}.storybeat_id`, 'missing_field', '`storybeat_id` is required.');
392
+ return;
393
+ }
394
+ if (!beatIds.has(beatId)) {
395
+ c.error(`${refAt}.storybeat_id`, 'dangling_reference', `No storybeat with id \`${beatId}\` in this narrative.`);
396
+ }
397
+ });
398
+ }
399
+ else if (refs !== undefined && refs !== null) {
400
+ c.error(`${at}.storybeats`, 'wrong_type', '`storybeats` must be an array.', { received: refs });
401
+ }
402
+ });
403
+ }
404
+ function validatePerspectiveRefs(refs, path, perspectiveIds, c) {
405
+ if (refs === undefined || refs === null)
406
+ return;
407
+ if (!Array.isArray(refs)) {
408
+ c.error(`${path}.perspectives`, 'wrong_type', '`perspectives` must be an array of references.', { received: refs });
409
+ return;
410
+ }
411
+ refs.forEach((entry, index) => {
412
+ const at = `${path}.perspectives[${index}]`;
413
+ if (typeof entry !== 'object' || entry === null) {
414
+ c.error(at, 'wrong_type', 'A perspective reference must be an object.', { received: entry });
415
+ return;
416
+ }
417
+ const id = entry['perspective_id'];
418
+ if (typeof id !== 'string' || id.length === 0) {
419
+ c.error(`${at}.perspective_id`, 'missing_field', '`perspective_id` is required.');
420
+ return;
421
+ }
422
+ if (!perspectiveIds.has(id)) {
423
+ c.error(`${at}.perspective_id`, 'dangling_reference', `No perspective with id \`${id}\` in this narrative.`);
424
+ }
425
+ });
426
+ }
427
+ function finish(c) {
428
+ const errors = c.issues.filter((issue) => issue.severity === 'error');
429
+ const warnings = c.issues.filter((issue) => issue.severity === 'warning');
430
+ return {
431
+ valid: errors.length === 0,
432
+ issues: c.issues,
433
+ errors,
434
+ warnings,
435
+ counts: c.counts,
436
+ extensions_used: [...c.extensions].sort(),
437
+ };
438
+ }
439
+ function resolveOptions(options) {
440
+ return {
441
+ allowExtensions: options?.allowExtensions ?? true,
442
+ requireTones: options?.requireTones ?? false,
443
+ checkSequenceContiguity: options?.checkSequenceContiguity ?? true,
444
+ requireCanonicalFields: options?.requireCanonicalFields ?? false,
445
+ };
446
+ }
447
+ /** Validate a whole `{ schema_version, story }` document. */
448
+ export function validateNcpDocument(input, options) {
449
+ const c = new Collector(resolveOptions(options));
450
+ if (typeof input !== 'object' || input === null) {
451
+ c.error('$', 'wrong_type', 'An NCP document must be an object.', { received: input });
452
+ return finish(c);
453
+ }
454
+ const document = input;
455
+ c.requireString(document, '$', 'schema_version');
456
+ const story = document['story'];
457
+ if (typeof story !== 'object' || story === null) {
458
+ c.error('$.story', 'missing_field', '`story` is required and must be an object.');
459
+ return finish(c);
460
+ }
461
+ validateStoryInto(story, '$.story', c);
462
+ return finish(c);
463
+ }
464
+ /** Validate a bare story object (no `schema_version` wrapper). */
465
+ export function validateStory(story, options) {
466
+ const c = new Collector(resolveOptions(options));
467
+ validateStoryInto(story, '$.story', c);
468
+ return finish(c);
469
+ }
470
+ function validateStoryInto(raw, path, c) {
471
+ if (typeof raw !== 'object' || raw === null) {
472
+ c.error(path, 'wrong_type', 'A story must be an object.', { received: raw });
473
+ return;
474
+ }
475
+ const story = raw;
476
+ c.requireString(story, path, 'id');
477
+ c.requireString(story, path, 'title');
478
+ c.canonicalRequired('story', story, path);
479
+ const narratives = asArray(story, path, 'narratives', c);
480
+ c.counts.narratives += narratives.length;
481
+ if (narratives.length === 0) {
482
+ c.error(`${path}.narratives`, 'empty_collection', 'A story needs at least one narrative.');
483
+ }
484
+ narratives.forEach((narrative, index) => validateNarrative(narrative, `${path}.narratives[${index}]`, c));
485
+ }
486
+ /** Narrow an unknown value to an `NcpDocument` when it validates clean. */
487
+ export function isNcpDocument(input) {
488
+ return validateNcpDocument(input).valid;
489
+ }
490
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/schema/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { NcpDocument, StorySummary } from '../schema/types.js';
2
+ export * from './mutations.js';
3
+ export interface StoryProjectMeta {
4
+ /** Where this project came from: a fixture id, an episode, an import. */
5
+ source?: string;
6
+ /** Chronicle episode this project is related to, when there is one. */
7
+ episode?: string;
8
+ author?: string;
9
+ tags?: string[];
10
+ [key: string]: unknown;
11
+ }
12
+ export interface StoryProject {
13
+ project_id: string;
14
+ document: NcpDocument;
15
+ created_at: string;
16
+ updated_at: string;
17
+ meta?: StoryProjectMeta;
18
+ /** True when the store cannot accept writes for this project. */
19
+ read_only?: boolean;
20
+ }
21
+ export interface StoryProjectSummary extends StorySummary {
22
+ project_id: string;
23
+ updated_at: string;
24
+ meta?: StoryProjectMeta;
25
+ read_only?: boolean;
26
+ }
27
+ export interface SaveOptions {
28
+ /**
29
+ * Fail instead of overwriting when the stored project has moved on. Pass the
30
+ * `updated_at` the caller last read.
31
+ */
32
+ expected_updated_at?: string;
33
+ }
34
+ export declare class StoryStoreConflictError extends Error {
35
+ readonly projectId: string;
36
+ readonly expected: string;
37
+ readonly actual: string;
38
+ constructor(projectId: string, expected: string, actual: string);
39
+ }
40
+ export declare class StoryStoreReadOnlyError extends Error {
41
+ readonly projectId: string;
42
+ constructor(projectId: string);
43
+ }
44
+ export interface StoryStore {
45
+ /** Which provider this is, for a status line that does not have to guess. */
46
+ readonly kind: string;
47
+ /** Human-readable location, safe to display (never a connection secret). */
48
+ readonly location: string;
49
+ /** Prepare the backing store if it needs it. Safe to call repeatedly. */
50
+ init?(): Promise<void>;
51
+ list(): Promise<StoryProjectSummary[]>;
52
+ get(projectId: string): Promise<StoryProject | undefined>;
53
+ save(project: StoryProject, options?: SaveOptions): Promise<StoryProject>;
54
+ remove(projectId: string): Promise<boolean>;
55
+ }
56
+ /** Turn a title into a project id a filesystem and a URL both accept. */
57
+ export declare function toProjectId(value: string): string;
58
+ /** Build a project record around a document, stamping both timestamps. */
59
+ export declare function newProject(document: NcpDocument, options?: {
60
+ projectId?: string;
61
+ meta?: StoryProjectMeta;
62
+ now?: string;
63
+ }): StoryProject;
64
+ export declare function summarizeProject(project: StoryProject): StoryProjectSummary;
65
+ /** An in-memory store. Useful for tests and for a read-only fixture catalog. */
66
+ export declare class MemoryStoryStore implements StoryStore {
67
+ readonly kind = "memory";
68
+ readonly location = "memory";
69
+ private readonly projects;
70
+ constructor(seed?: readonly StoryProject[]);
71
+ list(): Promise<StoryProjectSummary[]>;
72
+ get(projectId: string): Promise<StoryProject | undefined>;
73
+ save(project: StoryProject, options?: SaveOptions): Promise<StoryProject>;
74
+ remove(projectId: string): Promise<boolean>;
75
+ }
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEnE,cAAc,gBAAgB,CAAA;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,WAAW,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,iEAAiE;IACjE,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAE9C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAFd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM;CAK1B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAIvC;AAED,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,yEAAyE;IACzE,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAA;IACtC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACzD,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACzE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC5C;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CACxB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACtE,YAAY,CASd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,mBAAmB,CAQ3E;AAED,gFAAgF;AAChF,qBAAa,gBAAiB,YAAW,UAAU;IACjD,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,QAAQ,YAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;gBAE/C,IAAI,GAAE,SAAS,YAAY,EAAO;IAIxC,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAItC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAKzD,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAezE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAKlD"}