@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.
- package/README.md +47 -2
- package/dist/adapters/common.d.ts +14 -0
- package/dist/adapters/common.d.ts.map +1 -0
- package/dist/adapters/common.js +99 -0
- package/dist/adapters/common.js.map +1 -0
- package/dist/adapters/composition.d.ts +7 -0
- package/dist/adapters/composition.d.ts.map +1 -0
- package/dist/adapters/composition.js +431 -0
- package/dist/adapters/composition.js.map +1 -0
- package/dist/adapters/directory.d.ts +7 -0
- package/dist/adapters/directory.d.ts.map +1 -0
- package/dist/adapters/directory.js +175 -0
- package/dist/adapters/directory.js.map +1 -0
- package/dist/adapters/episode-yaml.d.ts +9 -0
- package/dist/adapters/episode-yaml.d.ts.map +1 -0
- package/dist/adapters/episode-yaml.js +326 -0
- package/dist/adapters/episode-yaml.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/observation.d.ts +125 -0
- package/dist/observation.d.ts.map +1 -0
- package/dist/observation.js +9 -0
- package/dist/observation.js.map +1 -0
- package/package.json +8 -8
|
@@ -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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA"}
|
|
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"}
|