@superbee/core 0.2.0-pre.16 → 0.2.0-pre.17

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 (109) hide show
  1. package/README.md +107 -4
  2. package/dist/bundle-health/index.d.ts +14 -0
  3. package/dist/bundle-health/index.d.ts.map +1 -0
  4. package/dist/bundle-health/index.js +12 -0
  5. package/dist/bundle-health/index.js.map +1 -0
  6. package/dist/bundle-health/kind-findings.d.ts +44 -0
  7. package/dist/bundle-health/kind-findings.d.ts.map +1 -0
  8. package/dist/bundle-health/kind-findings.js +68 -0
  9. package/dist/bundle-health/kind-findings.js.map +1 -0
  10. package/dist/bundle-health/legacy-page.d.ts +39 -0
  11. package/dist/bundle-health/legacy-page.d.ts.map +1 -0
  12. package/dist/bundle-health/legacy-page.js +50 -0
  13. package/dist/bundle-health/legacy-page.js.map +1 -0
  14. package/dist/bundle-health/report.d.ts +202 -0
  15. package/dist/bundle-health/report.d.ts.map +1 -0
  16. package/dist/bundle-health/report.js +438 -0
  17. package/dist/bundle-health/report.js.map +1 -0
  18. package/dist/hosted-client/write.d.ts +10 -1
  19. package/dist/hosted-client/write.d.ts.map +1 -1
  20. package/dist/hosted-client/write.js +9 -4
  21. package/dist/hosted-client/write.js.map +1 -1
  22. package/dist/hosted-transport/answer-rows.d.ts +3 -2
  23. package/dist/hosted-transport/answer-rows.d.ts.map +1 -1
  24. package/dist/hosted-transport/answer-rows.js +1 -1
  25. package/dist/hosted-transport/answer-rows.js.map +1 -1
  26. package/dist/hosted-transport/whole-document-transport.d.ts +1 -1
  27. package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -1
  28. package/dist/hosted-transport/whole-document-transport.js +20 -12
  29. package/dist/hosted-transport/whole-document-transport.js.map +1 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +1 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/kinds-load.js +4 -4
  35. package/dist/kinds-load.js.map +1 -1
  36. package/dist/kinds.d.ts.map +1 -1
  37. package/dist/kinds.js +3 -2
  38. package/dist/kinds.js.map +1 -1
  39. package/dist/paths.d.ts +16 -0
  40. package/dist/paths.d.ts.map +1 -1
  41. package/dist/paths.js +25 -0
  42. package/dist/paths.js.map +1 -1
  43. package/dist/query-filter.d.ts +9 -0
  44. package/dist/query-filter.d.ts.map +1 -1
  45. package/dist/query-filter.js +19 -3
  46. package/dist/query-filter.js.map +1 -1
  47. package/dist/record-overlay/apply.d.ts +43 -0
  48. package/dist/record-overlay/apply.d.ts.map +1 -0
  49. package/dist/record-overlay/apply.js +490 -0
  50. package/dist/record-overlay/apply.js.map +1 -0
  51. package/dist/record-overlay/canonical.d.ts +14 -0
  52. package/dist/record-overlay/canonical.d.ts.map +1 -0
  53. package/dist/record-overlay/canonical.js +31 -0
  54. package/dist/record-overlay/canonical.js.map +1 -0
  55. package/dist/record-overlay/digest.d.ts +4 -0
  56. package/dist/record-overlay/digest.d.ts.map +1 -0
  57. package/dist/record-overlay/digest.js +11 -0
  58. package/dist/record-overlay/digest.js.map +1 -0
  59. package/dist/record-overlay/errors.d.ts +40 -0
  60. package/dist/record-overlay/errors.d.ts.map +1 -0
  61. package/dist/record-overlay/errors.js +51 -0
  62. package/dist/record-overlay/errors.js.map +1 -0
  63. package/dist/record-overlay/findings.d.ts +5 -0
  64. package/dist/record-overlay/findings.d.ts.map +1 -0
  65. package/dist/record-overlay/findings.js +83 -0
  66. package/dist/record-overlay/findings.js.map +1 -0
  67. package/dist/record-overlay/index.d.ts +23 -0
  68. package/dist/record-overlay/index.d.ts.map +1 -0
  69. package/dist/record-overlay/index.js +21 -0
  70. package/dist/record-overlay/index.js.map +1 -0
  71. package/dist/record-overlay/plan.d.ts +12 -0
  72. package/dist/record-overlay/plan.d.ts.map +1 -0
  73. package/dist/record-overlay/plan.js +284 -0
  74. package/dist/record-overlay/plan.js.map +1 -0
  75. package/dist/record-overlay/policy.d.ts +60 -0
  76. package/dist/record-overlay/policy.d.ts.map +1 -0
  77. package/dist/record-overlay/policy.js +209 -0
  78. package/dist/record-overlay/policy.js.map +1 -0
  79. package/dist/record-overlay/redact.d.ts +3 -0
  80. package/dist/record-overlay/redact.d.ts.map +1 -0
  81. package/dist/record-overlay/redact.js +27 -0
  82. package/dist/record-overlay/redact.js.map +1 -0
  83. package/dist/record-overlay/signal-kind.d.ts +30 -0
  84. package/dist/record-overlay/signal-kind.d.ts.map +1 -0
  85. package/dist/record-overlay/signal-kind.js +38 -0
  86. package/dist/record-overlay/signal-kind.js.map +1 -0
  87. package/dist/record-overlay/signal-text.d.ts +45 -0
  88. package/dist/record-overlay/signal-text.d.ts.map +1 -0
  89. package/dist/record-overlay/signal-text.js +116 -0
  90. package/dist/record-overlay/signal-text.js.map +1 -0
  91. package/dist/record-overlay/source-index.d.ts +19 -0
  92. package/dist/record-overlay/source-index.d.ts.map +1 -0
  93. package/dist/record-overlay/source-index.js +102 -0
  94. package/dist/record-overlay/source-index.js.map +1 -0
  95. package/dist/record-overlay/types.d.ts +286 -0
  96. package/dist/record-overlay/types.d.ts.map +1 -0
  97. package/dist/record-overlay/types.js +2 -0
  98. package/dist/record-overlay/types.js.map +1 -0
  99. package/dist/remote-operations.js +5 -2
  100. package/dist/remote-operations.js.map +1 -1
  101. package/dist/storage.d.ts +2 -1
  102. package/dist/storage.d.ts.map +1 -1
  103. package/dist/storage.js +1 -1
  104. package/dist/storage.js.map +1 -1
  105. package/dist/uncertain-write.d.ts +39 -6
  106. package/dist/uncertain-write.d.ts.map +1 -1
  107. package/dist/uncertain-write.js +25 -3
  108. package/dist/uncertain-write.js.map +1 -1
  109. package/package.json +9 -1
