@miadi/episodic-memory-schema 0.1.0 → 0.2.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
@@ -115,10 +115,55 @@ Work the manuscript *implies* but did not complete. Each commission becomes a ca
115
115
 
116
116
  ---
117
117
 
118
+ ## Compatibility-first observation
119
+
120
+ Historical Chronicle sources do not need to satisfy the strict `EpisodicMemory`
121
+ authored schema before they can be inspected. The additive observation API reads
122
+ a source into a deterministic, diagnostic-rich description without rewriting it:
123
+
124
+ ```ts
125
+ import {
126
+ observeCompositionManifest,
127
+ observeEpisodeDirectory,
128
+ observeEpisodeYamlManifest
129
+ } from "@miadi/episodic-memory-schema"
130
+
131
+ const composition = observeCompositionManifest(compositionJson, {
132
+ relativePath: "ep097-ceremony-agent-skills/composition.json"
133
+ })
134
+
135
+ // Parsing YAML is intentionally caller-owned.
136
+ const manifest = observeEpisodeYamlManifest(parsedEpisodeYaml, {
137
+ relativePath: "2026-06-21-episode-076-plan-to-episode-pipeline/episode.yaml"
138
+ })
139
+
140
+ // Directory traversal is also caller-owned; pass a read-only snapshot.
141
+ const inferred = observeEpisodeDirectory({
142
+ entries: ["AGENTS.md", "AUDIO-MANIFEST.md", "source-ledger.md"]
143
+ }, {
144
+ relativePath: "2026-06-21-episode-075-claude-plans-dothome-concepts"
145
+ })
146
+ ```
147
+
148
+ The result exposes identity candidates, typed source metadata, source-relative
149
+ artifact references, episode relations, compatibility diagnostics, and fields
150
+ that were not structurally projected. Its identity is derived from the source
151
+ path rather than from an episode number alone.
152
+
153
+ The adapters cover composition manifests, already-parsed `episode.yaml`
154
+ manifests, and caller-supplied directory snapshots. They have no filesystem or
155
+ YAML-parser dependency. Projection into strict `EpisodicMemory` remains a
156
+ separate, explicit future operation; observation never silently promotes or
157
+ modifies source material.
158
+
159
+ ---
160
+
118
161
  ## Versioning
119
162
 
120
- - v0.1.0 (current) — initial schema; expect minor additions before v1.0
121
- - Schema version is encoded in the `schemaVersion` field, not just the package version
163
+ - v0.2.0 (current) — compatibility-first observation adapters for composition manifests, parsed episode YAML, and descriptor-light directory snapshots
164
+ - v0.1.1 — strict authored episodic-memory types and JSON Schema
165
+ - The package release is `0.2.0`; the authored memory schema remains `episodic-memory.v1.0`
166
+ - Schema version is encoded in the `schemaVersion` field, independently of the package version
122
167
 
123
168
  ---
124
169
 
