@ifc-lite/sdk 9.4.0 → 9.6.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 (164) hide show
  1. package/README.md +57 -16
  2. package/dist/cost-reference-scan.d.ts.map +1 -1
  3. package/dist/cost-reference-scan.js +10 -9
  4. package/dist/cost-reference-scan.js.map +1 -1
  5. package/dist/headless/align-backend.d.ts +5 -0
  6. package/dist/headless/align-backend.d.ts.map +1 -0
  7. package/dist/headless/align-backend.js +15 -0
  8. package/dist/headless/align-backend.js.map +1 -0
  9. package/dist/headless/authored-attribute-value.d.ts +3 -0
  10. package/dist/headless/authored-attribute-value.d.ts.map +1 -0
  11. package/dist/headless/authored-attribute-value.js +34 -0
  12. package/dist/headless/authored-attribute-value.js.map +1 -0
  13. package/dist/headless/backend-query-relationships.d.ts +5 -0
  14. package/dist/headless/backend-query-relationships.d.ts.map +1 -0
  15. package/dist/headless/backend-query-relationships.js +55 -0
  16. package/dist/headless/backend-query-relationships.js.map +1 -0
  17. package/dist/headless/backend-query.d.ts +20 -0
  18. package/dist/headless/backend-query.d.ts.map +1 -0
  19. package/dist/headless/backend-query.js +359 -0
  20. package/dist/headless/backend-query.js.map +1 -0
  21. package/dist/headless/backend.d.ts +80 -0
  22. package/dist/headless/backend.d.ts.map +1 -0
  23. package/dist/headless/backend.js +317 -0
  24. package/dist/headless/backend.js.map +1 -0
  25. package/dist/headless/capabilities.d.ts +22 -0
  26. package/dist/headless/capabilities.d.ts.map +1 -0
  27. package/dist/headless/capabilities.js +52 -0
  28. package/dist/headless/capabilities.js.map +1 -0
  29. package/dist/headless/effective-entity-membership.d.ts +8 -0
  30. package/dist/headless/effective-entity-membership.d.ts.map +1 -0
  31. package/dist/headless/effective-entity-membership.js +23 -0
  32. package/dist/headless/effective-entity-membership.js.map +1 -0
  33. package/dist/headless/headless-backend-cost-store.d.ts +14 -0
  34. package/dist/headless/headless-backend-cost-store.d.ts.map +1 -0
  35. package/dist/headless/headless-backend-cost-store.js +18 -0
  36. package/dist/headless/headless-backend-cost-store.js.map +1 -0
  37. package/dist/headless/headless-backend-modelling.d.ts +50 -0
  38. package/dist/headless/headless-backend-modelling.d.ts.map +1 -0
  39. package/dist/headless/headless-backend-modelling.js +128 -0
  40. package/dist/headless/headless-backend-modelling.js.map +1 -0
  41. package/dist/headless/headless-backend-room.d.ts +9 -0
  42. package/dist/headless/headless-backend-room.d.ts.map +1 -0
  43. package/dist/headless/headless-backend-room.js +22 -0
  44. package/dist/headless/headless-backend-room.js.map +1 -0
  45. package/dist/headless/headless-backend-store-stubs.d.ts +13 -0
  46. package/dist/headless/headless-backend-store-stubs.d.ts.map +1 -0
  47. package/dist/headless/headless-backend-store-stubs.js +9 -0
  48. package/dist/headless/headless-backend-store-stubs.js.map +1 -0
  49. package/dist/headless/headless-backend-store.d.ts +8 -0
  50. package/dist/headless/headless-backend-store.d.ts.map +1 -0
  51. package/dist/headless/headless-backend-store.js +42 -0
  52. package/dist/headless/headless-backend-store.js.map +1 -0
  53. package/dist/headless/headless-backend-structural-store.d.ts +21 -0
  54. package/dist/headless/headless-backend-structural-store.d.ts.map +1 -0
  55. package/dist/headless/headless-backend-structural-store.js +18 -0
  56. package/dist/headless/headless-backend-structural-store.js.map +1 -0
  57. package/dist/headless/headless-backend-structural.d.ts +4 -0
  58. package/dist/headless/headless-backend-structural.d.ts.map +1 -0
  59. package/dist/headless/headless-backend-structural.js +24 -0
  60. package/dist/headless/headless-backend-structural.js.map +1 -0
  61. package/dist/headless/mutation-base.d.ts +5 -0
  62. package/dist/headless/mutation-base.d.ts.map +1 -0
  63. package/dist/headless/mutation-base.js +31 -0
  64. package/dist/headless/mutation-base.js.map +1 -0
  65. package/dist/headless/options.d.ts +11 -0
  66. package/dist/headless/options.d.ts.map +1 -0
  67. package/dist/headless/options.js +13 -0
  68. package/dist/headless/options.js.map +1 -0
  69. package/dist/headless/overlay.d.ts +170 -0
  70. package/dist/headless/overlay.d.ts.map +1 -0
  71. package/dist/headless/overlay.js +285 -0
  72. package/dist/headless/overlay.js.map +1 -0
  73. package/dist/headless/schema-tables.d.ts +42 -0
  74. package/dist/headless/schema-tables.d.ts.map +1 -0
  75. package/dist/headless/schema-tables.js +77 -0
  76. package/dist/headless/schema-tables.js.map +1 -0
  77. package/dist/headless/session.d.ts +23 -0
  78. package/dist/headless/session.d.ts.map +1 -0
  79. package/dist/headless/session.js +125 -0
  80. package/dist/headless/session.js.map +1 -0
  81. package/dist/headless.d.ts +13 -0
  82. package/dist/headless.d.ts.map +1 -0
  83. package/dist/headless.js +13 -0
  84. package/dist/headless.js.map +1 -0
  85. package/dist/index.d.ts +2 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/namespaces/bcf-viewpoint.d.ts +19 -0
  88. package/dist/namespaces/bcf-viewpoint.d.ts.map +1 -1
  89. package/dist/namespaces/bcf-viewpoint.js.map +1 -1
  90. package/dist/namespaces/bcf.d.ts.map +1 -1
  91. package/dist/namespaces/bcf.js +17 -0
  92. package/dist/namespaces/bcf.js.map +1 -1
  93. package/dist/namespaces/viewer.d.ts +20 -1
  94. package/dist/namespaces/viewer.d.ts.map +1 -1
  95. package/dist/namespaces/viewer.js +40 -0
  96. package/dist/namespaces/viewer.js.map +1 -1
  97. package/dist/review/capture-budget.d.ts.map +1 -1
  98. package/dist/review/capture-budget.js +9 -0
  99. package/dist/review/capture-budget.js.map +1 -1
  100. package/dist/review/capture-ownership.d.ts +12 -0
  101. package/dist/review/capture-ownership.d.ts.map +1 -0
  102. package/dist/review/capture-ownership.js +8 -0
  103. package/dist/review/capture-ownership.js.map +1 -0
  104. package/dist/review/capture-types.d.ts +14 -0
  105. package/dist/review/capture-types.d.ts.map +1 -1
  106. package/dist/review/cards.js +1 -1
  107. package/dist/review/cards.js.map +1 -1
  108. package/dist/review/identity.d.ts +1 -1
  109. package/dist/review/identity.d.ts.map +1 -1
  110. package/dist/review/identity.js +7 -2
  111. package/dist/review/identity.js.map +1 -1
  112. package/dist/review/native-captures.d.ts +4 -0
  113. package/dist/review/native-captures.d.ts.map +1 -1
  114. package/dist/review/native-captures.js +9 -6
  115. package/dist/review/native-captures.js.map +1 -1
  116. package/dist/review/native-identity-table.d.ts +8 -0
  117. package/dist/review/native-identity-table.d.ts.map +1 -0
  118. package/dist/review/native-identity-table.js +29 -0
  119. package/dist/review/native-identity-table.js.map +1 -0
  120. package/dist/review/portable-bindings.d.ts +7 -0
  121. package/dist/review/portable-bindings.d.ts.map +1 -0
  122. package/dist/review/portable-bindings.js +88 -0
  123. package/dist/review/portable-bindings.js.map +1 -0
  124. package/dist/review/portable-native-owners.d.ts +23 -0
  125. package/dist/review/portable-native-owners.d.ts.map +1 -0
  126. package/dist/review/portable-native-owners.js +127 -0
  127. package/dist/review/portable-native-owners.js.map +1 -0
  128. package/dist/review/portable-projection.d.ts +11 -0
  129. package/dist/review/portable-projection.d.ts.map +1 -0
  130. package/dist/review/portable-projection.js +104 -0
  131. package/dist/review/portable-projection.js.map +1 -0
  132. package/dist/review/portable-report-metadata.d.ts +1 -0
  133. package/dist/review/portable-report-metadata.d.ts.map +1 -1
  134. package/dist/review/portable-report-metadata.js +5 -2
  135. package/dist/review/portable-report-metadata.js.map +1 -1
  136. package/dist/review/portable-snapshot.d.ts +89 -0
  137. package/dist/review/portable-snapshot.d.ts.map +1 -0
  138. package/dist/review/portable-snapshot.js +164 -0
  139. package/dist/review/portable-snapshot.js.map +1 -0
  140. package/dist/review/portable-source-contract.d.ts +3 -0
  141. package/dist/review/portable-source-contract.d.ts.map +1 -0
  142. package/dist/review/portable-source-contract.js +8 -0
  143. package/dist/review/portable-source-contract.js.map +1 -0
  144. package/dist/review/portable-validation-evidence.d.ts +2 -1
  145. package/dist/review/portable-validation-evidence.d.ts.map +1 -1
  146. package/dist/review/portable-validation-evidence.js +3 -1
  147. package/dist/review/portable-validation-evidence.js.map +1 -1
  148. package/dist/review/saved-validation.d.ts +2 -0
  149. package/dist/review/saved-validation.d.ts.map +1 -1
  150. package/dist/review/saved-validation.js +1 -1
  151. package/dist/review/saved-validation.js.map +1 -1
  152. package/dist/review/types.d.ts +2 -0
  153. package/dist/review/types.d.ts.map +1 -1
  154. package/dist/review.d.ts +2 -0
  155. package/dist/review.d.ts.map +1 -1
  156. package/dist/review.js +2 -0
  157. package/dist/review.js.map +1 -1
  158. package/dist/section-plane.d.ts +12 -0
  159. package/dist/section-plane.d.ts.map +1 -0
  160. package/dist/section-plane.js +5 -0
  161. package/dist/section-plane.js.map +1 -0
  162. package/dist/types.d.ts +6 -6
  163. package/dist/types.d.ts.map +1 -1
  164. package/package.json +19 -14
