@action-state-group/capsule-viewer 0.0.0 → 0.1.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.
Files changed (45) hide show
  1. package/LICENSE +201 -0
  2. package/LICENSE-BSD-3-Clause +28 -0
  3. package/README.md +23 -1
  4. package/dist/browser.d.ts +4 -0
  5. package/dist/browser.js +11 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/compliance-presentation.d.ts +51 -0
  8. package/dist/compliance-presentation.js +140 -0
  9. package/dist/compliance-presentation.js.map +1 -0
  10. package/dist/compliance-styles.d.ts +8 -0
  11. package/dist/compliance-styles.js +66 -0
  12. package/dist/compliance-styles.js.map +1 -0
  13. package/dist/compliance-view.d.ts +6 -0
  14. package/dist/compliance-view.js +394 -0
  15. package/dist/compliance-view.js.map +1 -0
  16. package/dist/compliance.d.ts +92 -0
  17. package/dist/compliance.js +333 -0
  18. package/dist/compliance.js.map +1 -0
  19. package/dist/composed-view.d.ts +24 -0
  20. package/dist/composed-view.js +179 -0
  21. package/dist/composed-view.js.map +1 -0
  22. package/dist/emitter-shell.html +136 -0
  23. package/dist/emitter.d.ts +69 -0
  24. package/dist/emitter.js +266 -0
  25. package/dist/emitter.js.map +1 -0
  26. package/dist/evidence-graph-view.d.ts +96 -0
  27. package/dist/evidence-graph-view.js +1480 -0
  28. package/dist/evidence-graph-view.js.map +1 -0
  29. package/dist/evidence-graph.iife.js +11373 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.js +7 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/outcome-report-styles.d.ts +16 -0
  34. package/dist/outcome-report-styles.js +225 -0
  35. package/dist/outcome-report-styles.js.map +1 -0
  36. package/dist/outcome-report-view.d.ts +5 -0
  37. package/dist/outcome-report-view.js +885 -0
  38. package/dist/outcome-report-view.js.map +1 -0
  39. package/dist/presentation-builder.d.ts +247 -0
  40. package/dist/presentation-builder.js +552 -0
  41. package/dist/presentation-builder.js.map +1 -0
  42. package/dist/presentation-mount.d.ts +26 -0
  43. package/dist/presentation-mount.js +45 -0
  44. package/dist/presentation-mount.js.map +1 -0
  45. package/package.json +47 -4
