@miadi/episodic-memory-schema 0.1.1 → 0.3.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.
@@ -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,13 @@
1
1
  export * from "./types.js";
2
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";
7
+ /**
8
+ * Shared source-reading helpers, exported so downstream packages read paths and
9
+ * infer identity the same way this package does rather than forking a second,
10
+ * drifting copy of the traversal validator.
11
+ */
12
+ export { inferArtifactKind, extractEpisodeNumber, validateRelativePath, tryValidateRelativePath, resolveSiblingPath, resolveChildPath, observationId, pathBasename, } from "./adapters/common.js";
3
13
  //# 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"}
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;AAEvC;;;;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,3 +1,13 @@
1
1
  export * from "./types.js";
2
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";
7
+ /**
8
+ * Shared source-reading helpers, exported so downstream packages read paths and
9
+ * infer identity the same way this package does rather than forking a second,
10
+ * drifting copy of the traversal validator.
11
+ */
12
+ export { inferArtifactKind, extractEpisodeNumber, validateRelativePath, tryValidateRelativePath, resolveSiblingPath, resolveChildPath, observationId, pathBasename, } from "./adapters/common.js";
3
13
  //# 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"}
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;AAEvC;;;;GAIG;AACH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAA"}