@@ -0,0 +1,14 @@
1
+ import type { ArtifactKind, EpisodeSourceFormat } from "../observation.js";
2
+ export type JsonRecord = Record<string, unknown>;
3
+ export declare function isRecord(value: unknown): value is JsonRecord;
4
+ export declare function cloneValue(value: unknown): unknown;
5
+ export declare function cloneRecordExcept(input: JsonRecord, excluded: readonly string[]): Record<string, unknown>;
6
+ export declare function validateRelativePath(value: string): string;
7
+ export declare function tryValidateRelativePath(value: string): string | undefined;
8
+ export declare function observationId(format: EpisodeSourceFormat, relativePath: string): string;
9
+ export declare function resolveSiblingPath(sourceDocumentPath: string, artifactPath: string): string | undefined;
10
+ export declare function resolveChildPath(directoryPath: string, childPath: string): string | undefined;
11
+ export declare function inferArtifactKind(filename: string, defaultKind?: ArtifactKind): ArtifactKind;
12
+ export declare function extractEpisodeNumber(value: string): string | undefined;
13
+ export declare function pathBasename(relativePath: string): string;
14
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE1E,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAE5D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CASlD;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqB1D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMzE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,mBAAmB,EAC3B,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,kBAAkB,CAChC,kBAAkB,EAAE,MAAM,EAC1B,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,YAAsB,GAClC,YAAY,CAQd;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGtE;AAED,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIzD"}
@@ -0,0 +1,95 @@
1
+ export function isRecord(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export function cloneValue(value) {
5
+ if (value instanceof Date)
6
+ return new Date(value.getTime());
7
+ if (Array.isArray(value))
8
+ return value.map(cloneValue);
9
+ if (isRecord(value)) {
10
+ const clone = {};
11
+ for (const [key, child] of Object.entries(value))
12
+ clone[key] = cloneValue(child);
13
+ return clone;
14
+ }
15
+ return value;
16
+ }
17
+ export function cloneRecordExcept(input, excluded) {
18
+ const result = {};
19
+ for (const [key, value] of Object.entries(input)) {
20
+ if (!excluded.includes(key))
21
+ result[key] = cloneValue(value);
22
+ }
23
+ return result;
24
+ }
25
+ export function validateRelativePath(value) {
26
+ if (typeof value !== "string" || value.length === 0) {
27
+ throw new TypeError("relativePath must be a non-empty relative path");
28
+ }
29
+ if (value.startsWith("/") || value.startsWith("\\") || /^[A-Za-z]:[\\/]/.test(value)) {
30
+ throw new TypeError("relativePath must not be absolute");
31
+ }
32
+ if (value.includes("\\")) {
33
+ throw new TypeError("relativePath must use forward slashes");
34
+ }
35
+ const segments = value.split("/");
36
+ if (segments.some((segment) => segment === "..")) {
37
+ throw new TypeError("relativePath must not contain '..' traversal");
38
+ }
39
+ const normalized = segments
40
+ .filter((segment) => segment !== "." && segment !== "")
41
+ .join("/");
42
+ if (normalized.length === 0) {
43
+ throw new TypeError("relativePath must identify a source");
44
+ }
45
+ return normalized;
46
+ }
47
+ export function tryValidateRelativePath(value) {
48
+ try {
49
+ return validateRelativePath(value);
50
+ }
51
+ catch {
52
+ return undefined;
53
+ }
54
+ }
55
+ export function observationId(format, relativePath) {
56
+ return `episode-observation:${format}:${encodeURIComponent(relativePath)}`;
57
+ }
58
+ export function resolveSiblingPath(sourceDocumentPath, artifactPath) {
59
+ const normalizedArtifact = tryValidateRelativePath(artifactPath);
60
+ if (normalizedArtifact === undefined)
61
+ return undefined;
62
+ const directoryEnd = sourceDocumentPath.lastIndexOf("/");
63
+ const directory = directoryEnd === -1 ? "" : sourceDocumentPath.slice(0, directoryEnd + 1);
64
+ return `${directory}${normalizedArtifact}`;
65
+ }
66
+ export function resolveChildPath(directoryPath, childPath) {
67
+ const normalizedChild = tryValidateRelativePath(childPath);
68
+ if (normalizedChild === undefined)
69
+ return undefined;
70
+ return `${directoryPath}/${normalizedChild}`;
71
+ }
72
+ export function inferArtifactKind(filename, defaultKind = "other") {
73
+ const lower = filename.toLowerCase();
74
+ if (/\.(?:mp3|m4a|wav|ogg|flac|aac)$/.test(lower))
75
+ return "audio";
76
+ if (/\.(?:png|jpe?g|gif|webp|bmp|svg)$/.test(lower))
77
+ return "image";
78
+ if (/(?:transcript|transcription)/.test(lower))
79
+ return "transcript";
80
+ if (/\.(?:md|mdx|txt|text|yaml|yml|json|twee|html?|sh)$/.test(lower))
81
+ return "text";
82
+ if (defaultKind === "transcript")
83
+ return "text";
84
+ return defaultKind;
85
+ }
86
+ export function extractEpisodeNumber(value) {
87
+ const match = /(?:^|[^a-z0-9])ep(?:isode)?[-_ ]*0*(\d{1,4})(?=$|[^0-9])/i.exec(value);
88
+ return match?.[1];
89
+ }
90
+ export function pathBasename(relativePath) {
91
+ const end = relativePath.endsWith("/") ? relativePath.length - 1 : relativePath.length;
92
+ const start = relativePath.lastIndexOf("/", end - 1);
93
+ return relativePath.slice(start + 1, end);
94
+ }
95
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/adapters/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EpisodeObservation, ObserveCompositionManifestOptions } from "../observation.js";
2
+ /**
3
+ * Observe a composition manifest without rewriting it or forcing it into the
4
+ * strict EpisodicMemory authored shape.
5
+ */
6
+ export declare function observeCompositionManifest(input: unknown, options: ObserveCompositionManifestOptions): EpisodeObservation;
7
+ //# sourceMappingURL=composition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../src/adapters/composition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,kBAAkB,EAGlB,iCAAiC,EAClC,MAAM,mBAAmB,CAAA;AAuB1B;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,iCAAiC,GACzC,kBAAkB,CAoCpB"}
@@ -0,0 +1,219 @@
1
+ import { cloneRecordExcept, cloneValue, extractEpisodeNumber, inferArtifactKind, isRecord, observationId, resolveSiblingPath, validateRelativePath, } from "./common.js";
2
+ const STRUCTURALLY_PROJECTED_TOP_LEVEL_FIELDS = new Set([
3
+ "clips",
4
+ "texts",
5
+ "images",
6
+ "relatedEpisodes",
7
+ "branchOf",
8
+ ]);
9
+ const STRING_METADATA_FIELDS = ["title", "slug", "created", "updated", "notes"];
10
+ /**
11
+ * Observe a composition manifest without rewriting it or forcing it into the
12
+ * strict EpisodicMemory authored shape.
13
+ */
14
+ export function observeCompositionManifest(input, options) {
15
+ const relativePath = validateRelativePath(options.relativePath);
16
+ const id = observationId("composition-json", relativePath);
17
+ const base = {
18
+ id,
19
+ zone: options.zone ?? "composition-intake",
20
+ sourceDocuments: [{ format: "composition-json", relativePath }],
21
+ identityCandidates: [{ kind: "path", value: relativePath }],
22
+ sourceMetadata: {},
23
+ artifacts: [],
24
+ relations: [],
25
+ diagnostics: [],
26
+ unmappedFields: {},
27
+ };
28
+ if (!isRecord(input)) {
29
+ base.diagnostics.push({
30
+ level: "error",
31
+ code: "composition.invalid-object",
32
+ message: "A composition manifest must be a non-array object.",
33
+ path: relativePath,
34
+ });
35
+ return base;
36
+ }
37
+ base.identityCandidates = observeIdentity(input, relativePath);
38
+ base.sourceMetadata = observeSourceMetadata(input, base.diagnostics);
39
+ base.artifacts.push(...observeArtifacts(input, "clips", "audio", relativePath, base.diagnostics), ...observeArtifacts(input, "texts", "transcript", relativePath, base.diagnostics), ...observeArtifacts(input, "images", "image", relativePath, base.diagnostics));
40
+ base.relations.push(...observeRelations(input, base.diagnostics));
41
+ base.unmappedFields = preserveUnmappedFields(input, base.sourceMetadata);
42
+ return base;
43
+ }
44
+ function observeIdentity(input, relativePath) {
45
+ const candidates = [];
46
+ if (typeof input.title === "string" && input.title.length > 0) {
47
+ candidates.push({ kind: "title", value: input.title });
48
+ }
49
+ if (typeof input.slug === "string" && input.slug.length > 0) {
50
+ candidates.push({ kind: "slug", value: input.slug });
51
+ }
52
+ const episodeNumber = extractEpisodeNumber([input.slug, input.title, relativePath]
53
+ .filter((value) => typeof value === "string")
54
+ .join(" "));
55
+ if (episodeNumber !== undefined) {
56
+ candidates.push({ kind: "episode-number", value: episodeNumber });
57
+ }
58
+ candidates.push({ kind: "path", value: relativePath });
59
+ return candidates;
60
+ }
61
+ function observeSourceMetadata(input, diagnostics) {
62
+ const metadata = {};
63
+ for (const field of STRING_METADATA_FIELDS) {
64
+ const value = input[field];
65
+ if (value === undefined)
66
+ continue;
67
+ if (typeof value === "string") {
68
+ metadata[field] = value;
69
+ }
70
+ else {
71
+ diagnostics.push({
72
+ level: "warning",
73
+ code: "composition.invalid-metadata",
74
+ message: `Composition field '${field}' must be a string when present.`,
75
+ path: field,
76
+ });
77
+ }
78
+ }
79
+ if (input.skillSeeds !== undefined) {
80
+ if (Array.isArray(input.skillSeeds) &&
81
+ input.skillSeeds.every((value) => typeof value === "string")) {
82
+ metadata.skillSeeds = [...input.skillSeeds];
83
+ }
84
+ else {
85
+ diagnostics.push({
86
+ level: "warning",
87
+ code: "composition.invalid-metadata",
88
+ message: "Composition field 'skillSeeds' must be an array of strings when present.",
89
+ path: "skillSeeds",
90
+ });
91
+ }
92
+ }
93
+ return metadata;
94
+ }
95
+ function observeArtifacts(input, field, defaultKind, sourceDocumentPath, diagnostics) {
96
+ const value = input[field];
97
+ if (value === undefined) {
98
+ diagnostics.push({
99
+ level: "info",
100
+ code: "composition.optional-field-missing",
101
+ message: `Optional composition field '${field}' is absent.`,
102
+ path: field,
103
+ });
104
+ return [];
105
+ }
106
+ if (!Array.isArray(value)) {
107
+ diagnostics.push({
108
+ level: "warning",
109
+ code: "composition.invalid-artifact-list",
110
+ message: `Composition field '${field}' must be an array when present.`,
111
+ path: field,
112
+ });
113
+ return [];
114
+ }
115
+ const artifacts = [];
116
+ value.forEach((entry, index) => {
117
+ const entryPath = `${field}[${index}]`;
118
+ if (!isRecord(entry) || typeof entry.filename !== "string" || entry.filename.length === 0) {
119
+ diagnostics.push({
120
+ level: "warning",
121
+ code: "composition.invalid-artifact",
122
+ message: "Artifact entries require a non-empty filename.",
123
+ path: entryPath,
124
+ });
125
+ return;
126
+ }
127
+ const relativePath = resolveSiblingPath(sourceDocumentPath, entry.filename);
128
+ if (relativePath === undefined) {
129
+ diagnostics.push({
130
+ level: "warning",
131
+ code: "composition.unsafe-artifact-path",
132
+ message: "Artifact filenames must be relative and must not contain traversal.",
133
+ path: `${entryPath}.filename`,
134
+ });
135
+ return;
136
+ }
137
+ const kind = inferArtifactKind(entry.filename, defaultKind);
138
+ const metadata = cloneRecordExcept(entry, ["filename", "label", "source"]);
139
+ const artifact = {
140
+ id: `artifact:${kind}:${encodeURIComponent(relativePath)}:${index}`,
141
+ kind,
142
+ relativePath,
143
+ metadata,
144
+ };
145
+ if (typeof entry.label === "string")
146
+ artifact.label = entry.label;
147
+ if (typeof entry.source === "string")
148
+ artifact.sourceArtifact = entry.source;
149
+ artifacts.push(artifact);
150
+ });
151
+ return artifacts;
152
+ }
153
+ function observeRelations(input, diagnostics) {
154
+ const relations = [];
155
+ if (input.relatedEpisodes === undefined) {
156
+ diagnostics.push({
157
+ level: "info",
158
+ code: "composition.optional-field-missing",
159
+ message: "Optional composition field 'relatedEpisodes' is absent.",
160
+ path: "relatedEpisodes",
161
+ });
162
+ }
163
+ else if (!Array.isArray(input.relatedEpisodes)) {
164
+ diagnostics.push({
165
+ level: "warning",
166
+ code: "composition.invalid-relation-list",
167
+ message: "Composition field 'relatedEpisodes' must be an array when present.",
168
+ path: "relatedEpisodes",
169
+ });
170
+ }
171
+ else {
172
+ input.relatedEpisodes.forEach((target, index) => {
173
+ if (typeof target !== "string" || target.length === 0) {
174
+ diagnostics.push({
175
+ level: "warning",
176
+ code: "composition.invalid-relation",
177
+ message: "Related episode entries must be non-empty strings.",
178
+ path: `relatedEpisodes[${index}]`,
179
+ });
180
+ return;
181
+ }
182
+ relations.push({
183
+ id: `relation:related-to:${encodeURIComponent(target)}:${index}`,
184
+ kind: "related-to",
185
+ target: { kind: "slug", value: target },
186
+ });
187
+ });
188
+ }
189
+ if (input.branchOf !== undefined) {
190
+ if (typeof input.branchOf === "string" && input.branchOf.length > 0) {
191
+ relations.push({
192
+ id: `relation:branch-of:${encodeURIComponent(input.branchOf)}`,
193
+ kind: "branch-of",
194
+ target: { kind: "slug", value: input.branchOf },
195
+ });
196
+ }
197
+ else {
198
+ diagnostics.push({
199
+ level: "warning",
200
+ code: "composition.invalid-branch",
201
+ message: "Composition field 'branchOf' must be a non-empty string when present.",
202
+ path: "branchOf",
203
+ });
204
+ }
205
+ }
206
+ return relations;
207
+ }
208
+ function preserveUnmappedFields(input, metadata) {
209
+ const mappedMetadataFields = new Set(Object.keys(metadata));
210
+ const unmapped = {};
211
+ for (const [key, value] of Object.entries(input)) {
212
+ if (!STRUCTURALLY_PROJECTED_TOP_LEVEL_FIELDS.has(key) &&
213
+ !mappedMetadataFields.has(key)) {
214
+ unmapped[key] = cloneValue(value);
215
+ }
216
+ }
217
+ return unmapped;
218
+ }
219
+ //# sourceMappingURL=composition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../src/adapters/composition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { EpisodeObservation, ObserveEpisodeDirectoryOptions } from "../observation.js";
2
+ /**
3
+ * Observe a caller-supplied directory snapshot without reading the filesystem.
4
+ * This provides a conservative fallback for descriptor-light Chronicle folders.
5
+ */
6
+ export declare function observeEpisodeDirectory(input: unknown, options: ObserveEpisodeDirectoryOptions): EpisodeObservation;
7
+ //# sourceMappingURL=directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../src/adapters/directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,kBAAkB,EAClB,8BAA8B,EAC/B,MAAM,mBAAmB,CAAA;AAwB1B;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,8BAA8B,GACtC,kBAAkB,CAsBpB"}
@@ -0,0 +1,175 @@
1
+ import { cloneRecordExcept, extractEpisodeNumber, inferArtifactKind, isRecord, observationId, pathBasename, resolveChildPath, validateRelativePath, } from "./common.js";
2
+ /**
3
+ * Observe a caller-supplied directory snapshot without reading the filesystem.
4
+ * This provides a conservative fallback for descriptor-light Chronicle folders.
5
+ */
6
+ export function observeEpisodeDirectory(input, options) {
7
+ const relativePath = validateRelativePath(options.relativePath);
8
+ const base = {
9
+ id: observationId("directory-inferred", relativePath),
10
+ zone: options.zone ?? "chronicle",
11
+ sourceDocuments: [{ format: "directory-inferred", relativePath }],
12
+ identityCandidates: observeDirectoryIdentity(relativePath),
13
+ sourceMetadata: {},
14
+ artifacts: [],
15
+ relations: [],
16
+ diagnostics: [],
17
+ unmappedFields: {},
18
+ };
19
+ const projected = projectDirectoryInput(input, relativePath, base.diagnostics);
20
+ if (projected === undefined)
21
+ return base;
22
+ base.unmappedFields = projected.unmappedFields;
23
+ const entries = normalizeEntries(projected.entries, relativePath, base.diagnostics);
24
+ base.artifacts = observeDirectoryArtifacts(entries, relativePath, base.diagnostics);
25
+ observeDescriptorState(entries, base.diagnostics);
26
+ return base;
27
+ }
28
+ function observeDirectoryIdentity(relativePath) {
29
+ const basename = pathBasename(relativePath);
30
+ const candidates = [];
31
+ if (basename.length > 0)
32
+ candidates.push({ kind: "slug", value: basename });
33
+ const episodeNumber = extractEpisodeNumber(relativePath);
34
+ if (episodeNumber !== undefined) {
35
+ candidates.push({ kind: "episode-number", value: episodeNumber });
36
+ }
37
+ candidates.push({ kind: "path", value: relativePath });
38
+ return candidates;
39
+ }
40
+ function projectDirectoryInput(input, relativePath, diagnostics) {
41
+ if (Array.isArray(input)) {
42
+ return { entries: input, unmappedFields: {} };
43
+ }
44
+ if (!isRecord(input)) {
45
+ diagnostics.push({
46
+ level: "error",
47
+ code: "directory.invalid-snapshot",
48
+ message: "A directory snapshot must be an entry array or an object containing entries.",
49
+ path: relativePath,
50
+ });
51
+ return undefined;
52
+ }
53
+ if (!Array.isArray(input.entries)) {
54
+ diagnostics.push({
55
+ level: "error",
56
+ code: "directory.invalid-entries",
57
+ message: "Directory snapshot field 'entries' must be an array.",
58
+ path: "entries",
59
+ });
60
+ return undefined;
61
+ }
62
+ return {
63
+ entries: input.entries,
64
+ unmappedFields: cloneRecordExcept(input, ["entries"]),
65
+ };
66
+ }
67
+ function normalizeEntries(entries, directoryPath, diagnostics) {
68
+ const normalized = [];
69
+ entries.forEach((entry, index) => {
70
+ const entryPath = `entries[${index}]`;
71
+ if (typeof entry === "string") {
72
+ const relativePath = validateEntryPath(entry, entryPath, diagnostics);
73
+ if (relativePath !== undefined) {
74
+ normalized.push({ relativePath, type: "file", metadata: {}, originalIndex: index });
75
+ }
76
+ return;
77
+ }
78
+ if (!isRecord(entry) || typeof entry.relativePath !== "string") {
79
+ diagnostics.push({
80
+ level: "warning",
81
+ code: "directory.invalid-entry",
82
+ message: "Directory entries must be path strings or objects with relativePath.",
83
+ path: entryPath,
84
+ });
85
+ return;
86
+ }
87
+ const relativePath = validateEntryPath(entry.relativePath, entryPath, diagnostics);
88
+ if (relativePath === undefined)
89
+ return;
90
+ if (entry.type !== undefined && entry.type !== "file" && entry.type !== "directory") {
91
+ diagnostics.push({
92
+ level: "warning",
93
+ code: "directory.invalid-entry-type",
94
+ message: "Directory entry type must be 'file' or 'directory' when present.",
95
+ path: `${entryPath}.type`,
96
+ });
97
+ return;
98
+ }
99
+ normalized.push({
100
+ relativePath,
101
+ type: entry.type ?? "file",
102
+ metadata: cloneRecordExcept(entry, ["relativePath", "type"]),
103
+ originalIndex: index,
104
+ });
105
+ });
106
+ normalized.sort((left, right) => {
107
+ if (left.relativePath < right.relativePath)
108
+ return -1;
109
+ if (left.relativePath > right.relativePath)
110
+ return 1;
111
+ return left.originalIndex - right.originalIndex;
112
+ });
113
+ return normalized;
114
+ }
115
+ function validateEntryPath(value, diagnosticPath, diagnostics) {
116
+ try {
117
+ return validateRelativePath(value);
118
+ }
119
+ catch {
120
+ diagnostics.push({
121
+ level: "warning",
122
+ code: "directory.unsafe-entry-path",
123
+ message: "Directory entry paths must be relative and must not contain traversal.",
124
+ path: diagnosticPath,
125
+ });
126
+ return undefined;
127
+ }
128
+ }
129
+ function observeDirectoryArtifacts(entries, directoryPath, diagnostics) {
130
+ const artifacts = [];
131
+ const seen = new Set();
132
+ for (const entry of entries) {
133
+ if (entry.type === "directory")
134
+ continue;
135
+ if (seen.has(entry.relativePath)) {
136
+ diagnostics.push({
137
+ level: "warning",
138
+ code: "directory.duplicate-entry",
139
+ message: "Duplicate directory entries are observed only once.",
140
+ path: entry.relativePath,
141
+ });
142
+ continue;
143
+ }
144
+ seen.add(entry.relativePath);
145
+ const relativePath = resolveChildPath(directoryPath, entry.relativePath);
146
+ if (relativePath === undefined)
147
+ continue;
148
+ const kind = inferArtifactKind(entry.relativePath);
149
+ artifacts.push({
150
+ id: `artifact:${kind}:${encodeURIComponent(relativePath)}`,
151
+ kind,
152
+ relativePath,
153
+ label: entry.relativePath,
154
+ metadata: entry.metadata,
155
+ });
156
+ }
157
+ return artifacts;
158
+ }
159
+ function observeDescriptorState(entries, diagnostics) {
160
+ const fileNames = new Set(entries
161
+ .filter(({ type }) => type === "file")
162
+ .map(({ relativePath }) => relativePath.toLowerCase()));
163
+ const hasDescriptor = fileNames.has("episode.yaml") ||
164
+ fileNames.has("episode.yml") ||
165
+ fileNames.has("readme.md") ||
166
+ fileNames.has("readme.txt");
167
+ if (!hasDescriptor) {
168
+ diagnostics.push({
169
+ level: "info",
170
+ code: "directory.descriptor-light",
171
+ message: "No episode.yaml or README descriptor was present; identity is path-derived.",
172
+ });
173
+ }
174
+ }
175
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/adapters/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EpisodeObservation, ObserveEpisodeYamlManifestOptions } from "../observation.js";
2
+ /**
3
+ * Observe an already-parsed episode.yaml manifest.
4
+ *
5
+ * YAML parsing remains the caller's responsibility so this schema package does
6
+ * not impose a parser, loader policy, or filesystem dependency.
7
+ */
8
+ export declare function observeEpisodeYamlManifest(input: unknown, options: ObserveEpisodeYamlManifestOptions): EpisodeObservation;
9
+ //# sourceMappingURL=episode-yaml.d.ts.map
@@ -0,0 +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;AAoC1B;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,iCAAiC,GACzC,kBAAkB,CAsCpB"}
@@ -0,0 +1,326 @@
1
+ import { cloneRecordExcept, cloneValue, extractEpisodeNumber, inferArtifactKind, isRecord, observationId, resolveSiblingPath, tryValidateRelativePath, validateRelativePath, } from "./common.js";
2
+ const STRING_METADATA_FIELDS = [
3
+ ["title", "title"],
4
+ ["slug", "slug"],
5
+ ["status", "status"],
6
+ ["session_title", "sessionTitle"],
7
+ ["primary_issue", "primaryIssue"],
8
+ ["created", "created"],
9
+ ["updated", "updated"],
10
+ ["notes", "notes"],
11
+ ];
12
+ /**
13
+ * Observe an already-parsed episode.yaml manifest.
14
+ *
15
+ * YAML parsing remains the caller's responsibility so this schema package does
16
+ * not impose a parser, loader policy, or filesystem dependency.
17
+ */
18
+ export function observeEpisodeYamlManifest(input, options) {
19
+ const relativePath = validateRelativePath(options.relativePath);
20
+ const base = {
21
+ id: observationId("episode-yaml", relativePath),
22
+ zone: options.zone ?? "chronicle",
23
+ sourceDocuments: [{ format: "episode-yaml", relativePath }],
24
+ identityCandidates: [{ kind: "path", value: relativePath }],
25
+ sourceMetadata: {},
26
+ artifacts: [],
27
+ relations: [],
28
+ diagnostics: [],
29
+ unmappedFields: {},
30
+ };
31
+ if (!isRecord(input)) {
32
+ base.diagnostics.push({
33
+ level: "error",
34
+ code: "episode-yaml.invalid-object",
35
+ message: "A parsed episode.yaml manifest must be a non-array object.",
36
+ path: relativePath,
37
+ });
38
+ return base;
39
+ }
40
+ const metadataProjection = observeMetadata(input, base.diagnostics);
41
+ base.sourceMetadata = metadataProjection.metadata;
42
+ base.identityCandidates = observeIdentity(input, relativePath, base.diagnostics);
43
+ base.artifacts = observeArtifactMap(input.artifacts, relativePath, base.diagnostics);
44
+ const relationProjection = observeLineage(input.lineage, base.diagnostics);
45
+ base.relations = relationProjection.relations;
46
+ base.unmappedFields = preserveUnmappedFields(input, metadataProjection.consumedFields, relationProjection);
47
+ return base;
48
+ }
49
+ function observeMetadata(input, diagnostics) {
50
+ const metadata = {};
51
+ const consumedFields = new Set();
52
+ for (const [sourceField, targetField] of STRING_METADATA_FIELDS) {
53
+ const value = input[sourceField];
54
+ if (value === undefined)
55
+ continue;
56
+ if (typeof value === "string") {
57
+ metadata[targetField] = value;
58
+ consumedFields.add(sourceField);
59
+ }
60
+ else {
61
+ diagnostics.push({
62
+ level: "warning",
63
+ code: "episode-yaml.invalid-metadata",
64
+ message: `Manifest field '${sourceField}' must be a string when present.`,
65
+ path: sourceField,
66
+ });
67
+ }
68
+ }
69
+ if (input.date !== undefined) {
70
+ if (typeof input.date === "string") {
71
+ metadata.date = input.date;
72
+ consumedFields.add("date");
73
+ }
74
+ else if (input.date instanceof Date && !Number.isNaN(input.date.getTime())) {
75
+ metadata.date = input.date.toISOString();
76
+ consumedFields.add("date");
77
+ }
78
+ else {
79
+ diagnostics.push({
80
+ level: "warning",
81
+ code: "episode-yaml.invalid-metadata",
82
+ message: "Manifest field 'date' must be a string or valid parsed Date.",
83
+ path: "date",
84
+ });
85
+ }
86
+ }
87
+ if (input.skillSeeds !== undefined) {
88
+ if (Array.isArray(input.skillSeeds) &&
89
+ input.skillSeeds.every((value) => typeof value === "string")) {
90
+ metadata.skillSeeds = [...input.skillSeeds];
91
+ consumedFields.add("skillSeeds");
92
+ }
93
+ else {
94
+ diagnostics.push({
95
+ level: "warning",
96
+ code: "episode-yaml.invalid-metadata",
97
+ message: "Manifest field 'skillSeeds' must be an array of strings when present.",
98
+ path: "skillSeeds",
99
+ });
100
+ }
101
+ }
102
+ return { metadata, consumedFields };
103
+ }
104
+ function observeIdentity(input, relativePath, diagnostics) {
105
+ const candidates = [];
106
+ if (typeof input.title === "string" && input.title.length > 0) {
107
+ candidates.push({ kind: "title", value: input.title });
108
+ }
109
+ if (typeof input.slug === "string" && input.slug.length > 0) {
110
+ candidates.push({ kind: "slug", value: input.slug });
111
+ }
112
+ const explicitNumber = normalizeEpisodeNumber(input.episode);
113
+ if (explicitNumber !== undefined) {
114
+ candidates.push({ kind: "episode-number", value: explicitNumber });
115
+ }
116
+ else if (input.episode !== undefined) {
117
+ diagnostics.push({
118
+ level: "warning",
119
+ code: "episode-yaml.invalid-episode-identity",
120
+ message: "Manifest field 'episode' must be a non-negative integer or episode label.",
121
+ path: "episode",
122
+ });
123
+ }
124
+ else {
125
+ const inferredNumber = extractEpisodeNumber(relativePath);
126
+ if (inferredNumber !== undefined) {
127
+ candidates.push({ kind: "episode-number", value: inferredNumber });
128
+ }
129
+ }
130
+ candidates.push({ kind: "path", value: relativePath });
131
+ return candidates;
132
+ }
133
+ function normalizeEpisodeNumber(value) {
134
+ if (typeof value === "number" && Number.isSafeInteger(value) && value >= 0) {
135
+ return String(value);
136
+ }
137
+ if (typeof value !== "string" || value.length === 0)
138
+ return undefined;
139
+ if (/^\d+$/.test(value))
140
+ return String(Number(value));
141
+ return extractEpisodeNumber(value);
142
+ }
143
+ function observeArtifactMap(value, sourceDocumentPath, diagnostics) {
144
+ if (value === undefined) {
145
+ diagnostics.push({
146
+ level: "info",
147
+ code: "episode-yaml.optional-field-missing",
148
+ message: "Optional manifest field 'artifacts' is absent.",
149
+ path: "artifacts",
150
+ });
151
+ return [];
152
+ }
153
+ if (!isRecord(value)) {
154
+ diagnostics.push({
155
+ level: "warning",
156
+ code: "episode-yaml.invalid-artifact-map",
157
+ message: "Manifest field 'artifacts' must be an object when present.",
158
+ path: "artifacts",
159
+ });
160
+ return [];
161
+ }
162
+ const artifacts = [];
163
+ walkArtifactMap(value, [], sourceDocumentPath, diagnostics, artifacts);
164
+ return artifacts;
165
+ }
166
+ function walkArtifactMap(value, keys, sourceDocumentPath, diagnostics, artifacts) {
167
+ for (const key of Object.keys(value).sort()) {
168
+ const child = value[key];
169
+ const childKeys = [...keys, key];
170
+ const manifestPath = `artifacts.${childKeys.join(".")}`;
171
+ if (typeof child === "string") {
172
+ const relativePath = resolveSiblingPath(sourceDocumentPath, child);
173
+ if (relativePath === undefined) {
174
+ diagnostics.push({
175
+ level: "warning",
176
+ code: "episode-yaml.unsafe-artifact-path",
177
+ message: "Artifact paths must be relative and must not contain traversal.",
178
+ path: manifestPath,
179
+ });
180
+ continue;
181
+ }
182
+ const kind = inferArtifactKind(child);
183
+ artifacts.push({
184
+ id: `artifact:${kind}:${encodeURIComponent(relativePath)}:${encodeURIComponent(manifestPath)}`,
185
+ kind,
186
+ relativePath,
187
+ label: childKeys.join(" / "),
188
+ metadata: { manifestPath },
189
+ });
190
+ continue;
191
+ }
192
+ if (isRecord(child)) {
193
+ walkArtifactMap(child, childKeys, sourceDocumentPath, diagnostics, artifacts);
194
+ continue;
195
+ }
196
+ diagnostics.push({
197
+ level: "warning",
198
+ code: "episode-yaml.invalid-artifact-entry",
199
+ message: "Artifact map leaves must be relative path strings.",
200
+ path: manifestPath,
201
+ });
202
+ }
203
+ }
204
+ function observeLineage(value, diagnostics) {
205
+ if (value === undefined) {
206
+ return { relations: [], unmappedLineage: {}, consumed: false };
207
+ }
208
+ if (!isRecord(value)) {
209
+ diagnostics.push({
210
+ level: "warning",
211
+ code: "episode-yaml.invalid-lineage",
212
+ message: "Manifest field 'lineage' must be an object when present.",
213
+ path: "lineage",
214
+ });
215
+ return { relations: [], unmappedLineage: {}, consumed: false };
216
+ }
217
+ const relations = [];
218
+ const unmappedLineage = {};
219
+ const mappings = [
220
+ ["continues_from", "continues-from"],
221
+ ["relates_to", "related-to"],
222
+ ];
223
+ for (const [field, kind] of mappings) {
224
+ const entries = value[field];
225
+ if (entries === undefined)
226
+ continue;
227
+ if (!Array.isArray(entries)) {
228
+ diagnostics.push({
229
+ level: "warning",
230
+ code: "episode-yaml.invalid-lineage-list",
231
+ message: `Lineage field '${field}' must be an array when present.`,
232
+ path: `lineage.${field}`,
233
+ });
234
+ unmappedLineage[field] = cloneValue(entries);
235
+ continue;
236
+ }
237
+ const rejectedEntries = [];
238
+ entries.forEach((entry, index) => {
239
+ const relation = observeRelationEntry(entry, kind, field, index, diagnostics);
240
+ if (relation !== undefined)
241
+ relations.push(relation);
242
+ else
243
+ rejectedEntries.push(cloneValue(entry));
244
+ });
245
+ if (rejectedEntries.length > 0)
246
+ unmappedLineage[field] = rejectedEntries;
247
+ }
248
+ for (const [key, child] of Object.entries(value)) {
249
+ if (!mappings.some(([field]) => field === key)) {
250
+ unmappedLineage[key] = cloneValue(child);
251
+ }
252
+ }
253
+ return { relations, unmappedLineage, consumed: true };
254
+ }
255
+ function observeRelationEntry(entry, kind, field, index, diagnostics) {
256
+ const path = `lineage.${field}[${index}]`;
257
+ let target;
258
+ let metadata;
259
+ if (typeof entry === "number" || typeof entry === "string") {
260
+ const episodeNumber = normalizeEpisodeNumber(entry);
261
+ if (episodeNumber !== undefined) {
262
+ target = { kind: "episode-number", value: episodeNumber };
263
+ }
264
+ }
265
+ else if (isRecord(entry)) {
266
+ const episodeNumber = normalizeEpisodeNumber(entry.episode);
267
+ if (episodeNumber !== undefined) {
268
+ target = { kind: "episode-number", value: episodeNumber };
269
+ const remainder = cloneRecordExcept(entry, ["episode"]);
270
+ if (Object.keys(remainder).length > 0)
271
+ metadata = remainder;
272
+ }
273
+ else if (typeof entry.path === "string" && entry.path.length > 0) {
274
+ const relativeTargetPath = tryValidateRelativePath(entry.path);
275
+ if (relativeTargetPath === undefined) {
276
+ diagnostics.push({
277
+ level: "warning",
278
+ code: "episode-yaml.unsafe-lineage-path",
279
+ message: "Path-only lineage targets must be relative and must not contain traversal.",
280
+ path: `${path}.path`,
281
+ });
282
+ return undefined;
283
+ }
284
+ target = { kind: "path", value: relativeTargetPath };
285
+ const remainder = cloneRecordExcept(entry, ["path"]);
286
+ if (Object.keys(remainder).length > 0)
287
+ metadata = remainder;
288
+ }
289
+ }
290
+ if (target === undefined) {
291
+ diagnostics.push({
292
+ level: "warning",
293
+ code: "episode-yaml.invalid-lineage-entry",
294
+ message: "Lineage entries require an episode number or path.",
295
+ path,
296
+ });
297
+ return undefined;
298
+ }
299
+ const relation = {
300
+ id: `relation:${kind}:${target.kind}:${encodeURIComponent(target.value)}:${index}`,
301
+ kind,
302
+ target,
303
+ };
304
+ if (metadata !== undefined)
305
+ relation.metadata = metadata;
306
+ return relation;
307
+ }
308
+ function preserveUnmappedFields(input, consumedMetadataFields, lineage) {
309
+ const unmapped = {};
310
+ for (const [key, value] of Object.entries(input)) {
311
+ if (consumedMetadataFields.has(key))
312
+ continue;
313
+ if (key === "episode" && normalizeEpisodeNumber(value) !== undefined)
314
+ continue;
315
+ if (key === "artifacts" && isRecord(value))
316
+ continue;
317
+ if (key === "lineage" && lineage.consumed)
318
+ continue;
319
+ unmapped[key] = cloneValue(value);
320
+ }
321
+ if (Object.keys(lineage.unmappedLineage).length > 0) {
322
+ unmapped.lineage = lineage.unmappedLineage;
323
+ }
324
+ return unmapped;
325
+ }
326
+ //# sourceMappingURL=episode-yaml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-yaml.js","sourceRoot":"","sources":["../../src/adapters/episode-yaml.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
- export * from "./types";
2
- export * from "./narrative";
1
+ export * from "./types.js";
2
+ export * from "./narrative.js";
3
+ export * from "./observation.js";
4
+ export * from "./adapters/composition.js";
5
+ export * from "./adapters/episode-yaml.js";
6
+ export * from "./adapters/directory.js";
3
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,aAAa,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,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,7 @@
1
- export * from "./types";
2
- export * from "./narrative";
1
+ export * from "./types.js";
2
+ export * from "./narrative.js";
3
+ export * from "./observation.js";
4
+ export * from "./adapters/composition.js";
5
+ export * from "./adapters/episode-yaml.js";
6
+ export * from "./adapters/directory.js";
3
7
  //# 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,SAAS,CAAA;AACvB,cAAc,aAAa,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,2BAA2B,CAAA;AACzC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,yBAAyB,CAAA"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Compatibility-first observations of heterogeneous episode sources.
