okf-core 0.0.0-bootstrap → 1.0.0-rc.2

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.
Files changed (63) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +40 -4
  3. package/dist/analyze.d.ts +6 -0
  4. package/dist/analyze.d.ts.map +1 -0
  5. package/dist/analyze.js +225 -0
  6. package/dist/analyze.js.map +1 -0
  7. package/dist/changes.d.ts +6 -0
  8. package/dist/changes.d.ts.map +1 -0
  9. package/dist/changes.js +81 -0
  10. package/dist/changes.js.map +1 -0
  11. package/dist/conformance.d.ts +5 -0
  12. package/dist/conformance.d.ts.map +1 -0
  13. package/dist/conformance.js +103 -0
  14. package/dist/conformance.js.map +1 -0
  15. package/dist/derive.d.ts +14 -0
  16. package/dist/derive.d.ts.map +1 -0
  17. package/dist/derive.js +356 -0
  18. package/dist/derive.js.map +1 -0
  19. package/dist/diagnostics.d.ts +4 -0
  20. package/dist/diagnostics.d.ts.map +1 -0
  21. package/dist/diagnostics.js +19 -0
  22. package/dist/diagnostics.js.map +1 -0
  23. package/dist/diff.d.ts +2 -0
  24. package/dist/diff.d.ts.map +1 -0
  25. package/dist/diff.js +76 -0
  26. package/dist/diff.js.map +1 -0
  27. package/dist/frontmatter.d.ts +12 -0
  28. package/dist/frontmatter.d.ts.map +1 -0
  29. package/dist/frontmatter.js +110 -0
  30. package/dist/frontmatter.js.map +1 -0
  31. package/dist/graph.d.ts +3 -0
  32. package/dist/graph.d.ts.map +1 -0
  33. package/dist/graph.js +42 -0
  34. package/dist/graph.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +10 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/links.d.ts +10 -0
  40. package/dist/links.d.ts.map +1 -0
  41. package/dist/links.js +104 -0
  42. package/dist/links.js.map +1 -0
  43. package/dist/listing.d.ts +15 -0
  44. package/dist/listing.d.ts.map +1 -0
  45. package/dist/listing.js +38 -0
  46. package/dist/listing.js.map +1 -0
  47. package/dist/markdown.d.ts +18 -0
  48. package/dist/markdown.d.ts.map +1 -0
  49. package/dist/markdown.js +22 -0
  50. package/dist/markdown.js.map +1 -0
  51. package/dist/paths.d.ts +35 -0
  52. package/dist/paths.d.ts.map +1 -0
  53. package/dist/paths.js +103 -0
  54. package/dist/paths.js.map +1 -0
  55. package/dist/search.d.ts +5 -0
  56. package/dist/search.d.ts.map +1 -0
  57. package/dist/search.js +122 -0
  58. package/dist/search.js.map +1 -0
  59. package/dist/types.d.ts +54 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +31 -5
