@miadi/episodic-memory-schema 0.3.0 → 0.5.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.
- package/dist/adapters/episode-yaml.d.ts.map +1 -1
- package/dist/adapters/episode-yaml.js +162 -14
- package/dist/adapters/episode-yaml.js.map +1 -1
- package/dist/adapters/segment-grammar.d.ts +82 -0
- package/dist/adapters/segment-grammar.d.ts.map +1 -0
- package/dist/adapters/segment-grammar.js +185 -0
- package/dist/adapters/segment-grammar.js.map +1 -0
- package/dist/chronicle-manifest.d.ts +83 -0
- package/dist/chronicle-manifest.d.ts.map +1 -0
- package/dist/chronicle-manifest.js +92 -0
- package/dist/chronicle-manifest.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/story-library-manifest.d.ts +76 -0
- package/dist/story-library-manifest.d.ts.map +1 -0
- package/dist/story-library-manifest.js +136 -0
- package/dist/story-library-manifest.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"episode-yaml.d.ts","sourceRoot":"","sources":["../../src/adapters/episode-yaml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,kBAAkB,EAIlB,iCAAiC,EAClC,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"episode-yaml.d.ts","sourceRoot":"","sources":["../../src/adapters/episode-yaml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,kBAAkB,EAIlB,iCAAiC,EAClC,MAAM,mBAAmB,CAAA;AA2C1B;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,iCAAiC,GACzC,kBAAkB,CA4CpB"}
|
|
@@ -40,10 +40,11 @@ export function observeEpisodeYamlManifest(input, options) {
|
|
|
40
40
|
const metadataProjection = observeMetadata(input, base.diagnostics);
|
|
41
41
|
base.sourceMetadata = metadataProjection.metadata;
|
|
42
42
|
base.identityCandidates = observeIdentity(input, relativePath, base.diagnostics);
|
|
43
|
-
base.artifacts =
|
|
43
|
+
base.artifacts = observeArtifacts(input.artifacts, relativePath, base.diagnostics);
|
|
44
44
|
const relationProjection = observeLineage(input.lineage, base.diagnostics);
|
|
45
|
-
|
|
46
|
-
base.
|
|
45
|
+
const relatedEpisodes = observeRelatedEpisodes(input.related_episodes, relationProjection.seen, base.diagnostics);
|
|
46
|
+
base.relations = [...relationProjection.relations, ...relatedEpisodes.relations];
|
|
47
|
+
base.unmappedFields = preserveUnmappedFields(input, metadataProjection.consumedFields, relationProjection, relatedEpisodes.consumed);
|
|
47
48
|
return base;
|
|
48
49
|
}
|
|
49
50
|
function observeMetadata(input, diagnostics) {
|
|
@@ -140,7 +141,15 @@ function normalizeEpisodeNumber(value) {
|
|
|
140
141
|
return String(Number(value));
|
|
141
142
|
return extractEpisodeNumber(value);
|
|
142
143
|
}
|
|
143
|
-
|
|
144
|
+
/**
|
|
145
|
+
* Observe the `artifacts:` field in either corpus shape.
|
|
146
|
+
*
|
|
147
|
+
* The authored house style is a (possibly nested) object map of label → path,
|
|
148
|
+
* but a large share of the corpus (e.g. ep014, ep044) writes `artifacts:` as a
|
|
149
|
+
* flat LIST of path strings. Both are real, so both are observed rather than
|
|
150
|
+
* one being warned away — kind is inferred per entry either way.
|
|
151
|
+
*/
|
|
152
|
+
function observeArtifacts(value, sourceDocumentPath, diagnostics) {
|
|
144
153
|
if (value === undefined) {
|
|
145
154
|
diagnostics.push({
|
|
146
155
|
level: "info",
|
|
@@ -150,11 +159,14 @@ function observeArtifactMap(value, sourceDocumentPath, diagnostics) {
|
|
|
150
159
|
});
|
|
151
160
|
return [];
|
|
152
161
|
}
|
|
162
|
+
if (Array.isArray(value)) {
|
|
163
|
+
return observeArtifactList(value, sourceDocumentPath, diagnostics);
|
|
164
|
+
}
|
|
153
165
|
if (!isRecord(value)) {
|
|
154
166
|
diagnostics.push({
|
|
155
167
|
level: "warning",
|
|
156
168
|
code: "episode-yaml.invalid-artifact-map",
|
|
157
|
-
message: "Manifest field 'artifacts' must be an object when present.",
|
|
169
|
+
message: "Manifest field 'artifacts' must be an object map or a list of path strings when present.",
|
|
158
170
|
path: "artifacts",
|
|
159
171
|
});
|
|
160
172
|
return [];
|
|
@@ -163,6 +175,41 @@ function observeArtifactMap(value, sourceDocumentPath, diagnostics) {
|
|
|
163
175
|
walkArtifactMap(value, [], sourceDocumentPath, diagnostics, artifacts);
|
|
164
176
|
return artifacts;
|
|
165
177
|
}
|
|
178
|
+
/** Observe the list-shaped `artifacts:` — an ordered array of path strings. */
|
|
179
|
+
function observeArtifactList(entries, sourceDocumentPath, diagnostics) {
|
|
180
|
+
const artifacts = [];
|
|
181
|
+
entries.forEach((entry, index) => {
|
|
182
|
+
const manifestPath = `artifacts[${index}]`;
|
|
183
|
+
if (typeof entry !== "string") {
|
|
184
|
+
diagnostics.push({
|
|
185
|
+
level: "warning",
|
|
186
|
+
code: "episode-yaml.invalid-artifact-entry",
|
|
187
|
+
message: "Artifact list entries must be relative path strings.",
|
|
188
|
+
path: manifestPath,
|
|
189
|
+
});
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const relativePath = resolveSiblingPath(sourceDocumentPath, entry);
|
|
193
|
+
if (relativePath === undefined) {
|
|
194
|
+
diagnostics.push({
|
|
195
|
+
level: "warning",
|
|
196
|
+
code: "episode-yaml.unsafe-artifact-path",
|
|
197
|
+
message: "Artifact paths must be relative and must not contain traversal.",
|
|
198
|
+
path: manifestPath,
|
|
199
|
+
});
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const kind = inferArtifactKind(entry);
|
|
203
|
+
artifacts.push({
|
|
204
|
+
id: `artifact:${kind}:${encodeURIComponent(relativePath)}:${encodeURIComponent(manifestPath)}`,
|
|
205
|
+
kind,
|
|
206
|
+
relativePath,
|
|
207
|
+
label: entry,
|
|
208
|
+
metadata: { manifestPath },
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
return artifacts;
|
|
212
|
+
}
|
|
166
213
|
function walkArtifactMap(value, keys, sourceDocumentPath, diagnostics, artifacts) {
|
|
167
214
|
for (const key of Object.keys(value).sort()) {
|
|
168
215
|
const child = value[key];
|
|
@@ -201,9 +248,36 @@ function walkArtifactMap(value, keys, sourceDocumentPath, diagnostics, artifacts
|
|
|
201
248
|
});
|
|
202
249
|
}
|
|
203
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* A stable key that collapses relations pointing at the same episode regardless
|
|
253
|
+
* of the dialect that expressed them. A path target like
|
|
254
|
+
* `2026-06-08-episode-039-...` and an episode-number target `39` resolve to the
|
|
255
|
+
* same key, so a house-style `continues_from` and an older `prior_episode` that
|
|
256
|
+
* name the same continuation are reported once, not twice.
|
|
257
|
+
*/
|
|
258
|
+
function relationDedupKey(relation) {
|
|
259
|
+
const { kind, target } = relation;
|
|
260
|
+
if (target.kind === "episode-number")
|
|
261
|
+
return `${kind}::ep:${target.value}`;
|
|
262
|
+
const episodeNumber = extractEpisodeNumber(target.value);
|
|
263
|
+
if (episodeNumber !== undefined)
|
|
264
|
+
return `${kind}::ep:${episodeNumber}`;
|
|
265
|
+
return `${kind}::${target.kind}:${target.value}`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Observe the `lineage:` block across every corpus dialect.
|
|
269
|
+
*
|
|
270
|
+
* House style: `continues_from` / `relates_to` — arrays of `{episode, path,
|
|
271
|
+
* relation}`. Older dialect: `prior_episode` — a bare folder-name string naming
|
|
272
|
+
* the continuation source (observed as a path-target continues-from edge).
|
|
273
|
+
* `related_themes` and any other keys are preserved verbatim in the returned
|
|
274
|
+
* `unmappedLineage`. Every edge is deduped so an episode carrying both dialects
|
|
275
|
+
* for the same target reports a single relation.
|
|
276
|
+
*/
|
|
204
277
|
function observeLineage(value, diagnostics) {
|
|
278
|
+
const seen = new Set();
|
|
205
279
|
if (value === undefined) {
|
|
206
|
-
return { relations: [], unmappedLineage: {}, consumed: false };
|
|
280
|
+
return { relations: [], unmappedLineage: {}, consumed: false, seen };
|
|
207
281
|
}
|
|
208
282
|
if (!isRecord(value)) {
|
|
209
283
|
diagnostics.push({
|
|
@@ -212,10 +286,19 @@ function observeLineage(value, diagnostics) {
|
|
|
212
286
|
message: "Manifest field 'lineage' must be an object when present.",
|
|
213
287
|
path: "lineage",
|
|
214
288
|
});
|
|
215
|
-
return { relations: [], unmappedLineage: {}, consumed: false };
|
|
289
|
+
return { relations: [], unmappedLineage: {}, consumed: false, seen };
|
|
216
290
|
}
|
|
217
291
|
const relations = [];
|
|
218
292
|
const unmappedLineage = {};
|
|
293
|
+
const pushUnique = (relation) => {
|
|
294
|
+
if (relation === undefined)
|
|
295
|
+
return;
|
|
296
|
+
const key = relationDedupKey(relation);
|
|
297
|
+
if (seen.has(key))
|
|
298
|
+
return;
|
|
299
|
+
seen.add(key);
|
|
300
|
+
relations.push(relation);
|
|
301
|
+
};
|
|
219
302
|
const mappings = [
|
|
220
303
|
["continues_from", "continues-from"],
|
|
221
304
|
["relates_to", "related-to"],
|
|
@@ -238,19 +321,82 @@ function observeLineage(value, diagnostics) {
|
|
|
238
321
|
entries.forEach((entry, index) => {
|
|
239
322
|
const relation = observeRelationEntry(entry, kind, field, index, diagnostics);
|
|
240
323
|
if (relation !== undefined)
|
|
241
|
-
|
|
324
|
+
pushUnique(relation);
|
|
242
325
|
else
|
|
243
326
|
rejectedEntries.push(cloneValue(entry));
|
|
244
327
|
});
|
|
245
328
|
if (rejectedEntries.length > 0)
|
|
246
329
|
unmappedLineage[field] = rejectedEntries;
|
|
247
330
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
331
|
+
// Older dialect (ep040): `lineage.prior_episode: <folder-name string>`.
|
|
332
|
+
const priorEpisode = value.prior_episode;
|
|
333
|
+
if (typeof priorEpisode === "string" && priorEpisode.length > 0) {
|
|
334
|
+
const relativeTargetPath = tryValidateRelativePath(priorEpisode);
|
|
335
|
+
if (relativeTargetPath === undefined) {
|
|
336
|
+
diagnostics.push({
|
|
337
|
+
level: "warning",
|
|
338
|
+
code: "episode-yaml.unsafe-lineage-path",
|
|
339
|
+
message: "Path-only lineage targets must be relative and must not contain traversal.",
|
|
340
|
+
path: "lineage.prior_episode",
|
|
341
|
+
});
|
|
342
|
+
unmappedLineage.prior_episode = cloneValue(priorEpisode);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
pushUnique({
|
|
346
|
+
id: `relation:continues-from:path:${encodeURIComponent(relativeTargetPath)}:prior_episode`,
|
|
347
|
+
kind: "continues-from",
|
|
348
|
+
target: { kind: "path", value: relativeTargetPath },
|
|
349
|
+
});
|
|
251
350
|
}
|
|
252
351
|
}
|
|
253
|
-
|
|
352
|
+
else if (priorEpisode !== undefined) {
|
|
353
|
+
diagnostics.push({
|
|
354
|
+
level: "warning",
|
|
355
|
+
code: "episode-yaml.invalid-lineage-entry",
|
|
356
|
+
message: "Lineage field 'prior_episode' must be a folder-name string.",
|
|
357
|
+
path: "lineage.prior_episode",
|
|
358
|
+
});
|
|
359
|
+
unmappedLineage.prior_episode = cloneValue(priorEpisode);
|
|
360
|
+
}
|
|
361
|
+
const knownKeys = new Set(["continues_from", "relates_to", "prior_episode"]);
|
|
362
|
+
for (const [key, child] of Object.entries(value)) {
|
|
363
|
+
if (knownKeys.has(key))
|
|
364
|
+
continue;
|
|
365
|
+
if (key in unmappedLineage)
|
|
366
|
+
continue;
|
|
367
|
+
unmappedLineage[key] = cloneValue(child);
|
|
368
|
+
}
|
|
369
|
+
return { relations, unmappedLineage, consumed: true, seen };
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Observe the top-level `related_episodes` dialect (schema
|
|
373
|
+
* `voice-episode-workspace/v1`, e.g. ep039) — an array of `{episode, relation}`
|
|
374
|
+
* mapped to `related-to` edges, deduped against edges already found in `lineage`.
|
|
375
|
+
*/
|
|
376
|
+
function observeRelatedEpisodes(value, seen, diagnostics) {
|
|
377
|
+
if (value === undefined)
|
|
378
|
+
return { relations: [], consumed: false };
|
|
379
|
+
if (!Array.isArray(value)) {
|
|
380
|
+
diagnostics.push({
|
|
381
|
+
level: "warning",
|
|
382
|
+
code: "episode-yaml.invalid-related-episodes",
|
|
383
|
+
message: "Top-level field 'related_episodes' must be an array when present.",
|
|
384
|
+
path: "related_episodes",
|
|
385
|
+
});
|
|
386
|
+
return { relations: [], consumed: false };
|
|
387
|
+
}
|
|
388
|
+
const relations = [];
|
|
389
|
+
value.forEach((entry, index) => {
|
|
390
|
+
const relation = observeRelationEntry(entry, "related-to", "related_episodes", index, diagnostics);
|
|
391
|
+
if (relation === undefined)
|
|
392
|
+
return;
|
|
393
|
+
const key = relationDedupKey(relation);
|
|
394
|
+
if (seen.has(key))
|
|
395
|
+
return;
|
|
396
|
+
seen.add(key);
|
|
397
|
+
relations.push(relation);
|
|
398
|
+
});
|
|
399
|
+
return { relations, consumed: true };
|
|
254
400
|
}
|
|
255
401
|
function observeRelationEntry(entry, kind, field, index, diagnostics) {
|
|
256
402
|
const path = `lineage.${field}[${index}]`;
|
|
@@ -305,17 +451,19 @@ function observeRelationEntry(entry, kind, field, index, diagnostics) {
|
|
|
305
451
|
relation.metadata = metadata;
|
|
306
452
|
return relation;
|
|
307
453
|
}
|
|
308
|
-
function preserveUnmappedFields(input, consumedMetadataFields, lineage) {
|
|
454
|
+
function preserveUnmappedFields(input, consumedMetadataFields, lineage, relatedEpisodesConsumed) {
|
|
309
455
|
const unmapped = {};
|
|
310
456
|
for (const [key, value] of Object.entries(input)) {
|
|
311
457
|
if (consumedMetadataFields.has(key))
|
|
312
458
|
continue;
|
|
313
459
|
if (key === "episode" && normalizeEpisodeNumber(value) !== undefined)
|
|
314
460
|
continue;
|
|
315
|
-
if (key === "artifacts" && isRecord(value))
|
|
461
|
+
if (key === "artifacts" && (isRecord(value) || Array.isArray(value)))
|
|
316
462
|
continue;
|
|
317
463
|
if (key === "lineage" && lineage.consumed)
|
|
318
464
|
continue;
|
|
465
|
+
if (key === "related_episodes" && relatedEpisodesConsumed)
|
|
466
|
+
continue;
|
|
319
467
|
unmapped[key] = cloneValue(value);
|
|
320
468
|
}
|
|
321
469
|
if (Object.keys(lineage.unmappedLineage).length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"episode-yaml.js","sourceRoot":"","sources":["../../src/adapters/episode-yaml.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"episode-yaml.js","sourceRoot":"","sources":["../../src/adapters/episode-yaml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The episode "writing pattern" grammar — filesystem-free.
|
|
3
|
+
*
|
|
4
|
+
* This is the shared, dependency-free classifier for an episode folder's file
|
|
5
|
+
* names: which files are the mains (`script.md`, `narration.txt`,
|
|
6
|
+
* `revision-notes.md`), which belong to a segment (`chapter-NN` / `interlude-NN`
|
|
7
|
+
* / `part-NN`) and in what role (`-script` / `-narration` / `-revision-notes` /
|
|
8
|
+
* `-transcript`), and which are per-segment or full-episode audio.
|
|
9
|
+
*
|
|
10
|
+
* It was lifted verbatim from the app's `episodeRoom.ts` so forgewright and the
|
|
11
|
+
* book tooling read an episode's structure the same way the `/chronicle` surface
|
|
12
|
+
* does, without forking the grammar. It operates on a directory snapshot (a list
|
|
13
|
+
* of file names) and returns which file plays which role — it never reads file
|
|
14
|
+
* contents or touches the filesystem. The app remains free to read the mapped
|
|
15
|
+
* files for their text/audio; this module only names the structure.
|
|
16
|
+
*/
|
|
17
|
+
export type SegmentKind = "chapter" | "interlude" | "part";
|
|
18
|
+
export type EpisodeFileRole = "script" | "narration" | "revision" | "transcript" | "doc" | "audio";
|
|
19
|
+
export interface ClassifiedEpisodeFile {
|
|
20
|
+
role: EpisodeFileRole;
|
|
21
|
+
/** The stem after the role suffix is stripped (`""` for the mains). */
|
|
22
|
+
stem: string;
|
|
23
|
+
file: string;
|
|
24
|
+
ext: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SegmentAudioDescriptor {
|
|
27
|
+
file: string;
|
|
28
|
+
label: string;
|
|
29
|
+
/** The segment stem this audio attaches to (`"episode"` for the full episode). */
|
|
30
|
+
sub: string;
|
|
31
|
+
primary: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface SegmentDescriptor {
|
|
34
|
+
/** The segment stem, e.g. `chapter-01` — the true key. */
|
|
35
|
+
id: string;
|
|
36
|
+
kind: SegmentKind;
|
|
37
|
+
order: number;
|
|
38
|
+
label: string;
|
|
39
|
+
/** Role → file name for this segment (script/narration/revision/transcript). */
|
|
40
|
+
roles: Partial<Record<EpisodeFileRole, string>>;
|
|
41
|
+
/** True when the segment's narration file is markdown (`.md`, not `.txt`). */
|
|
42
|
+
narrationIsMarkdown: boolean;
|
|
43
|
+
/** Audio files whose stem is this segment's stem. */
|
|
44
|
+
audio: SegmentAudioDescriptor[];
|
|
45
|
+
}
|
|
46
|
+
export interface MainDocuments {
|
|
47
|
+
/** File name of the main script (`script.md` / `-script.md`). */
|
|
48
|
+
script?: string;
|
|
49
|
+
/** File name of the main narration (`narration.txt|md`). */
|
|
50
|
+
narration?: string;
|
|
51
|
+
narrationIsMarkdown: boolean;
|
|
52
|
+
/** File name of the main revision notes (`revision-notes.md`). */
|
|
53
|
+
revision?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface DocDescriptor {
|
|
56
|
+
file: string;
|
|
57
|
+
label: string;
|
|
58
|
+
}
|
|
59
|
+
export interface EpisodeSegmentModel {
|
|
60
|
+
mains: MainDocuments;
|
|
61
|
+
segments: SegmentDescriptor[];
|
|
62
|
+
audio: SegmentAudioDescriptor[];
|
|
63
|
+
docs: DocDescriptor[];
|
|
64
|
+
}
|
|
65
|
+
/** Classify one file name into its role + stem, or null when it is ignorable. */
|
|
66
|
+
export declare function classifyEpisodeFile(file: string): ClassifiedEpisodeFile | null;
|
|
67
|
+
/** Parse a segment stem (`chapter-01`, `interlude-2`, `part-03-title`). */
|
|
68
|
+
export declare function segmentKeyFromStem(stem: string): {
|
|
69
|
+
kind: SegmentKind;
|
|
70
|
+
order: number;
|
|
71
|
+
label: string;
|
|
72
|
+
} | null;
|
|
73
|
+
/**
|
|
74
|
+
* Observe an episode folder's file names into its structural model: mains,
|
|
75
|
+
* ordered segments (with per-segment roles + audio), full-episode/loose audio,
|
|
76
|
+
* and loose docs. Deterministic and content-free — pass the directory's file
|
|
77
|
+
* names (or entries with a `relativePath`); nested paths are keyed by basename.
|
|
78
|
+
*/
|
|
79
|
+
export declare function observeEpisodeSegments(files: ReadonlyArray<string | {
|
|
80
|
+
relativePath: string;
|
|
81
|
+
}>): EpisodeSegmentModel;
|
|
82
|
+
//# sourceMappingURL=segment-grammar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-grammar.d.ts","sourceRoot":"","sources":["../../src/adapters/segment-grammar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAA;AAE1D,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,WAAW,GACX,UAAU,GACV,YAAY,GACZ,KAAK,GACL,OAAO,CAAA;AAEX,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAA;IACrB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,WAAW,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,8EAA8E;IAC9E,mBAAmB,EAAE,OAAO,CAAA;IAC5B,qDAAqD;IACrD,KAAK,EAAE,sBAAsB,EAAE,CAAA;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAA;IACpB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,KAAK,EAAE,sBAAsB,EAAE,CAAA;IAC/B,IAAI,EAAE,aAAa,EAAE,CAAA;CACtB;AA6BD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAU9E;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GACX;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW5D;AAmBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,CAAC,MAAM,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,GACtD,mBAAmB,CAsFrB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The episode "writing pattern" grammar — filesystem-free.
|
|
3
|
+
*
|
|
4
|
+
* This is the shared, dependency-free classifier for an episode folder's file
|
|
5
|
+
* names: which files are the mains (`script.md`, `narration.txt`,
|
|
6
|
+
* `revision-notes.md`), which belong to a segment (`chapter-NN` / `interlude-NN`
|
|
7
|
+
* / `part-NN`) and in what role (`-script` / `-narration` / `-revision-notes` /
|
|
8
|
+
* `-transcript`), and which are per-segment or full-episode audio.
|
|
9
|
+
*
|
|
10
|
+
* It was lifted verbatim from the app's `episodeRoom.ts` so forgewright and the
|
|
11
|
+
* book tooling read an episode's structure the same way the `/chronicle` surface
|
|
12
|
+
* does, without forking the grammar. It operates on a directory snapshot (a list
|
|
13
|
+
* of file names) and returns which file plays which role — it never reads file
|
|
14
|
+
* contents or touches the filesystem. The app remains free to read the mapped
|
|
15
|
+
* files for their text/audio; this module only names the structure.
|
|
16
|
+
*/
|
|
17
|
+
const TEXT_EXT = new Set([".md", ".txt"]);
|
|
18
|
+
const AUDIO_EXT = new Set([".mp3", ".ogg"]);
|
|
19
|
+
const DOC_LABELS = {
|
|
20
|
+
readme: "README",
|
|
21
|
+
"source-ledger": "Source Ledger",
|
|
22
|
+
agents: "AGENTS",
|
|
23
|
+
"relational-map": "Relational Map",
|
|
24
|
+
"medicine-wheel-snapshot": "Medicine Wheel Snapshot",
|
|
25
|
+
"audio-manifest": "Audio Manifest",
|
|
26
|
+
"delivery-notes": "Delivery Notes",
|
|
27
|
+
synopsis: "Synopsis",
|
|
28
|
+
"context-setting": "Context Setting",
|
|
29
|
+
status: "Status",
|
|
30
|
+
};
|
|
31
|
+
function extname(file) {
|
|
32
|
+
const dot = file.lastIndexOf(".");
|
|
33
|
+
return dot <= 0 ? "" : file.slice(dot).toLowerCase();
|
|
34
|
+
}
|
|
35
|
+
function titleize(value) {
|
|
36
|
+
return value
|
|
37
|
+
.replace(/[-_]+/g, " ")
|
|
38
|
+
.trim()
|
|
39
|
+
.split(" ")
|
|
40
|
+
.map((word) => (word ? word[0].toUpperCase() + word.slice(1) : word))
|
|
41
|
+
.join(" ");
|
|
42
|
+
}
|
|
43
|
+
/** Classify one file name into its role + stem, or null when it is ignorable. */
|
|
44
|
+
export function classifyEpisodeFile(file) {
|
|
45
|
+
const ext = extname(file);
|
|
46
|
+
const base = file.slice(0, file.length - ext.length);
|
|
47
|
+
if (AUDIO_EXT.has(ext))
|
|
48
|
+
return { role: "audio", stem: base, file, ext };
|
|
49
|
+
if (!TEXT_EXT.has(ext))
|
|
50
|
+
return null;
|
|
51
|
+
if (base.endsWith("-script"))
|
|
52
|
+
return { role: "script", stem: base.slice(0, -"-script".length), file, ext };
|
|
53
|
+
if (base.endsWith("-narration"))
|
|
54
|
+
return { role: "narration", stem: base.slice(0, -"-narration".length), file, ext };
|
|
55
|
+
if (base.endsWith("-revision-notes"))
|
|
56
|
+
return { role: "revision", stem: base.slice(0, -"-revision-notes".length), file, ext };
|
|
57
|
+
if (base.endsWith("-transcript"))
|
|
58
|
+
return { role: "transcript", stem: base.slice(0, -"-transcript".length), file, ext };
|
|
59
|
+
return { role: "doc", stem: base, file, ext };
|
|
60
|
+
}
|
|
61
|
+
/** Parse a segment stem (`chapter-01`, `interlude-2`, `part-03-title`). */
|
|
62
|
+
export function segmentKeyFromStem(stem) {
|
|
63
|
+
let match = stem.match(/^chapter-0*(\d+)/);
|
|
64
|
+
if (match)
|
|
65
|
+
return { kind: "chapter", order: Number(match[1]), label: `Chapter ${Number(match[1])}` };
|
|
66
|
+
match = stem.match(/^interlude-0*(\d+)/);
|
|
67
|
+
if (match)
|
|
68
|
+
return { kind: "interlude", order: Number(match[1]), label: `Interlude ${Number(match[1])}` };
|
|
69
|
+
match = stem.match(/part-0*(\d+)[-_]?(.*)$/);
|
|
70
|
+
if (match) {
|
|
71
|
+
const tail = match[2] ? ` · ${titleize(match[2])}` : "";
|
|
72
|
+
return { kind: "part", order: Number(match[1]), label: `Part ${Number(match[1])}${tail}` };
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function audioLabel(stem) {
|
|
77
|
+
if (stem === "episode")
|
|
78
|
+
return { label: "Full episode", sub: "episode", primary: true };
|
|
79
|
+
const segment = segmentKeyFromStem(stem);
|
|
80
|
+
if (segment)
|
|
81
|
+
return { label: segment.label, sub: stem, primary: false };
|
|
82
|
+
return { label: titleize(stem), sub: stem, primary: false };
|
|
83
|
+
}
|
|
84
|
+
function toFileName(entry) {
|
|
85
|
+
const raw = typeof entry === "string" ? entry : entry?.relativePath;
|
|
86
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
87
|
+
return null;
|
|
88
|
+
// A segment grammar is a flat, single-directory grammar: nested paths are not
|
|
89
|
+
// episode segments. Take the basename so callers may pass either shape.
|
|
90
|
+
const slash = Math.max(raw.lastIndexOf("/"), raw.lastIndexOf("\\"));
|
|
91
|
+
const name = slash === -1 ? raw : raw.slice(slash + 1);
|
|
92
|
+
return name.length > 0 ? name : null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Observe an episode folder's file names into its structural model: mains,
|
|
96
|
+
* ordered segments (with per-segment roles + audio), full-episode/loose audio,
|
|
97
|
+
* and loose docs. Deterministic and content-free — pass the directory's file
|
|
98
|
+
* names (or entries with a `relativePath`); nested paths are keyed by basename.
|
|
99
|
+
*/
|
|
100
|
+
export function observeEpisodeSegments(files) {
|
|
101
|
+
const mains = { narrationIsMarkdown: false };
|
|
102
|
+
const audio = [];
|
|
103
|
+
const docs = [];
|
|
104
|
+
const segmentMap = new Map();
|
|
105
|
+
for (const entry of files) {
|
|
106
|
+
const file = toFileName(entry);
|
|
107
|
+
if (file === null)
|
|
108
|
+
continue;
|
|
109
|
+
const classified = classifyEpisodeFile(file);
|
|
110
|
+
if (!classified)
|
|
111
|
+
continue;
|
|
112
|
+
if (classified.role === "script" && classified.stem === "") {
|
|
113
|
+
mains.script = file;
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (classified.role === "audio") {
|
|
117
|
+
const meta = audioLabel(classified.stem);
|
|
118
|
+
audio.push({ file, label: meta.label, sub: meta.sub, primary: meta.primary });
|
|
119
|
+
}
|
|
120
|
+
if (classified.role === "doc") {
|
|
121
|
+
const key = classified.stem.toLowerCase();
|
|
122
|
+
if (classified.stem === "script") {
|
|
123
|
+
mains.script = file;
|
|
124
|
+
}
|
|
125
|
+
else if (classified.stem === "narration") {
|
|
126
|
+
mains.narration = file;
|
|
127
|
+
mains.narrationIsMarkdown = classified.ext === ".md";
|
|
128
|
+
}
|
|
129
|
+
else if (classified.stem === "revision-notes") {
|
|
130
|
+
mains.revision = file;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
docs.push({ file, label: DOC_LABELS[key] ?? titleize(classified.stem) });
|
|
134
|
+
}
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (classified.role === "narration" && classified.stem === "") {
|
|
138
|
+
mains.narration = file;
|
|
139
|
+
mains.narrationIsMarkdown = classified.ext === ".md";
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (classified.role === "revision" && classified.stem === "") {
|
|
143
|
+
mains.revision = file;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (classified.role === "transcript" && classified.stem === "")
|
|
147
|
+
continue;
|
|
148
|
+
const key = segmentKeyFromStem(classified.stem);
|
|
149
|
+
if (!key)
|
|
150
|
+
continue;
|
|
151
|
+
const bucket = segmentMap.get(classified.stem) ?? { key, roles: {} };
|
|
152
|
+
bucket.roles[classified.role] = classified;
|
|
153
|
+
segmentMap.set(classified.stem, bucket);
|
|
154
|
+
}
|
|
155
|
+
const segments = [];
|
|
156
|
+
for (const [stem, bucket] of segmentMap) {
|
|
157
|
+
const narration = bucket.roles.narration;
|
|
158
|
+
const segment = {
|
|
159
|
+
id: stem,
|
|
160
|
+
kind: bucket.key.kind,
|
|
161
|
+
order: bucket.key.order,
|
|
162
|
+
label: bucket.key.label,
|
|
163
|
+
roles: {},
|
|
164
|
+
narrationIsMarkdown: narration ? narration.ext === ".md" : false,
|
|
165
|
+
audio: audio.filter((track) => track.sub === stem),
|
|
166
|
+
};
|
|
167
|
+
for (const [role, classified] of Object.entries(bucket.roles)) {
|
|
168
|
+
segment.roles[role] = classified.file;
|
|
169
|
+
}
|
|
170
|
+
segments.push(segment);
|
|
171
|
+
}
|
|
172
|
+
segments.sort((left, right) => {
|
|
173
|
+
if (left.order !== right.order)
|
|
174
|
+
return left.order - right.order;
|
|
175
|
+
const rank = (kind) => (kind === "chapter" ? 0 : kind === "interlude" ? 1 : 2);
|
|
176
|
+
return rank(left.kind) - rank(right.kind);
|
|
177
|
+
});
|
|
178
|
+
audio.sort((left, right) => {
|
|
179
|
+
const primaryRank = (track) => (track.primary ? 0 : 1);
|
|
180
|
+
return primaryRank(left) - primaryRank(right) || left.sub.localeCompare(right.sub);
|
|
181
|
+
});
|
|
182
|
+
docs.sort((left, right) => left.label.localeCompare(right.label));
|
|
183
|
+
return { mains, segments, audio, docs };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=segment-grammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segment-grammar.js","sourceRoot":"","sources":["../../src/adapters/segment-grammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The chronicle catalog — a list-of-episodes zone the app `/chronicle` surface
|
|
3
|
+
* and forgewright read identically (jgwill/Miadi#506, #507).
|
|
4
|
+
*
|
|
5
|
+
* Filesystem-free, like the rest of this package: it observes already-collected
|
|
6
|
+
* per-episode inputs (a folder name, and — when the episode is structured — its
|
|
7
|
+
* observed `episode.yaml`) and assembles the manifest. The enumerator that walks
|
|
8
|
+
* the chronicle root on disk and produces these inputs lives in
|
|
9
|
+
* `@miadi/inquiry-weave` (`catalog.ts`); this module only shapes and validates
|
|
10
|
+
* what it is handed, so the app and forgewright never fork the read-side.
|
|
11
|
+
*/
|
|
12
|
+
import type { CompatibilityDiagnostic, EpisodeObservation, EpisodeRelation } from "./observation.js";
|
|
13
|
+
import type { StoryManifestEntry } from "./story-library-manifest.js";
|
|
14
|
+
/** The medicine-wheel parent every chronicle episode node hangs under. */
|
|
15
|
+
export declare const CHRONICLE_PARENT_NODE_ID = "chronicle:miadi-chronicle";
|
|
16
|
+
export declare const CHRONICLE_SERIES = "miadi-chronicle";
|
|
17
|
+
/**
|
|
18
|
+
* The medicine-wheel projection id for one episode.
|
|
19
|
+
* Mirrors `@miadi/inquiry-weave`'s `episodeNodeId` — the shared convention both
|
|
20
|
+
* the writer and the readers key on. Keyed on the folder name, never the number
|
|
21
|
+
* (numbers collide; folder names do not).
|
|
22
|
+
*/
|
|
23
|
+
export declare function chronicleEpisodeNodeId(name: string): string;
|
|
24
|
+
/** One row of the chronicle catalog, as both renderers consume it. */
|
|
25
|
+
export interface EpisodeManifestEntry {
|
|
26
|
+
/** Folder basename — the true key. */
|
|
27
|
+
name: string;
|
|
28
|
+
/** Medicine-wheel node id, `chronicle:<name>`. */
|
|
29
|
+
nodeId: string;
|
|
30
|
+
/** Path relative to the chronicle root, `<name>/episode.yaml`. */
|
|
31
|
+
relativePath: string;
|
|
32
|
+
/** Episode number when parseable from the folder name; may collide. */
|
|
33
|
+
number?: number;
|
|
34
|
+
slug?: string;
|
|
35
|
+
date?: string;
|
|
36
|
+
title?: string;
|
|
37
|
+
status?: string;
|
|
38
|
+
type?: string;
|
|
39
|
+
/** Lineage edges (`continues_from` / `relates_to` / `branch_of`) when structured. */
|
|
40
|
+
relations: EpisodeRelation[];
|
|
41
|
+
/** True when a structured `episode.yaml` was observed (vs. name-only). */
|
|
42
|
+
structured: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Published book/story form(s) for this episode, attached by `linkStoryForms`
|
|
45
|
+
* from a `StoryLibraryManifest`. Absent when the episode has no published story.
|
|
46
|
+
*/
|
|
47
|
+
stories?: StoryManifestEntry[];
|
|
48
|
+
}
|
|
49
|
+
/** What the enumerator collects per folder before manifest assembly. */
|
|
50
|
+
export interface ChronicleManifestEntryInput {
|
|
51
|
+
name: string;
|
|
52
|
+
number?: number;
|
|
53
|
+
slug?: string;
|
|
54
|
+
date?: string;
|
|
55
|
+
/** Present when the episode carried a structured `episode.yaml`. */
|
|
56
|
+
observation?: EpisodeObservation;
|
|
57
|
+
}
|
|
58
|
+
export interface ChronicleManifest {
|
|
59
|
+
zone: "chronicle";
|
|
60
|
+
series: string;
|
|
61
|
+
/** Medicine-wheel parent node id all entries hang under. */
|
|
62
|
+
parentNodeId: string;
|
|
63
|
+
generatedAt?: string;
|
|
64
|
+
episodes: EpisodeManifestEntry[];
|
|
65
|
+
diagnostics: CompatibilityDiagnostic[];
|
|
66
|
+
}
|
|
67
|
+
export interface ObserveChronicleManifestOptions {
|
|
68
|
+
series?: string;
|
|
69
|
+
parentNodeId?: string;
|
|
70
|
+
/** When provided, stamps `generatedAt`; omit for a deterministic manifest. */
|
|
71
|
+
now?: () => Date;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Assemble a ChronicleManifest from per-episode inputs.
|
|
75
|
+
*
|
|
76
|
+
* Non-destructive and compatibility-first: name-only episodes (the older
|
|
77
|
+
* `script.md` era) are catalogued alongside structured ones; observation
|
|
78
|
+
* diagnostics are lifted and path-scoped; number collisions are reported as an
|
|
79
|
+
* `info` diagnostic, never dropped. Output is ordered by folder name so the
|
|
80
|
+
* manifest is stable across runs.
|
|
81
|
+
*/
|
|
82
|
+
export declare function observeChronicleManifest(inputs: readonly ChronicleManifestEntryInput[], options?: ObserveChronicleManifestOptions): ChronicleManifest;
|
|
83
|
+
//# sourceMappingURL=chronicle-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronicle-manifest.d.ts","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,8BAA8B,CAAA;AACnE,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,qFAAqF;IACrF,SAAS,EAAE,eAAe,EAAE,CAAA;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAA;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAC/B;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,oBAAoB,EAAE,CAAA;IAChC,WAAW,EAAE,uBAAuB,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,2BAA2B,EAAE,EAC9C,OAAO,GAAE,+BAAoC,GAC5C,iBAAiB,CAwDnB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The chronicle catalog — a list-of-episodes zone the app `/chronicle` surface
|
|
3
|
+
* and forgewright read identically (jgwill/Miadi#506, #507).
|
|
4
|
+
*
|
|
5
|
+
* Filesystem-free, like the rest of this package: it observes already-collected
|
|
6
|
+
* per-episode inputs (a folder name, and — when the episode is structured — its
|
|
7
|
+
* observed `episode.yaml`) and assembles the manifest. The enumerator that walks
|
|
8
|
+
* the chronicle root on disk and produces these inputs lives in
|
|
9
|
+
* `@miadi/inquiry-weave` (`catalog.ts`); this module only shapes and validates
|
|
10
|
+
* what it is handed, so the app and forgewright never fork the read-side.
|
|
11
|
+
*/
|
|
12
|
+
/** The medicine-wheel parent every chronicle episode node hangs under. */
|
|
13
|
+
export const CHRONICLE_PARENT_NODE_ID = "chronicle:miadi-chronicle";
|
|
14
|
+
export const CHRONICLE_SERIES = "miadi-chronicle";
|
|
15
|
+
/**
|
|
16
|
+
* The medicine-wheel projection id for one episode.
|
|
17
|
+
* Mirrors `@miadi/inquiry-weave`'s `episodeNodeId` — the shared convention both
|
|
18
|
+
* the writer and the readers key on. Keyed on the folder name, never the number
|
|
19
|
+
* (numbers collide; folder names do not).
|
|
20
|
+
*/
|
|
21
|
+
export function chronicleEpisodeNodeId(name) {
|
|
22
|
+
return `chronicle:${name}`;
|
|
23
|
+
}
|
|
24
|
+
function readStringField(fields, key) {
|
|
25
|
+
const value = fields[key];
|
|
26
|
+
return typeof value === "string" && value.trim() !== "" ? value : undefined;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Assemble a ChronicleManifest from per-episode inputs.
|
|
30
|
+
*
|
|
31
|
+
* Non-destructive and compatibility-first: name-only episodes (the older
|
|
32
|
+
* `script.md` era) are catalogued alongside structured ones; observation
|
|
33
|
+
* diagnostics are lifted and path-scoped; number collisions are reported as an
|
|
34
|
+
* `info` diagnostic, never dropped. Output is ordered by folder name so the
|
|
35
|
+
* manifest is stable across runs.
|
|
36
|
+
*/
|
|
37
|
+
export function observeChronicleManifest(inputs, options = {}) {
|
|
38
|
+
const series = options.series ?? CHRONICLE_SERIES;
|
|
39
|
+
const parentNodeId = options.parentNodeId ?? CHRONICLE_PARENT_NODE_ID;
|
|
40
|
+
const diagnostics = [];
|
|
41
|
+
const episodes = inputs.map((input) => {
|
|
42
|
+
const obs = input.observation;
|
|
43
|
+
const entry = {
|
|
44
|
+
name: input.name,
|
|
45
|
+
nodeId: chronicleEpisodeNodeId(input.name),
|
|
46
|
+
relativePath: `${input.name}/episode.yaml`,
|
|
47
|
+
number: input.number,
|
|
48
|
+
slug: input.slug,
|
|
49
|
+
date: input.date ?? obs?.sourceMetadata.date,
|
|
50
|
+
title: obs?.sourceMetadata.title,
|
|
51
|
+
status: obs?.sourceMetadata.status,
|
|
52
|
+
type: obs ? readStringField(obs.unmappedFields, "type") : undefined,
|
|
53
|
+
relations: obs?.relations ?? [],
|
|
54
|
+
structured: obs !== undefined,
|
|
55
|
+
};
|
|
56
|
+
if (obs) {
|
|
57
|
+
for (const d of obs.diagnostics) {
|
|
58
|
+
diagnostics.push({ ...d, path: d.path ?? input.name });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return entry;
|
|
62
|
+
});
|
|
63
|
+
const byNumber = new Map();
|
|
64
|
+
for (const e of episodes) {
|
|
65
|
+
if (e.number === undefined)
|
|
66
|
+
continue;
|
|
67
|
+
const names = byNumber.get(e.number) ?? [];
|
|
68
|
+
names.push(e.name);
|
|
69
|
+
byNumber.set(e.number, names);
|
|
70
|
+
}
|
|
71
|
+
for (const [num, names] of byNumber) {
|
|
72
|
+
if (names.length > 1) {
|
|
73
|
+
diagnostics.push({
|
|
74
|
+
level: "info",
|
|
75
|
+
code: "chronicle.episode-number-collision",
|
|
76
|
+
message: `episode number ${num} is shared by ${names.length} folders; the folder name is the key (${names.join(", ")})`,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
episodes.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
|
|
81
|
+
const manifest = {
|
|
82
|
+
zone: "chronicle",
|
|
83
|
+
series,
|
|
84
|
+
parentNodeId,
|
|
85
|
+
episodes,
|
|
86
|
+
diagnostics,
|
|
87
|
+
};
|
|
88
|
+
if (options.now)
|
|
89
|
+
manifest.generatedAt = options.now().toISOString();
|
|
90
|
+
return manifest;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=chronicle-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chronicle-manifest.js","sourceRoot":"","sources":["../src/chronicle-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export * from "./types.js";
|
|
2
2
|
export * from "./narrative.js";
|
|
3
3
|
export * from "./observation.js";
|
|
4
|
+
export * from "./chronicle-manifest.js";
|
|
5
|
+
export * from "./story-library-manifest.js";
|
|
4
6
|
export * from "./adapters/composition.js";
|
|
5
7
|
export * from "./adapters/episode-yaml.js";
|
|
6
8
|
export * from "./adapters/directory.js";
|
|
9
|
+
export * from "./adapters/segment-grammar.js";
|
|
7
10
|
/**
|
|
8
11
|
* Shared source-reading helpers, exported so downstream packages read paths and
|
|
9
12
|
* infer identity the same way this package does rather than forking a second,
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
export * from "./types.js";
|
|
2
2
|
export * from "./narrative.js";
|
|
3
3
|
export * from "./observation.js";
|
|
4
|
+
export * from "./chronicle-manifest.js";
|
|
5
|
+
export * from "./story-library-manifest.js";
|
|
4
6
|
export * from "./adapters/composition.js";
|
|
5
7
|
export * from "./adapters/episode-yaml.js";
|
|
6
8
|
export * from "./adapters/directory.js";
|
|
9
|
+
export * from "./adapters/segment-grammar.js";
|
|
7
10
|
/**
|
|
8
11
|
* Shared source-reading helpers, exported so downstream packages read paths and
|
|
9
12
|
* infer identity the same way this package does rather than forking a second,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAE7C;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The story library catalog — the published Twine/interactive-book zone
|
|
3
|
+
* (`/home/mia/Documents/Twine/Stories`), read the same way the chronicle catalog
|
|
4
|
+
* reads episode folders (jgwill/Miadi#506 book cycle).
|
|
5
|
+
*
|
|
6
|
+
* Filesystem-free, like the rest of this package: it observes an already-collected
|
|
7
|
+
* directory snapshot (story file/dir names) and assembles the manifest. The
|
|
8
|
+
* enumerator that walks the stories root on disk lives in `@miadi/inquiry-weave`
|
|
9
|
+
* (`story-library.ts`), mirroring `buildChronicleCatalog`; this module only shapes
|
|
10
|
+
* and validates what it is handed so the app and forgewright never fork the
|
|
11
|
+
* read-side.
|
|
12
|
+
*
|
|
13
|
+
* A story maps to an episode by the episode number parsed from its name
|
|
14
|
+
* (`Episode_040___…`, `Episode-044-…`). Stories with no parseable episode number
|
|
15
|
+
* (a pilot title like `The_Room_Lent_It_Ears.html`, or `dummy1.html`) are still
|
|
16
|
+
* catalogued — the library tolerates non-episode stories.
|
|
17
|
+
*/
|
|
18
|
+
import type { CompatibilityDiagnostic, EpisodeIdentityCandidate } from "./observation.js";
|
|
19
|
+
import type { EpisodeManifestEntry } from "./chronicle-manifest.js";
|
|
20
|
+
export type StoryKind = "html" | "directory" | "other";
|
|
21
|
+
/** One published story, as the book-cycle surface consumes it. */
|
|
22
|
+
export interface StoryManifestEntry {
|
|
23
|
+
/** File or directory basename — the true key. */
|
|
24
|
+
name: string;
|
|
25
|
+
/** Stable id, `story:<name>`. */
|
|
26
|
+
storyId: string;
|
|
27
|
+
kind: StoryKind;
|
|
28
|
+
/** Path relative to the stories root. */
|
|
29
|
+
relativePath: string;
|
|
30
|
+
/** Episode number parsed from the name, when present. */
|
|
31
|
+
episodeNumber?: number;
|
|
32
|
+
/** Identity candidates parsed from the name (episode-number, slug, path). */
|
|
33
|
+
identityCandidates: EpisodeIdentityCandidate[];
|
|
34
|
+
/** A display title derived from the name. */
|
|
35
|
+
title: string;
|
|
36
|
+
}
|
|
37
|
+
/** What the enumerator collects per story before manifest assembly. */
|
|
38
|
+
export interface StoryLibraryEntryInput {
|
|
39
|
+
/** File or directory name, or an object carrying it plus a directory flag. */
|
|
40
|
+
name: string;
|
|
41
|
+
type?: "file" | "directory";
|
|
42
|
+
}
|
|
43
|
+
export interface StoryLibraryManifest {
|
|
44
|
+
zone: "story-library";
|
|
45
|
+
/** A label for the stories root, never an absolute path (stays portable). */
|
|
46
|
+
root: string;
|
|
47
|
+
generatedAt?: string;
|
|
48
|
+
stories: StoryManifestEntry[];
|
|
49
|
+
diagnostics: CompatibilityDiagnostic[];
|
|
50
|
+
}
|
|
51
|
+
export interface ObserveStoryLibraryOptions {
|
|
52
|
+
/** A label for the stories root; defaults to `twine-stories`. */
|
|
53
|
+
root?: string;
|
|
54
|
+
/** When provided, stamps `generatedAt`; omit for a deterministic manifest. */
|
|
55
|
+
now?: () => Date;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Assemble a StoryLibraryManifest from collected story names.
|
|
59
|
+
*
|
|
60
|
+
* Non-destructive and deterministic: entries are sorted by name; a non-episode
|
|
61
|
+
* story is kept with `episodeNumber` undefined; an empty library is reported as
|
|
62
|
+
* an `info` diagnostic rather than an error.
|
|
63
|
+
*/
|
|
64
|
+
export declare function observeStoryLibrary(inputs: ReadonlyArray<string | StoryLibraryEntryInput>, options?: ObserveStoryLibraryOptions): StoryLibraryManifest;
|
|
65
|
+
/** Index the library's stories by the episode number they declare. */
|
|
66
|
+
export declare function indexStoriesByEpisode(manifest: StoryLibraryManifest): Map<number, StoryManifestEntry[]>;
|
|
67
|
+
/**
|
|
68
|
+
* Non-destructively attach each episode's book form(s) to its chronicle entry.
|
|
69
|
+
*
|
|
70
|
+
* Returns a shallow-copied entry list where any episode whose number matches a
|
|
71
|
+
* published story gains a `stories` array — the seam the `/chronicle` surface
|
|
72
|
+
* uses to link an episode to its interactive-book form. Episodes without a
|
|
73
|
+
* published story are returned unchanged (no `stories` field).
|
|
74
|
+
*/
|
|
75
|
+
export declare function linkStoryForms(episodes: readonly EpisodeManifestEntry[], library: StoryLibraryManifest): EpisodeManifestEntry[];
|
|
76
|
+
//# sourceMappingURL=story-library-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-library-manifest.d.ts","sourceRoot":"","sources":["../src/story-library-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAEzF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAAA;AAEtD,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,SAAS,CAAA;IACf,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAA;IACpB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,6EAA6E;IAC7E,kBAAkB,EAAE,wBAAwB,EAAE,CAAA;IAC9C,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAA;CACd;AAED,uEAAuE;AACvE,MAAM,WAAW,sBAAsB;IACrC,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,eAAe,CAAA;IACrB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,WAAW,EAAE,uBAAuB,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAgCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,sBAAsB,CAAC,EACtD,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CA6DtB;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,oBAAoB,GAC7B,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CASnC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,SAAS,oBAAoB,EAAE,EACzC,OAAO,EAAE,oBAAoB,GAC5B,oBAAoB,EAAE,CAQxB"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The story library catalog — the published Twine/interactive-book zone
|
|
3
|
+
* (`/home/mia/Documents/Twine/Stories`), read the same way the chronicle catalog
|
|
4
|
+
* reads episode folders (jgwill/Miadi#506 book cycle).
|
|
5
|
+
*
|
|
6
|
+
* Filesystem-free, like the rest of this package: it observes an already-collected
|
|
7
|
+
* directory snapshot (story file/dir names) and assembles the manifest. The
|
|
8
|
+
* enumerator that walks the stories root on disk lives in `@miadi/inquiry-weave`
|
|
9
|
+
* (`story-library.ts`), mirroring `buildChronicleCatalog`; this module only shapes
|
|
10
|
+
* and validates what it is handed so the app and forgewright never fork the
|
|
11
|
+
* read-side.
|
|
12
|
+
*
|
|
13
|
+
* A story maps to an episode by the episode number parsed from its name
|
|
14
|
+
* (`Episode_040___…`, `Episode-044-…`). Stories with no parseable episode number
|
|
15
|
+
* (a pilot title like `The_Room_Lent_It_Ears.html`, or `dummy1.html`) are still
|
|
16
|
+
* catalogued — the library tolerates non-episode stories.
|
|
17
|
+
*/
|
|
18
|
+
import { extractEpisodeNumber } from "./adapters/common.js";
|
|
19
|
+
const HTML_PATTERN = /\.html?$/i;
|
|
20
|
+
function stripExtension(name) {
|
|
21
|
+
return name.replace(/\.[^.]+$/, "");
|
|
22
|
+
}
|
|
23
|
+
function storyTitle(name) {
|
|
24
|
+
return stripExtension(name)
|
|
25
|
+
.replace(/[-_]+/g, " ")
|
|
26
|
+
.replace(/\s+/g, " ")
|
|
27
|
+
.trim();
|
|
28
|
+
}
|
|
29
|
+
function observeStoryIdentity(name, relativePath) {
|
|
30
|
+
const candidates = [];
|
|
31
|
+
const slug = stripExtension(name);
|
|
32
|
+
if (slug.length > 0)
|
|
33
|
+
candidates.push({ kind: "slug", value: slug });
|
|
34
|
+
const parsed = extractEpisodeNumber(name);
|
|
35
|
+
const episodeNumber = parsed === undefined ? undefined : Number(parsed);
|
|
36
|
+
if (episodeNumber !== undefined) {
|
|
37
|
+
candidates.push({ kind: "episode-number", value: String(episodeNumber) });
|
|
38
|
+
}
|
|
39
|
+
candidates.push({ kind: "path", value: relativePath });
|
|
40
|
+
return { episodeNumber, candidates };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Assemble a StoryLibraryManifest from collected story names.
|
|
44
|
+
*
|
|
45
|
+
* Non-destructive and deterministic: entries are sorted by name; a non-episode
|
|
46
|
+
* story is kept with `episodeNumber` undefined; an empty library is reported as
|
|
47
|
+
* an `info` diagnostic rather than an error.
|
|
48
|
+
*/
|
|
49
|
+
export function observeStoryLibrary(inputs, options = {}) {
|
|
50
|
+
const root = options.root ?? "twine-stories";
|
|
51
|
+
const diagnostics = [];
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
const stories = [];
|
|
54
|
+
for (const raw of inputs) {
|
|
55
|
+
const input = typeof raw === "string" ? { name: raw } : raw;
|
|
56
|
+
const name = input?.name;
|
|
57
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
58
|
+
diagnostics.push({
|
|
59
|
+
level: "warning",
|
|
60
|
+
code: "story-library.invalid-entry",
|
|
61
|
+
message: "Story entries must be a name string or an object carrying a name.",
|
|
62
|
+
});
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (seen.has(name)) {
|
|
66
|
+
diagnostics.push({
|
|
67
|
+
level: "warning",
|
|
68
|
+
code: "story-library.duplicate-entry",
|
|
69
|
+
message: "Duplicate story entries are observed only once.",
|
|
70
|
+
path: name,
|
|
71
|
+
});
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
seen.add(name);
|
|
75
|
+
const kind = input.type === "directory" ? "directory" : HTML_PATTERN.test(name) ? "html" : "other";
|
|
76
|
+
const { episodeNumber, candidates } = observeStoryIdentity(name, name);
|
|
77
|
+
stories.push({
|
|
78
|
+
name,
|
|
79
|
+
storyId: `story:${name}`,
|
|
80
|
+
kind,
|
|
81
|
+
relativePath: name,
|
|
82
|
+
episodeNumber,
|
|
83
|
+
identityCandidates: candidates,
|
|
84
|
+
title: storyTitle(name),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
stories.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
88
|
+
if (stories.length === 0) {
|
|
89
|
+
diagnostics.push({
|
|
90
|
+
level: "info",
|
|
91
|
+
code: "story-library.empty",
|
|
92
|
+
message: "No stories were present in the library snapshot.",
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
const manifest = {
|
|
96
|
+
zone: "story-library",
|
|
97
|
+
root,
|
|
98
|
+
stories,
|
|
99
|
+
diagnostics,
|
|
100
|
+
};
|
|
101
|
+
if (options.now)
|
|
102
|
+
manifest.generatedAt = options.now().toISOString();
|
|
103
|
+
return manifest;
|
|
104
|
+
}
|
|
105
|
+
/** Index the library's stories by the episode number they declare. */
|
|
106
|
+
export function indexStoriesByEpisode(manifest) {
|
|
107
|
+
const byEpisode = new Map();
|
|
108
|
+
for (const story of manifest.stories) {
|
|
109
|
+
if (story.episodeNumber === undefined)
|
|
110
|
+
continue;
|
|
111
|
+
const bucket = byEpisode.get(story.episodeNumber) ?? [];
|
|
112
|
+
bucket.push(story);
|
|
113
|
+
byEpisode.set(story.episodeNumber, bucket);
|
|
114
|
+
}
|
|
115
|
+
return byEpisode;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Non-destructively attach each episode's book form(s) to its chronicle entry.
|
|
119
|
+
*
|
|
120
|
+
* Returns a shallow-copied entry list where any episode whose number matches a
|
|
121
|
+
* published story gains a `stories` array — the seam the `/chronicle` surface
|
|
122
|
+
* uses to link an episode to its interactive-book form. Episodes without a
|
|
123
|
+
* published story are returned unchanged (no `stories` field).
|
|
124
|
+
*/
|
|
125
|
+
export function linkStoryForms(episodes, library) {
|
|
126
|
+
const byEpisode = indexStoriesByEpisode(library);
|
|
127
|
+
return episodes.map((episode) => {
|
|
128
|
+
if (episode.number === undefined)
|
|
129
|
+
return episode;
|
|
130
|
+
const matched = byEpisode.get(episode.number);
|
|
131
|
+
if (!matched || matched.length === 0)
|
|
132
|
+
return episode;
|
|
133
|
+
return { ...episode, stories: matched };
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=story-library-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"story-library-manifest.js","sourceRoot":"","sources":["../src/story-library-manifest.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miadi/episodic-memory-schema",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "TypeScript types and JSON Schema for episodic memory — the durable session-to-session memory layer in the Miadi orchestration kit. Narrative layer is NCP-aligned; provenance layer is W3C PROV-DM and OAIS-informed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"miadi",
|