@@ -0,0 +1,104 @@
1
+ import { clashFindings } from './clash.js';
2
+ import { validationFindings } from './validation.js';
3
+ import { savedValidationFacts } from './saved-validation.js';
4
+ /** These models are aliases within the imported wire, not live model ids.
5
+ * Only a verified full source hash binds them to actual columnar identities.
6
+ */
7
+ function analysisModels(saved, owners) {
8
+ return saved.models.map(model => {
9
+ const owner = owners.find(item => item.sourceSHA256 === model.sourceContentHash);
10
+ return { id: model.key, name: owner?.model.name ?? model.name,
11
+ ...(owner ? { sourceIdentity: owner.sourceSHA256 } : {}),
12
+ expressIdOf: GlobalId => owner?.identities.get(GlobalId) ?? 0,
13
+ globalIdOf: expressId => owner?.GlobalIds.get(expressId) ?? '',
14
+ ...(owner?.model.storeyOf ? { storeyOf: (expressId) => owner.model.storeyOf?.(expressId) ?? null } : {}) };
15
+ });
16
+ }
17
+ /** Preserve native evidence and statuses; import never attests a new run or
18
+ * turns saved freshness/currentness into independent evaluation.
19
+ */
20
+ function historical(result, id, capturedAt) {
21
+ const runs = result.runs.map(run => ({ ...run, id, capturedAt, temporal: 'historical', complete: false,
22
+ incomplete: [...run.incomplete, ...(run.incomplete.some(gap => gap.code === 'partial-source'
23
+ && gap.detail === 'Imported history is not independent native execution.') ? [] : [{ code: 'partial-source',
24
+ detail: 'Imported history is not independent native execution.' }])] }));
25
+ const findings = result.findings.map(finding => {
26
+ const index = result.runs.indexOf(finding.run), run = runs[index];
27
+ if (!run)
28
+ throw new Error('Imported Review run ownership is unavailable');
29
+ return { ...finding, id: JSON.stringify([id, finding.id]), run, lifecycle: 'not-evaluated' };
30
+ });
31
+ return { runs, findings };
32
+ }
33
+ function missingIdentity(finding, models) {
34
+ return { ...finding, elements: finding.elements.map(element => {
35
+ const model = models.find(item => item.id === element.modelId);
36
+ const expressId = model?.expressIdOf(element.globalId) ?? 0;
37
+ const recorded = finding.evidence.kind === 'validation' ? finding.evidence.expressId : null;
38
+ return model?.sourceIdentity && expressId > 0 && (recorded === null || recorded === expressId) ? { ...element }
39
+ : { ...element, modelId: null, nativeUnresolved: 'unmatched' };
40
+ }) };
41
+ }
42
+ /** Shared canonical adapters, with no mutation of the supplied decoded wire. */
43
+ export function projectPortableAnalysis(saved, owners) {
44
+ const models = analysisModels(saved, owners);
45
+ let result;
46
+ if (saved.kind === 'validation') {
47
+ result = validationFindings({ report: { ...saved.report, timestamp: new Date(saved.report.timestamp) }, stale: false }, models);
48
+ }
49
+ else {
50
+ // The canonical baseline adapter consumes no renderer geometry. `ref`
51
+ // retains the recorded local EXPRESS id; it is never an invented offset.
52
+ const native = { ...saved.result, clashes: saved.result.clashes.map(clash => ({ ...clash,
53
+ a: { ...clash.a, ref: clash.a.expressId }, b: { ...clash.b, ref: clash.b.expressId },
54
+ distance: typeof clash.distance === 'number' ? clash.distance : Number(clash.distance) })) };
55
+ result = clashFindings({ current: null, baseline: { result: native,
56
+ modelNames: Object.fromEntries(saved.models.map(model => [model.key, model.name])), takenAt: Date.parse(saved.capturedAt) } }, models);
57
+ // The baseline adapter intentionally emits no live model id. Rebind each
58
+ // occurrence only via its original saved model key and full source proof.
59
+ result.findings = result.findings.map((finding, index) => ({ ...finding,
60
+ elements: finding.elements.map((element, side) => {
61
+ const ref = side === 0 ? saved.result.clashes[index].a : saved.result.clashes[index].b;
62
+ const model = models.find(item => item.id === ref.model);
63
+ const actualGuid = model?.globalIdOf(ref.expressId) ?? '';
64
+ const recordedGuid = ref.key.startsWith('expressid:') ? '' : element.globalId;
65
+ return { ...element, globalId: recordedGuid || actualGuid, modelId: ref.model,
66
+ ...(!actualGuid || (recordedGuid && recordedGuid !== actualGuid)
67
+ ? { modelId: null, nativeUnresolved: 'unmatched' } : {}) };
68
+ }) }));
69
+ }
70
+ result.findings = result.findings.map(finding => {
71
+ const checked = missingIdentity(finding, models);
72
+ return { ...checked, elements: checked.elements.map(element => {
73
+ const savedModel = saved.models.find(model => model.key === element.modelId);
74
+ const owner = owners.find(item => item.sourceSHA256 === savedModel?.sourceContentHash);
75
+ return { ...element, modelId: owner?.model.id ?? null };
76
+ }) };
77
+ });
78
+ return historical(result, JSON.stringify(['imported-analysis', saved.id]), saved.capturedAt);
79
+ }
80
+ /** Saved failure evidence keeps its recorded detail, gaps and identity. A
81
+ * name/fingerprint match alone cannot bind an imported row to a live source.
82
+ */
83
+ export function projectPortableValidation(saved, owners) {
84
+ const result = savedValidationFacts(saved, { identityAvailable: row => !!row.GlobalId
85
+ && !!owners.find(owner => owner.sourceSHA256 === row.modelContentHash)?.identities.has(row.GlobalId) });
86
+ if (saved.snapshot.kind !== 'ids-report')
87
+ return result;
88
+ const rows = saved.snapshot.elementEvidence?.rows ?? [];
89
+ result.findings = result.findings.map((finding, index) => {
90
+ const row = rows[index];
91
+ const owner = row?.modelContentHash ? owners.find(item => item.sourceSHA256 === row.modelContentHash) : undefined;
92
+ return { ...finding, elements: finding.elements.map(element => {
93
+ if (!owner || !owner.identities.has(element.globalId))
94
+ return { ...element, modelId: null, nativeUnresolved: 'unmatched' };
95
+ const bound = { ...element, modelId: owner.model.id, modelName: owner.model.name };
96
+ // The legacy adapter's missing-name marker is not a native identity
97
+ // failure. Full source/GUID proof binds independently of display names.
98
+ delete bound.nativeUnresolved;
99
+ return bound;
100
+ }) };
101
+ });
102
+ return historical(result, JSON.stringify(['imported-saved-validation', saved.id]), saved.snapshot.generatedAt);
103
+ }
104
+ //# sourceMappingURL=portable-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-projection.js","sourceRoot":"","sources":["../../src/review/portable-projection.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ export declare function validateBlockTitle(block: Record<string, unknown>, at: s
26
26
  export interface ReportModelScope {
27
27
  name: string;
28
28
  fingerprint?: string;
29
+ sourceContentHash?: string;
29
30
  }