@@ -0,0 +1,438 @@
1
+ /**
2
+ * The bundle health report: every finding `superbee status` prints, computed from one bundle read.
3
+ *
4
+ * Composition only: Kind conformance is `validateAgainstKind`, links are `parseLinksFromDoc` and
5
+ * `parseQualifiedLinks`, staleness is `freshness()`, View registrations are `parseRegistration`.
6
+ * One `loadKinds`, one lenient `query`, two prefix-scoped `listBlobs` and one root-index read per
7
+ * call; every finding derives in memory from those results. Orphans and both graph lints come from
8
+ * the edge sets built while scanning for unresolved links, never a per-document backlink query.
9
+ *
10
+ * Findings are data, never errors: a document whose frontmatter does not parse is a `malformed`
11
+ * row, and an unresolved link is information (OKF permits links to knowledge not yet written).
12
+ *
13
+ * Top-level report keys are camelCase; row keys are snake_case, the rows `superbee status` prints.
14
+ */
15
+ import { listBlobs, query, readBundleOkfVersion } from "../bundle-ops.js";
16
+ import { createLocalResolver, resolveQualifiedLinks } from "../cross-bundle.js";
17
+ import { BUNDLE_NAME_DOC_ID, BUNDLE_NAME_DOC_TYPE, DEPENDENCIES_DOC_ID, DEPENDENCIES_DOC_TYPE, declaredBundleId, parseDependencies, } from "../dependencies.js";
18
+ import { freshness, invalidLegacyTimestamp, staleAfterInstant } from "../freshness.js";
19
+ import { MalformedDocumentError } from "../frontmatter-contract.js";
20
+ import { freshnessHorizonMs, isKindFieldValidationWarning, isTerminal, projectKindValidationWarnings, validateAgainstKind, } from "../kinds.js";
21
+ import { loadKinds } from "../kinds-load.js";
22
+ import { collectLinkDeclarations, localEdgeQualifiedDeclaration, qualifiedEdgeViolation } from "../link-types.js";
23
+ import { parseLinksFromDoc } from "../links.js";
24
+ import { isOkfLifecycleStatus } from "../okf-lifecycle.js";
25
+ import { invalidOkfTimestamps } from "../okf-timestamps.js";
26
+ import { isAnyEntryKey, isAnyRegistryId, isPageTypeName, isViewEntryVersion, parseRegistration, VIEW_ENTRY_PREFIX, } from "../page.js";
27
+ import { isQualifiedHref, parseQualifiedLinks } from "../qualified-links.js";
28
+ import { trustTierCounts } from "../verification.js";
29
+ import { hasLegacyBridgeField, isLegacyPageConvention, isLegacyPageDoc, isLegacyRegistryDocId, LEGACY_PAGE_BLOB_PREFIX, } from "./legacy-page.js";
30
+ /** A document's `type`, or "" when absent or not a string: the one place this coercion happens. */
31
+ function docType(doc) {
32
+ return typeof doc.frontmatter.type === "string" ? doc.frontmatter.type : "";
33
+ }
34
+ /** Preserve ordinary YAML value shapes while keeping unsupported JSON values legible. */
35
+ function diagnosticValue(value) {
36
+ try {
37
+ return JSON.parse(JSON.stringify(value, (_key, item) => typeof item === "number" && !Number.isFinite(item) ? `<${String(item)}>` : item));
38
+ }
39
+ catch {
40
+ // YAML aliases can form cycles; the report must still name the offending document.
41
+ return `<non-JSON ${Array.isArray(value) ? "array" : typeof value}: circular or too deeply nested>`;
42
+ }
43
+ }
44
+ /**
45
+ * Documents that define the bundle's operating model or identity rather than participating as
46
+ * concept instances. Their lack of inbound concept links is intentional, so they are never orphans.
47
+ */
48
+ function isGraphDefinition(doc) {
49
+ const type = docType(doc);
50
+ return type === "Convention" ||
51
+ isPageTypeName(type) ||
52
+ isLegacyPageDoc(doc.frontmatter) ||
53
+ (type === "Reference" && doc.id.startsWith("references/")) ||
54
+ (type === BUNDLE_NAME_DOC_TYPE && doc.id === BUNDLE_NAME_DOC_ID) ||
55
+ (type === DEPENDENCIES_DOC_TYPE && doc.id === DEPENDENCIES_DOC_ID);
56
+ }
57
+ function okfV02WorkflowStatusCollisions(registry, docs) {
58
+ const affectedByKind = new Map();
59
+ const observedValuesByKind = new Map();
60
+ for (const doc of docs) {
61
+ const value = doc.frontmatter.status;
62
+ if (value === undefined || isOkfLifecycleStatus(value))
63
+ continue;
64
+ const type = docType(doc);
65
+ affectedByKind.set(type, (affectedByKind.get(type) ?? 0) + 1);
66
+ const display = typeof value === "string" ? value : `<${Array.isArray(value) ? "array" : typeof value}>`;
67
+ const observed = observedValuesByKind.get(type) ?? new Set();
68
+ observed.add(display);
69
+ observedValuesByKind.set(type, observed);
70
+ }
71
+ const rows = [];
72
+ for (const kind of [...registry.kinds.values()].sort((a, b) => a.governs.localeCompare(b.governs))) {
73
+ const declaresStatus = kind.fields.required.includes("status") || kind.fields.optional.includes("status");
74
+ if (!declaresStatus)
75
+ continue;
76
+ const declaredValues = kind.fields.values.status;
77
+ const incompatibleValues = (declaredValues ?? []).filter((value) => !isOkfLifecycleStatus(value));
78
+ const affectedDocuments = affectedByKind.get(kind.governs) ?? 0;
79
+ if (declaredValues !== undefined && incompatibleValues.length === 0 && affectedDocuments === 0)
80
+ continue;
81
+ rows.push({
82
+ kind: kind.governs,
83
+ convention: kind.id,
84
+ declaration: declaredValues === undefined ? "unbounded" : "enumerated",
85
+ incompatible_values: incompatibleValues,
86
+ observed_incompatible_values: [...(observedValuesByKind.get(kind.governs) ?? [])].sort(),
87
+ affected_documents: affectedDocuments,
88
+ });
89
+ }
90
+ return rows;
91
+ }
92
+ /**
93
+ * Compute the health report for `bundle`. Read-only: it reads through the bundle's backend and
94
+ * never writes. It throws only what it propagates: `InvalidInputError` for a backend-less bundle in
95
+ * a runtime with no default, backend errors other than `MalformedDocumentError` (a finding), and
96
+ * whatever the `bindings` hook throws.
97
+ */
98
+ export async function bundleHealth(bundle, options = {}) {
99
+ // A document whose frontmatter does not parse is its own finding, never an abort.
100
+ const malformed = [];
101
+ const [registry, docs, legacyBlobKeys, viewBlobKeys, okfVersionRead] = await Promise.all([
102
+ loadKinds(bundle),
103
+ query(bundle, {}, { onSkip: (s) => malformed.push({ id: s.id, reason: s.reason }) }),
104
+ // legacyNaming: blob keys still under the legacy pages/ prefix.
105
+ listBlobs(bundle, LEGACY_PAGE_BLOB_PREFIX),
106
+ // views: the views/ half of the entry-key existence set (the legacy listing is the other half).
107
+ listBlobs(bundle, VIEW_ENTRY_PREFIX),
108
+ readBundleOkfVersion(bundle)
109
+ .then((version) => ({ version }))
110
+ .catch((error) => {
111
+ if (!(error instanceof MalformedDocumentError))
112
+ throw error;
113
+ return { version: undefined, malformed: { id: "index.md", reason: error.message } };
114
+ }),
115
+ ]);
116
+ if ("malformed" in okfVersionRead)
117
+ malformed.unshift(okfVersionRead.malformed);
118
+ const okfVersion = okfVersionRead.version;
119
+ const byId = new Set(docs.map((d) => d.id));
120
+ const docsById = new Map(docs.map((d) => [d.id, d]));
121
+ // Kind lint, per violation; conformance debt regroups the same pass by document and keeps only
122
+ // frontmatter-level codes (a missing body section names no field an update could set).
123
+ const kindLint = [];
124
+ const conformanceDebtDocs = new Map(); // id -> type, first seen (docs is id-sorted)
125
+ for (const doc of docs) {
126
+ const kind = registry.kinds.get(docType(doc));
127
+ if (!kind)
128
+ continue;
129
+ for (const w of projectKindValidationWarnings(okfVersion, kind, validateAgainstKind(doc, kind))) {
130
+ kindLint.push({ id: doc.id, field: w.field ?? "", code: w.code });
131
+ if (isKindFieldValidationWarning(w) && !conformanceDebtDocs.has(doc.id)) {
132
+ conformanceDebtDocs.set(doc.id, docType(doc));
133
+ }
134
+ }
135
+ }
136
+ // The declared typed-edge vocabulary, shared with `link add`'s write-time lint.
137
+ const linkTypeDeclarations = collectLinkDeclarations(registry);
138
+ const unresolvedLinks = [];
139
+ const inbound = new Set();
140
+ const outbound = new Set();
141
+ // id -> resolved inbound edges from OTHER documents (a self-link rescues nothing).
142
+ const inboundEdges = new Map();
143
+ const linkTypeViolations = [];
144
+ const crossLinkTypeViolations = [];
145
+ for (const doc of docs) {
146
+ for (const l of parseLinksFromDoc(doc)) {
147
+ // A malformed `okf:` href without `//` also parses as a local link; it counts once, as a
148
+ // cross-bundle invalid_ref, never as a local edge.
149
+ if (isQualifiedHref(l.href))
150
+ continue;
151
+ // A local link under a qualified declaration is a cross-bundle type violation whether or not
152
+ // its local target exists.
153
+ const qualifiedDeclaration = localEdgeQualifiedDeclaration(linkTypeDeclarations.get(l.text), docType(doc));
154
+ if (qualifiedDeclaration) {
155
+ crossLinkTypeViolations.push({
156
+ from: doc.id,
157
+ href: l.href,
158
+ text: l.text,
159
+ expected: `${qualifiedDeclaration.governs} -> ${qualifiedDeclaration.target}`,
160
+ });
161
+ }
162
+ // Any non-self link is an intentional outgoing edge; an unresolved one has its own finding,
163
+ // so it must not also make its source an orphan.
164
+ if (l.to !== doc.id)
165
+ outbound.add(doc.id);
166
+ if (!byId.has(l.to)) {
167
+ unresolvedLinks.push({ from: doc.id, href: l.href });
168
+ continue;
169
+ }
170
+ if (l.to !== doc.id) {
171
+ inbound.add(l.to);
172
+ const list = inboundEdges.get(l.to) ?? [];
173
+ list.push({ text: l.text, sourceType: docType(doc) });
174
+ inboundEdges.set(l.to, list);
175
+ }
176
+ // A resolved edge whose text is a declared link type its source or target does not conform to.
177
+ const declared = linkTypeDeclarations.get(l.text);
178
+ if (declared && declared.length > 0 && !qualifiedDeclaration) {
179
+ const sourceType = docType(doc);
180
+ const targetType = docType(docsById.get(l.to));
181
+ const matched = declared.find((d) => d.governs === sourceType) ?? declared[0];
182
+ const sourceOk = declared.some((d) => d.governs === sourceType);
183
+ const targetOk = targetType === matched.target;
184
+ if (!sourceOk || !targetOk) {
185
+ linkTypeViolations.push({
186
+ from: doc.id,
187
+ to: l.to,
188
+ text: l.text,
189
+ expected: `${matched.governs} -> ${matched.target}`,
190
+ });
191
+ }
192
+ }
193
+ }
194
+ }
195
+ // Cross-bundle links, parsed from the documents already in hand.
196
+ const qualifiedLinks = [];
197
+ for (const doc of docs) {
198
+ for (const q of parseQualifiedLinks(doc)) {
199
+ qualifiedLinks.push(q);
200
+ if (!q.ref)
201
+ continue;
202
+ const violation = qualifiedEdgeViolation(linkTypeDeclarations.get(q.text), docType(doc), q.ref.alias);
203
+ if (violation) {
204
+ crossLinkTypeViolations.push({
205
+ from: doc.id,
206
+ href: q.href,
207
+ text: q.text,
208
+ expected: `${violation.governs} -> ${violation.target}`,
209
+ });
210
+ }
211
+ }
212
+ }
213
+ const dependenciesDoc = docsById.get(DEPENDENCIES_DOC_ID);
214
+ const hasCrossBundle = dependenciesDoc !== undefined || qualifiedLinks.length > 0;
215
+ const selfBundleId = declaredBundleId(docsById.get(BUNDLE_NAME_DOC_ID)) ?? options.selfBundleId;
216
+ const declaredDeps = parseDependencies(dependenciesDoc, selfBundleId === undefined ? {} : { selfBundleId });
217
+ // Binding runs here, after every read and on this one parse, so a malformed or absent declaration
218
+ // stays a finding and a self alias is already dropped when the binder sees the declaration.
219
+ const bindings = typeof options.bindings === "function"
220
+ ? await options.bindings(declaredDeps)
221
+ : options.bindings ?? new Map();
222
+ let crossBundle = null;
223
+ if (hasCrossBundle) {
224
+ let unchecked = 0;
225
+ const checked = qualifiedLinks.filter((q) => {
226
+ const unbound = q.ref !== null && declaredDeps.dependencies.has(q.ref.alias) && !bindings.has(q.ref.alias);
227
+ if (unbound)
228
+ unchecked++;
229
+ return !unbound;
230
+ });
231
+ const resolver = createLocalResolver({ dependencies: declaredDeps.dependencies, rejected: declaredDeps.rejected, bindings });
232
+ // One probe per bound alias rides the same resolve call, so each binding's verdict (identity,
233
+ // pin) comes from the resolver and its copy is still read in one batch.
234
+ const probeAliases = [...bindings.keys()];
235
+ const probes = probeAliases.map((alias) => {
236
+ const ref = { alias, id: BUNDLE_NAME_DOC_ID };
237
+ return { from: BUNDLE_NAME_DOC_ID, text: "", href: "", ref };
238
+ });
239
+ const results = await resolveQualifiedLinks(resolver, [...checked, ...probes]);
240
+ const verdictByAlias = new Map();
241
+ results.slice(checked.length).forEach((r, i) => {
242
+ const resolution = r.resolution;
243
+ const state = resolution.state === "resolved" || resolution.reason === "target_missing" ? "ok" : resolution.reason;
244
+ verdictByAlias.set(probeAliases[i], state);
245
+ });
246
+ const unresolved = [];
247
+ for (const { link, resolution } of results.slice(0, checked.length)) {
248
+ if (resolution.state === "resolved")
249
+ continue;
250
+ unresolved.push({ from: link.from, href: link.href, reason: resolution.reason, detail: resolution.detail });
251
+ }
252
+ const dependencies = [];
253
+ for (const entry of declaredDeps.dependencies.values()) {
254
+ dependencies.push({
255
+ alias: entry.alias,
256
+ bundle_id: entry.bundle_id,
257
+ state: verdictByAlias.get(entry.alias) ?? "unbound",
258
+ bound: bindings.get(entry.alias)?.label ?? null,
259
+ pin: entry.pin?.value ?? null,
260
+ });
261
+ }
262
+ crossBundle = {
263
+ links: qualifiedLinks.length,
264
+ unchecked,
265
+ unresolved,
266
+ dependencies,
267
+ problems: declaredDeps.problems.map((p) => ({ code: p.code, alias: p.alias ?? null, detail: p.detail })),
268
+ };
269
+ }
270
+ // Orphans are isolated content documents inside an established graph: a bundle with no resolved
271
+ // edge has not adopted graph structure yet, roots with outbound edges are intentional, and
272
+ // definition documents are classified above.
273
+ const orphans = [];
274
+ if (inbound.size > 0) {
275
+ for (const doc of docs) {
276
+ if (!inbound.has(doc.id) && !outbound.has(doc.id) && !isGraphDefinition(doc)) {
277
+ orphans.push({ id: doc.id, type: docType(doc) });
278
+ }
279
+ }
280
+ }
281
+ // One freshness authority handles both standard v0.2 `stale_after` and optional Kind horizons.
282
+ const now = options.now ?? new Date();
283
+ const stale = [];
284
+ const noTimestamp = [];
285
+ const invalidStaleAfter = [];
286
+ const invalidTimestamps = [];
287
+ const invalidLegacyTimestamps = [];
288
+ for (const doc of docs) {
289
+ const invalidLegacy = invalidLegacyTimestamp(doc.frontmatter, okfVersion);
290
+ if (invalidLegacy) {
291
+ invalidLegacyTimestamps.push({ id: doc.id, type: docType(doc), field: invalidLegacy.field, value: diagnosticValue(invalidLegacy.value) });
292
+ }
293
+ if (okfVersion === "0.2") {
294
+ for (const { field, value } of invalidOkfTimestamps(doc.frontmatter)) {
295
+ invalidTimestamps.push({ id: doc.id, type: docType(doc), field, value: diagnosticValue(value) });
296
+ }
297
+ }
298
+ const kind = registry.kinds.get(docType(doc));
299
+ const horizonMs = kind ? freshnessHorizonMs(kind) : undefined;
300
+ const hasStaleAfter = okfVersion === "0.2" && Object.hasOwn(doc.frontmatter, "stale_after");
301
+ const staleAfterIsInvalid = hasStaleAfter && staleAfterInstant(doc.frontmatter.stale_after) === null;
302
+ if (staleAfterIsInvalid) {
303
+ invalidStaleAfter.push({ id: doc.id, type: docType(doc), value: diagnosticValue(doc.frontmatter.stale_after) });
304
+ }
305
+ // A readable stale_after is a string: staleAfterInstant accepts strings only.
306
+ const staleAfter = hasStaleAfter && !staleAfterIsInvalid
307
+ ? doc.frontmatter.stale_after
308
+ : undefined;
309
+ if (horizonMs === undefined && staleAfter === undefined)
310
+ continue;
311
+ const result = freshness(doc, { maxAgeMs: horizonMs, now, okfVersion });
312
+ if (result.verdict === "empty" && horizonMs !== undefined) {
313
+ noTimestamp.push({ id: doc.id, type: docType(doc) });
314
+ }
315
+ else if (result.verdict === "stale") {
316
+ stale.push({
317
+ id: doc.id,
318
+ ...(result.ageMs === undefined ? {} : { age_ms: result.ageMs }),
319
+ ...(horizonMs === undefined ? {} : { horizon_ms: horizonMs }),
320
+ ...(staleAfter === undefined ? {} : { stale_after: staleAfter }),
321
+ });
322
+ }
323
+ }
324
+ // OKF v0.2 trust tiers (SPEC 5.3); v0.1 defines no trust family.
325
+ const trust = okfVersion === "0.2" && docs.length > 0 ? trustTierCounts(docs) : null;
326
+ // Inbound expectations: one row per instance of a Kind declaring `expects_inbound` that lacks a
327
+ // conforming inbound edge. An instance whose Kind declares a terminal set it currently matches is
328
+ // skipped and counted, never silently dropped.
329
+ const missingExpectedRanked = [];
330
+ let terminalSkipped = 0;
331
+ for (const doc of docs) {
332
+ const kind = registry.kinds.get(docType(doc));
333
+ if (!kind?.expectsInbound)
334
+ continue;
335
+ const terminalDeclared = Object.keys(kind.fields.terminal).length > 0;
336
+ if (terminalDeclared && isTerminal(kind, doc.frontmatter)) {
337
+ terminalSkipped++;
338
+ continue;
339
+ }
340
+ const edges = inboundEdges.get(doc.id) ?? [];
341
+ const missing = Object.entries(kind.expectsInbound)
342
+ .filter(([text, sourceKind]) => !edges.some((e) => e.text === text && e.sourceType === sourceKind))
343
+ .map(([text]) => text);
344
+ if (missing.length === 0)
345
+ continue;
346
+ const declaresStatus = kind.fields.required.includes("status") || kind.fields.optional.includes("status");
347
+ const row = declaresStatus
348
+ ? { id: doc.id, status: doc.frontmatter.status, missing }
349
+ : { id: doc.id, missing };
350
+ // Non-terminal instances sort first: by the declared terminal set when the Kind has one, else
351
+ // by the historical status === "done" fallback.
352
+ const sortsFirst = terminalDeclared ? isTerminal(kind, doc.frontmatter) : row.status === "done";
353
+ missingExpectedRanked.push({ row, sortsFirst });
354
+ }
355
+ missingExpectedRanked.sort((a, b) => {
356
+ if (a.sortsFirst !== b.sortsFirst)
357
+ return a.sortsFirst ? 1 : -1;
358
+ return String(a.row.id).localeCompare(String(b.row.id));
359
+ });
360
+ const missingExpectedLinks = missingExpectedRanked.map((e) => e.row);
361
+ // legacyNaming: retired names the runtime no longer accepts, plus legacy locations (still
362
+ // recognized, reported as information). Documents count only under the legacy registry prefix,
363
+ // blob keys only under the legacy entry prefix.
364
+ const legacyNaming = {
365
+ pageTyped: docs.filter((doc) => isLegacyPageDoc(doc.frontmatter)).map((doc) => ({ id: doc.id })),
366
+ bridgeField: docs.filter((doc) => hasLegacyBridgeField(doc.frontmatter)).map((doc) => ({ id: doc.id })),
367
+ pageConvention: docs.filter((doc) => isLegacyPageConvention(doc.frontmatter)).map((doc) => ({ id: doc.id })),
368
+ legacyPrefix: [
369
+ ...docs.filter((doc) => isLegacyRegistryDocId(doc.id)).map((doc) => ({ id: doc.id, store: "doc" })),
370
+ ...legacyBlobKeys
371
+ .slice()
372
+ .sort()
373
+ .map((key) => ({ id: key, store: "blob" })),
374
+ ],
375
+ };
376
+ // The View surface, recognized with the same predicates the ui launcher uses (legacy locations
377
+ // included; a Page-typed document is a legacyNaming finding instead). Entry existence derives
378
+ // from the two prefix-scoped listings above, never a per-registration probe.
379
+ const entryBlobKeys = new Set([...viewBlobKeys, ...legacyBlobKeys]);
380
+ const views = { typed: 0, danglingEntries: [], invalidRegistrations: [] };
381
+ for (const doc of docs) {
382
+ if (!isPageTypeName(doc.frontmatter.type))
383
+ continue;
384
+ views.typed++;
385
+ const registration = parseRegistration(doc.id, doc.frontmatter);
386
+ if (registration) {
387
+ if (!entryBlobKeys.has(registration.entry)) {
388
+ views.danglingEntries.push({ id: registration.id, entry: registration.entry });
389
+ }
390
+ continue;
391
+ }
392
+ // The document declares the View kind name but fails the registration grammar; name each
393
+ // failing leg with the grammar helpers parseRegistration composes.
394
+ const legs = [];
395
+ if (!isAnyRegistryId(doc.id))
396
+ legs.push("id");
397
+ if (!isAnyEntryKey(doc.frontmatter.entry))
398
+ legs.push("entry");
399
+ if (Object.hasOwn(doc.frontmatter, "entry_version") &&
400
+ !isViewEntryVersion(doc.frontmatter.entry_version)) {
401
+ legs.push("entry_version");
402
+ }
403
+ views.invalidRegistrations.push({ id: doc.id, problem: legs.join("+") });
404
+ }
405
+ const statusCollisions = okfV02WorkflowStatusCollisions(registry, docs);
406
+ const okfUpgrade = okfVersion === "0.1" && statusCollisions.length > 0
407
+ ? {
408
+ statusFieldRows: statusCollisions,
409
+ affectedDocuments: statusCollisions.reduce((total, row) => total + row.affected_documents, 0),
410
+ }
411
+ : null;
412
+ return {
413
+ okfVersion,
414
+ docs: docs.length,
415
+ kinds: registry.kinds.size,
416
+ malformed,
417
+ kindLint,
418
+ conformanceDebt: registry.kinds.size > 0 ? [...conformanceDebtDocs].map(([id, type]) => ({ id, type })) : null,
419
+ registryWarnings: registry.warnings,
420
+ unresolvedLinks,
421
+ orphans,
422
+ linkTypeViolations,
423
+ crossLinkTypeViolations,
424
+ missingExpectedLinks,
425
+ terminalSkipped,
426
+ stale,
427
+ noTimestamp,
428
+ invalidStaleAfter,
429
+ invalidTimestamps,
430
+ invalidLegacyTimestamps,
431
+ trust,
432
+ views,
433
+ crossBundle,
434
+ okfUpgrade,
435
+ legacyNaming,
436
+ };
437
+ }
438
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/bundle-health/report.ts"],"names":[],"mappings":"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"}
@@ -111,9 +111,18 @@ export type HostedWriteResult = (WriteResultBase & {
111
111
  readonly code: HostedWriteRefusalCode;
112
112
  readonly message: string;
113
113
  })
