@sentropic/focus 0.3.0 → 0.5.0-rc.10
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 +9 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/editing/anchors.d.ts +14 -0
- package/dist/editing/anchors.d.ts.map +1 -0
- package/dist/editing/anchors.js +113 -0
- package/dist/editing/anchors.js.map +1 -0
- package/dist/editing/codec.d.ts +24 -0
- package/dist/editing/codec.d.ts.map +1 -0
- package/dist/editing/codec.js +143 -0
- package/dist/editing/codec.js.map +1 -0
- package/dist/editing/contract.d.ts +129 -0
- package/dist/editing/contract.d.ts.map +1 -0
- package/dist/editing/contract.js +76 -0
- package/dist/editing/contract.js.map +1 -0
- package/dist/editing/diff.d.ts +12 -0
- package/dist/editing/diff.d.ts.map +1 -0
- package/dist/editing/diff.js +125 -0
- package/dist/editing/diff.js.map +1 -0
- package/dist/editing/digest.d.ts +6 -0
- package/dist/editing/digest.d.ts.map +1 -0
- package/dist/editing/digest.js +56 -0
- package/dist/editing/digest.js.map +1 -0
- package/dist/editing/index.d.ts +7 -0
- package/dist/editing/index.d.ts.map +1 -0
- package/dist/editing/index.js +7 -0
- package/dist/editing/index.js.map +1 -0
- package/dist/editing/reconcile.d.ts +66 -0
- package/dist/editing/reconcile.d.ts.map +1 -0
- package/dist/editing/reconcile.js +167 -0
- package/dist/editing/reconcile.js.map +1 -0
- package/dist/editing/structure.d.ts +24 -0
- package/dist/editing/structure.d.ts.map +1 -0
- package/dist/editing/structure.js +71 -0
- package/dist/editing/structure.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +144 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +1 -1
- package/dist/model.js.map +1 -1
- package/dist/registry/definitions.d.ts +159 -0
- package/dist/registry/definitions.d.ts.map +1 -0
- package/dist/registry/definitions.js +509 -0
- package/dist/registry/definitions.js.map +1 -0
- package/dist/render/evidence.d.ts +10 -0
- package/dist/render/evidence.d.ts.map +1 -0
- package/dist/render/evidence.js +37 -0
- package/dist/render/evidence.js.map +1 -0
- package/dist/render/html.d.ts.map +1 -1
- package/dist/render/html.js +14 -1
- package/dist/render/html.js.map +1 -1
- package/dist/render/md.d.ts.map +1 -1
- package/dist/render/md.js +15 -1
- package/dist/render/md.js.map +1 -1
- package/dist/render/presentation.d.ts +4 -0
- package/dist/render/presentation.d.ts.map +1 -0
- package/dist/render/presentation.js +25 -0
- package/dist/render/presentation.js.map +1 -0
- package/dist/render/terminal.d.ts.map +1 -1
- package/dist/render/terminal.js +15 -1
- package/dist/render/terminal.js.map +1 -1
- package/dist/track/index.d.ts.map +1 -1
- package/dist/track/index.js +24 -10
- package/dist/track/index.js.map +1 -1
- package/dist/validation/evidence-bytes.d.ts +5 -0
- package/dist/validation/evidence-bytes.d.ts.map +1 -0
- package/dist/validation/evidence-bytes.js +57 -0
- package/dist/validation/evidence-bytes.js.map +1 -0
- package/dist/validation/evidence-shape.d.ts +12 -0
- package/dist/validation/evidence-shape.d.ts.map +1 -0
- package/dist/validation/evidence-shape.js +54 -0
- package/dist/validation/evidence-shape.js.map +1 -0
- package/dist/validation/evidence-sources.d.ts +7 -0
- package/dist/validation/evidence-sources.d.ts.map +1 -0
- package/dist/validation/evidence-sources.js +56 -0
- package/dist/validation/evidence-sources.js.map +1 -0
- package/dist/validation/evidence.d.ts +5 -0
- package/dist/validation/evidence.d.ts.map +1 -0
- package/dist/validation/evidence.js +131 -0
- package/dist/validation/evidence.js.map +1 -0
- package/dist/validation/index.d.ts +59 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +500 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/readability.d.ts +28 -0
- package/dist/validation/readability.d.ts.map +1 -0
- package/dist/validation/readability.js +265 -0
- package/dist/validation/readability.js.map +1 -0
- package/package.json +36 -8
- package/registry/entries.v1.json +140 -0
- package/schemas/decision-dossier-document.v1.schema.json +193 -0
- package/schemas/decision-dossier-document.v2.schema.json +925 -0
- package/schemas/focus-edit-return.v1.schema.json +950 -0
- package/schemas/focus-editing-manifest.v1.schema.json +167 -0
- package/skills/focus/SKILL.md +181 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { decodeEvidence, evidenceLines, evidenceText, sha256 } from './evidence-bytes.js';
|
|
2
|
+
import { array, fail, imageDimensions, record, text } from './evidence-shape.js';
|
|
3
|
+
export const isTextSource = (media) => /^text\/[a-z0-9.+-]+$/.test(media)
|
|
4
|
+
|| ['application/json', 'application/yaml', 'application/x-yaml', 'application/x-ndjson'].includes(media);
|
|
5
|
+
export function checkSources(value, register) {
|
|
6
|
+
const lineCounts = new Map();
|
|
7
|
+
const sources = array(value, '$.sources').map((raw, i) => {
|
|
8
|
+
const path = `$.sources[${i}]`;
|
|
9
|
+
const s = record(raw, path, ['id', 'title', 'origin', 'mediaType', 'encoding', 'data', 'sha256', 'size'], ['width', 'height', 'alt']);
|
|
10
|
+
for (const key of ['id', 'title', 'mediaType', 'sha256'])
|
|
11
|
+
text(s[key], `${path}.${key}`);
|
|
12
|
+
register(s.id, `${path}.id`);
|
|
13
|
+
const origin = s.origin;
|
|
14
|
+
const fields = origin && Object.hasOwn(origin, 'uri') ? ['uri'] : ['repo', 'revision', 'path'];
|
|
15
|
+
record(origin, `${path}.origin`, fields);
|
|
16
|
+
for (const key of fields)
|
|
17
|
+
text(origin[key], `${path}.origin.${key}`);
|
|
18
|
+
if (s.encoding !== 'base64')
|
|
19
|
+
fail(`${path}.encoding`, 'source_encoding', 'Only original base64 bytes are accepted');
|
|
20
|
+
const media = s.mediaType;
|
|
21
|
+
if (!isTextSource(media) && !['image/png', 'image/jpeg'].includes(media))
|
|
22
|
+
fail(`${path}.mediaType`, 'unsupported_media', `Unsupported media for source ${s.id}`);
|
|
23
|
+
let bytes;
|
|
24
|
+
try {
|
|
25
|
+
bytes = decodeEvidence(text(s.data, `${path}.data`, true));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return fail(`${path}.data`, 'source_encoding', `Invalid base64 for source ${s.id}`);
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isSafeInteger(s.size) || s.size !== bytes.length)
|
|
31
|
+
fail(`${path}.size`, 'source_size', `Byte size mismatch for source ${s.id}`);
|
|
32
|
+
if (!/^[a-f0-9]{64}$/.test(s.sha256) || sha256(bytes) !== s.sha256)
|
|
33
|
+
fail(`${path}.sha256`, 'source_digest', `SHA-256 mismatch for source ${s.id}`);
|
|
34
|
+
if (isTextSource(media)) {
|
|
35
|
+
try {
|
|
36
|
+
lineCounts.set(s.id, evidenceLines(evidenceText(bytes)).length);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
fail(`${path}.data`, 'source_encoding', `Invalid UTF-8 for source ${s.id}`);
|
|
40
|
+
}
|
|
41
|
+
for (const key of ['width', 'height', 'alt'])
|
|
42
|
+
if (s[key] !== undefined)
|
|
43
|
+
fail(`${path}.${key}`, 'invalid_evidence', 'Image metadata on text');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
text(s.alt, `${path}.alt`);
|
|
47
|
+
const dimensions = imageDimensions(bytes, media);
|
|
48
|
+
if (!dimensions || !Number.isSafeInteger(s.width) || !Number.isSafeInteger(s.height)
|
|
49
|
+
|| dimensions[0] <= 0 || dimensions[1] <= 0 || dimensions[0] !== s.width || dimensions[1] !== s.height)
|
|
50
|
+
fail(path, 'image_metadata', `Image dimensions/signature mismatch for source ${s.id}`);
|
|
51
|
+
}
|
|
52
|
+
return s;
|
|
53
|
+
});
|
|
54
|
+
return { sources, lineCounts };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=evidence-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-sources.js","sourceRoot":"","sources":["../../src/validation/evidence-sources.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;OACrF,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5G,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,QAA4C;IACvF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,WAAW,EAAC,UAAU,EAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,CAAC,CAAC,CAAC;QAC7H,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACtF,QAAQ,CAAC,CAAC,CAAC,EAAY,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAiC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAC,UAAU,EAAC,MAAM,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,CAAC,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,WAAW,GAAG,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,IAAI,CAAC,GAAG,IAAI,WAAW,EAAE,iBAAiB,EAAE,yCAAyC,CAAC,CAAC;QACpH,MAAM,KAAK,GAAG,CAAC,CAAC,SAAmB,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,GAAG,IAAI,YAAY,EAAE,mBAAmB,EAAE,gCAAgC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChK,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QACnE,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,iBAAiB,EAAE,6BAA6B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,aAAa,EAAE,iCAAiC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3I,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAgB,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM;YAAE,IAAI,CAAC,GAAG,IAAI,SAAS,EAAE,eAAe,EAAE,+BAA+B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7J,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC;gBAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAY,EAAE,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;YAClF,MAAM,CAAC;gBAAC,IAAI,CAAC,GAAG,IAAI,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAC,CAAC;YACtF,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,CAAC;gBAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS;oBAAE,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,kBAAkB,EAAE,wBAAwB,CAAC,CAAC;QAC7I,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC;mBAC/E,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM;gBACtG,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,kDAAkD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,CAA8B,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { DecisionDossierDocumentV1, DecisionDossierDocumentV2 } from '../model.js';
|
|
2
|
+
import type { ValidationResult } from './index.js';
|
|
3
|
+
/** Dispatch before the legacy closed validator, keeping its shape and identity intact. */
|
|
4
|
+
export declare function checkEvidence(value: Record<string, unknown>, legacy: (v: unknown) => ValidationResult<DecisionDossierDocumentV1>): ValidationResult<DecisionDossierDocumentV2>;
|
|
5
|
+
//# sourceMappingURL=evidence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../src/validation/evidence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,EAAkD,MAAM,aAAa,CAAC;AACxI,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,gBAAgB,CAAC,yBAAyB,CAAC,GAAG,gBAAgB,CAAC,yBAAyB,CAAC,CA+F9K"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { array, EvidenceError, fail, record, strings, text } from './evidence-shape.js';
|
|
2
|
+
import { checkSources } from './evidence-sources.js';
|
|
3
|
+
/** Dispatch before the legacy closed validator, keeping its shape and identity intact. */
|
|
4
|
+
export function checkEvidence(value, legacy) {
|
|
5
|
+
try {
|
|
6
|
+
const { schemaVersion: _version, sources: rawSources, citations: rawCitations, evidenceGroups: rawGroups, annexes: rawAnnexes, ...base } = value;
|
|
7
|
+
const citationLinks = new Map();
|
|
8
|
+
const strip = (raw, path) => {
|
|
9
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
10
|
+
return raw;
|
|
11
|
+
const { citationRefs, ...node } = raw;
|
|
12
|
+
if (citationRefs !== undefined)
|
|
13
|
+
citationLinks.set(path, strings(citationRefs, `${path}.citationRefs`));
|
|
14
|
+
return node;
|
|
15
|
+
};
|
|
16
|
+
if (Array.isArray(base.sections))
|
|
17
|
+
base.sections = base.sections.map((raw, i) => {
|
|
18
|
+
const section = strip(raw, `$.sections[${i}]`);
|
|
19
|
+
if (section?.kind === 'optionSet' && Array.isArray(section.options))
|
|
20
|
+
return { ...section,
|
|
21
|
+
options: section.options.map((o, j) => strip(o, `$.sections[${i}].options[${j}]`)) };
|
|
22
|
+
return section;
|
|
23
|
+
});
|
|
24
|
+
const checked = legacy(base);
|
|
25
|
+
if (!checked.ok)
|
|
26
|
+
return checked;
|
|
27
|
+
const doc = checked.value, seen = new Set(), targets = new Set([doc.ref]);
|
|
28
|
+
const register = (id, path) => {
|
|
29
|
+
if (seen.has(id))
|
|
30
|
+
fail(path, 'duplicate_id', `Duplicate id ${id}`);
|
|
31
|
+
seen.add(id);
|
|
32
|
+
};
|
|
33
|
+
doc.sections.forEach(s => {
|
|
34
|
+
register(s.id, '$.sections');
|
|
35
|
+
targets.add(s.id);
|
|
36
|
+
targets.add(s.targetRef);
|
|
37
|
+
if (s.kind === 'optionSet')
|
|
38
|
+
s.options.forEach(o => { register(o.id, '$.sections.options'); targets.add(o.id); targets.add(o.targetRef); });
|
|
39
|
+
});
|
|
40
|
+
const { sources, lineCounts } = checkSources(rawSources, register);
|
|
41
|
+
const sourceMap = new Map(sources.map(s => [s.id, s]));
|
|
42
|
+
const citations = array(rawCitations, '$.citations').map((raw, i) => {
|
|
43
|
+
const p = `$.citations[${i}]`, c = record(raw, p, ['id', 'sourceId', 'label', 'locator']);
|
|
44
|
+
for (const key of ['id', 'sourceId', 'label'])
|
|
45
|
+
text(c[key], `${p}.${key}`);
|
|
46
|
+
register(c.id, `${p}.id`);
|
|
47
|
+
const source = sourceMap.get(c.sourceId) ?? fail(`${p}.sourceId`, 'unresolved_source', `Unknown source ${c.sourceId}`);
|
|
48
|
+
const loc = c.locator;
|
|
49
|
+
if (loc?.kind === 'lines') {
|
|
50
|
+
record(loc, `${p}.locator`, ['kind', 'start', 'end']);
|
|
51
|
+
if (!lineCounts.has(source.id))
|
|
52
|
+
fail(`${p}.locator`, 'citation_media', `Source ${source.id} is not text`);
|
|
53
|
+
if (!Number.isSafeInteger(loc.start) || !Number.isSafeInteger(loc.end) || loc.start < 1
|
|
54
|
+
|| loc.end < loc.start || loc.end > lineCounts.get(source.id))
|
|
55
|
+
fail(`${p}.locator`, 'citation_range', `Invalid inclusive line range for ${source.id}`);
|
|
56
|
+
}
|
|
57
|
+
else if (loc?.kind === 'image') {
|
|
58
|
+
record(loc, `${p}.locator`, ['kind', 'caption']);
|
|
59
|
+
text(loc.caption, `${p}.locator.caption`);
|
|
60
|
+
if (!source.mediaType.startsWith('image/'))
|
|
61
|
+
fail(`${p}.locator`, 'citation_media', `Source ${source.id} is not an image`);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
fail(`${p}.locator`, 'invalid_evidence', 'Unknown citation locator');
|
|
65
|
+
return c;
|
|
66
|
+
});
|
|
67
|
+
const citationIds = new Set(citations.map(c => c.id));
|
|
68
|
+
const references = (raw, p, ids, code) => {
|
|
69
|
+
const refs = strings(raw, p);
|
|
70
|
+
for (const id of refs)
|
|
71
|
+
if (!ids.has(id))
|
|
72
|
+
fail(p, code, `Unresolved reference ${id}`);
|
|
73
|
+
return refs;
|
|
74
|
+
};
|
|
75
|
+
for (const [path, refs] of citationLinks)
|
|
76
|
+
references(refs, `${path}.citationRefs`, citationIds, 'unresolved_citation');
|
|
77
|
+
const evidenceGroups = array(rawGroups, '$.evidenceGroups').map((raw, i) => {
|
|
78
|
+
const p = `$.evidenceGroups[${i}]`, g = record(raw, p, ['id', 'summary', 'citationRefs', 'sourceRefs']);
|
|
79
|
+
register(text(g.id, `${p}.id`), `${p}.id`);
|
|
80
|
+
text(g.summary, `${p}.summary`);
|
|
81
|
+
references(g.citationRefs, `${p}.citationRefs`, citationIds, 'unresolved_citation');
|
|
82
|
+
references(g.sourceRefs, `${p}.sourceRefs`, new Set(sourceMap.keys()), 'unresolved_source');
|
|
83
|
+
return g;
|
|
84
|
+
});
|
|
85
|
+
const annexes = array(rawAnnexes, '$.annexes').map((raw, i) => {
|
|
86
|
+
const p = `$.annexes[${i}]`, a = record(raw, p, ['id', 'title', 'summary', 'blocks', 'backRefs']);
|
|
87
|
+
register(text(a.id, `${p}.id`), `${p}.id`);
|
|
88
|
+
text(a.title, `${p}.title`);
|
|
89
|
+
text(a.summary, `${p}.summary`);
|
|
90
|
+
references(a.backRefs, `${p}.backRefs`, targets, 'unresolved_target');
|
|
91
|
+
array(a.blocks, `${p}.blocks`).forEach((rawBlock, j) => {
|
|
92
|
+
const bpath = `${p}.blocks[${j}]`, kind = rawBlock?.kind;
|
|
93
|
+
if (kind === 'text' || kind === 'code') {
|
|
94
|
+
const b = record(rawBlock, bpath, ['kind', 'text'], kind === 'code' ? ['language'] : []);
|
|
95
|
+
text(b.text, `${bpath}.text`, true);
|
|
96
|
+
if (b.language !== undefined)
|
|
97
|
+
text(b.language, `${bpath}.language`);
|
|
98
|
+
}
|
|
99
|
+
else if (kind === 'table') {
|
|
100
|
+
const b = record(rawBlock, bpath, ['kind', 'columns', 'rows']);
|
|
101
|
+
const columns = strings(b.columns, `${bpath}.columns`);
|
|
102
|
+
if (!columns.length)
|
|
103
|
+
fail(bpath, 'invalid_evidence', 'A table needs columns');
|
|
104
|
+
array(b.rows, `${bpath}.rows`).forEach((row, k) => {
|
|
105
|
+
const cells = array(row, `${bpath}.rows[${k}]`);
|
|
106
|
+
cells.forEach((cell, l) => text(cell, `${bpath}.rows[${k}][${l}]`, true));
|
|
107
|
+
if (cells.length !== columns.length)
|
|
108
|
+
fail(bpath, 'invalid_evidence', 'Table row width mismatch');
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else if (kind === 'references') {
|
|
112
|
+
const b = record(rawBlock, bpath, ['kind', 'citationRefs']);
|
|
113
|
+
references(b.citationRefs, `${bpath}.citationRefs`, citationIds, 'unresolved_citation');
|
|
114
|
+
}
|
|
115
|
+
else
|
|
116
|
+
fail(`${bpath}.kind`, 'invalid_evidence', 'Unsupported annex block (no decisions or active content)');
|
|
117
|
+
});
|
|
118
|
+
return a;
|
|
119
|
+
});
|
|
120
|
+
const attach = (node, path) => citationLinks.has(path) ? { ...node, citationRefs: citationLinks.get(path) } : node;
|
|
121
|
+
const sections = doc.sections.map((s, i) => attach(s.kind === 'optionSet' ? { ...s,
|
|
122
|
+
options: s.options.map((o, j) => attach(o, `$.sections[${i}].options[${j}]`)) } : s, `$.sections[${i}]`));
|
|
123
|
+
return { ok: true, value: { ...doc, schemaVersion: 2, sections, sources, citations, evidenceGroups, annexes } };
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof EvidenceError)
|
|
127
|
+
return { ok: false, issues: [error.issue] };
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../src/validation/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@sentropic/focus/validate` — the typed runtime validator for the
|
|
3
|
+
* `DecisionDossierDocument` (contract §4.2, R4).
|
|
4
|
+
*
|
|
5
|
+
* Two layers, matching the published JSON Schema asset
|
|
6
|
+
* (`schemas/decision-dossier-document.v1.schema.json`,
|
|
7
|
+
* `urn:sentropic:focus:DecisionDossierDocument:1.0.0`):
|
|
8
|
+
*
|
|
9
|
+
* 1. structure — closed shape check (unknown fields, wrong types, bad enums,
|
|
10
|
+
* an enabled snapshot interaction all refuse);
|
|
11
|
+
* 2. semantics — unique node IDs, interaction targets resolvable to the
|
|
12
|
+
* dossier ref, a section id/targetRef or a nested option id/targetRef,
|
|
13
|
+
* an opaque provenance source binding (any string, per the published
|
|
14
|
+
* schema), and comprehension evidence whose dossier hash still matches
|
|
15
|
+
* the snapshot hash.
|
|
16
|
+
*
|
|
17
|
+
* Pure and dependency-free: no I/O, no clock, no mutation of the input.
|
|
18
|
+
* Every recorded issue is a refusal — the schema is closed.
|
|
19
|
+
*/
|
|
20
|
+
export { READABILITY_LIMITS, READABILITY_BUDGETS, validateDecisionDossierReadability } from "./readability.js";
|
|
21
|
+
import type { DecisionDossierDocument } from "../model.js";
|
|
22
|
+
/** Stable schema ID of the published DecisionDossierDocument asset. */
|
|
23
|
+
export declare const DOSSIER_SCHEMA_ID = "urn:sentropic:focus:DecisionDossierDocument:1.0.0";
|
|
24
|
+
/** Version of the dossier schema, independent of the package version. */
|
|
25
|
+
export declare const DOSSIER_SCHEMA_VERSION = "1.0.0";
|
|
26
|
+
/** One machine-checkable validation failure. */
|
|
27
|
+
export interface ValidationIssue {
|
|
28
|
+
/** JSON-path-style location, e.g. `$.sections[2].options[0].annotation`. */
|
|
29
|
+
readonly path: string;
|
|
30
|
+
/** Stable machine code (`missing_field`, `duplicate_id`, …). */
|
|
31
|
+
readonly code: string;
|
|
32
|
+
/** Human-readable detail; never echoes secrets (dossiers carry none). */
|
|
33
|
+
readonly message: string;
|
|
34
|
+
}
|
|
35
|
+
export type ValidationResult<T> = {
|
|
36
|
+
readonly ok: true;
|
|
37
|
+
readonly value: T;
|
|
38
|
+
} | {
|
|
39
|
+
readonly ok: false;
|
|
40
|
+
readonly issues: readonly ValidationIssue[];
|
|
41
|
+
};
|
|
42
|
+
/** Thrown by {@link assertDecisionDossierDocument} on an invalid dossier. */
|
|
43
|
+
export declare class DecisionDossierValidationError extends Error {
|
|
44
|
+
readonly issues: readonly ValidationIssue[];
|
|
45
|
+
constructor(issues: readonly ValidationIssue[]);
|
|
46
|
+
}
|
|
47
|
+
/** Absence means historical v1; unknown explicit versions always refuse. */
|
|
48
|
+
export declare const validateDecisionDossierStructure: (value: unknown) => ValidationResult<DecisionDossierDocument>;
|
|
49
|
+
/** Semantic layer on a structurally valid dossier. Empty means valid. */
|
|
50
|
+
export declare const validateDecisionDossierSemantics: (doc: DecisionDossierDocument) => ValidationIssue[];
|
|
51
|
+
/** Full validation: structure first, then semantics. */
|
|
52
|
+
export declare const validateDecisionDossierDocument: (value: unknown) => ValidationResult<DecisionDossierDocument>;
|
|
53
|
+
/** Parse or throw {@link DecisionDossierValidationError}. */
|
|
54
|
+
export declare const assertDecisionDossierDocument: (value: unknown) => DecisionDossierDocument;
|
|
55
|
+
/** Presentation requires the backward-compatible structure AND the readability gate. */
|
|
56
|
+
export declare const validateDecisionDossierForPresentation: (value: unknown) => ValidationResult<DecisionDossierDocument>;
|
|
57
|
+
/** Refuse before any presentation or host rendering hook runs. */
|
|
58
|
+
export declare const assertDecisionDossierForPresentation: (value: unknown) => DecisionDossierDocument;
|
|
59
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kCAAkC,EAAE,MAAM,kBAAkB,CAAC;AAE/G,OAAO,KAAK,EAIV,uBAAuB,EAWxB,MAAM,aAAa,CAAC;AAErB,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,sDACuB,CAAC;AAEtD,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAC1B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,CAAC;AAExE,6EAA6E;AAC7E,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;gBAChC,MAAM,EAAE,SAAS,eAAe,EAAE;CAS/C;AA8dD,4EAA4E;AAC5E,eAAO,MAAM,gCAAgC,GAAI,OAAO,OAAO,KAAG,gBAAgB,CAAC,uBAAuB,CAMzG,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,gCAAgC,GAC3C,KAAK,uBAAuB,KAC3B,eAAe,EA8DjB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,+BAA+B,GAC1C,OAAO,OAAO,KACb,gBAAgB,CAAC,uBAAuB,CAM1C,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,6BAA6B,GACxC,OAAO,OAAO,KACb,uBAIF,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,sCAAsC,GAAI,OAAO,OAAO,KAAG,gBAAgB,CAAC,uBAAuB,CAK/G,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,oCAAoC,GAAI,OAAO,OAAO,KAAG,uBAIrE,CAAC"}
|