30
31
  /** The author's choice to print or omit a report's stamp rows (#6566, #6678).
31
32
  * Absent means shown, so every document saved before the choice printed the same. */
@@ -1 +1 @@
1
- {"version":3,"file":"portable-report-metadata.d.ts","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACpH,MAAM,WAAW,6BAA6B;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEhF,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,2GAA2G;AAC3G,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,6GAA6G;AAC7G,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sGAAsG;IACtG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,UAAW,SAAQ,sBAAsB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAS5H;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AACxE;qFACqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAalI"}
1
+ {"version":3,"file":"portable-report-metadata.d.ts","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,KAAK,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAEpH,MAAM,WAAW,6BAA6B;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEhF,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,2GAA2G;AAC3G,eAAO,MAAM,oBAAoB,IAAI,CAAC;AACtC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,6GAA6G;AAC7G,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sGAAsG;IACtG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,0FAA0F;AAC1F,MAAM,WAAW,UAAW,SAAQ,sBAAsB;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAS5H;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE;AACpG;qFACqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,6BAA6B,EAAE,GAAG,IAAI,CAelI"}
@@ -2,6 +2,7 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { isAutomationReportProvenance } from './portable-automation-provenance.js';
5
+ import { isFullSourceSHA256 } from './portable-source-contract.js';
5
6
  /** Opaque sRGB document colours; named/alpha/short forms are intentionally excluded. */