@@ -0,0 +1,333 @@
1
+ // SPDX-License-Identifier: BSD-3-Clause
2
+ import { asString, isObject, } from "@action-state-group/agent-action-capsule";
3
+ import { findTranscript, NOT_STATED, readableId, } from "@action-state-group/agent-action-capsule";
4
+ import { REQUIREMENT_CLAIM, } from "@action-state-group/agent-action-capsule";
5
+ /**
6
+ * The EU AI Act obligations-report card, rendered from a verified Result v0
7
+ * root. Results are stated as counts of sessions per TEST; there is no
8
+ * per-conversation roll-up and no overall compliance percentage anywhere in
9
+ * this model.
10
+ *
11
+ * Where each thing on the page comes from:
12
+ *
13
+ * - From the sealed records (or "not stated"): which obligations and tests
14
+ * exist (the requirement claims' `requirement_ref`s, `<obligation>.<test>`,
15
+ * in the order the claims first name them), every verdict and count, the
16
+ * pack id and version (the claims' one `contract_ref`), each test's wording
17
+ * (the cited reports' `clause_claim`, when they all agree), each test's
18
+ * tier (the cited reports' `epistemic_type`, when they all agree), the
19
+ * contract and judge pin, the rationale, and the transcript (only when the
20
+ * bundle carries it verifiably; see `findTranscript`).
21
+ * - From the producer's `eu-ai-act-compliance/v1` extension, outside the
22
+ * signed records: the regulatory mapping -- article, obligation title,
23
+ * plain-language summary, applicability, method, the not-evaluable note and
24
+ * the finding templates (severity, recommendation, owner). The page labels
25
+ * it as the producer's mapping. An obligation the claims name but the
26
+ * extension does not map reads "not stated"; a test the extension names but
27
+ * no claim does is not drawn.
28
+ *
29
+ * A finding is drawn only for a test whose finding template exists AND whose
30
+ * sealed not-met count is above zero.
31
+ */
32
+ const CLAIM_ID_SEPARATOR = "::";
33
+ function drawnVerdict(claim) {
34
+ if (claim.failed)
35
+ return "failed";
36
+ if (claim.support === "unsupported")
37
+ return "unsupported";
38
+ return claim.verdict;
39
+ }
40
+ /**
41
+ * The claim's cited `evaluation-report/v1`, resolved against this bundle.
42
+ * A book record's own agent_input is the book's header, not the report: the
43
+ * report is the agent_input of the capsule the record carries
44
+ * (`carriedInput`, digest-checked by result-root.ts).
45
+ */
46
+ function reportPayload(records, claim) {
47
+ const digest = claim.evidence[0]?.digest;
48
+ if (digest === undefined)
49
+ return undefined;
50
+ const record = records.get(digest);
51
+ if (record === undefined)
52
+ return undefined;
53
+ const input = record.carriedInput ?? record.agentInput;
54
+ if (input.state !== "disclosed")
55
+ return undefined;
56
+ return isObject(input.payload) ? input.payload : undefined;
57
+ }
58
+ function dayOf(payload) {
59
+ const period = asString(payload?.period);
60
+ if (period === undefined)
61
+ return NOT_STATED;
62
+ const colon = period.indexOf(":");
63
+ return colon === -1 ? period : period.slice(colon + 1);
64
+ }
65
+ function sealedTier(payload) {
66
+ const type = asString(payload?.epistemic_type);
67
+ if (type === "semantic_judgment")
68
+ return "judged";
69
+ if (type === "recomputed_determination")
70
+ return "recomputed";
71
+ return "not stated";
72
+ }
73
+ function agree(values, none, mixed) {
74
+ const distinct = new Set(values.filter((v) => v !== none));
75
+ if (distinct.size === 0)
76
+ return none;
77
+ return distinct.size === 1 ? [...distinct][0] : mixed;
78
+ }
79
+ function parseClaim(claim) {
80
+ if (claim.type !== REQUIREMENT_CLAIM)
81
+ return undefined;
82
+ const sep = claim.id.indexOf(CLAIM_ID_SEPARATOR);
83
+ if (sep <= 0)
84
+ return undefined;
85
+ const dot = claim.requirementRef.indexOf(".");
86
+ if (dot <= 0 || dot === claim.requirementRef.length - 1)
87
+ return undefined;
88
+ return {
89
+ claim,
90
+ conversationId: claim.id.slice(0, sep),
91
+ obligationKey: claim.requirementRef.slice(0, dot),
92
+ };
93
+ }
94
+ /**
95
+ * The claims this card counts, and the pack they belong to. When the claims
96
+ * name one `contract_ref`, all of them. When they name more than one (a
97
+ * bundle carrying a different pack's claims too), only the claims whose test
98
+ * the producer's extension maps, and the pack reads not stated: a different
99
+ * pack's claim is never grouped into this card's sessions.
100
+ */
101
+ function countedClaims(result, presentation) {
102
+ const parsed = result.claims.flatMap((c) => {
103
+ const p = parseClaim(c);
104
+ return p === undefined ? [] : [p];
105
+ });
106
+ const refs = new Set(parsed.map((p) => p.claim.contractRef));
107
+ if (refs.size === 1) {
108
+ const ref = [...refs][0];
109
+ const at = ref.lastIndexOf("@");
110
+ return {
111
+ claims: parsed,
112
+ pack: {
113
+ id: at <= 0 ? NOT_STATED : ref.slice(0, at),
114
+ version: at <= 0 || at === ref.length - 1 ? NOT_STATED : ref.slice(at + 1),
115
+ },
116
+ };
117
+ }
118
+ const mapped = new Set(presentation.obligations.flatMap((o) => o.rows.map((r) => r.criterionId)));
119
+ return {
120
+ claims: parsed.filter((p) => mapped.has(p.claim.requirementRef)),
121
+ pack: { id: NOT_STATED, version: NOT_STATED },
122
+ };
123
+ }
124
+ function buildSessions(result, claims, testIds) {
125
+ const byConversation = new Map();
126
+ for (const p of claims) {
127
+ const list = byConversation.get(p.conversationId) ?? [];
128
+ list.push(p.claim);
129
+ byConversation.set(p.conversationId, list);
130
+ }
131
+ const sessions = [];
132
+ for (const [conversationId, conversationClaims] of byConversation) {
133
+ const tests = [];
134
+ const sources = new Set();
135
+ let day = NOT_STATED;
136
+ for (const criterionId of testIds) {
137
+ const claim = conversationClaims.find((c) => c.requirementRef === criterionId);
138
+ if (claim === undefined) {
139
+ // The Result v0 schema has no not_applicable verdict: a test the
140
+ // roll-up left out for this conversation reads not_applicable,
141
+ // never a silent gap.
142
+ tests.push({
143
+ criterionId,
144
+ verdict: "not_applicable",
145
+ tier: "not stated",
146
+ });
147
+ continue;
148
+ }
149
+ const payload = reportPayload(result.records, claim);
150
+ const rationale = asString(payload?.rationale);
151
+ // The Result's own schema-checked contract_ref first, then what the
152
+ // report states.
153
+ const contract = claim.contractRef ||
154
+ asString(payload?.contract_ref) ||
155
+ asString(payload?.contract);
156
+ const judgePinDigest = asString(payload?.judge_pin_digest);
157
+ const source = asString(payload?.source_capsule_id);
158
+ if (source !== undefined)
159
+ sources.add(source);
160
+ if (day === NOT_STATED)
161
+ day = dayOf(payload);
162
+ const reportDigest = claim.evidence[0]?.digest;
163
+ tests.push({
164
+ criterionId,
165
+ verdict: drawnVerdict(claim),
166
+ tier: sealedTier(payload),
167
+ claim,
168
+ ...(reportDigest === undefined ? {} : { reportDigest }),
169
+ ...(rationale === undefined ? {} : { rationale }),
170
+ ...(contract === undefined ? {} : { contract }),
171
+ ...(judgePinDigest === undefined ? {} : { judgePinDigest }),
172
+ });
173
+ }
174
+ const sourceCapsuleId = sources.size === 1 ? [...sources][0] : undefined;
175
+ sessions.push({
176
+ conversationId,
177
+ day,
178
+ tests,
179
+ ...(sourceCapsuleId === undefined ? {} : { sourceCapsuleId }),
180
+ transcript: findTranscript(result, conversationId, conversationClaims, sourceCapsuleId),
181
+ });
182
+ }
183
+ sessions.sort((a, b) => a.day === b.day
184
+ ? a.conversationId.localeCompare(b.conversationId)
185
+ : a.day.localeCompare(b.day));
186
+ return sessions;
187
+ }
188
+ function sealedWording(result, claims, criterionId) {
189
+ const texts = new Set();
190
+ for (const p of claims) {
191
+ if (p.claim.requirementRef !== criterionId)
192
+ continue;
193
+ const text = asString(reportPayload(result.records, p.claim)?.clause_claim);
194
+ if (text !== undefined)
195
+ texts.add(text);
196
+ }
197
+ if (texts.size === 1)
198
+ return { text: [...texts][0], source: "sealed" };
199
+ return { text: NOT_STATED, source: texts.size === 0 ? "unstated" : "mixed" };
200
+ }
201
+ function buildRow(criterionId, mapping, wording, sessions) {
202
+ const byVerdict = new Map([
203
+ ["met", []],
204
+ ["not_met", []],
205
+ ["not_evaluable", []],
206
+ ["not_applicable", []],
207
+ ]);
208
+ const tiers = [];
209
+ for (const session of sessions) {
210
+ const test = session.tests.find((t) => t.criterionId === criterionId);
211
+ if (test === undefined)
212
+ continue;
213
+ tiers.push(test.tier);
214
+ // failed/unsupported (a claim that failed verification, or cites
215
+ // evidence this bundle can't resolve) is never read as met: it folds
216
+ // into not_met.
217
+ const bucket = test.verdict === "failed" || test.verdict === "unsupported"
218
+ ? "not_met"
219
+ : test.verdict;
220
+ byVerdict.get(bucket).push(session.conversationId);
221
+ }
222
+ return {
223
+ criterionId,
224
+ name: mapping?.name ??
225
+ readableId(criterionId.slice(criterionId.indexOf(".") + 1)),
226
+ wording,
227
+ tier: agree(tiers, "not stated", "mixed"),
228
+ ...(mapping?.notEvaluableNote === undefined
229
+ ? {}
230
+ : { notEvaluableNote: mapping.notEvaluableNote }),
231
+ ...(mapping?.finding === undefined ? {} : { finding: mapping.finding }),
232
+ metCount: byVerdict.get("met").length,
233
+ notMetCount: byVerdict.get("not_met").length,
234
+ notEvaluableCount: byVerdict.get("not_evaluable").length,
235
+ notApplicableCount: byVerdict.get("not_applicable").length,
236
+ sessionsByVerdict: byVerdict,
237
+ };
238
+ }
239
+ function buildObligation(key, mapping, rows) {
240
+ if (mapping === undefined)
241
+ return {
242
+ key,
243
+ mapped: false,
244
+ article: NOT_STATED,
245
+ title: readableId(key),
246
+ plain: NOT_STATED,
247
+ judgedTerms: [],
248
+ applicability: { status: "not stated", note: NOT_STATED },
249
+ method: NOT_STATED,
250
+ rows,
251
+ };
252
+ return {
253
+ key,
254
+ mapped: true,
255
+ article: mapping.article,
256
+ title: mapping.title,
257
+ plain: mapping.plain,
258
+ judgedTerms: mapping.judgedTerms,
259
+ applicability: mapping.applicability,
260
+ method: mapping.method,
261
+ rows,
262
+ };
263
+ }
264
+ function buildRunInfo(sessions) {
265
+ const contracts = new Set();
266
+ const pins = new Set();
267
+ for (const session of sessions)
268
+ for (const test of session.tests) {
269
+ if (test.contract !== undefined)
270
+ contracts.add(test.contract);
271
+ if (test.judgePinDigest !== undefined)
272
+ pins.add(test.judgePinDigest);
273
+ }
274
+ return {
275
+ ...(contracts.size === 1 ? { contract: [...contracts][0] } : {}),
276
+ ...(pins.size === 1 ? { judgePinDigest: [...pins][0] } : {}),
277
+ pinned: contracts.size <= 1 && pins.size <= 1,
278
+ };
279
+ }
280
+ function buildFindings(obligations) {
281
+ const findings = [];
282
+ for (const obligation of obligations)
283
+ for (const row of obligation.rows) {
284
+ // Derived from the sealed verdicts: a test with no finding template
285
+ // can never produce one, and a test WITH one produces nothing when
286
+ // its not-met count is zero.
287
+ if (row.finding === undefined || row.notMetCount === 0)
288
+ continue;
289
+ findings.push({
290
+ id: row.finding.id,
291
+ criterionId: row.criterionId,
292
+ obligationKey: obligation.key,
293
+ article: obligation.article,
294
+ testName: row.name,
295
+ severity: row.finding.severity,
296
+ recommendation: row.finding.recommendation,
297
+ ownerDue: row.finding.ownerDue,
298
+ sessionIds: row.sessionsByVerdict.get("not_met") ?? [],
299
+ });
300
+ }
301
+ return findings;
302
+ }
303
+ export function buildComplianceModel(result, presentation) {
304
+ const { claims, pack } = countedClaims(result, presentation);
305
+ // Obligations and tests in the order the claims first name them.
306
+ const tests = new Map();
307
+ for (const p of claims) {
308
+ const list = tests.get(p.obligationKey) ?? [];
309
+ if (!list.includes(p.claim.requirementRef))
310
+ list.push(p.claim.requirementRef);
311
+ tests.set(p.obligationKey, list);
312
+ }
313
+ const testIds = [...tests.values()].flat();
314
+ const sessions = buildSessions(result, claims, testIds);
315
+ const mappings = new Map(presentation.obligations.map((o) => [o.key, o]));
316
+ const obligations = [...tests.entries()].map(([key, ids]) => {
317
+ const mapping = mappings.get(key);
318
+ const rowMappings = new Map((mapping?.rows ?? []).map((r) => [r.criterionId, r]));
319
+ return buildObligation(key, mapping, ids.map((id) => buildRow(id, rowMappings.get(id), sealedWording(result, claims, id), sessions)));
320
+ });
321
+ return {
322
+ regulation: presentation.regulation,
323
+ pack,
324
+ obligations,
325
+ sessions,
326
+ findings: buildFindings(obligations),
327
+ totalSessions: sessions.length,
328
+ runInfo: buildRunInfo(sessions),
329
+ qualityProtocol: presentation.qualityProtocol,
330
+ capsuleId: result.capsuleId,
331
+ };
332
+ }
333
+ //# sourceMappingURL=compliance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance.js","sourceRoot":"","sources":["../src/compliance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type ComposedResult } from "@action-state-group/agent-action-capsule";
2
+ import type { PresentationModule } from "@action-state-group/agent-action-capsule";
3
+ /**
4
+ * The composition section: a generic view of the `composed/v1` block's
5
+ * verification, as the verify core computed it (`composed.ts`). It reports
6
+ * what draft-mih-zhang-agent-disclosure-bundle-01 "Verifying composed/v1"
7
+ * says a verifier reports, separately: the composed digest, each member,
8
+ * composition closure, each join's declared and derived state, and per
9
+ * derived agreement whether it is redundant or corroborating on declared
10
+ * custody. It shows no product wording and names no party's business role;
11
+ * an observer's `role` is shown as the block declares it, uninterpreted.
12
+ *
13
+ * It never verifies: every value it shows is read from the context's one
14
+ * verification result.
15
+ */
16
+ type Verified = Extract<ComposedResult, {
17
+ malformed: false;
18
+ }>;
19
+ export interface ComposedSectionModel {
20
+ readonly result: Verified;
21
+ }
22
+ /** The built-in composition section module (`aac.builtin.composed/v0`). */
23
+ export declare const composedSectionModule: PresentationModule<ComposedSectionModel>;
24
+ export {};
@@ -0,0 +1,179 @@
1
+ import { BUILTIN_MANIFEST_COMPOSED } from "@action-state-group/agent-action-capsule";
2
+ import { COMPOSED_KIND, } from "@action-state-group/agent-action-capsule";
3
+ /** The well-formed composed/v1 result the core verified, if there is one. */
4
+ function composedResult(context) {
5
+ const entry = context.verification.extensions.find((extension) => extension.kind === COMPOSED_KIND);
6
+ const composed = entry?.composed;
7
+ return composed !== undefined && !composed.malformed ? composed : undefined;
8
+ }
9
+ function element(tag, text) {
10
+ const node = document.createElement(tag);
11
+ if (text !== undefined)
12
+ node.textContent = text;
13
+ return node;
14
+ }
15
+ function row(cells, header = false) {
16
+ const tr = element("tr");
17
+ for (const cell of cells)
18
+ tr.append(element(header ? "th" : "td", cell));
19
+ return tr;
20
+ }
21
+ function table(name, columns, rows) {
22
+ const node = element("table");
23
+ node.setAttribute(`data-${name}`, "");
24
+ const head = element("thead");
25
+ head.append(row(columns, true));
26
+ const body = element("tbody");
27
+ body.append(...rows);
28
+ node.append(head, body);
29
+ return node;
30
+ }
31
+ const NOT_APPLICABLE = "—";
32
+ const findingsText = (findings) => findings.length === 0 ? "none" : findings.join(", ");
33
+ const claimText = (claim) => claim === undefined
34
+ ? NOT_APPLICABLE
35
+ : claim.findings.length === 0
36
+ ? claim.status
37
+ : `${claim.status} (${claim.findings.join(", ")})`;
38
+ const pairText = (members) => `${members[0]} – ${members[1]}`;
39
+ // The values two members hold at one compare pointer, as text. No winner is
40
+ // named (draft "Joins": "names no winner").
41
+ function renderDifference(difference, host) {
42
+ const list = element("dl");
43
+ list.dataset.pointer = difference.pointer;
44
+ list.append(element("dt", difference.pointer));
45
+ for (const value of difference.values)
46
+ list.append(element("dd", value.resolved
47
+ ? `${value.member}: ${JSON.stringify(value.value)}`
48
+ : `${value.member}: does not resolve`));
49
+ host.append(list);
50
+ }
51
+ // go/bundle/composed.go:102-114 and draft "Observers and Redundancy": a
52
+ // redundant pair is presented as "redundant, not corroborating" with its
53
+ // reason; a corroborating one is qualified as resting on declared custody.
54
+ function corroborationText(c) {
55
+ switch (c.result) {
56
+ case "redundant":
57
+ return `${c.report} (${c.reasons.join(", ")})`;
58
+ case "corroborating":
59
+ return "corroborating, on declared custody";
60
+ case "not_applicable":
61
+ return "not applicable: the join did not derive agree";
62
+ }
63
+ }
64
+ function renderComposed(model, host, services) {
65
+ const result = model.result;
66
+ const section = element("section");
67
+ section.dataset.section = "composition";
68
+ section.dataset.module = BUILTIN_MANIFEST_COMPOSED.id;
69
+ section.append(element("h2", "Composition"));
70
+ const status = element("p", `composed/v1 check: ${result.status}`);
71
+ status.dataset.compositionStatus = result.status;
72
+ section.append(status);
73
+ if (result.findings.length > 0)
74
+ section.append(element("p", `findings: ${result.findings.join(", ")}`));
75
+ // capsule-cli internal/cli/composed.go:69, the same statement of scope.
76
+ section.append(element("p", "Composition closure covers the declared members only; it is not completeness of participation."));
77
+ section.append(element("h3", "Composed digest"));
78
+ const digest = element("dl");
79
+ digest.dataset.composedDigest = result.composedDigest.declared;
80
+ digest.dataset.matches = String(result.composedDigest.matches);
81
+ digest.append(element("dt", "declared"), element("dd", result.composedDigest.declared), element("dt", "recomputed"), element("dd", result.composedDigest.recomputed || "uncomputable"), element("dt", "matches"), element("dd", result.composedDigest.matches ? "yes" : "no"));
82
+ section.append(digest);
83
+ section.append(element("h3", "Members"));
84
+ section.append(table("composition-members", [
85
+ "member",
86
+ "observer",
87
+ "outcome",
88
+ "body",
89
+ "digest",
90
+ "graph closure",
91
+ "interval coverage",
92
+ "per-record membership",
93
+ "refusal signature",
94
+ "findings",
95
+ ], result.members.map((m) => {
96
+ const tr = row([
97
+ m.id,
98
+ m.observer,
99
+ m.outcome,
100
+ m.body,
101
+ m.digest,
102
+ claimText(m.bundle?.graphClosure),
103
+ claimText(m.bundle?.intervalCoverage),
104
+ claimText(m.bundle?.perRecordMembership),
105
+ m.refusalSignature ?? NOT_APPLICABLE,
106
+ findingsText(m.findings),
107
+ ]);
108
+ tr.dataset.memberId = m.id;
109
+ tr.dataset.body = m.body;
110
+ tr.dataset.digest = m.digest;
111
+ return tr;
112
+ })));
113
+ section.append(element("h3", "Observers"));
114
+ section.append(table("composition-observers", ["observer", "role", "custody domain"], result.observers.map((o) => {
115
+ const tr = row([o.id, o.role, o.custodyDomain]);
116
+ tr.dataset.observerId = o.id;
117
+ return tr;
118
+ })));
119
+ // Draft "Observers and Redundancy": custody labels can only downgrade.
120
+ section.append(element("p", "Custody domains are labels declared by whoever composed this block. Identical labels make an agreeing pair redundant; distinct labels do not establish that two observers are independent."));
121
+ section.append(element("h3", "Composition closure"));
122
+ const closure = element("p", `${result.compositionClosure.status}; missing: ${result.compositionClosure.missing.length === 0
123
+ ? "none"
124
+ : result.compositionClosure.missing.join(", ")}; findings: ${findingsText(result.compositionClosure.findings)}`);
125
+ closure.dataset.closureStatus = result.compositionClosure.status;
126
+ section.append(closure);
127
+ section.append(element("h3", "Joins"));
128
+ if (result.joins.length === 0)
129
+ section.append(element("p", "No joins."));
130
+ else {
131
+ section.append(table("composition-joins", ["members", "basis", "declared", "derived", "result"], result.joins.map((j) => {
132
+ const tr = row([
133
+ pairText(j.members),
134
+ j.basis,
135
+ j.declared,
136
+ j.derived ?? "not derivable",
137
+ j.result,
138
+ ]);
139
+ tr.dataset.joinMembers = j.members.join(",");
140
+ tr.dataset.joinDeclared = j.declared;
141
+ tr.dataset.joinDerived = j.derived ?? "not_derivable";
142
+ tr.dataset.joinResult = j.result;
143
+ return tr;
144
+ })));
145
+ for (const j of result.joins) {
146
+ if (j.differences.length === 0)
147
+ continue;
148
+ const details = services.details(`Differing values: ${pairText(j.members)}`);
149
+ details.dataset.joinDifferences = j.members.join(",");
150
+ for (const difference of j.differences)
151
+ renderDifference(difference, details);
152
+ section.append(details);
153
+ }
154
+ // Per pair, never combined into a count or a score.
155
+ section.append(element("h3", "Agreement"));
156
+ section.append(table("composition-agreement", ["members", "result"], result.corroboration.map((c) => {
157
+ const tr = row([pairText(c.members), corroborationText(c)]);
158
+ tr.dataset.agreementMembers = c.members.join(",");
159
+ tr.dataset.corroboration = c.result;
160
+ if (c.result === "redundant")
161
+ tr.dataset.reasons = c.reasons.join(",");
162
+ return tr;
163
+ })));
164
+ }
165
+ host.L1.append(section);
166
+ }
167
+ /** The built-in composition section module (`aac.builtin.composed/v0`). */
168
+ export const composedSectionModule = {
169
+ manifest: BUILTIN_MANIFEST_COMPOSED,
170
+ canRender: (context) => composedResult(context) !== undefined,
171
+ buildModel: (context) => {
172
+ const result = composedResult(context);
173
+ if (result === undefined)
174
+ throw new Error(`${BUILTIN_MANIFEST_COMPOSED.id}: buildModel called although canRender was false`);
175
+ return { result };
176
+ },
177
+ render: renderComposed,
178
+ };
179
+ //# sourceMappingURL=composed-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composed-view.js","sourceRoot":"","sources":["../src/composed-view.ts"],"names":[],"mappings":"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"}