@miadi/episodic-memory-schema 0.11.0 → 0.12.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/README.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  Types + JSON Schema for **episodic memory** — the durable session-to-session memory layer in the Miadi orchestration kit.
4
4
 
5
+ In the Miadi stack, this is the shared record format. An episode is the unit everything is
6
+ filed under, and this package defines its shapes: the authored `EpisodicMemory` a session
7
+ leaves behind, and the read-only observations, manifests and catalogs other packages build
8
+ from existing episode folders. It has no dependencies and touches no filesystem: callers read
9
+ the files and hand it what they read.
10
+
11
+ Most of the stack depends on it: `@miadi/inquiry-weave`, `passages`, `@miadi/capture`,
12
+ `@miadi/episode-capture`, `@miadi/transcription`, `@miadi/plan-insight` and
13
+ `@miadi/musical-composition-to-episode`.
14
+
5
15
  When a Storyweaver session closes, the Export Steward extracts an episodic-memory object and feeds it back to Miadi world memory. The next commission inherits what this one built.
6
16
 
7
17
  ---
@@ -35,7 +45,7 @@ EpisodicMemory
35
45
 
36
46
  ### Narrative layer is NCP-aligned
37
47
 
38
- The `narrative` layer mirrors the [Narrative Context Protocol](https://github.com/) two-layer model:
48
+ The `narrative` layer mirrors the Narrative Context Protocol (NCP) two-layer model:
39
49
 
40
50
  - **Subtext** — authorial intent: perspectives, players, storypoints, storybeats, dynamics
41
51
  - **Storytelling** — surface presentation: overviews, moments
@@ -52,7 +62,7 @@ An NCP-consuming agent can read the narrative layer directly. Episodic-memory ad
52
62
  ## Install
53
63
 
54
64
  ```bash
55
- pnpm add @miadi/episodic-memory-schema
65
+ npm i @miadi/episodic-memory-schema
56
66
  ```
57
67
 
58
68
  ## Usage
@@ -158,18 +168,25 @@ modifies source material.
158
168
 
159
169
  ---
160
170
 
161
- ## Reviews held by an episode
162
-
163
- `parseReviewRef`, `readEpisodeReviews`, `reviewNodeId` and `EpisodeReviewEntry` type a Miadi
164
- review inside `episode.yaml` (`reviews:`), in the shape Episode 345 set on the wheel
165
- (`review:<uuid>`). Pure: no fs, no fetch. jgwill/Miadi#682.
171
+ ## Also in this package
172
+
173
+ - **Chronicle and story-library manifests.** `observeChronicleManifest`,
174
+ `EpisodeManifestEntry`, `chronicleEpisodeNodeId`, `linkEpisodeCaptures`;
175
+ `observeStoryLibrary`, `StoryManifestEntry`, `indexStoriesByEpisode`, `linkStoryForms`. They
176
+ shape a snapshot of the chronicle, or of a library of stories made from episodes, that the
177
+ caller hands in.
178
+ - **Episode captures.** `EpisodeCaptureRecord` and its parts: the descriptor of a recording
179
+ filed into an episode. `CaptureProvenance` is the provenance a capture carries.
180
+ - **Attention items.** The `attention.json` store an episode keeps for questions waiting on a
181
+ person (`ATTENTION_FILE`, schema `chronicle.attention.v1`).
182
+ - **Reviews held by an episode.** `parseReviewRef`, `readEpisodeReviews`, `reviewNodeId` and
183
+ `EpisodeReviewEntry` type a Miadi review inside `episode.yaml` (`reviews:`), with its
184
+ `review:<uuid>` node id. Pure: no fs, no fetch.
166
185
 
167
186
  ## Versioning
168
187
 
169
- - v0.2.0 (current) — compatibility-first observation adapters for composition manifests, parsed episode YAML, and descriptor-light directory snapshots
170
- - v0.1.1 — strict authored episodic-memory types and JSON Schema
171
- - The package release is `0.2.0`; the authored memory schema remains `episodic-memory.v1.0`
172
- - Schema version is encoded in the `schemaVersion` field, independently of the package version
188
+ The package version and the authored memory schema version move independently. The schema is
189
+ `episodic-memory.v1.0`, carried in the `schemaVersion` field.
173
190
 
174
191
  ---
175
192
 
@@ -182,7 +199,7 @@ review inside `episode.yaml` (`reviews:`), in the shape Episode 345 set on the w
182
199
  | W3C PROV-DM | Source / agent / activity attribution |
183
200
  | OAIS reference model + FAIR (Wilkinson 2016) | Archival packaging frame |
184
201
  | HAWK (Cheng et al. 2025, arXiv:2507.04067) | 10-predicate evaluation rubric; versioned chapter-state audit trail |
185
- | Storyweaver foundations (`foundations/narrative-studies-and-digital-storytelling/`) | Domain integration |
202
+ | Storyweaver foundations (narrative studies and digital storytelling) | Domain integration |
186
203
 
187
204
  ## License
188
205
 
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The chronicle FOUNDATION contract — a foundation packet held by an episode.
3
+ *
4
+ * A foundation packet is academic grounding (`foundations/<slug>/` in a repo,
5
+ * distributed in `@miadi/foundations`). Its address is
6
+ * `miadi-foundation:<slug>`. An episode holds one the way it holds a review
7
+ * (jgwill/Miadi#630): the packet is one reusable node on the wheel
8
+ * (`foundation:<slug>`), the episode relates to it with an edge naming what it
9
+ * uses the packet for, and the episode keeps its own record of the version it
10
+ * read. Packets get corrected; the version is what the episode stood on.
11
+ *
12
+ * An episode can also hold a small foundation of its own, written inside the
13
+ * vessel under `foundations/<topic>/`. That packet belongs to the episode: its
14
+ * address is `miadi-chronicle:<episode>/foundations/<topic>`, and its wheel
15
+ * node is keyed by the episode folder so two episodes can each hold a topic of
16
+ * the same name.
17
+ *
18
+ * Manifest shape (`episode.yaml`):
19
+ *
20
+ * foundations:
21
+ * - slug: resource-addressing-and-terminal-hypermedia
22
+ * source: package
23
+ * version: 0.1.6
24
+ * title: Resource Addressing & Terminal Hypermedia
25
+ * relation: grounded-by
26
+ * added: '2026-10-02T10:30:00.000Z'
27
+ * - slug: screenwalk-media-type
28
+ * source: episode
29
+ * path: foundations/screenwalk-media-type
30
+ *
31
+ * A `miadi-foundation:<slug>` string in `references:` is read as a held
32
+ * packet too. Pure — no fs, no fetch. Ref: jgwill/Miadi#713, jgwill/Miadi#548.
33
+ */
34
+ /** The address scheme of a distributed foundation packet. */
35
+ export declare const FOUNDATION_REFERENCE_PREFIX = "miadi-foundation:";
36
+ /** Wheel node ids for foundations: `foundation:<slug>`. */
37
+ export declare const FOUNDATION_NODE_PREFIX = "foundation:";
38
+ /** The wheel metadata kind a foundation node carries. */
39
+ export declare const FOUNDATION_NODE_KIND = "miadi_foundation";
40
+ /** Where an episode keeps the small foundations it authors itself. */
41
+ export declare const EPISODE_FOUNDATIONS_DIR = "foundations";
42
+ /** What an episode uses a packet for when nobody said: "Episode grounded-by Foundation". */
43
+ export declare const DEFAULT_FOUNDATION_RELATION = "grounded-by";
44
+ /** `package`: a packet from `@miadi/foundations`. `episode`: a packet inside this episode's vessel. */
45
+ export type FoundationSource = "package" | "episode";
46
+ export declare function isFoundationSlug(value: unknown): value is string;
47
+ /**
48
+ * The wheel node id of a held packet. A distributed packet is one node shared
49
+ * by every episode; an episode's own packet is keyed by the episode folder.
50
+ */
51
+ export declare function foundationNodeId(slug: string, episodeFolder?: string): string;
52
+ /** The slug a `miadi-foundation:` reference names, or null. `//` is accepted on input. */
53
+ export declare function foundationSlugOf(reference: unknown): string | null;
54
+ /** One foundation as an episode records it. */
55
+ export interface EpisodeFoundationEntry {
56
+ /** The packet directory name. */
57
+ slug: string;
58
+ source: FoundationSource;
59
+ /** The `@miadi/foundations` version read (source `package`). */
60
+ version?: string;
61
+ title?: string;
62
+ /** Vessel-relative directory of an episode's own packet (source `episode`). */
63
+ path?: string;
64
+ /** What the episode uses the packet for: completes "Episode <relation> Foundation". */
65
+ relation?: string;
66
+ /** ISO timestamp the packet entered the episode. */
67
+ added?: string;
68
+ }
69
+ export interface ObservedEpisodeFoundation extends EpisodeFoundationEntry {
70
+ /** `foundations` for a structured entry, `references` for a `miadi-foundation:` citation. */
71
+ declared: "foundations" | "references";
72
+ }
73
+ /** The entry's keys in the order the manifest writes them. */
74
+ export declare const FOUNDATION_ENTRY_KEYS: readonly ["slug", "source", "version", "title", "path", "relation", "added"];
75
+ /** An episode's own packet lives under `foundations/<slug>`, and nowhere else. */
76
+ export declare function episodeFoundationPath(slug: string): string;
77
+ /** Tolerant reader for one `foundations:` item. Null when it names no packet. */
78
+ export declare function toEpisodeFoundationEntry(raw: unknown): EpisodeFoundationEntry | null;
79
+ /**
80
+ * Every foundation a parsed `episode.yaml` holds: the structured
81
+ * `foundations:` list first, then `miadi-foundation:` citations in
82
+ * `references:` that the list does not already name. One entry per packet.
83
+ */
84
+ export declare function readEpisodeFoundations(manifest: unknown): ObservedEpisodeFoundation[];
85
+ //# sourceMappingURL=episode-foundation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-foundation.d.ts","sourceRoot":"","sources":["../src/episode-foundation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,2BAA2B,sBAAsB,CAAA;AAE9D,2DAA2D;AAC3D,eAAO,MAAM,sBAAsB,gBAAgB,CAAA;AAEnD,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,qBAAqB,CAAA;AAEtD,sEAAsE;AACtE,eAAO,MAAM,uBAAuB,gBAAgB,CAAA;AAEpD,4FAA4F;AAC5F,eAAO,MAAM,2BAA2B,gBAAgB,CAAA;AAExD,uGAAuG;AACvG,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAA;AAKpD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED,+CAA+C;AAC/C,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,gBAAgB,CAAA;IACxB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE,6FAA6F;IAC7F,QAAQ,EAAE,aAAa,GAAG,YAAY,CAAA;CACvC;AAED,8DAA8D;AAC9D,eAAO,MAAM,qBAAqB,8EAA+E,CAAA;AAOjH,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAuBpF;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,GAAG,yBAAyB,EAAE,CAoBrF"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * The chronicle FOUNDATION contract — a foundation packet held by an episode.
3
+ *
4
+ * A foundation packet is academic grounding (`foundations/<slug>/` in a repo,
5
+ * distributed in `@miadi/foundations`). Its address is
6
+ * `miadi-foundation:<slug>`. An episode holds one the way it holds a review
7
+ * (jgwill/Miadi#630): the packet is one reusable node on the wheel
8
+ * (`foundation:<slug>`), the episode relates to it with an edge naming what it
9
+ * uses the packet for, and the episode keeps its own record of the version it
10
+ * read. Packets get corrected; the version is what the episode stood on.
11
+ *
12
+ * An episode can also hold a small foundation of its own, written inside the
13
+ * vessel under `foundations/<topic>/`. That packet belongs to the episode: its
14
+ * address is `miadi-chronicle:<episode>/foundations/<topic>`, and its wheel
15
+ * node is keyed by the episode folder so two episodes can each hold a topic of
16
+ * the same name.
17
+ *
18
+ * Manifest shape (`episode.yaml`):
19
+ *
20
+ * foundations:
21
+ * - slug: resource-addressing-and-terminal-hypermedia
22
+ * source: package
23
+ * version: 0.1.6
24
+ * title: Resource Addressing & Terminal Hypermedia
25
+ * relation: grounded-by
26
+ * added: '2026-10-02T10:30:00.000Z'
27
+ * - slug: screenwalk-media-type
28
+ * source: episode
29
+ * path: foundations/screenwalk-media-type
30
+ *
31
+ * A `miadi-foundation:<slug>` string in `references:` is read as a held
32
+ * packet too. Pure — no fs, no fetch. Ref: jgwill/Miadi#713, jgwill/Miadi#548.
33
+ */
34
+ /** The address scheme of a distributed foundation packet. */
35
+ export const FOUNDATION_REFERENCE_PREFIX = "miadi-foundation:";
36
+ /** Wheel node ids for foundations: `foundation:<slug>`. */
37
+ export const FOUNDATION_NODE_PREFIX = "foundation:";
38
+ /** The wheel metadata kind a foundation node carries. */
39
+ export const FOUNDATION_NODE_KIND = "miadi_foundation";
40
+ /** Where an episode keeps the small foundations it authors itself. */
41
+ export const EPISODE_FOUNDATIONS_DIR = "foundations";
42
+ /** What an episode uses a packet for when nobody said: "Episode grounded-by Foundation". */
43
+ export const DEFAULT_FOUNDATION_RELATION = "grounded-by";
44
+ // A packet directory name: no separator, no leading dot, never `..`.
45
+ const SLUG = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
46
+ export function isFoundationSlug(value) {
47
+ return typeof value === "string" && SLUG.test(value) && !value.includes("..");
48
+ }
49
+ /**
50
+ * The wheel node id of a held packet. A distributed packet is one node shared
51
+ * by every episode; an episode's own packet is keyed by the episode folder.
52
+ */
53
+ export function foundationNodeId(slug, episodeFolder) {
54
+ return episodeFolder ? `${FOUNDATION_NODE_PREFIX}${episodeFolder}/${slug}` : `${FOUNDATION_NODE_PREFIX}${slug}`;
55
+ }
56
+ /** The slug a `miadi-foundation:` reference names, or null. `//` is accepted on input. */
57
+ export function foundationSlugOf(reference) {
58
+ if (typeof reference !== "string")
59
+ return null;
60
+ const m = /^miadi-foundation:(?:\/\/)?([^/?#\s]+)/i.exec(reference.trim());
61
+ return m && isFoundationSlug(m[1]) ? m[1] : null;
62
+ }
63
+ /** The entry's keys in the order the manifest writes them. */
64
+ export const FOUNDATION_ENTRY_KEYS = ["slug", "source", "version", "title", "path", "relation", "added"];
65
+ function text(value) {
66
+ if (typeof value === "number" && Number.isFinite(value))
67
+ return String(value);
68
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
69
+ }
70
+ /** An episode's own packet lives under `foundations/<slug>`, and nowhere else. */
71
+ export function episodeFoundationPath(slug) {
72
+ return `${EPISODE_FOUNDATIONS_DIR}/${slug}`;
73
+ }
74
+ /** Tolerant reader for one `foundations:` item. Null when it names no packet. */
75
+ export function toEpisodeFoundationEntry(raw) {
76
+ if (typeof raw === "string") {
77
+ const slug = foundationSlugOf(raw) ?? (isFoundationSlug(raw.trim()) ? raw.trim() : null);
78
+ return slug ? { slug, source: "package" } : null;
79
+ }
80
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
81
+ return null;
82
+ const r = raw;
83
+ const slug = text(r.slug);
84
+ if (!isFoundationSlug(slug))
85
+ return null;
86
+ const source = r.source === "episode" ? "episode" : "package";
87
+ const entry = { slug, source };
88
+ const version = text(r.version);
89
+ if (version && source === "package")
90
+ entry.version = version;
91
+ const title = text(r.title);
92
+ if (title)
93
+ entry.title = title;
94
+ // The path is declared by the source, never taken from the file: an
95
+ // episode's packet is `foundations/<slug>`, whatever a hand edit wrote.
96
+ if (source === "episode")
97
+ entry.path = episodeFoundationPath(slug);
98
+ const relation = text(r.relation);
99
+ if (relation)
100
+ entry.relation = relation;
101
+ const added = r.added instanceof Date ? r.added.toISOString() : text(r.added);
102
+ if (added)
103
+ entry.added = added;
104
+ return entry;
105
+ }
106
+ const keyOf = (entry) => `${entry.source}:${entry.slug}`;
107
+ /**
108
+ * Every foundation a parsed `episode.yaml` holds: the structured
109
+ * `foundations:` list first, then `miadi-foundation:` citations in
110
+ * `references:` that the list does not already name. One entry per packet.
111
+ */
112
+ export function readEpisodeFoundations(manifest) {
113
+ if (typeof manifest !== "object" || manifest === null)
114
+ return [];
115
+ const m = manifest;
116
+ const out = [];
117
+ const seen = new Set();
118
+ for (const item of Array.isArray(m.foundations) ? m.foundations : []) {
119
+ const entry = toEpisodeFoundationEntry(item);
120
+ if (!entry || seen.has(keyOf(entry)))
121
+ continue;
122
+ seen.add(keyOf(entry));
123
+ out.push({ ...entry, declared: "foundations" });
124
+ }
125
+ for (const reference of Array.isArray(m.references) ? m.references : []) {
126
+ const slug = foundationSlugOf(reference);
127
+ if (!slug)
128
+ continue;
129
+ const entry = { slug, source: "package" };
130
+ if (seen.has(keyOf(entry)))
131
+ continue;
132
+ seen.add(keyOf(entry));
133
+ out.push({ ...entry, declared: "references" });
134
+ }
135
+ return out;
136
+ }
137
+ //# sourceMappingURL=episode-foundation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-foundation.js","sourceRoot":"","sources":["../src/episode-foundation.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -32,4 +32,10 @@ export type { AttentionItem, AttentionStore, ParsedAttentionStore, } from "./att
32
32
  */
33
33
  export { REVIEW_SERVICE_BASE_URL, REVIEW_REFERENCE_PREFIX, REVIEW_NODE_PREFIX, REVIEW_NODE_KIND, REVIEW_ENTRY_KEYS, isReviewId, reviewNodeId, reviewReference, reviewPageUrl, reviewJsonUrl, parseReviewRef, toEpisodeReviewEntry, readEpisodeReviews, } from "./episode-review.js";
34
34
  export type { ReviewRef, EpisodeReviewEntry, ObservedEpisodeReview } from "./episode-review.js";
35
+ /**
36
+ * A foundation packet held by an episode — the `foundations:` list in
37
+ * `episode.yaml`, and the wheel node kind it projects to (jgwill/Miadi#713).
38
+ */
39
+ export { FOUNDATION_REFERENCE_PREFIX, FOUNDATION_NODE_PREFIX, FOUNDATION_NODE_KIND, FOUNDATION_ENTRY_KEYS, EPISODE_FOUNDATIONS_DIR, DEFAULT_FOUNDATION_RELATION, isFoundationSlug, foundationNodeId, foundationSlugOf, episodeFoundationPath, toEpisodeFoundationEntry, readEpisodeFoundations, } from "./episode-foundation.js";
40
+ export type { FoundationSource, EpisodeFoundationEntry, ObservedEpisodeFoundation } from "./episode-foundation.js";
35
41
  //# sourceMappingURL=index.d.ts.map
@@ -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,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,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;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAEvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,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,+BAA+B,CAAA;AAC7C,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;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAEjE;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EACV,aAAa,EACb,cAAc,EACd,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAEvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAE/F;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -29,4 +29,9 @@ export { ATTENTION_FILE, ATTENTION_SCHEMA_VERSION, toAttentionItem, parseAttenti
29
29
  * shape Episode 345 set (jgwill/Miadi#630).
30
30
  */
31
31
  export { REVIEW_SERVICE_BASE_URL, REVIEW_REFERENCE_PREFIX, REVIEW_NODE_PREFIX, REVIEW_NODE_KIND, REVIEW_ENTRY_KEYS, isReviewId, reviewNodeId, reviewReference, reviewPageUrl, reviewJsonUrl, parseReviewRef, toEpisodeReviewEntry, readEpisodeReviews, } from "./episode-review.js";
32
+ /**
33
+ * A foundation packet held by an episode — the `foundations:` list in
34
+ * `episode.yaml`, and the wheel node kind it projects to (jgwill/Miadi#713).
35
+ */
36
+ export { FOUNDATION_REFERENCE_PREFIX, FOUNDATION_NODE_PREFIX, FOUNDATION_NODE_KIND, FOUNDATION_ENTRY_KEYS, EPISODE_FOUNDATIONS_DIR, DEFAULT_FOUNDATION_RELATION, isFoundationSlug, foundationNodeId, foundationSlugOf, episodeFoundationPath, toEpisodeFoundationEntry, readEpisodeFoundations, } from "./episode-foundation.js";
32
37
  //# sourceMappingURL=index.js.map
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,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,+BAA+B,CAAA;AAC7C,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;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAOvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,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,+BAA+B,CAAA;AAC7C,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;AAE7B;;;GAGG;AACH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,sBAAsB,CAAA;AAG7B;;;GAGG;AACH,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,gBAAgB,CAAA;AAOvB;;;GAGG;AACH,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAG5B;;;GAGG;AACH,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miadi/episodic-memory-schema",
3
- "version": "0.11.0",
3
+ "version": "0.12.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",