6
7
  export function isRgbColor(value) {
7
8
  return typeof value === 'string' && /^#[0-9a-f]{6}$/i.test(value);
@@ -34,8 +35,10 @@ export function validateReportProvenance(block, at, errors) {
34
35
  if (typeof model !== 'object' || model === null || Array.isArray(model))
35
36
  return false;
36
37
  const m = model;
37
- return typeof m.name === 'string' && m.name.trim().length > 0 && (m.fingerprint === undefined || (typeof m.fingerprint === 'string' && m.fingerprint.length > 0));
38
+ return typeof m.name === 'string' && m.name.trim().length > 0
39
+ && (m.fingerprint === undefined || (typeof m.fingerprint === 'string' && m.fingerprint.length > 0))
40
+ && (m.sourceContentHash === undefined || isFullSourceSHA256(m.sourceContentHash));
38
41
  })))
39
- errors.push({ path: `${at}.reportModels`, message: 'expected non-empty model names and optional non-empty fingerprints' });
42
+ errors.push({ path: `${at}.reportModels`, message: 'expected non-empty model names, optional non-empty fingerprints and optional lowercase 64-hex sourceContentHash' });
40
43
  }
41
44
  //# sourceMappingURL=portable-report-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"portable-report-metadata.js","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"portable-report-metadata.js","sourceRoot":"","sources":["../../src/review/portable-report-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { NativeReviewModel } from './capture-types.js';
