@uwmd/core 1.6.0 → 1.8.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.
- package/dist/agents/bancroft.js +4 -1
- package/dist/agents/bancroft.js.map +1 -1
- package/dist/asset-class.d.ts +98 -0
- package/dist/asset-class.d.ts.map +1 -0
- package/dist/asset-class.js +226 -0
- package/dist/asset-class.js.map +1 -0
- package/dist/browser.d.ts +23 -9
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +25 -5
- package/dist/browser.js.map +1 -1
- package/dist/calc/errors.d.ts +1 -1
- package/dist/calc/errors.d.ts.map +1 -1
- package/dist/calc/errors.js.map +1 -1
- package/dist/calc/evaluator.js +25 -1
- package/dist/calc/evaluator.js.map +1 -1
- package/dist/calc/prng.d.ts +59 -0
- package/dist/calc/prng.d.ts.map +1 -0
- package/dist/calc/prng.js +181 -0
- package/dist/calc/prng.js.map +1 -0
- package/dist/calc/sensitivity.d.ts +76 -0
- package/dist/calc/sensitivity.d.ts.map +1 -0
- package/dist/calc/sensitivity.js +160 -0
- package/dist/calc/sensitivity.js.map +1 -0
- package/dist/calc/stochastic.d.ts +97 -0
- package/dist/calc/stochastic.d.ts.map +1 -0
- package/dist/calc/stochastic.js +265 -0
- package/dist/calc/stochastic.js.map +1 -0
- package/dist/cascade.d.ts.map +1 -1
- package/dist/cascade.js +8 -4
- package/dist/cascade.js.map +1 -1
- package/dist/cli-args.d.ts +37 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +93 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.js +119 -72
- package/dist/cli.js.map +1 -1
- package/dist/editor.js +25 -6
- package/dist/editor.js.map +1 -1
- package/dist/index.d.ts +24 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +16 -4
- package/dist/init.js.map +1 -1
- package/dist/integrity-canonical.d.ts.map +1 -1
- package/dist/integrity-canonical.js +10 -2
- package/dist/integrity-canonical.js.map +1 -1
- package/dist/integrity.d.ts +92 -4
- package/dist/integrity.d.ts.map +1 -1
- package/dist/integrity.js +195 -9
- package/dist/integrity.js.map +1 -1
- package/dist/lite-bridge.d.ts.map +1 -1
- package/dist/lite-bridge.js +47 -0
- package/dist/lite-bridge.js.map +1 -1
- package/dist/migrate-source-tags.d.ts +34 -0
- package/dist/migrate-source-tags.d.ts.map +1 -0
- package/dist/migrate-source-tags.js +179 -0
- package/dist/migrate-source-tags.js.map +1 -0
- package/dist/module-runtime.d.ts +57 -0
- package/dist/module-runtime.d.ts.map +1 -0
- package/dist/module-runtime.js +167 -0
- package/dist/module-runtime.js.map +1 -0
- package/dist/module-signing.d.ts +85 -0
- package/dist/module-signing.d.ts.map +1 -0
- package/dist/module-signing.js +136 -0
- package/dist/module-signing.js.map +1 -0
- package/dist/modules.d.ts +42 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +124 -1
- package/dist/modules.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +27 -1
- package/dist/parser.js.map +1 -1
- package/dist/protocol.d.ts +234 -21
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +352 -32
- package/dist/protocol.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +22 -2
- package/dist/renderer.js.map +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +17 -0
- package/dist/report.js.map +1 -1
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +9 -3
- package/dist/runner.js.map +1 -1
- package/dist/types.d.ts +118 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +44 -0
- package/dist/types.js.map +1 -1
- package/dist/validator.d.ts +26 -2
- package/dist/validator.d.ts.map +1 -1
- package/dist/validator.js +256 -19
- package/dist/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -2
package/dist/index.js
CHANGED
|
@@ -6,6 +6,8 @@ export { compact, diff } from './compactor.js';
|
|
|
6
6
|
export { render, UnsupportedRenderFormatError } from './renderer.js';
|
|
7
7
|
export { renderReportHtml, REPORT_CSS } from './report.js';
|
|
8
8
|
export { UW_LITE_REPRESENTATION_ID, UWX_REPRESENTATION_ID, UW_LITE_REPRESENTATION_VERSION, UWX_REPRESENTATION_VERSION, UW_LITE_MEDIA_TYPE, UWX_MEDIA_TYPE, UW_LITE_EXTENSION, UW_LITE_SOURCE_DESCRIPTOR, UWX_SOURCE_DESCRIPTOR, UWX_EXTENSION, UWSourceRepresentationError, detectUWSourceRepresentation, migrateLegacyUWMarkdown, } from './source-representation.js';
|
|
9
|
+
// RFC 0031 source-tag migration (`uwmd migrate --source-tags`)
|
|
10
|
+
export { migrateSourceTags, mapLegacySource } from './migrate-source-tags.js';
|
|
9
11
|
export { UWLiteError, parseUWLite, canonicalizeUWLiteFinancial, renderCanonicalUWLite, } from './lite.js';
|
|
10
12
|
export { UW_LITE_BRIDGE_PROFILE, UW_LITE_SOURCE_EXTENSION, UW_LITE_FIELD_MAPPINGS, UWLiteBridgeError, compileUWLite, projectUWEnvelopeToLite, stringifyUWX, } from './lite-bridge.js';
|
|
11
13
|
export { UW_JSON_REPRESENTATION_VERSION, UW_JSON_MEDIA_TYPE, UWJsonError, toUWJson, stringifyUWEnvelope, stringifyUWJson, stringifyUWJsonWithDigest, parseUWJson, parseUWJsonVerified, fromUWJson, UW_JSON_CODEC, } from './uwjson.js';
|
|
@@ -19,15 +21,33 @@ export { CodecRegistry, UWCodecError } from './codec.js';
|
|
|
19
21
|
export { writeAgentBlock, writeErrorEntry, buildMeta } from './runner.js';
|
|
20
22
|
export { applyEdit, applyEditAsync, resolvePolicy } from './editor.js';
|
|
21
23
|
export { evaluateCalc, parseExpression, evaluate, BUILTINS, CalcError, calcError } from './calc/index.js';
|
|
24
|
+
// RFC 0007 — sensitivity tables. A declaration, not a grammar extension: the
|
|
25
|
+
// §VIII.1 sandbox is unchanged, and the grid never travels through
|
|
26
|
+
// `CalcResult.value`.
|
|
27
|
+
// RFC 0005 — stochastic calculations. Sampling is a declaration plus the §VIII.7
|
|
28
|
+
// override mechanism; the grammar and the builtins are untouched, and the
|
|
29
|
+
// builtins stay pure.
|
|
30
|
+
export { evaluateStochastic, isStochasticDecl, SUMMARY_STATS, MAX_STOCHASTIC_SAMPLES, MIN_STOCHASTIC_SAMPLES, } from './calc/stochastic.js';
|
|
31
|
+
export { Pcg64, PRNG_ALGORITHM, inverseNormalCdf, sampleUniform, sampleNormal, sampleTriangular, } from './calc/prng.js';
|
|
32
|
+
export { evaluateSensitivity, isSensitivityDecl, assertSensitivityOk, MAX_SENSITIVITY_CELLS, MAX_SENSITIVITY_AXIS, } from './calc/sensitivity.js';
|
|
22
33
|
// The §VIII.5 quantization boundary. Exported because a host that reports its
|
|
23
34
|
// own derived numbers alongside pack results must quantize them the same way, or
|
|
24
35
|
// its receipt digest will not reproduce.
|
|
25
36
|
export { quantizeDecimal, resolveRoundTo, DEFAULT_ROUND_TO, DEFAULT_ROUND_TO_BY_UNIT, MAX_ROUND_TO, } from './calc/index.js';
|
|
26
37
|
export { MULTIFAMILY_PACK, OFFICE_PACK, RETAIL_PACK, INDUSTRIAL_PACK, SELF_STORAGE_PACK, HOSPITALITY_PACK, SENIOR_HOUSING_PACK, STUDENT_HOUSING_PACK, LAND_PACK, MIXED_USE_PACK, getPackForAssetClass, emitFromAst, emitExcelFormula, emitCalcExcelFormula, ExcelEmitError, } from './packs/index.js';
|
|
27
|
-
export { loadModuleManifest, createModuleRegistry, getModuleCalculationsForAssetClass, ModuleRegistryError, } from './modules.js';
|
|
38
|
+
export { loadModuleManifest, loadModuleManifestAsync, createModuleRegistry, createModuleRegistryAsync, getModuleCalculationsForAssetClass, ModuleRegistryError, } from './modules.js';
|
|
39
|
+
// RFC 0003 — module-declared asset classes. Identifier grammar and resolution
|
|
40
|
+
// are crypto-free and browser-safe; `AssetClass` itself stays a closed union.
|
|
41
|
+
export { parseAssetClass, isCustomAssetClass, resolveAssetClass, declaredAssetClasses, assetClassDeclarationConflicts, declaredModuleDependencies, } from './asset-class.js';
|
|
42
|
+
export { evaluateModuleCalculations, validateAgainstModules, checkModuleSections, } from './module-runtime.js';
|
|
43
|
+
// RFC 0002 — module signatures. Crypto-free half only; `@uwmd/signing` supplies
|
|
44
|
+
// the verifier that `verifyModuleSignature` and the async loaders accept.
|
|
45
|
+
export { moduleSigningPayload, verifyModuleSignature, checkSignatureShape, MODULE_SIGNATURE_SCHEME, } from './module-signing.js';
|
|
28
46
|
// ─── RFC 0018: document profiles, lease abstracts, deal packages ─────────────
|
|
29
47
|
// All browser-safe: no I/O, no network, no hashing implementation imported.
|
|
30
|
-
export { BUILTIN_DOCUMENT_PROFILES, DEAL_UNDERWRITING_PROFILE, LEASE_ABSTRACT_PROFILE, SOURCE_NOTE_PROFILE, MARKET_DATA_PROFILE, DOCUMENT_PROFILE_PATTERN, lookupDocumentProfile, STANDARD_SECTION_IDS, isStandardSectionId, EXTENSION_SECTION_PREFIX, BUILTIN_EDGE_TYPES, lookupEdgeType, isEdgeTypeValidOnLayer,
|
|
48
|
+
export { BUILTIN_DOCUMENT_PROFILES, DEAL_UNDERWRITING_PROFILE, LEASE_ABSTRACT_PROFILE, SOURCE_NOTE_PROFILE, MARKET_DATA_PROFILE, DOCUMENT_PROFILE_PATTERN, lookupDocumentProfile, STANDARD_SECTION_IDS, isStandardSectionId, EXTENSION_SECTION_PREFIX, BUILTIN_EDGE_TYPES, lookupEdgeType, isEdgeTypeValidOnLayer,
|
|
49
|
+
// RFC 0027: the Protocol §XIII size-intensive registry. Browser-safe.
|
|
50
|
+
SIZE_INTENSIVES, getSizeIntensive, resolveDealSize, } from './protocol.js';
|
|
31
51
|
export { UW_PACKAGE_VERSION, UW_PACKAGE_ZIP_CODEC, UW_PACKAGE_ZIP_MEDIA_TYPE, UW_PACKAGE_CONTEXT_CODEC, UW_PACKAGE_CONTEXT_MEDIA_TYPE, CONTEXT_INLINABLE_ROLES, UWPackageError, isSafeMemberPath, validateUWDealPackageManifest, assertUWDealPackageManifest, projectPackageLinksToEntityEdges, edgeTypesForLayer, } from './deal-package.js';
|
|
32
52
|
export { projectUWDealPackageContext, validateUWDealPackageContext, verifyContextContentDigests, } from './deal-package-context.js';
|
|
33
53
|
export { LEASE_ABSTRACT_PROFILE_ID, LEASE_ABSTRACT_GROUPS, LEASE_TERM_STATUSES, LEASE_ARTIFACT_KINDS, LeaseAbstractError, validateLeaseAbstract, assertLeaseAbstract, projectLeaseAbstractToRentRoll, } from './lease-abstract.js';
|
|
@@ -57,17 +77,18 @@ export { deriveDCF } from './dcf.js';
|
|
|
57
77
|
// ─── Asset-class defaults & cascade (Protocol §V.7-§V.8) ──────────────────────
|
|
58
78
|
export { MULTIFAMILY_DEFAULTS, OFFICE_DEFAULTS, RETAIL_DEFAULTS, INDUSTRIAL_DEFAULTS, SELF_STORAGE_DEFAULTS, HOSPITALITY_DEFAULTS, SENIOR_HOUSING_DEFAULTS, STUDENT_HOUSING_DEFAULTS, LAND_DEFAULTS, MIXED_USE_DEFAULTS, getAssetClassDefaults, getDefaultRange, listDefaultedFields, } from './defaults.js';
|
|
59
79
|
export { inferGaps, summarizeGaps, readGapsContent } from './gaps.js';
|
|
60
|
-
export { sha256Hex, computeBlockHash, verifyChain, verifyProvenance, } from './integrity.js';
|
|
80
|
+
export { sha256Hex, computeBlockHash, verifyChain, verifyProvenance, blockSigningPayload, canonicalBlockSigningInput, } from './integrity.js';
|
|
61
81
|
export { canonicalize } from './integrity-canonical.js';
|
|
62
82
|
export { CORE_PACKAGE_NAME, CORE_VERSION } from './version.js';
|
|
83
|
+
export { REFERENCE_IMPLEMENTATION_MANIFEST } from './protocol.js';
|
|
63
84
|
export { UW_RECEIPT_VERSION, SUPPORTED_RECEIPT_VERSIONS, ROLLUP_FUNCTIONS, PORTFOLIO_ROLLUP_SECTION, verifyRollup, evaluateRollup, validateRollupAggregate, UW_LITE_CANONICALIZATION, UW_LITE_CANONICALIZATION_VERSION, UWX_CANONICALIZATION, UWX_CANONICALIZATION_VERSION, RECEIPT_RESULT_TOLERANCE, BUILTIN_POLICY_SET, BUILTIN_POLICY_SET_VERSION, ReceiptError, resolveReceiptSubject, computeReceiptResults, computeResultsDigest, issueReceipt, receiptSigningPayload, verifyReceipt, assertUWReceipt, } from './receipts.js';
|
|
64
85
|
export { verifyCapitalStack, recomputeSizing, trancheAnnualDebtService, isDebtTranche, capitalStackContext, CAPITAL_STACK_SIZING_DECIMALS, } from './capital-stack.js';
|
|
65
86
|
export { resolveValue, readInFile } from './cascade.js';
|
|
66
|
-
export { DEFAULT_THRESHOLDS, ASSET_CLASSES } from './types.js';
|
|
87
|
+
export { DEFAULT_THRESHOLDS, ASSET_CLASSES, UW_SIGNATURE_ALGORITHMS } from './types.js';
|
|
67
88
|
// ─── Display formatting ───────────────────────────────────────────────────────
|
|
68
89
|
export { formatCurrency, formatPercent, formatRatio, formatCount, formatDate, formatNull, formatValue, formatPercentCsv, formatNumberCsv, } from './format.js';
|
|
69
90
|
// ─── Protocol surface ─────────────────────────────────────────────────────────
|
|
70
|
-
export { PROTOCOL_VERSION, FORMAT_VERSION, DEFAULT_NUMBER_FORMAT, DEFAULT_DATE_FORMAT, BUILTIN_VIEW_MODELS, BUILTIN_EDIT_POLICIES, BUILTIN_REMEDIATIONS, BUILTIN_INCOMPLETE_DATA_POLICIES, CASCADE_ORDER, SOURCE_TAGS, lookupIncompleteDataPolicy, } from './protocol.js';
|
|
91
|
+
export { PROTOCOL_VERSION, FORMAT_VERSION, DEFAULT_NUMBER_FORMAT, DEFAULT_DATE_FORMAT, BUILTIN_VIEW_MODELS, BUILTIN_EDIT_POLICIES, BUILTIN_REMEDIATIONS, VALIDATOR_CODE_FAMILIES, validatorCodeFamily, BUILTIN_INCOMPLETE_DATA_POLICIES, CASCADE_ORDER, SOURCE_TAGS, ACTOR_NAMESPACES, ACTOR_SOURCE_RE, parseActorSource, lookupIncompleteDataPolicy, } from './protocol.js';
|
|
71
92
|
// ─── Refinement / context profiles (Protocol §IX, §X) ────────────────────────
|
|
72
93
|
export { extractDependencyGraph, getExprDependencies } from './calc/dependencies.js';
|
|
73
94
|
export { rankGaps } from './refinement.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,WAAgB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC/B;AAYD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,WAAgB,GAAG,MAAM,CA+KlE"}
|
package/dist/init.js
CHANGED
|
@@ -68,7 +68,17 @@ source_documents: []
|
|
|
68
68
|
section,
|
|
69
69
|
version: 1,
|
|
70
70
|
superseded: false,
|
|
71
|
-
|
|
71
|
+
// `manual`, not `wizard`. A scaffold a person is about to fill in is a
|
|
72
|
+
// human-authored block, and `manual` is the one token that means the same
|
|
73
|
+
// thing in every source vocabulary the specs define. `wizard` matched no
|
|
74
|
+
// BUILTIN_EDIT_POLICIES pattern, so every freshly generated file carried
|
|
75
|
+
// blocks that no policy governed — which is why replacing them in place
|
|
76
|
+
// appeared to work.
|
|
77
|
+
//
|
|
78
|
+
// Deliberately not `system/init`: that resolves to `system/*`, whose
|
|
79
|
+
// authority is `system_only`, and these stubs exist precisely to be edited
|
|
80
|
+
// by a person.
|
|
81
|
+
source: 'manual',
|
|
72
82
|
agent_id: null,
|
|
73
83
|
agent_version: null,
|
|
74
84
|
actor: 'user',
|
|
@@ -110,7 +120,7 @@ source_documents: []
|
|
|
110
120
|
|
|
111
121
|
_${s.label} — Add narrative here._
|
|
112
122
|
|
|
113
|
-
\`\`\`json uw:section=${s.id} source=
|
|
123
|
+
\`\`\`json uw:section=${s.id} source=manual ts=${now} v=1 confidence=low
|
|
114
124
|
${metaStub(s.id)}
|
|
115
125
|
\`\`\`
|
|
116
126
|
|
|
@@ -120,7 +130,9 @@ ${metaStub(s.id)}
|
|
|
120
130
|
section: 'pipeline_log',
|
|
121
131
|
version: 1,
|
|
122
132
|
superseded: false,
|
|
123
|
-
|
|
133
|
+
// The initializer writing an append-only log entry. `system/init` matches
|
|
134
|
+
// `system/*`; `engine:uwmd` matched nothing.
|
|
135
|
+
source: 'system/init',
|
|
124
136
|
agent_id: null,
|
|
125
137
|
agent_version: '1.0.0',
|
|
126
138
|
actor: 'system',
|
|
@@ -161,7 +173,7 @@ ${sectionBlocks}
|
|
|
161
173
|
|
|
162
174
|
## Pipeline Log {#pipeline_log}
|
|
163
175
|
|
|
164
|
-
\`\`\`json uw:section=pipeline_log source=
|
|
176
|
+
\`\`\`json uw:section=pipeline_log source=system/init ts=${now} v=1 confidence=high
|
|
165
177
|
${pipelineLogEntry}
|
|
166
178
|
\`\`\`
|
|
167
179
|
`;
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity-canonical.d.ts","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"integrity-canonical.d.ts","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAExD"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// Protocol §V.9 — "Canonical block JSON"
|
|
3
3
|
//
|
|
4
4
|
// Implements RFC 8785 (JCS) with one extension: the keys `content_hash` and
|
|
5
|
-
// `signature` inside any nested `_meta` object
|
|
5
|
+
// `signature` inside any nested `_meta` object (spelled `section`/`section_id`)
|
|
6
|
+
// are removed before hashing.
|
|
6
7
|
// This keeps hash computation idempotent across multiple round trips through
|
|
7
8
|
// the cascade.
|
|
8
9
|
//
|
|
@@ -47,9 +48,16 @@ function stripExcludedKeys(input) {
|
|
|
47
48
|
* meta fields. We strip the excluded keys from every meta-shaped sub-object,
|
|
48
49
|
* not only the top-level `_meta`, so that nested provenance (e.g. inside
|
|
49
50
|
* field_overrides) hashes consistently.
|
|
51
|
+
*
|
|
52
|
+
* `section_id` is accepted alongside `section` because it is the spelling every
|
|
53
|
+
* `.uw.md` on disk actually uses (format spec §3, and the `uwmd-block` schema's
|
|
54
|
+
* own example). Requiring `section` alone meant this predicate returned false
|
|
55
|
+
* for every parsed block, so the two exclusions §V.9 mandates silently never
|
|
56
|
+
* applied outside of hand-built test objects — stamping a `content_hash` then
|
|
57
|
+
* changed the hash it was a digest of, and INT-04 fired on untouched files.
|
|
50
58
|
*/
|
|
51
59
|
function looksLikeMeta(obj) {
|
|
52
|
-
return ('section' in obj &&
|
|
60
|
+
return (('section' in obj || 'section_id' in obj) &&
|
|
53
61
|
'version' in obj &&
|
|
54
62
|
'source' in obj);
|
|
55
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity-canonical.js","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yCAAyC;AACzC,EAAE;AACF,4EAA4E;AAC5E,
|
|
1
|
+
{"version":3,"file":"integrity-canonical.js","sourceRoot":"","sources":["../src/integrity-canonical.ts"],"names":[],"mappings":"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"}
|
package/dist/integrity.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ParsedUWFile, UWBlock } from './types.js';
|
|
1
|
+
import type { ParsedUWFile, UWBlock, UWBlockSignature } from './types.js';
|
|
2
2
|
import type { EditPolicy } from './protocol.js';
|
|
3
3
|
/**
|
|
4
4
|
* SHA-256 of the canonicalized JSON of `value`. Returns the lowercase hex
|
|
@@ -22,7 +22,7 @@ export declare function sha256BytesHex(bytes: Uint8Array): Promise<string>;
|
|
|
22
22
|
* canonicalizer).
|
|
23
23
|
*/
|
|
24
24
|
export declare function computeBlockHash(block: UWBlock): Promise<string>;
|
|
25
|
-
export type IntegrityCode = 'INT-01' | 'INT-02' | 'INT-03' | 'INT-04' | 'POL-01' | 'POL-02';
|
|
25
|
+
export type IntegrityCode = 'INT-01' | 'INT-02' | 'INT-03' | 'INT-04' | 'INT-05' | 'INT-06' | 'INT-07' | 'INT-08' | 'POL-01' | 'POL-02';
|
|
26
26
|
export interface IntegrityIssue {
|
|
27
27
|
code: IntegrityCode;
|
|
28
28
|
severity: 'error' | 'warning';
|
|
@@ -36,6 +36,83 @@ export interface IntegrityResult {
|
|
|
36
36
|
issues: IntegrityIssue[];
|
|
37
37
|
chains_verified: number;
|
|
38
38
|
chains_with_hashes: number;
|
|
39
|
+
/**
|
|
40
|
+
* How many blocks carry `_meta.signature` (RFC 0010). Reported even when no
|
|
41
|
+
* verifier was supplied, so a caller can tell "no signatures" apart from
|
|
42
|
+
* "signatures present but unchecked" — the distinction that makes a
|
|
43
|
+
* `signatures_verified: 0` result readable.
|
|
44
|
+
*/
|
|
45
|
+
signatures_present: number;
|
|
46
|
+
/**
|
|
47
|
+
* How many signatures cryptographically verified. Always 0 without a
|
|
48
|
+
* `signatureVerifier`; never inferred from the signature's mere presence.
|
|
49
|
+
*/
|
|
50
|
+
signatures_verified: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The canonical JSON a block signature covers.
|
|
54
|
+
*
|
|
55
|
+
* Deliberately not the block itself: the signer commits to the block's
|
|
56
|
+
* `content_hash` (which already covers the content), plus the four provenance
|
|
57
|
+
* facts a verifier needs in order to say *who* signed *what*, *when*. Signing
|
|
58
|
+
* the block directly would re-derive the hash for no gain and would drag
|
|
59
|
+
* `parent_hash` into the commitment — see {@link UWBlockSignature}.
|
|
60
|
+
*/
|
|
61
|
+
export interface BlockSigningInput {
|
|
62
|
+
content_hash: string;
|
|
63
|
+
section: string;
|
|
64
|
+
actor: string;
|
|
65
|
+
timestamp: string;
|
|
66
|
+
kid: string;
|
|
67
|
+
signed_at: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Build the exact bytes a signature is computed over: RFC 8785 canonical JSON
|
|
71
|
+
* of {@link BlockSigningInput}. Crypto-free, so it lives in core — signer and
|
|
72
|
+
* verifier MUST agree on this string or nothing else matters.
|
|
73
|
+
*
|
|
74
|
+
* Returns `null` when the block cannot produce a signing input at all (no
|
|
75
|
+
* `content_hash`, or no signature to take `kid`/`signed_at` from).
|
|
76
|
+
*/
|
|
77
|
+
export declare function blockSigningPayload(block: UWBlock): string | null;
|
|
78
|
+
/**
|
|
79
|
+
* Canonicalize an explicit signing input.
|
|
80
|
+
*
|
|
81
|
+
* The signer needs this and {@link blockSigningPayload} cannot serve it: at
|
|
82
|
+
* signing time the block has no `_meta.signature` yet, so there is nowhere to
|
|
83
|
+
* read `kid` and `signed_at` from. Both paths funnel through this one function
|
|
84
|
+
* so the two sides cannot drift.
|
|
85
|
+
*/
|
|
86
|
+
export declare function canonicalBlockSigningInput(input: BlockSigningInput): string;
|
|
87
|
+
/** Why a signature failed to verify. Mirrors RFC 0010's `SigVerifyError`. */
|
|
88
|
+
export type BlockSigFailure = 'unknown_kid' | 'algorithm_mismatch' | 'bad_signature' | 'malformed';
|
|
89
|
+
export type BlockSigVerdict = {
|
|
90
|
+
ok: true;
|
|
91
|
+
} | {
|
|
92
|
+
ok: false;
|
|
93
|
+
reason: BlockSigFailure;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Plugged in by `@uwmd/signing`; absent here so core stays crypto-free (the
|
|
97
|
+
* same seam `ReceiptSignatureVerifier` uses for receipts).
|
|
98
|
+
*/
|
|
99
|
+
export interface BlockSignatureVerifier {
|
|
100
|
+
verify(payload: string, signature: UWBlockSignature): Promise<BlockSigVerdict>;
|
|
101
|
+
}
|
|
102
|
+
export interface VerifyChainOptions {
|
|
103
|
+
/**
|
|
104
|
+
* Supplied by a signing package. Without it, INT-06/INT-07 never fire and a
|
|
105
|
+
* signed block is treated exactly like an unsigned one — verification is
|
|
106
|
+
* opt-in, and silently "passing" an unchecked signature is the failure this
|
|
107
|
+
* design most wants to avoid, which is what `signatures_present` reports.
|
|
108
|
+
*/
|
|
109
|
+
signatureVerifier?: BlockSignatureVerifier;
|
|
110
|
+
/**
|
|
111
|
+
* Algorithms to flag as deprecated (INT-08). Empty at protocol 1.7 — no
|
|
112
|
+
* admitted algorithm is deprecated yet — but the knob exists so a deployment
|
|
113
|
+
* can retire one ahead of the spec.
|
|
114
|
+
*/
|
|
115
|
+
deprecatedAlgorithms?: readonly string[];
|
|
39
116
|
}
|
|
40
117
|
/**
|
|
41
118
|
* For every supersede chain in the parsed file:
|
|
@@ -47,9 +124,20 @@ export interface IntegrityResult {
|
|
|
47
124
|
* `content_hash` (else INT-01 error).
|
|
48
125
|
*
|
|
49
126
|
* A chain with no hashes at all yields no findings and is not counted in
|
|
50
|
-
* `chains_verified
|
|
127
|
+
* `chains_verified` — but its blocks are still swept for signatures, because a
|
|
128
|
+
* signature over a block that has no `content_hash` commits to nothing and is
|
|
129
|
+
* exactly the case INT-05 exists to catch.
|
|
130
|
+
*
|
|
131
|
+
* Signature checks (protocol §V.11) run over every block in the file:
|
|
132
|
+
* - INT-05 error — `signature` present with no `content_hash`.
|
|
133
|
+
* - INT-07 error — the stamped `content_hash` no longer recomputes, so the
|
|
134
|
+
* signature covers content that is no longer there (INT-04 reports the same
|
|
135
|
+
* drift as a warning; on a signed block it is an error).
|
|
136
|
+
* - INT-06 error — `kid` unknown to the supplied store.
|
|
137
|
+
* - INT-07 error — the signature does not verify.
|
|
138
|
+
* - INT-08 warning — the algorithm is in the caller's deprecation list.
|
|
51
139
|
*/
|
|
52
|
-
export declare function verifyChain(parsed: ParsedUWFile): Promise<IntegrityResult>;
|
|
140
|
+
export declare function verifyChain(parsed: ParsedUWFile, options?: VerifyChainOptions): Promise<IntegrityResult>;
|
|
53
141
|
/**
|
|
54
142
|
* Cross-check `_meta.actor` and the operation that produced the block against
|
|
55
143
|
* BUILTIN_EDIT_POLICIES.
|
package/dist/integrity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../src/integrity.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"integrity.d.ts","sourceRoot":"","sources":["../src/integrity.ts"],"names":[],"mappings":"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"}
|
package/dist/integrity.js
CHANGED
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
// - SHA-256 implementation is split between Node (`createHash`) and Web
|
|
10
10
|
// Crypto (`crypto.subtle`). The browser entry point binds the latter via
|
|
11
11
|
// subpath export when adopters import from `@uwmd/core/browser`.
|
|
12
|
-
import { canonicalize } from './integrity-canonical.js';
|
|
13
|
-
import {
|
|
12
|
+
import { canonicalize, canonicalizeExact } from './integrity-canonical.js';
|
|
13
|
+
import { UW_SIGNATURE_ALGORITHMS } from './types.js';
|
|
14
|
+
import { BUILTIN_EDIT_POLICIES, parseActorSource } from './protocol.js';
|
|
14
15
|
// ─── Hashing ─────────────────────────────────────────────────────────────────
|
|
15
16
|
/**
|
|
16
17
|
* SHA-256 of the canonicalized JSON of `value`. Returns the lowercase hex
|
|
@@ -63,6 +64,46 @@ export async function computeBlockHash(block) {
|
|
|
63
64
|
// stripped by the canonicalizer.
|
|
64
65
|
return sha256Hex({ ...block.content, _meta: block.meta });
|
|
65
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Build the exact bytes a signature is computed over: RFC 8785 canonical JSON
|
|
69
|
+
* of {@link BlockSigningInput}. Crypto-free, so it lives in core — signer and
|
|
70
|
+
* verifier MUST agree on this string or nothing else matters.
|
|
71
|
+
*
|
|
72
|
+
* Returns `null` when the block cannot produce a signing input at all (no
|
|
73
|
+
* `content_hash`, or no signature to take `kid`/`signed_at` from).
|
|
74
|
+
*/
|
|
75
|
+
export function blockSigningPayload(block) {
|
|
76
|
+
const sig = block.meta.signature;
|
|
77
|
+
const hash = block.meta.content_hash;
|
|
78
|
+
if (!sig || typeof hash !== 'string')
|
|
79
|
+
return null;
|
|
80
|
+
return canonicalBlockSigningInput({
|
|
81
|
+
content_hash: hash,
|
|
82
|
+
section: block.meta.section,
|
|
83
|
+
actor: block.meta.actor,
|
|
84
|
+
timestamp: block.meta.timestamp,
|
|
85
|
+
kid: sig.kid,
|
|
86
|
+
signed_at: sig.signed_at,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Canonicalize an explicit signing input.
|
|
91
|
+
*
|
|
92
|
+
* The signer needs this and {@link blockSigningPayload} cannot serve it: at
|
|
93
|
+
* signing time the block has no `_meta.signature` yet, so there is nowhere to
|
|
94
|
+
* read `kid` and `signed_at` from. Both paths funnel through this one function
|
|
95
|
+
* so the two sides cannot drift.
|
|
96
|
+
*/
|
|
97
|
+
export function canonicalBlockSigningInput(input) {
|
|
98
|
+
return canonicalizeExact({
|
|
99
|
+
content_hash: input.content_hash,
|
|
100
|
+
section: input.section,
|
|
101
|
+
actor: input.actor,
|
|
102
|
+
timestamp: input.timestamp,
|
|
103
|
+
kid: input.kid,
|
|
104
|
+
signed_at: input.signed_at,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
66
107
|
// ─── Chain verification ──────────────────────────────────────────────────────
|
|
67
108
|
/**
|
|
68
109
|
* For every supersede chain in the parsed file:
|
|
@@ -74,9 +115,20 @@ export async function computeBlockHash(block) {
|
|
|
74
115
|
* `content_hash` (else INT-01 error).
|
|
75
116
|
*
|
|
76
117
|
* A chain with no hashes at all yields no findings and is not counted in
|
|
77
|
-
* `chains_verified
|
|
118
|
+
* `chains_verified` — but its blocks are still swept for signatures, because a
|
|
119
|
+
* signature over a block that has no `content_hash` commits to nothing and is
|
|
120
|
+
* exactly the case INT-05 exists to catch.
|
|
121
|
+
*
|
|
122
|
+
* Signature checks (protocol §V.11) run over every block in the file:
|
|
123
|
+
* - INT-05 error — `signature` present with no `content_hash`.
|
|
124
|
+
* - INT-07 error — the stamped `content_hash` no longer recomputes, so the
|
|
125
|
+
* signature covers content that is no longer there (INT-04 reports the same
|
|
126
|
+
* drift as a warning; on a signed block it is an error).
|
|
127
|
+
* - INT-06 error — `kid` unknown to the supplied store.
|
|
128
|
+
* - INT-07 error — the signature does not verify.
|
|
129
|
+
* - INT-08 warning — the algorithm is in the caller's deprecation list.
|
|
78
130
|
*/
|
|
79
|
-
export async function verifyChain(parsed) {
|
|
131
|
+
export async function verifyChain(parsed, options = {}) {
|
|
80
132
|
const issues = [];
|
|
81
133
|
let chainsWithHashes = 0;
|
|
82
134
|
let chainsVerified = 0;
|
|
@@ -140,14 +192,128 @@ export async function verifyChain(parsed) {
|
|
|
140
192
|
if (chainOK)
|
|
141
193
|
chainsVerified++;
|
|
142
194
|
}
|
|
195
|
+
const sig = await verifySignatures(parsed, issues, options);
|
|
143
196
|
const errors = issues.filter((i) => i.severity === 'error').length;
|
|
144
197
|
return {
|
|
145
198
|
ok: errors === 0,
|
|
146
199
|
issues,
|
|
147
200
|
chains_verified: chainsVerified,
|
|
148
201
|
chains_with_hashes: chainsWithHashes,
|
|
202
|
+
signatures_present: sig.present,
|
|
203
|
+
signatures_verified: sig.verified,
|
|
149
204
|
};
|
|
150
205
|
}
|
|
206
|
+
/**
|
|
207
|
+
* Sweep every block in the file for `_meta.signature` and append INT-05..08.
|
|
208
|
+
*
|
|
209
|
+
* Walks all blocks — heads, superseded priors, and every variant — rather than
|
|
210
|
+
* the per-section chain heads `verifyChain` walks. A signature on a superseded
|
|
211
|
+
* block is the whole point of per-block signing: "the sponsor signed *this*
|
|
212
|
+
* version of the rent roll" must stay checkable after the block is superseded.
|
|
213
|
+
*/
|
|
214
|
+
async function verifySignatures(parsed, issues, options) {
|
|
215
|
+
const deprecated = options.deprecatedAlgorithms ?? [];
|
|
216
|
+
let present = 0;
|
|
217
|
+
let verified = 0;
|
|
218
|
+
for (const [sectionId, block] of everyBlock(parsed)) {
|
|
219
|
+
const signature = block.meta.signature;
|
|
220
|
+
if (!signature)
|
|
221
|
+
continue;
|
|
222
|
+
present++;
|
|
223
|
+
const where = `Block v${block.meta.version} of '${sectionId}'`;
|
|
224
|
+
if (deprecated.includes(signature.alg)) {
|
|
225
|
+
issues.push({
|
|
226
|
+
code: 'INT-08',
|
|
227
|
+
severity: 'warning',
|
|
228
|
+
section: sectionId,
|
|
229
|
+
message: `${where} is signed with deprecated algorithm '${signature.alg}'.`,
|
|
230
|
+
actual: signature.alg,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// INT-05 needs no key material: a signature over an absent content_hash is
|
|
234
|
+
// structurally void, so it is reported whether or not a verifier exists.
|
|
235
|
+
const payload = blockSigningPayload(block);
|
|
236
|
+
if (payload === null) {
|
|
237
|
+
issues.push({
|
|
238
|
+
code: 'INT-05',
|
|
239
|
+
severity: 'error',
|
|
240
|
+
section: sectionId,
|
|
241
|
+
message: `${where} carries a signature but no content_hash, so the signature commits to nothing.`,
|
|
242
|
+
});
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
// A signed block whose stamped hash no longer recomputes is INT-07 as well
|
|
246
|
+
// as INT-04, and the escalation from warning to error is the point: on an
|
|
247
|
+
// unsigned block a drifted hash is a bookkeeping slip, but on a signed one
|
|
248
|
+
// it means the content in front of you is not the content anybody signed.
|
|
249
|
+
const recomputed = await computeBlockHash(block);
|
|
250
|
+
if (recomputed !== block.meta.content_hash) {
|
|
251
|
+
issues.push({
|
|
252
|
+
code: 'INT-07',
|
|
253
|
+
severity: 'error',
|
|
254
|
+
section: sectionId,
|
|
255
|
+
message: `${where} was signed over content_hash ${block.meta.content_hash}, but its content now hashes to ${recomputed}.`,
|
|
256
|
+
expected: recomputed,
|
|
257
|
+
actual: block.meta.content_hash,
|
|
258
|
+
});
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (!UW_SIGNATURE_ALGORITHMS.includes(signature.alg)) {
|
|
262
|
+
issues.push({
|
|
263
|
+
code: 'INT-07',
|
|
264
|
+
severity: 'error',
|
|
265
|
+
section: sectionId,
|
|
266
|
+
message: `${where} declares unrecognized signature algorithm '${signature.alg}'.`,
|
|
267
|
+
expected: UW_SIGNATURE_ALGORITHMS.join('|'),
|
|
268
|
+
actual: signature.alg,
|
|
269
|
+
});
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
if (!options.signatureVerifier)
|
|
273
|
+
continue;
|
|
274
|
+
const verdict = await options.signatureVerifier.verify(payload, signature);
|
|
275
|
+
if (verdict.ok) {
|
|
276
|
+
verified++;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (verdict.reason === 'unknown_kid') {
|
|
280
|
+
issues.push({
|
|
281
|
+
code: 'INT-06',
|
|
282
|
+
severity: 'error',
|
|
283
|
+
section: sectionId,
|
|
284
|
+
message: `${where} is signed by key '${signature.kid}', which this verifier's key store does not hold.`,
|
|
285
|
+
actual: signature.kid,
|
|
286
|
+
});
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
issues.push({
|
|
290
|
+
code: 'INT-07',
|
|
291
|
+
severity: 'error',
|
|
292
|
+
section: sectionId,
|
|
293
|
+
message: `${where} signature did not verify (${verdict.reason}).`,
|
|
294
|
+
actual: signature.kid,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
return { present, verified };
|
|
298
|
+
}
|
|
299
|
+
/** Every block in the file, superseded priors and variants included. */
|
|
300
|
+
function* everyBlock(parsed) {
|
|
301
|
+
for (const [sectionId, prior] of Object.entries(parsed.superseded)) {
|
|
302
|
+
for (const block of prior)
|
|
303
|
+
yield [sectionId, block];
|
|
304
|
+
}
|
|
305
|
+
for (const [sectionId, entry] of Object.entries(parsed.sections)) {
|
|
306
|
+
if (!entry)
|
|
307
|
+
continue;
|
|
308
|
+
if ('annotation' in entry) {
|
|
309
|
+
yield [sectionId, entry];
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
for (const variant of Object.values(entry)) {
|
|
313
|
+
yield [sectionId, variant];
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
151
317
|
// ─── Provenance verification ─────────────────────────────────────────────────
|
|
152
318
|
/**
|
|
153
319
|
* Cross-check `_meta.actor` and the operation that produced the block against
|
|
@@ -195,6 +361,8 @@ export function verifyProvenance(parsed, policies = BUILTIN_EDIT_POLICIES) {
|
|
|
195
361
|
issues,
|
|
196
362
|
chains_verified: 0,
|
|
197
363
|
chains_with_hashes: 0,
|
|
364
|
+
signatures_present: 0,
|
|
365
|
+
signatures_verified: 0,
|
|
198
366
|
};
|
|
199
367
|
}
|
|
200
368
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
@@ -230,17 +398,35 @@ function globMatch(pattern, value) {
|
|
|
230
398
|
}
|
|
231
399
|
return false;
|
|
232
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* Classify from the parsed actor namespace, not string prefixes (RFC 0031).
|
|
403
|
+
* A source outside the actor grammar — a legacy colon form, a bare word, a
|
|
404
|
+
* resolution tag — classifies as `unknown`, never as human by default.
|
|
405
|
+
* `document/*` is likewise `unknown`: a document is evidence, not an
|
|
406
|
+
* authority class.
|
|
407
|
+
*/
|
|
233
408
|
function classifyActor(actor, source) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
409
|
+
const s = parseActorSource(source);
|
|
410
|
+
if (s.kind === 'namespaced') {
|
|
411
|
+
if (s.namespace === 'system' || s.namespace === 'institution')
|
|
412
|
+
return 'system';
|
|
413
|
+
if (s.namespace === 'agent')
|
|
414
|
+
return 'agent';
|
|
415
|
+
}
|
|
416
|
+
const a = parseActorSource(actor);
|
|
417
|
+
if (a.kind === 'namespaced' && a.namespace === 'agent')
|
|
237
418
|
return 'agent';
|
|
238
|
-
|
|
419
|
+
if (s.kind === 'manual')
|
|
420
|
+
return 'human';
|
|
421
|
+
return 'unknown';
|
|
239
422
|
}
|
|
240
423
|
function authorityAllows(authority, actor) {
|
|
241
424
|
switch (authority) {
|
|
425
|
+
// `unknown` passes `either`: refusing it would turn every legacy source in
|
|
426
|
+
// the wild into a POL-01, which is a migration, not a bug fix. It can
|
|
427
|
+
// never satisfy the three restricted classes below.
|
|
242
428
|
case 'either':
|
|
243
|
-
return actor
|
|
429
|
+
return actor !== 'system';
|
|
244
430
|
case 'agent_only':
|
|
245
431
|
return actor === 'agent';
|
|
246
432
|
case 'human_only':
|