114
- /** The host may or may not hold the write. `lookupWrite` or `settleWrite` asks again later. */
114
+ /**
115
+ * The host may or may not hold the write. `lookupWrite` or `settleWrite` asks again later.
116
+ * `refusal` is the refusal of this call's resend, when one ended it: the resend was refused
117
+ * before it ran (access withdrawn, signed out, a spent quota, a malformed request) while an
118
+ * earlier delivery may still commit, so the write is kept. It says why settling must wait.
119
+ */
115
120
  | (WriteResultBase & {
116
121
  readonly status: "unknown";
122
+ readonly refusal?: {
123
+ readonly code: string;
124
+ readonly message: string;
125
+ };
117
126
  });
118
127
  /**
119
128
  * What `lookupWrite` and `settleWrite` answer: a write's result, or `unrecorded` when the intent
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/hosted-client/write.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/hosted-client/write.ts"],"names":[],"mappings":"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"}
@@ -170,7 +170,7 @@ function resultOf(intent, outcome) {
170
170
  return { ...base, status: "conflict", reason: "concurrent_change", message: outcome.message };
171
171
  return { ...base, status: "refused", code: outcome.code, message: outcome.message };
172
172
  case "unknown":
173
- return { ...base, status: "unknown" };
173
+ return { ...base, status: "unknown", ...(outcome.refusal ? { refusal: { code: outcome.refusal.code, message: outcome.refusal.message } } : {}) };
174
174
  }
175
175
  }
176
176
  /** The signal a write's requests run under: the client's, and the caller's when given. */