2
+ import type { NativeReviewCaptures } from './native-captures.js';
3
+ import { type SavedAnalysisRun } from './portable-analysis.js';
4
+ import { type SavedValidationReport } from './portable-saved-validation.js';
5
+ import { type FindingSourceKind, type ReviewFinding, type FindingRun } from './types.js';
6
+ export interface PortableReviewRequest {
7
+ sources?: unknown;
8
+ modelIds?: unknown;
9
+ maxFindings?: unknown;
10
+ savedAnalysisRuns?: unknown;
11
+ savedValidationReports?: unknown;
12
+ }
13
+ /** Supplied records remain imported history, even when full source bytes and GUIDs bind.
14
+ * No producer, storage, editor, reconciliation or publication is invoked here.
15
+ */
16
+ export declare function readPortableReview(captures: NativeReviewCaptures, liveModels: () => readonly NativeReviewModel[], request: PortableReviewRequest, allowed: (id: string) => boolean): Promise<{
17
+ origin: "imported";
18
+ retention: null;
19
+ latestAttempt: null;
20
+ findings: ReviewFinding[];
21
+ runs: FindingRun[];
22
+ provenance: never[];
23
+ coverage: never[];
24
+ records: Array<{
25
+ format: string;
26
+ value: SavedAnalysisRun | SavedValidationReport;
27
+ }>;
28
+ bindings: Array<{
29
+ id: string;
30
+ format: string;
31
+ state: string;
32
+ refusal: string | null;
33
+ }>;
34
+ cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
35
+ totals: import("./cards.js").ReviewTotals;
36
+ sources: {
37
+ source: FindingSourceKind;
38
+ state: string;
39
+ refusal: string;
40
+ }[];
41
+ bounds: {
42
+ knownFindings: number | null;
43
+ omittedFindings: number | null;
44
+ rowLimit: number;
45
+ textLimit: number;
46
+ clippedTextFields: number;
47
+ knownFindingsScope: "supplied-historical-records";
48
+ nativeCoverageComplete: boolean;
49
+ presentationComplete: boolean;
50
+ };
51
+ } | {
52
+ findings: ReviewFinding<import("./types.js").ReviewMessage>[];
53
+ runs: FindingRun<import("./types.js").ReviewMessage>[];
54
+ bindings: {
55
+ id: string;
56
+ format: string;
57
+ state: string;
58
+ refusal: string | null;
59
+ }[];
60
+ records: ({
61
+ format: string;
62
+ value: SavedAnalysisRun;
63
+ } | {
64
+ format: string;
65
+ value: SavedValidationReport;
66
+ })[];
67
+ cards: import("./cards.js").CoordinationCard<import("./types.js").ReviewMessage>[];
68
+ totals: import("./cards.js").ReviewTotals;
69
+ sources: {
70
+ source: FindingSourceKind;
71
+ state: string;
72
+ }[];
73
+ bounds: {
74
+ knownFindings: number | null;
75
+ omittedFindings: number | null;
76
+ rowLimit: number;
77
+ textLimit: number;
78
+ clippedTextFields: number;
79
+ knownFindingsScope: "supplied-historical-records";
80
+ nativeCoverageComplete: boolean;
81
+ presentationComplete: boolean;
82
+ };
83
+ origin: "imported";
84
+ retention: null;
85
+ latestAttempt: null;
86
+ provenance: never[];
87
+ coverage: never[];
88
+ }>;
89
+ //# sourceMappingURL=portable-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-snapshot.d.ts","sourceRoot":"","sources":["../../src/review/portable-snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAIjG,OAAO,EAAwB,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAA4B,MAAM,YAAY,CAAC;AAEzI,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAC/D;AAaD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,SAAS,iBAAiB,EAAE,EACrH,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO;;;;cAU8B,aAAa,EAAE;UAAc,UAAU,EAAE;;;aACtF,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,gBAAgB,GAAG,qBAAqB,CAAA;KAAE,CAAC;cAAkB,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;;;;gBAEhK,iBAAiB;;;;;uBACrC,MAAM,GAAG,IAAI;yBAA2B,MAAM,GAAG,IAAI;;;;;;;;;;;;YA4BH,MAAM;gBAAU,MAAM;eAAS,MAAM;iBAAW,MAAM,GAAG,IAAI;;;;;;;;;;;;gBA4D3F,iBAAiB;;;;;;;;;;;;;;;;;;GAY3E"}
@@ -0,0 +1,164 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { buildCards } from './cards.js';
5
+ import { reviewValueFits } from './capture-budget.js';
6
+ import { decodeSavedAnalysisRun } from './portable-analysis.js';
7
+ import { validateSavedReport } from './portable-saved-validation.js';
8
+ import { analysisBinding, validationBinding } from './portable-bindings.js';
9
+ import { withPortableOwners } from './portable-native-owners.js';
10
+ import { projectPortableAnalysis, projectPortableValidation } from './portable-projection.js';
11
+ import { FINDING_SOURCE_KINDS } from './types.js';
12
+ function selectors(value, maximum) {
13
+ if (value === undefined)
14
+ return undefined;
15
+ if (!Array.isArray(value) || value.length > maximum || value.some(x => typeof x !== 'string' || x.length > 1_024)) {
16
+ throw new Error('Review selectors must be bounded string arrays');
17
+ }
18
+ return value.slice();
19
+ }
20
+ function records(value) {
21
+ if (value === undefined)
22
+ return [];
23
+ if (!Array.isArray(value) || value.length > 32)
24
+ throw new Error('Portable Review libraries must be arrays of at most 32 records');
25
+ return value;
26
+ }
27
+ /** Supplied records remain imported history, even when full source bytes and GUIDs bind.
28
+ * No producer, storage, editor, reconciliation or publication is invoked here.
29
+ */
30
+ export async function readPortableReview(captures, liveModels, request, allowed) {
31
+ const selected = selectors(request.sources, 5) ?? [...FINDING_SOURCE_KINDS];
32
+ if (selected.some(x => !FINDING_SOURCE_KINDS.some(kind => kind === x)))
33
+ throw new Error('Unknown Review source kind');
34
+ const requested = selectors(request.modelIds, 64);
35
+ const cap = request.maxFindings ?? 128;
36
+ if (typeof cap !== 'number' || !Number.isSafeInteger(cap) || cap < 0 || cap > 512)
37
+ throw new Error('Review row limit must be an integer from 0 to 512');
38
+ const admitted = (id) => allowed(id) && (!requested || requested.includes(id));
39
+ const scopedModels = () => liveModels().filter(model => admitted(model.id));
40
+ const empty = (refusal) => {
41
+ const cards = buildCards([], []);
42
+ return { origin: 'imported', retention: null, latestAttempt: null, findings: [], runs: [],
43
+ provenance: [], coverage: [], records: [], bindings: [],
44
+ cards: cards.cards, totals: cards.totals,
45
+ sources: selected.map(source => ({ source: source, state: source === 'validation' || source === 'clash' ? 'unavailable' : 'unsupported', refusal })),
46
+ bounds: { knownFindings: null, omittedFindings: null, rowLimit: cap, textLimit: 512,
47
+ clippedTextFields: 0, knownFindingsScope: 'supplied-historical-records', nativeCoverageComplete: false, presentationComplete: false } };
48
+ };
49
+ if (requested?.some(id => !allowed(id)))
50
+ return empty('scope');
51
+ if (!reviewValueFits(request))
52
+ return empty('work-bound');
53
+ const preflight = captures.portableEvidenceRefusal(request);
54
+ if (preflight)
55
+ return empty(preflight);
56
+ // Copy after the bounded walk, so caller mutation during source awaits cannot
57
+ // substitute another library for the one admitted at this boundary.
58
+ const frozen = structuredClone(request);
59
+ const analyses = [], reports = [];
60
+ for (const value of records(frozen.savedAnalysisRuns)) {
61
+ const saved = decodeSavedAnalysisRun(value);
62
+ if (!saved)
63
+ return empty('invalid-record');
64
+ analyses.push(saved);
65
+ }
66
+ for (const value of records(frozen.savedValidationReports)) {
67
+ if (!validateSavedReport(value))
68
+ return empty('invalid-record');
69
+ reports.push(value);
70
+ }
71
+ if (analyses.length + reports.length > 32)
72
+ return empty('work-bound');
73
+ const ids = [...analyses.map(run => `analysis:${run.id}`), ...reports.map(report => `report:${report.id}`)];
74
+ if (new Set(ids).size !== ids.length)
75
+ return empty('record-ambiguous');
76
+ // A mixed analysis library declares no kind by its mere presence. A typed
77
+ // validation-report collection, including an explicit empty one, does.
78
+ const present = (source) => source === 'clash' ? analyses.some(saved => saved.kind === 'clash')
79
+ : source === 'validation' ? analyses.some(saved => saved.kind === 'validation') || frozen.savedValidationReports !== undefined : false;
80
+ const project = (owners, unavailable = new Map()) => {
81
+ const findings = [], runs = [], bindings = [];
82
+ const append = (result, format, id, refusal) => {
83
+ for (const run of result.runs)
84
+ runs.push(run);
85
+ for (const finding of result.findings) {
86
+ const identities = finding.elements.map(element => [owners.find(owner => owner.model.id === element.modelId)?.sourceSHA256 ?? null, element.globalId]);
87
+ finding.lineage = JSON.stringify([refusal ? ['unbound-record', format, id] : ['verified-source-elements', identities], finding.lineage]);
88
+ findings.push(finding);
89
+ }
90
+ };
91
+ for (const saved of analyses) {
92
+ if (!selected.includes(saved.kind === 'clash' ? 'clash' : 'validation'))
93
+ continue;
94
+ const refusal = analysisBinding(saved, owners, unavailable);
95
+ bindings.push({ id: saved.id, format: 'saved-analysis-run', state: refusal ? 'unbound' : 'bound', refusal });
96
+ const result = projectPortableAnalysis(saved, refusal ? [] : owners);
97
+ append(result, 'saved-analysis-run', saved.id, refusal);
98
+ }
99
+ for (const saved of reports) {
100
+ if (!selected.includes('validation'))
101
+ continue;
102
+ const refusal = validationBinding(saved, owners, unavailable);
103
+ bindings.push({ id: saved.id, format: 'saved-validation-report', state: refusal ? 'unbound' : 'bound', refusal });
104
+ const result = projectPortableValidation(saved, refusal ? [] : owners);
105
+ append(result, 'saved-validation-report', saved.id, refusal);
106
+ }
107
+ let clippedTextFields = 0;
108
+ const text = (value) => {
109
+ if (value.length <= 512)
110
+ return value;
111
+ clippedTextFields++;
112
+ const split = value.charCodeAt(511) >= 0xD800 && value.charCodeAt(511) <= 0xDBFF
113
+ && value.charCodeAt(512) >= 0xDC00 && value.charCodeAt(512) <= 0xDFFF;
114
+ return value.slice(0, split ? 511 : 512);
115
+ };
116
+ // Bounds describe the complete supplied finding inventory, not merely the
117
+ // retained rows. Source truncation or gaps keep population/omission unknown.
118
+ const inventoryKnown = reports.filter(() => selected.includes('validation')).every(saved => saved.snapshot.kind === 'ids-report' && saved.snapshot.elementEvidence !== undefined
119
+ && saved.snapshot.elementEvidence.omitted === 0 && saved.snapshot.elementEvidence.gaps.length === 0
120
+ // #7372: summaries count failed entities (warnings have their own bucket
121
+ // for rules), not failed specifications/cardinality-only outcomes.
122
+ && saved.snapshot.elementEvidence.rows.length === saved.snapshot.summary.failed + (saved.snapshot.summary.warnings ?? 0))
123
+ && analyses.filter(saved => selected.includes(saved.kind === 'clash' ? 'clash' : 'validation')).every(saved => saved.kind === 'clash' ? !saved.result.truncated : saved.report.specificationResults.every(spec => !spec.error && !spec.setResultsTruncated && spec.passedCount + spec.failedCount === spec.applicableCount
124
+ && spec.entityResults.reduce((failed, row) => failed + Number(!row.passed), 0) === spec.failedCount));
125
+ const visible = findings.slice(0, cap);
126
+ for (const finding of visible) {
127
+ finding.title = text(finding.title);
128
+ finding.detail = finding.detail.map(text);
129
+ finding.storeys = finding.storeys.map(text);
130
+ finding.disciplines = finding.disciplines.map(text);
131
+ for (const element of finding.elements)
132
+ if (element.name !== undefined)
133
+ element.name = text(element.name);
134
+ }
135
+ for (const run of runs) {
136
+ run.label = text(run.label);
137
+ for (const gap of run.incomplete)
138
+ if (gap.detail !== undefined)
139
+ gap.detail = text(gap.detail);
140
+ }
141
+ const models = owners.map(owner => ({ ...owner.model, sourceIdentity: owner.sourceSHA256,
142
+ expressIdOf: (GlobalId) => owner.identities.get(GlobalId) ?? 0,
143
+ globalIdOf: (expressId) => owner.GlobalIds.get(expressId) ?? '' }));
144
+ const cards = buildCards(visible, models);
145
+ const response = { ...empty(''), findings: visible, runs, bindings,
146
+ records: [...analyses.filter(saved => selected.includes(saved.kind === 'clash' ? 'clash' : 'validation')).map(value => ({ format: 'saved-analysis-run', value })),
147
+ ...reports.filter(() => selected.includes('validation')).map(value => ({ format: 'saved-validation-report', value }))], cards: cards.cards, totals: cards.totals,
148
+ sources: selected.map(source => ({ source: source, state: source === 'validation' || source === 'clash' ? present(source) ? 'available' : 'not-run' : 'unsupported' })),
149
+ bounds: { knownFindings: inventoryKnown ? findings.length : null, omittedFindings: inventoryKnown ? findings.length - visible.length : null, rowLimit: cap, textLimit: 512,
150
+ clippedTextFields, knownFindingsScope: 'supplied-historical-records', nativeCoverageComplete: false,
151
+ presentationComplete: inventoryKnown && findings.length <= cap && !clippedTextFields } };
152
+ if (!reviewValueFits(response))
153
+ return empty('work-bound');
154
+ const final = captures.portableEvidenceRefusal(response);
155
+ return final ? empty(final) : response;
156
+ };
157
+ if (frozen.savedAnalysisRuns === undefined && frozen.savedValidationReports === undefined)
158
+ return empty('records-unavailable');
159
+ if (!analyses.length && !reports.length)
160
+ return project([]);
161
+ const result = await withPortableOwners(scopedModels, admitted, project);
162
+ return result.ok ? result.value : empty(result.refusal);
163
+ }
164
+ //# sourceMappingURL=portable-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-snapshot.js","sourceRoot":"","sources":["../../src/review/portable-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Full source identity, distinct from the historical sampled fingerprint. */
2
+ export declare function isFullSourceSHA256(value: unknown): value is string;
3
+ //# sourceMappingURL=portable-source-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-source-contract.d.ts","sourceRoot":"","sources":["../../src/review/portable-source-contract.ts"],"names":[],"mappings":"AAIA,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAElE"}
@@ -0,0 +1,8 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /** Full source identity, distinct from the historical sampled fingerprint. */
5
+ export function isFullSourceSHA256(value) {
6
+ return typeof value === 'string' && /^[0-9a-f]{64}$/.test(value);
7
+ }
8
+ //# sourceMappingURL=portable-source-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-source-contract.js","sourceRoot":"","sources":["../../src/review/portable-source-contract.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC"}
@@ -1,4 +1,3 @@
1
- /** Canonical saved failure evidence wire contract shared by document import and native Review (#7372). */
2
1
  export declare const SAVED_VALIDATION_LIMITS: {
3
2
  readonly rows: 2000;
4
3
  readonly sourceRows: 50000;
@@ -15,6 +14,8 @@ export interface SavedValidationElement {
15
14
  GlobalId: string | null;
16
15
  modelName: string | null;
17
16
  modelFingerprint?: string;
17
+ /** Optional producer-captured full source identity; absence remains historical/unbound. */
18
+ modelContentHash?: string;
18
19
  ifcType: string;
19
20
  Name?: string;
20
21
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"portable-validation-evidence.d.ts","sourceRoot":"","sources":["../../src/review/portable-validation-evidence.ts"],"names":[],"mappings":"AAIA,0GAA0G;AAC1G,eAAO,MAAM,uBAAuB;;;;;;;;CAG1B,CAAC;AAWX,MAAM,WAAW,sBAAsB;IACrC,0FAA0F;IAC1F,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,qFAAqF;AACrF,MAAM,WAAW,yBAAyB;IACxC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C;AACD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0HAA0H;IAC1H,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAgBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAQxF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAQlI"}
1
+ {"version":3,"file":"portable-validation-evidence.d.ts","sourceRoot":"","sources":["../../src/review/portable-validation-evidence.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB;;;;;;;;CAG1B,CAAC;AAWX,MAAM,WAAW,sBAAsB;IACrC,0FAA0F;IAC1F,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2FAA2F;IAC3F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,QAAQ,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,qFAAqF;AACrF,MAAM,WAAW,yBAAyB;IACxC,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,qGAAqG;IACrG,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C;AACD,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0HAA0H;IAC1H,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAgBD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CASxF;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,CAQlI"}
@@ -2,6 +2,7 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  /** Canonical saved failure evidence wire contract shared by document import and native Review (#7372). */
5
+ import { isFullSourceSHA256 } from './portable-source-contract.js';
5
6
  export const SAVED_VALIDATION_LIMITS = {
6
7
  rows: 2_000, sourceRows: 50_000, rowBytes: 8_192, totalBytes: 1_048_576,
7
8
  text: 1_024, checks: 1_024, definitionBytes: 131_072,
@@ -14,7 +15,7 @@ const CHECK_LIMIT = SAVED_VALIDATION_LIMITS.checks;
14
15
  const DEFINITION_BYTE_LIMIT = SAVED_VALIDATION_LIMITS.definitionBytes;
15
16
  const DIGEST = /^xxh64:[0-9a-f]{16}$/;
16
17
  const EVIDENCE_FIELDS = new Set(['version', 'rows', 'observed', 'omitted', 'gaps', 'definition']);
17
- const ROW_FIELDS = new Set(['id', 'specificationId', 'GlobalId', 'modelName', 'modelFingerprint', 'ifcType', 'Name', 'title', 'nativeStatus', 'detail', 'signature']);
18
+ const ROW_FIELDS = new Set(['id', 'specificationId', 'GlobalId', 'modelName', 'modelFingerprint', 'modelContentHash', 'ifcType', 'Name', 'title', 'nativeStatus', 'detail', 'signature']);
18
19
  const digest = (value) => typeof value === 'string' && DIGEST.test(value);
19
20
  function validDefinition(value) {
20
21
  if (value === undefined)
@@ -33,6 +34,7 @@ const count = (value) => Number.isSafeInteger(value) && Number(value) >= 0;
33
34
  export function isSavedValidationElement(value) {
34
35
  if (!record(value) || Object.keys(value).some(key => !ROW_FIELDS.has(key)) || !text(value.id, 128) || !text(value.specificationId) || (value.GlobalId !== null && !text(value.GlobalId, 200))
35
36
  || (value.modelName !== null && !text(value.modelName)) || (value.modelFingerprint !== undefined && !text(value.modelFingerprint, 256))
37
+ || (value.modelContentHash !== undefined && !isFullSourceSHA256(value.modelContentHash))
36
38
  || !text(value.ifcType, 200) || (value.Name !== undefined && (typeof value.Name !== 'string' || value.Name.length > TEXT_LIMIT))
37
39
  || typeof value.title !== 'string' || value.title.length > TEXT_LIMIT
38
40
  || (value.nativeStatus !== 'failed' && value.nativeStatus !== 'warning') || !Array.isArray(value.detail)
@@ -1 +1 @@
1
- {"version":3,"file":"portable-validation-evidence.js","sourceRoot":"","sources":["../../src/review/portable-validation-evidence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"portable-validation-evidence.js","sourceRoot":"","sources":["../../src/review/portable-validation-evidence.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ import type { FindingLifecycle, FindingSourceResult, ReviewMessage, RunGap } fro
6
6
  */
7
7
  export declare function savedValidationFacts<Message extends ReviewMessage = ReviewMessage>(saved: SavedValidationReport, options?: {
8
8
  incomplete?: RunGap<Message>[];
9
+ /** Host-verified full source and GUID proof; absent preserves legacy name-only handling. */
10
+ identityAvailable?: (row: SavedValidationElement) => boolean;
9
11
  outcome?: (row: SavedValidationElement) => {
10
12
  lifecycle: FindingLifecycle;
11
13
  notes?: Message[];
@@ -1 +1 @@
1
- {"version":3,"file":"saved-validation.d.ts","sourceRoot":"","sources":["../../src/review/saved-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAc,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAG3G;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa,EAAE,KAAK,EAAE,qBAAqB,EAC9G,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK;QAAE,SAAS,EAAE,gBAAgB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,SAAS,CAAA;CAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAyBlJ"}
1
+ {"version":3,"file":"saved-validation.d.ts","sourceRoot":"","sources":["../../src/review/saved-validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAc,mBAAmB,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAG3G;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,aAAa,GAAG,aAAa,EAAE,KAAK,EAAE,qBAAqB,EAC9G,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,4FAA4F;IAC5F,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,sBAAsB,KAAK;QAAE,SAAS,EAAE,gBAAgB,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,SAAS,CAAA;CAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAyBlJ"}
@@ -14,7 +14,7 @@ export function savedValidationFacts(saved, options = {}) {
14
14
  ...(captured?.gaps.map(detail => ({ code: 'partial-source', detail })) ?? [])] };
15
15
  return { runs: [run], findings: (captured?.rows ?? []).map(row => {
16
16
  const outcome = options.outcome?.(row);
17
- const identityAvailable = !!row.GlobalId && !!row.modelName;
17
+ const identityAvailable = !!row.GlobalId && (!!row.modelName || options.identityAvailable?.(row) === true);
18
18
  return { id: JSON.stringify([run.id, row.id]),
19
19
  lineage: JSON.stringify(['saved-validation', snapshot.sourceName, row.specificationId, row.modelName, row.GlobalId, row.id]),
20
20
  source: 'validation', run, elements: row.GlobalId ? [{ globalId: row.GlobalId, modelId: null, modelName: row.modelName,
@@ -1 +1 @@
1
- {"version":3,"file":"saved-validation.js","sourceRoot":"","sources":["../../src/review/saved-validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"saved-validation.js","sourceRoot":"","sources":["../../src/review/saved-validation.ts"],"names":[],"mappings":"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"}
@@ -146,6 +146,8 @@ export interface FindingSourceResult<Message extends ReviewMessage = ReviewMessa
146
146
  }
147
147
  /** A model as the review layer sees it: identity plus a GlobalId lookup. */
148
148
  export interface ReviewModel {
149
+ /** Full source identity verified by the host for this read. Omit for legacy name-only models. */
150
+ sourceIdentity?: string;
149
151
  id: string;
150
152
  name: string;
151
153
  /** Returns a positive express id, or a value <= 0 when the GlobalId is not in the model. */