3
+ *
4
+ * An observation describes source material without requiring it to satisfy the
5
+ * authored EpisodicMemory schema. Consumers can inspect the diagnostics and
6
+ * decide whether a later, explicit projection is appropriate.
7
+ */
8
+ export type EpisodeSourceZone = "composition-intake" | "chronicle" | "runtime-projection";
9
+ export type EpisodeSourceFormat = "composition-json" | "episode-yaml" | "directory-inferred" | "episodic-memory";
10
+ export interface SourceDocumentRef {
11
+ format: EpisodeSourceFormat;
12
+ relativePath: string;
13
+ }
14
+ export interface EpisodeIdentityCandidate {
15
+ kind: "episode-number" | "slug" | "title" | "path";
16
+ value: string;
17
+ }
18
+ export type ArtifactKind = "audio" | "transcript" | "image" | "text" | "other";
19
+ export interface ArtifactReference {
20
+ id: string;
21
+ kind: ArtifactKind;
22
+ relativePath: string;
23
+ label?: string;
24
+ sourceArtifact?: string;
25
+ metadata: Record<string, unknown>;
26
+ }
27
+ export type EpisodeRelationKind = "related-to" | "branch-of" | "continues-from";
28
+ export interface EpisodeRelation {
29
+ id: string;
30
+ kind: EpisodeRelationKind;
31
+ target: EpisodeIdentityCandidate;
32
+ metadata?: Record<string, unknown>;
33
+ }
34
+ export interface CompatibilityDiagnostic {
35
+ level: "info" | "warning" | "error";
36
+ code: string;
37
+ message: string;
38
+ path?: string;
39
+ }
40
+ export interface EpisodeSourceMetadata {
41
+ title?: string;
42
+ slug?: string;
43
+ created?: string;
44
+ updated?: string;
45
+ notes?: string;
46
+ skillSeeds?: string[];
47
+ date?: string;
48
+ status?: string;
49
+ sessionTitle?: string;
50
+ primaryIssue?: string;
51
+ }
52
+ export interface EpisodeObservation {
53
+ id: string;
54
+ zone: EpisodeSourceZone;
55
+ sourceDocuments: SourceDocumentRef[];
56
+ identityCandidates: EpisodeIdentityCandidate[];
57
+ sourceMetadata: EpisodeSourceMetadata;
58
+ artifacts: ArtifactReference[];
59
+ relations: EpisodeRelation[];
60
+ diagnostics: CompatibilityDiagnostic[];
61
+ /** Source fields that were preserved but not structurally projected. */
62
+ unmappedFields: Record<string, unknown>;
63
+ }
64
+ export interface ObserveCompositionManifestOptions {
65
+ relativePath: string;
66
+ zone?: "composition-intake";
67
+ }
68
+ export interface ObserveEpisodeYamlManifestOptions {
69
+ relativePath: string;
70
+ zone?: "chronicle";
71
+ }
72
+ export interface EpisodeDirectoryEntry {
73
+ relativePath: string;
74
+ type?: "file" | "directory";
75
+ size?: number;
76
+ modifiedAt?: string;
77
+ }
78
+ export interface EpisodeDirectorySnapshot {
79
+ entries: readonly (string | EpisodeDirectoryEntry)[];
80
+ }
81
+ export interface ObserveEpisodeDirectoryOptions {
82
+ relativePath: string;
83
+ zone?: "chronicle";
84
+ }
85
+ //# sourceMappingURL=observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Compatibility-first observations of heterogeneous episode sources.
3
+ *
4
+ * An observation describes source material without requiring it to satisfy the
5
+ * authored EpisodicMemory schema. Consumers can inspect the diagnostics and
6
+ * decide whether a later, explicit projection is appropriate.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.js","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
package/dist/types.d.ts CHANGED
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * Plus follow-up commissions — seeds for the next episode.
17
17
  */
18
- import type { NarrativeContribution } from "./narrative";
18
+ import type { NarrativeContribution } from "./narrative.js";
19
19
  export declare const SCHEMA_VERSION: "episodic-memory.v1.0";
20
20
  export type SchemaVersion = typeof SCHEMA_VERSION;
21
21
  export interface EpisodicMemory {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.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.1.0",
3
+ "version": "0.2.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",
@@ -18,7 +18,7 @@
18
18
  "homepage": "https://github.com/jgwill/Miadi/tree/main/packages/episodic-memory-schema",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "https://github.com/jgwill/Miadi.git",
21
+ "url": "git+https://github.com/jgwill/Miadi.git",
22
22
  "directory": "packages/episodic-memory-schema"
23
23
  },
24
24
  "type": "module",
@@ -42,7 +42,8 @@
42
42
  "scripts": {
43
43
  "build": "tsc",
44
44
  "type-check": "tsc --noEmit",
45
- "prepublishOnly": "pnpm build"
45
+ "test": "npm run build && node --test test/*.test.mjs",
46
+ "prepublishOnly": "npm run build"
46
47
  },
47
48
  "devDependencies": {
48
49
  "typescript": "^5.4.0"