@@ -0,0 +1,103 @@
1
+ import { diagnostic } from "./diagnostics.js";
2
+ import { validDate } from "./derive.js";
3
+ import { markdownBlocks, markdownHeadings } from "./markdown.js";
4
+ import { isSafeMarkdownPath } from "./paths.js";
5
+ export function documentKind(path) {
6
+ const name = path.split("/").at(-1);
7
+ return name === "index.md" ? "index" : name === "log.md" ? "log" : "concept";
8
+ }
9
+ export function coreDiagnostics(path, kind, parsed) {
10
+ const result = [];
11
+ if (!isSafeMarkdownPath(path)) {
12
+ result.push(diagnostic("core", "error", "core.bundle.path.invalid", path, "document path must be a confined bundle-relative .md path"));
13
+ }
14
+ if (kind === "concept") {
15
+ if (!parsed.hadFrontmatter) {
16
+ result.push(diagnostic("core", "error", "core.concept.frontmatter.missing", path, "concept must begin with YAML frontmatter"));
17
+ return result;
18
+ }
19
+ if (parsed.error !== null || parsed.snapshot === null) {
20
+ const jsonBoundary = parsed.errorKind === "json";
21
+ result.push(diagnostic("core", "error", jsonBoundary ? "core.concept.frontmatter.non-json" : "core.concept.frontmatter.invalid-yaml", path, jsonBoundary
22
+ ? `okf.inspect.v1 cannot represent concept frontmatter: ${parsed.error ?? "unknown error"}`
23
+ : `concept frontmatter is not a parseable YAML mapping: ${parsed.error ?? "unknown error"}`));
24
+ return result;
25
+ }
26
+ const type = parsed.snapshot.metadata["type"];
27
+ if (typeof type !== "string" || !type.trim()) {
28
+ result.push(diagnostic("core", "error", "core.concept.type.missing", path, "concept type must be a non-empty string"));
29
+ }
30
+ return result;
31
+ }
32
+ if (parsed.hadFrontmatter && parsed.error !== null) {
33
+ const jsonBoundary = parsed.errorKind === "json";
34
+ result.push(diagnostic("core", "error", jsonBoundary ? `core.${kind}.frontmatter.non-json` : `core.${kind}.frontmatter.invalid-yaml`, path, jsonBoundary
35
+ ? `okf.inspect.v1 cannot represent ${kind} frontmatter: ${parsed.error}`
36
+ : `${kind} frontmatter is not a parseable YAML mapping: ${parsed.error}`));
37
+ }
38
+ if (kind === "index") {
39
+ if (path === "index.md") {
40
+ if (parsed.snapshot !== null) {
41
+ const keys = Object.keys(parsed.snapshot.metadata);
42
+ if (keys.some((key) => key !== "okf_version")) {
43
+ result.push(diagnostic("core", "error", "core.index.frontmatter.keys", path, "root index frontmatter supports only okf_version"));
44
+ }
45
+ }
46
+ }
47
+ else if (parsed.hadFrontmatter) {
48
+ result.push(diagnostic("core", "error", "core.index.frontmatter.nested", path, "nested index.md must not contain frontmatter"));
49
+ }
50
+ if (markdownHeadings(parsed.body).length === 0) {
51
+ result.push(diagnostic("core", "error", "core.index.heading.missing", path, "index must contain a Markdown heading"));
52
+ }
53
+ return result;
54
+ }
55
+ if (parsed.hadFrontmatter) {
56
+ result.push(diagnostic("core", "error", "core.log.frontmatter.forbidden", path, "log.md must not contain frontmatter"));
57
+ }
58
+ const blocks = markdownBlocks(parsed.body);
59
+ const headings = blocks.flatMap((block) => block.type === "heading" ? [block] : []);
60
+ if (headings.length === 0) {
61
+ result.push(diagnostic("core", "error", "core.log.heading.missing", path, "log must contain a Markdown heading"));
62
+ }
63
+ const dateHeadings = headings.filter((heading) => heading.depth === 2);
64
+ if (dateHeadings.length === 0) {
65
+ result.push(diagnostic("core", "error", "core.log.date-group.missing", path, "log must contain at least one level-two YYYY-MM-DD date group"));
66
+ }
67
+ const validDates = [];
68
+ for (const heading of dateHeadings) {
69
+ const value = heading.text.trim();
70
+ if (!validDate(value)) {
71
+ result.push(diagnostic("core", "error", "core.log.heading.date", path, `log date heading must be YYYY-MM-DD: ${value}`));
72
+ }
73
+ else {
74
+ validDates.push(value);
75
+ }
76
+ }
77
+ for (const [blockIndex, block] of blocks.entries()) {
78
+ if (block.type !== "heading" || block.depth !== 2) {
79
+ continue;
80
+ }
81
+ let groupEnd = blocks.length;
82
+ for (let candidateIndex = blockIndex + 1; candidateIndex < blocks.length; candidateIndex += 1) {
83
+ const candidate = blocks[candidateIndex];
84
+ if (candidate.type === "heading" && candidate.depth === 2) {
85
+ groupEnd = candidateIndex;
86
+ break;
87
+ }
88
+ }
89
+ if (!blocks.slice(blockIndex + 1, groupEnd).some((candidate) => candidate.type === "list")) {
90
+ result.push(diagnostic("core", "error", "core.log.date-group.list", path, `log date group must contain a top-level list of entries: ${block.text.trim()}`));
91
+ }
92
+ }
93
+ for (let index = 1; index < validDates.length; index += 1) {
94
+ const previous = validDates[index - 1];
95
+ const current = validDates[index];
96
+ if (current > previous) {
97
+ result.push(diagnostic("core", "error", "core.log.heading.order", path, `log date groups must be newest first: ${current} follows ${previous}`));
98
+ break;
99
+ }
100
+ }
101
+ return result;
102
+ }
103
+ //# sourceMappingURL=conformance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AnalyzedDocument, DerivedDocumentFields, Diagnostic, DocumentExtensions } from "okf-contracts";
2
+ export declare function validDate(value: string): boolean;
3
+ export declare function deriveDocumentFields(metadata: Readonly<Record<string, unknown>>, body: string, path: string, knownPaths: ReadonlySet<string>, nonDocumentPaths: ReadonlySet<string>, today: string | null): {
4
+ readonly derived: DerivedDocumentFields;
5
+ readonly guidance: readonly Diagnostic[];
6
+ };
7
+ /**
8
+ * Project the derived fields `okf.inspect.v1` cannot carry. `okf_type` is the document's OKF
9
+ * type under the name a catalog predicate matches on, and the usage windows frame every
10
+ * `usage_count` the analysis already reports. Both are derived from the same frontmatter the
11
+ * analysis read, so a consumer reads them here instead of re-deriving them itself.
12
+ */
13
+ export declare function documentExtensions(document: AnalyzedDocument): DocumentExtensions;
14
+ //# sourceMappingURL=derive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,qBAAqB,EACrB,UAAU,EACV,kBAAkB,EAGnB,MAAM,eAAe,CAAC;AA+BvB,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAUhD;AAqXD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAC3C,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAC/B,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB;IAAE,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,CAkDvF;AA+ED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,kBAAkB,CAiBjF"}
package/dist/derive.js ADDED
@@ -0,0 +1,356 @@
1
+ import { diagnostic } from "./diagnostics.js";
2
+ import { markdownHeadings } from "./markdown.js";
3
+ import { resolveWithinBundle } from "./paths.js";
4
+ const DATE = /^(\d{4})-(\d{2})-(\d{2})$/;
5
+ const DATETIME = /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-])(\d{2}):(\d{2}))$/;
6
+ const ACTOR = /^(?:human:[^\s/:]+|process:[^\s/:]+|[^\s/:]+\/[^\s/:]+)$/;
7
+ const VALID_STATUSES = new Set(["draft", "stable", "deprecated"]);
8
+ /**
9
+ * Tags that mark a page as perishable, so it should say when it goes stale. Edit this set to
10
+ * match what a bundle actually tags; it only catches pages someone remembered to tag.
11
+ */
12
+ const PERISHABLE_TAGS = new Set([
13
+ "pricing",
14
+ "vendor-limits",
15
+ "product-version",
16
+ "agreement",
17
+ "engagement-terms",
18
+ ]);
19
+ const SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*:/;
20
+ function nonempty(value) {
21
+ return typeof value === "string" && value.trim() ? value.trim() : null;
22
+ }
23
+ function mapping(value) {
24
+ return typeof value === "object" && value !== null && !Array.isArray(value);
25
+ }
26
+ export function validDate(value) {
27
+ const match = DATE.exec(value);
28
+ if (!match) {
29
+ return false;
30
+ }
31
+ const year = Number(match[1]);
32
+ const month = Number(match[2]);
33
+ const day = Number(match[3]);
34
+ const date = new Date(Date.UTC(year, month - 1, day));
35
+ return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day;
36
+ }
37
+ function validRecordedAt(value) {
38
+ if (typeof value !== "string") {
39
+ return false;
40
+ }
41
+ if (validDate(value)) {
42
+ return true;
43
+ }
44
+ const match = DATETIME.exec(value);
45
+ if (!match || !validDate(match[1])) {
46
+ return false;
47
+ }
48
+ const hour = Number(match[2]);
49
+ const minute = Number(match[3]);
50
+ const second = Number(match[4]);
51
+ const offsetHour = match[6] === undefined ? 0 : Number(match[6]);
52
+ const offsetMinute = match[7] === undefined ? 0 : Number(match[7]);
53
+ return hour <= 23 && minute <= 59 && second <= 59 && offsetHour <= 23 && offsetMinute <= 59;
54
+ }
55
+ function validActor(value) {
56
+ return typeof value === "string" && ACTOR.test(value);
57
+ }
58
+ function trustTier(metadata) {
59
+ const value = metadata["verified"];
60
+ const entries = Array.isArray(value) ? value : value && typeof value === "object" ? [value] : [];
61
+ let machine = false;
62
+ for (const entry of entries) {
63
+ if (!mapping(entry)) {
64
+ continue;
65
+ }
66
+ const actor = nonempty(entry["by"]);
67
+ if (actor?.startsWith("human:")) {
68
+ return "human-reviewed";
69
+ }
70
+ if (actor) {
71
+ machine = true;
72
+ }
73
+ }
74
+ return machine ? "machine-confirmed" : "unverified";
75
+ }
76
+ /** The `sources` entries `sourceFields` keeps; anything else never reaches `derived.sources`. */
77
+ function isUsableSourceEntry(entry) {
78
+ return mapping(entry) && nonempty(entry["resource"]) !== null;
79
+ }
80
+ function sourceFields(value, path, knownPaths, guidance) {
81
+ if (value === undefined || value === null) {
82
+ return [];
83
+ }
84
+ if (!Array.isArray(value)) {
85
+ guidance.push(diagnostic("guidance", "warning", "guidance.sources.type", path, "sources should be a list"));
86
+ return [];
87
+ }
88
+ const result = [];
89
+ value.forEach((entry, index) => {
90
+ if (!mapping(entry)) {
91
+ guidance.push(diagnostic("guidance", "warning", "guidance.source.mapping", path, `sources[${index}] should be a mapping`));
92
+ return;
93
+ }
94
+ const resource = nonempty(entry["resource"]);
95
+ if (!resource) {
96
+ guidance.push(diagnostic("guidance", "warning", "guidance.source.resource", path, `sources[${index}].resource should be a non-empty string`));
97
+ return;
98
+ }
99
+ checkUsageWindow(entry["usage_window"], path, `sources[${index}].usage_window`, "guidance.source.usage-window", guidance);
100
+ let resolvedPath = null;
101
+ let exists = null;
102
+ const looksLocal = resource.startsWith("/") || resource.startsWith("./") || resource.startsWith("../") || resource.endsWith(".md");
103
+ if (!SCHEME.test(resource) && looksLocal) {
104
+ const resolution = resolveWithinBundle(path, resource);
105
+ if (resolution.kind === "escape") {
106
+ guidance.push(diagnostic("guidance", "warning", "guidance.source.escape", path, `sources[${index}].resource escapes the bundle: ${resource}`));
107
+ }
108
+ else if (resolution.kind === "internal") {
109
+ resolvedPath = resolution.path;
110
+ exists = knownPaths.has(resolution.path);
111
+ if (!exists) {
112
+ guidance.push(diagnostic("guidance", "warning", "guidance.source.broken", path, `sources[${index}].resource does not resolve: ${resource}`));
113
+ }
114
+ }
115
+ }
116
+ result.push({
117
+ id: nonempty(entry["id"]),
118
+ resource,
119
+ title: nonempty(entry["title"]),
120
+ author: nonempty(entry["author"]),
121
+ usageCount: typeof entry["usage_count"] === "number" ? entry["usage_count"] : null,
122
+ lastModified: nonempty(entry["last_modified"]),
123
+ resolvedPath,
124
+ exists,
125
+ });
126
+ });
127
+ return result;
128
+ }
129
+ function checkTrustAndLifecycle(metadata, path, guidance) {
130
+ const generated = metadata["generated"];
131
+ if (generated !== undefined) {
132
+ if (!mapping(generated)) {
133
+ guidance.push(diagnostic("guidance", "warning", "guidance.generated.type", path, "generated should be a mapping"));
134
+ }
135
+ else {
136
+ if (!validActor(generated["by"])) {
137
+ guidance.push(diagnostic("guidance", "warning", "guidance.generated.by", path, "generated.by should use <producer>/<version>, human:<id>, or process:<id>"));
138
+ }
139
+ if (generated["at"] !== undefined && !validRecordedAt(generated["at"])) {
140
+ guidance.push(diagnostic("guidance", "warning", "guidance.generated.at", path, "generated.at should be an ISO 8601 datetime with an explicit offset; YYYY-MM-DD is accepted for compatibility"));
141
+ }
142
+ }
143
+ }
144
+ const verified = metadata["verified"];
145
+ if (verified !== undefined) {
146
+ const entries = Array.isArray(verified)
147
+ ? verified
148
+ : typeof verified === "object" && verified !== null
149
+ ? [verified]
150
+ : null;
151
+ if (entries === null) {
152
+ guidance.push(diagnostic("guidance", "warning", "guidance.verified.type", path, "verified should be a mapping or list"));
153
+ }
154
+ else {
155
+ entries.forEach((entry, index) => {
156
+ if (!mapping(entry)) {
157
+ guidance.push(diagnostic("guidance", "warning", "guidance.verified.event", path, `verified[${index}] should be a mapping`));
158
+ return;
159
+ }
160
+ if (!validActor(entry["by"])) {
161
+ guidance.push(diagnostic("guidance", "warning", "guidance.verified.by", path, `verified[${index}].by should use <producer>/<version>, human:<id>, or process:<id>`));
162
+ }
163
+ if (!validRecordedAt(entry["at"])) {
164
+ guidance.push(diagnostic("guidance", "warning", "guidance.verified.at", path, `verified[${index}].at should be an ISO 8601 datetime with an explicit offset; YYYY-MM-DD is accepted for compatibility`));
165
+ }
166
+ });
167
+ }
168
+ }
169
+ const status = metadata["status"];
170
+ if (status !== undefined && (typeof status !== "string" || !VALID_STATUSES.has(status))) {
171
+ guidance.push(diagnostic("guidance", "warning", "guidance.status.value", path, "status should be draft, stable, or deprecated"));
172
+ }
173
+ const staleAfter = metadata["stale_after"];
174
+ if (staleAfter !== undefined && (typeof staleAfter !== "string" || !validDate(staleAfter))) {
175
+ guidance.push(diagnostic("guidance", "warning", "guidance.stale-after.date", path, "stale_after should be YYYY-MM-DD"));
176
+ }
177
+ if (metadata["type"] === "Attested Computation" && !nonempty(metadata["runtime"])) {
178
+ guidance.push(diagnostic("guidance", "warning", "guidance.attested.runtime", path, "Attested Computation concepts should declare runtime"));
179
+ }
180
+ checkUsageWindow(metadata["usage_window"], path, "usage_window", "guidance.usage-window", guidance);
181
+ checkAttestationContract(metadata, path, guidance);
182
+ }
183
+ /** `usage_window` frames every `usage_count`, so a malformed one makes those counts unreadable. */
184
+ function checkUsageWindow(value, path, label, code, guidance) {
185
+ if (value === undefined) {
186
+ return;
187
+ }
188
+ if (!mapping(value)) {
189
+ guidance.push(diagnostic("guidance", "warning", `${code}.type`, path, `${label} should be a mapping`));
190
+ return;
191
+ }
192
+ for (const key of ["from", "to"]) {
193
+ const bound = value[key];
194
+ if (bound !== undefined && (typeof bound !== "string" || !validDate(bound))) {
195
+ guidance.push(diagnostic("guidance", "warning", `${code}.${key}`, path, `${label}.${key} should be YYYY-MM-DD`));
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * The contract fields of an Attested Computation. `runtime` is checked above; these are the
201
+ * fields that say how to run the computation and what evidence the attester inspects.
202
+ */
203
+ function checkAttestationContract(metadata, path, guidance) {
204
+ const parameters = metadata["parameters"];
205
+ if (parameters !== undefined) {
206
+ if (!Array.isArray(parameters)) {
207
+ guidance.push(diagnostic("guidance", "warning", "guidance.parameters.type", path, "parameters should be a list"));
208
+ }
209
+ else {
210
+ parameters.forEach((entry, index) => {
211
+ if (!mapping(entry) || !nonempty(entry["name"])) {
212
+ guidance.push(diagnostic("guidance", "warning", "guidance.parameter.name", path, `parameters[${index}] should be a mapping with a non-empty name`));
213
+ }
214
+ });
215
+ }
216
+ }
217
+ const executor = metadata["executor"];
218
+ if (executor !== undefined) {
219
+ if (!mapping(executor)) {
220
+ guidance.push(diagnostic("guidance", "warning", "guidance.executor.type", path, "executor should be a mapping"));
221
+ }
222
+ else {
223
+ if (!nonempty(executor["resource"])) {
224
+ guidance.push(diagnostic("guidance", "warning", "guidance.executor.resource", path, "executor.resource should be a non-empty string"));
225
+ }
226
+ const receipt = executor["receipt"];
227
+ if (receipt !== undefined
228
+ && (!Array.isArray(receipt) || receipt.some((field) => !nonempty(field)))) {
229
+ guidance.push(diagnostic("guidance", "warning", "guidance.executor.receipt", path, "executor.receipt should be a list of non-empty strings"));
230
+ }
231
+ }
232
+ }
233
+ const attester = metadata["attester"];
234
+ if (attester !== undefined) {
235
+ if (!mapping(attester)) {
236
+ guidance.push(diagnostic("guidance", "warning", "guidance.attester.type", path, "attester should be a mapping"));
237
+ }
238
+ else if (!nonempty(attester["resource"])) {
239
+ guidance.push(diagnostic("guidance", "warning", "guidance.attester.resource", path, "attester.resource should be a non-empty string"));
240
+ }
241
+ }
242
+ }
243
+ export function deriveDocumentFields(metadata, body, path, knownPaths, nonDocumentPaths, today) {
244
+ const guidance = [];
245
+ checkTrustAndLifecycle(metadata, path, guidance);
246
+ checkContractPaths(metadata, path, knownPaths, nonDocumentPaths, guidance);
247
+ const tagsValue = metadata["tags"];
248
+ let tags = [];
249
+ if (tagsValue !== undefined) {
250
+ if (!Array.isArray(tagsValue) || tagsValue.some((tag) => typeof tag !== "string")) {
251
+ guidance.push(diagnostic("guidance", "warning", "guidance.tags.type", path, "tags should be a list of strings"));
252
+ }
253
+ else {
254
+ tags = tagsValue.map((tag) => tag.trim()).filter(Boolean);
255
+ }
256
+ }
257
+ const staleAfter = nonempty(metadata["stale_after"]);
258
+ if (staleAfter === null) {
259
+ const perishable = [...new Set(tags.filter((tag) => PERISHABLE_TAGS.has(tag)))].sort();
260
+ if (perishable.length > 0) {
261
+ guidance.push(diagnostic("guidance", "warning", "guidance.stale-after.perishable", path, `tags ${perishable.join(", ")} perish, so stale_after should be set`));
262
+ }
263
+ }
264
+ const validStaleAfter = staleAfter !== null && validDate(staleAfter) ? staleAfter : null;
265
+ const validToday = today !== null && validDate(today) ? today : null;
266
+ const statusValue = nonempty(metadata["status"]);
267
+ const heading = markdownHeadings(body).find(({ depth }) => depth === 1)?.text.trim();
268
+ const filename = path.split("/").at(-1)?.replace(/\.md$/i, "") ?? path;
269
+ return {
270
+ derived: {
271
+ title: nonempty(metadata["title"]) ?? heading ?? filename,
272
+ type: nonempty(metadata["type"]),
273
+ description: nonempty(metadata["description"]),
274
+ status: statusValue ?? "stable",
275
+ trustTier: trustTier(metadata),
276
+ stale: validStaleAfter !== null && validToday !== null ? validToday >= validStaleAfter : null,
277
+ staleAfter: validStaleAfter,
278
+ tags,
279
+ sources: sourceFields(metadata["sources"], path, knownPaths, guidance),
280
+ },
281
+ guidance,
282
+ };
283
+ }
284
+ /** Like `mapping`, but yields the record so its keys can be read. */
285
+ function asMapping(value) {
286
+ return mapping(value) ? value : null;
287
+ }
288
+ /**
289
+ * Resolve the path-valued fields of an Attested Computation. The spec lists `computation`,
290
+ * `executor.resource` and `attester.resource` alongside `sources[].resource` as fields that
291
+ * name a file, but only source resources were resolved, so a broken executor path passed
292
+ * without comment.
293
+ *
294
+ * These three name a file rather than a page: a `computation` is a query, an `attester.resource`
295
+ * is a script. So a target counts as resolved when it is either a loaded document or a bundle
296
+ * file the loader saw without parsing. `sources[].resource` is deliberately not treated this
297
+ * way — a source naming an unwritten `.md` page is the corpus's to-do list, and keeps reporting.
298
+ */
299
+ function checkContractPaths(metadata, path, knownPaths, nonDocumentPaths, guidance) {
300
+ const executor = asMapping(metadata["executor"]);
301
+ const attester = asMapping(metadata["attester"]);
302
+ const candidates = [
303
+ ["computation", metadata["computation"]],
304
+ ["executor.resource", executor?.["resource"]],
305
+ ["attester.resource", attester?.["resource"]],
306
+ ];
307
+ for (const [label, value] of candidates) {
308
+ const target = nonempty(value);
309
+ if (target === null || SCHEME.test(target)) {
310
+ continue;
311
+ }
312
+ const resolution = resolveWithinBundle(path, target);
313
+ if (resolution.kind === "escape") {
314
+ guidance.push(diagnostic("guidance", "warning", "guidance.contract.escape", path, `${label} escapes the bundle: ${target}`));
315
+ }
316
+ else if (resolution.kind === "internal"
317
+ && !knownPaths.has(resolution.path)
318
+ && !nonDocumentPaths.has(resolution.path)) {
319
+ guidance.push(diagnostic("guidance", "warning", "guidance.contract.broken", path, `${label} does not resolve: ${target}`));
320
+ }
321
+ }
322
+ }
323
+ function usageWindowOf(value) {
324
+ const record = asMapping(value);
325
+ if (record === null) {
326
+ return null;
327
+ }
328
+ const from = nonempty(record["from"]);
329
+ const to = nonempty(record["to"]);
330
+ return from === null && to === null ? null : { from, to };
331
+ }
332
+ /**
333
+ * Project the derived fields `okf.inspect.v1` cannot carry. `okf_type` is the document's OKF
334
+ * type under the name a catalog predicate matches on, and the usage windows frame every
335
+ * `usage_count` the analysis already reports. Both are derived from the same frontmatter the
336
+ * analysis read, so a consumer reads them here instead of re-deriving them itself.
337
+ */
338
+ export function documentExtensions(document) {
339
+ const metadata = document.metadata;
340
+ const sourceUsageWindows = [];
341
+ const sources = metadata["sources"];
342
+ if (Array.isArray(sources)) {
343
+ for (const entry of sources) {
344
+ if (isUsableSourceEntry(entry)) {
345
+ sourceUsageWindows.push(usageWindowOf(entry["usage_window"]));
346
+ }
347
+ }
348
+ }
349
+ return {
350
+ path: document.path,
351
+ okf_type: nonempty(metadata["type"]),
352
+ usageWindow: usageWindowOf(metadata["usage_window"]),
353
+ sourceUsageWindows,
354
+ };
355
+ }
356
+ //# sourceMappingURL=derive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive.js","sourceRoot":"","sources":["../src/derive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Diagnostic } from "okf-contracts";
2
+ export declare function diagnostic(family: Diagnostic["family"], severity: Diagnostic["severity"], code: string, path: string, message: string, range?: Diagnostic["range"]): Diagnostic;
3
+ export declare function compareDiagnostics(left: Diagnostic, right: Diagnostic): number;
4
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAIhD,wBAAgB,UAAU,CACxB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC5B,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAC1B,UAAU,CASZ;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAQ9E"}
@@ -0,0 +1,19 @@
1
+ import { byCodePoint } from "./paths.js";
2
+ export function diagnostic(family, severity, code, path, message, range) {
3
+ return {
4
+ family,
5
+ severity,
6
+ code,
7
+ path,
8
+ message,
9
+ ...(range === undefined ? {} : { range }),
10
+ };
11
+ }
12
+ export function compareDiagnostics(left, right) {
13
+ return (byCodePoint(left.path, right.path) ||
14
+ byCodePoint(left.family, right.family) ||
15
+ byCodePoint(left.code, right.code) ||
16
+ (left.range?.start.offset ?? -1) - (right.range?.start.offset ?? -1) ||
17
+ byCodePoint(left.message, right.message));
18
+ }
19
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,UAAU,CACxB,MAA4B,EAC5B,QAAgC,EAChC,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,KAA2B;IAE3B,OAAO;QACL,MAAM;QACN,QAAQ;QACR,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAgB,EAAE,KAAiB;IACpE,OAAO,CACL,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;QAClC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACpE,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CACzC,CAAC;AACJ,CAAC"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare function unifiedDiff(before: string, after: string, path: string): string;
2
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AA4CA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA4B/E"}
package/dist/diff.js ADDED
@@ -0,0 +1,76 @@
1
+ const MAX_LINES = 5_000;
2
+ const CONTEXT = 3;
3
+ function commonSubsequence(before, after) {
4
+ const table = Array.from({ length: before.length + 1 }, () => new Array(after.length + 1).fill(0));
5
+ for (let i = before.length - 1; i >= 0; i -= 1) {
6
+ for (let j = after.length - 1; j >= 0; j -= 1) {
7
+ const row = table[i];
8
+ row[j] =
9
+ before[i] === after[j]
10
+ ? (table[i + 1][j + 1] ?? 0) + 1
11
+ : Math.max(table[i + 1][j] ?? 0, row[j + 1] ?? 0);
12
+ }
13
+ }
14
+ return table;
15
+ }
16
+ function operations(before, after) {
17
+ const table = commonSubsequence(before, after);
18
+ const result = [];
19
+ let i = 0;
20
+ let j = 0;
21
+ while (i < before.length && j < after.length) {
22
+ if (before[i] === after[j]) {
23
+ result.push({ sign: " ", text: before[i] });
24
+ i += 1;
25
+ j += 1;
26
+ }
27
+ else if ((table[i + 1][j] ?? 0) >= (table[i][j + 1] ?? 0)) {
28
+ result.push({ sign: "-", text: before[i] });
29
+ i += 1;
30
+ }
31
+ else {
32
+ result.push({ sign: "+", text: after[j] });
33
+ j += 1;
34
+ }
35
+ }
36
+ for (; i < before.length; i += 1)
37
+ result.push({ sign: "-", text: before[i] });
38
+ for (; j < after.length; j += 1)
39
+ result.push({ sign: "+", text: after[j] });
40
+ return result;
41
+ }
42
+ export function unifiedDiff(before, after, path) {
43
+ if (before === after)
44
+ return "";
45
+ const beforeLines = before.split("\n");
46
+ const afterLines = after.split("\n");
47
+ if (beforeLines.length > MAX_LINES || afterLines.length > MAX_LINES) {
48
+ return `--- a/${path}\n+++ b/${path}\n@@ file too large to diff @@\n`;
49
+ }
50
+ const ops = operations(beforeLines, afterLines);
51
+ const keep = new Array(ops.length).fill(false);
52
+ ops.forEach((operation, index) => {
53
+ if (operation.sign === " ")
54
+ return;
55
+ for (let offset = -CONTEXT; offset <= CONTEXT; offset += 1) {
56
+ const current = index + offset;
57
+ if (current >= 0 && current < ops.length)
58
+ keep[current] = true;
59
+ }
60
+ });
61
+ const body = [];
62
+ let elided = false;
63
+ ops.forEach((operation, index) => {
64
+ if (keep[index]) {
65
+ if (elided)
66
+ body.push("@@");
67
+ elided = false;
68
+ body.push(`${operation.sign}${operation.text}`);
69
+ }
70
+ else {
71
+ elided = true;
72
+ }
73
+ });
74
+ return [`--- a/${path}`, `+++ b/${path}`, ...body, ""].join("\n");
75
+ }
76
+ //# sourceMappingURL=diff.js.map