@@ -255,8 +255,8 @@ async function deliver(context, intent, reader, capabilities, callerSignal) {
255
255
  if (storeFailure)
256
256
  throw storeFailure.cause;
257
257
  // A refusal after the caller aborted is the abort's (the carrier sends nothing once it has),
258
- // never the host's verdict: the identity stays unknown and its record is kept.
259
- const answer = callerSignal.aborted && outcome.kind === "refused" ? { kind: "unknown" } : outcome;
258
+ // never the host's verdict: the identity stays unknown and its record is kept, with no reason.
259
+ const answer = callerSignal.aborted && (outcome.kind === "refused" || outcome.kind === "unknown") ? { kind: "unknown" } : outcome;
260
260
  await recordOutcome(context, intent, answer, settled.attempts);
261
261
  return resultOf(intent, answer);
262
262
  }
@@ -339,7 +339,8 @@ async function lookupOnly(context, intent, reader, capabilities, signal) {
339
339
  const transport = transportFor(context, intent, reader, capabilities, signal);
340
340
  let outcome;
341
341
  try {
342
- outcome = (await transport.lookup(intent.requestId)) ?? { kind: "unknown" };
342
+ const recorded = await transport.lookup(intent.requestId);
343
+ outcome = recorded === null || recorded.kind === "pending" ? { kind: "unknown" } : recorded;
343
344
  }
344
345
  catch {
345
346
  outcome = { kind: "unknown" };
@@ -356,6 +357,8 @@ export async function hostedLookupWrite(context, requestId, options = {}) {
356
357
  const signal = writeSignal(context, options.signal);
357
358
  signal.throwIfAborted();
358
359
  return serialized(context, requestId, async () => {
360
+ // Aborted while an earlier call under this identity ran: this one sends nothing.
361
+ signal.throwIfAborted();
359
362
  const held = await heldIntent(context, requestId);
360
363
  if (!("intent" in held))
361
364
  return held;
@@ -372,6 +375,8 @@ export async function hostedSettleWrite(context, requestId, options = {}) {
372
375
  const signal = writeSignal(context, options.signal);
373
376
  signal.throwIfAborted();
374
377
  return serialized(context, requestId, async () => {
378
+ // Aborted while an earlier call under this identity ran: this one sends nothing.
379
+ signal.throwIfAborted();
375
380
  const held = await heldIntent(context, requestId);
376
381
  if (!("intent" in held))
377
382
  return held;