attention-manifest-protocol 0.4.2 → 0.4.3
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/CHANGELOG.md +341 -293
- package/CHANGELOG.zh-CN.md +41 -8
- package/README.md +250 -171
- package/README.zh-CN.md +251 -171
- package/lib/assignment/assign.d.ts +102 -0
- package/lib/assignment/assign.js +556 -0
- package/lib/assignment/binding.d.ts +103 -0
- package/lib/assignment/binding.js +575 -0
- package/lib/assignment/errors.d.ts +14 -0
- package/lib/assignment/errors.js +16 -0
- package/lib/assignment/guards.d.ts +18 -0
- package/lib/assignment/guards.js +28 -0
- package/lib/assignment/index.d.ts +10 -0
- package/lib/assignment/index.js +10 -0
- package/lib/assignment/types.d.ts +169 -0
- package/lib/assignment/types.js +1 -0
- package/lib/attention/budget.d.ts +1 -1
- package/lib/attention/budget.js +31 -9
- package/lib/bayes/engine.js +2 -1
- package/lib/bayes/reliability.js +25 -10
- package/lib/boundary/frame.d.ts +10 -4
- package/lib/boundary/frame.js +346 -109
- package/lib/boundary/kinds.d.ts +11 -0
- package/lib/boundary/kinds.js +33 -0
- package/lib/boundary/refTable.d.ts +19 -9
- package/lib/boundary/refTable.js +128 -30
- package/lib/boundary/toolCall.d.ts +22 -10
- package/lib/boundary/toolCall.js +798 -97
- package/lib/concept/conceptBudget.js +10 -1
- package/lib/concurrency/idempotency.d.ts +4 -3
- package/lib/concurrency/idempotency.js +57 -13
- package/lib/concurrency/retry.js +18 -3
- package/lib/context/agentContext.d.ts +13 -0
- package/lib/context/agentContext.js +14 -1
- package/lib/context/ast.d.ts +4 -1
- package/lib/context/ast.js +13 -3
- package/lib/context/contentStore.js +22 -9
- package/lib/context/contextBuilder.d.ts +457 -0
- package/lib/context/contextBuilder.js +1395 -0
- package/lib/context/contextPackage.d.ts +214 -0
- package/lib/context/contextPackage.js +191 -0
- package/lib/context/index.d.ts +14 -3
- package/lib/context/index.js +9 -1
- package/lib/context/relevance.d.ts +171 -0
- package/lib/context/relevance.js +250 -0
- package/lib/context/workspaceDiff.d.ts +105 -0
- package/lib/context/workspaceDiff.js +238 -0
- package/lib/context/workspaceService.d.ts +236 -1
- package/lib/context/workspaceService.js +1501 -73
- package/lib/cooperation/collaboration.d.ts +9 -0
- package/lib/cooperation/session.d.ts +4 -4
- package/lib/cooperation/session.js +3 -3
- package/lib/database/adapter/filesystemStore.d.ts +145 -0
- package/lib/database/adapter/filesystemStore.js +321 -0
- package/lib/database/adapter/index.d.ts +2 -0
- package/lib/database/adapter/index.js +2 -0
- package/lib/database/adapter/workspaceSessionStore.d.ts +118 -0
- package/lib/database/adapter/workspaceSessionStore.js +120 -0
- package/lib/database/entity/fileGraph.d.ts +53 -0
- package/lib/database/entity/fileGraph.js +15 -0
- package/lib/database/entity/fileTree.d.ts +76 -0
- package/lib/database/entity/fileTree.js +39 -0
- package/lib/database/entity/hook.d.ts +29 -0
- package/lib/database/entity/hook.js +18 -0
- package/lib/database/entity/index.d.ts +4 -0
- package/lib/database/entity/index.js +4 -0
- package/lib/database/entity/workspaceSession.d.ts +53 -0
- package/lib/database/entity/workspaceSession.js +28 -0
- package/lib/database/repository/fileAnnotationRepository.d.ts +75 -0
- package/lib/database/repository/fileAnnotationRepository.js +109 -0
- package/lib/database/repository/fileGraphRepository.d.ts +188 -0
- package/lib/database/repository/fileGraphRepository.js +648 -0
- package/lib/database/repository/fileNodeRepository.d.ts +116 -0
- package/lib/database/repository/fileNodeRepository.js +263 -0
- package/lib/database/repository/fileOutlineRepository.d.ts +40 -0
- package/lib/database/repository/fileOutlineRepository.js +104 -0
- package/lib/database/repository/fileWriteRepository.d.ts +41 -0
- package/lib/database/repository/fileWriteRepository.js +93 -0
- package/lib/database/repository/hookRepository.d.ts +67 -0
- package/lib/database/repository/hookRepository.js +150 -0
- package/lib/database/repository/index.d.ts +7 -0
- package/lib/database/repository/index.js +7 -0
- package/lib/database/repository/workspaceSessionRepository.d.ts +134 -0
- package/lib/database/repository/workspaceSessionRepository.js +327 -0
- package/lib/database/service/database.d.ts +14 -0
- package/lib/database/service/database.js +21 -0
- package/lib/database/sql/schema.js +187 -0
- package/lib/database/store/database.js +6 -1
- package/lib/delegate/team.d.ts +5 -0
- package/lib/delegate/team.js +83 -20
- package/lib/discover/classify.d.ts +20 -0
- package/lib/discover/classify.js +85 -0
- package/lib/discover/host.d.ts +20 -0
- package/lib/discover/host.js +89 -0
- package/lib/discover/index.d.ts +11 -0
- package/lib/discover/index.js +11 -0
- package/lib/discover/kinds.d.ts +14 -0
- package/lib/discover/kinds.js +23 -0
- package/lib/discover/tree.d.ts +7 -0
- package/lib/discover/tree.js +432 -0
- package/lib/discover/types.d.ts +115 -0
- package/lib/discover/types.js +1 -0
- package/lib/error/boundaryRejection.d.ts +1 -1
- package/lib/evaluation/agreement.js +2 -2
- package/lib/execution/handles.js +6 -0
- package/lib/execution/pin.js +2 -2
- package/lib/file/cfb.d.ts +56 -0
- package/lib/file/cfb.js +396 -0
- package/lib/file/dependency.d.ts +151 -0
- package/lib/file/dependency.js +568 -0
- package/lib/file/directory.d.ts +34 -0
- package/lib/file/directory.js +141 -0
- package/lib/file/errors.d.ts +20 -0
- package/lib/file/errors.js +18 -0
- package/lib/file/exportGraph.d.ts +31 -0
- package/lib/file/exportGraph.js +554 -0
- package/lib/file/file.d.ts +40 -0
- package/lib/file/file.js +339 -0
- package/lib/file/importGraph.d.ts +121 -0
- package/lib/file/importGraph.js +1022 -0
- package/lib/file/index.d.ts +45 -0
- package/lib/file/index.js +30 -0
- package/lib/file/metadata.d.ts +66 -0
- package/lib/file/metadata.js +470 -0
- package/lib/file/path.d.ts +60 -0
- package/lib/file/path.js +259 -0
- package/lib/file/read.d.ts +168 -0
- package/lib/file/read.js +541 -0
- package/lib/file/runtime.d.ts +95 -0
- package/lib/file/runtime.js +150 -0
- package/lib/file/service.d.ts +227 -0
- package/lib/file/service.js +663 -0
- package/lib/file/syntaxTree.d.ts +7 -0
- package/lib/file/syntaxTree.js +38 -0
- package/lib/file/time.d.ts +38 -0
- package/lib/file/time.js +44 -0
- package/lib/file/tree.d.ts +53 -0
- package/lib/file/tree.js +417 -0
- package/lib/file/types.d.ts +371 -0
- package/lib/file/types.js +1 -0
- package/lib/file/write.d.ts +159 -0
- package/lib/file/write.js +1028 -0
- package/lib/file/zip.d.ts +35 -0
- package/lib/file/zip.js +349 -0
- package/lib/fingerprint/algorithm.d.ts +97 -0
- package/lib/fingerprint/algorithm.js +271 -0
- package/lib/fingerprint/bytes.d.ts +18 -0
- package/lib/fingerprint/bytes.js +31 -0
- package/lib/fingerprint/error.d.ts +73 -0
- package/lib/fingerprint/error.js +86 -0
- package/lib/fingerprint/file.d.ts +71 -0
- package/lib/fingerprint/file.js +254 -0
- package/lib/fingerprint/index.d.ts +37 -0
- package/lib/fingerprint/index.js +12 -0
- package/lib/fingerprint/json.d.ts +41 -0
- package/lib/fingerprint/json.js +94 -0
- package/lib/fingerprint/number.d.ts +32 -0
- package/lib/fingerprint/number.js +95 -0
- package/lib/fingerprint/policy.d.ts +54 -0
- package/lib/fingerprint/policy.js +50 -0
- package/lib/fingerprint/preimage.d.ts +84 -0
- package/lib/fingerprint/preimage.js +133 -0
- package/lib/fingerprint/raw.d.ts +26 -0
- package/lib/fingerprint/raw.js +45 -0
- package/lib/fingerprint/ref.d.ts +39 -0
- package/lib/fingerprint/ref.js +178 -0
- package/lib/fingerprint/text.d.ts +42 -0
- package/lib/fingerprint/text.js +155 -0
- package/lib/fingerprint/tree.d.ts +56 -0
- package/lib/fingerprint/tree.js +288 -0
- package/lib/fingerprint/verify.d.ts +20 -0
- package/lib/fingerprint/verify.js +99 -0
- package/lib/global/filesystem.d.ts +43 -0
- package/lib/global/filesystem.js +75 -0
- package/lib/global/index.d.ts +8 -0
- package/lib/global/index.js +8 -0
- package/lib/global/service.d.ts +51 -0
- package/lib/global/service.js +98 -0
- package/lib/governance/transport.js +18 -6
- package/lib/hook/ast.d.ts +29 -0
- package/lib/hook/ast.js +22 -0
- package/lib/hook/code.d.ts +55 -0
- package/lib/hook/code.js +47 -0
- package/lib/hook/dependency.d.ts +45 -0
- package/lib/hook/dependency.js +28 -0
- package/lib/hook/diff.d.ts +114 -0
- package/lib/hook/diff.js +327 -0
- package/lib/hook/exportation.d.ts +31 -0
- package/lib/hook/exportation.js +24 -0
- package/lib/hook/file.d.ts +44 -0
- package/lib/hook/file.js +154 -0
- package/lib/hook/importation.d.ts +33 -0
- package/lib/hook/importation.js +22 -0
- package/lib/hook/index.d.ts +30 -0
- package/lib/hook/index.js +23 -0
- package/lib/hook/outline.d.ts +35 -0
- package/lib/hook/outline.js +27 -0
- package/lib/hook/project.d.ts +65 -0
- package/lib/hook/project.js +217 -0
- package/lib/hook/types.d.ts +114 -0
- package/lib/hook/types.js +407 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.js +9 -0
- package/lib/lock/lease.js +28 -3
- package/lib/manifest/cardSign.d.ts +1 -1
- package/lib/manifest/cardSign.js +37 -7
- package/lib/manifest/federation.js +13 -6
- package/lib/manifest/trust.d.ts +2 -0
- package/lib/manifest/trust.js +27 -6
- package/lib/module/index.d.ts +4 -0
- package/lib/module/index.js +4 -0
- package/lib/module/mcp/client.js +21 -2
- package/lib/module/mcp/filesystemServer.d.ts +24 -0
- package/lib/module/mcp/filesystemServer.js +102 -0
- package/lib/module/mcp/http.js +32 -19
- package/lib/module/mcp/workspaceServer.js +20 -3
- package/lib/module/tool/filesystemExecutor.d.ts +18 -0
- package/lib/module/tool/filesystemExecutor.js +49 -0
- package/lib/module/tool/globalExecutor.d.ts +17 -0
- package/lib/module/tool/globalExecutor.js +39 -0
- package/lib/module/tool/globalFilesystemExecutor.d.ts +18 -0
- package/lib/module/tool/globalFilesystemExecutor.js +49 -0
- package/lib/module/tool/workspaceExecutor.d.ts +9 -0
- package/lib/module/tool/workspaceExecutor.js +16 -3
- package/lib/naming/aliases.d.ts +48 -0
- package/lib/naming/aliases.js +79 -0
- package/lib/naming/catalog.d.ts +117 -0
- package/lib/naming/catalog.js +108 -0
- package/lib/naming/grammar.d.ts +67 -0
- package/lib/naming/grammar.js +212 -0
- package/lib/naming/ids.d.ts +157 -0
- package/lib/naming/ids.js +119 -0
- package/lib/naming/index.d.ts +13 -0
- package/lib/naming/index.js +13 -0
- package/lib/outline/index.d.ts +9 -0
- package/lib/outline/index.js +8 -0
- package/lib/outline/office.d.ts +160 -0
- package/lib/outline/office.js +2375 -0
- package/lib/outline/officeBridge.d.ts +32 -0
- package/lib/outline/officeBridge.js +27 -0
- package/lib/outline/outline.d.ts +159 -0
- package/lib/outline/outline.js +837 -0
- package/lib/outline/outlineIndex.d.ts +97 -0
- package/lib/outline/outlineIndex.js +325 -0
- package/lib/outline/outlineKeywords.d.ts +59 -0
- package/lib/outline/outlineKeywords.js +143 -0
- package/lib/outline/outlineStrategies.d.ts +414 -0
- package/lib/outline/outlineStrategies.js +8324 -0
- package/lib/outline/reactOutline.d.ts +37 -0
- package/lib/outline/reactOutline.js +1070 -0
- package/lib/outline/shellOutline.d.ts +65 -0
- package/lib/outline/shellOutline.js +873 -0
- package/lib/outline/sqlOutline.d.ts +170 -0
- package/lib/outline/sqlOutline.js +1536 -0
- package/lib/outline/strategy.d.ts +46 -0
- package/lib/outline/strategy.js +1 -0
- package/lib/outline/types.d.ts +95 -0
- package/lib/outline/types.js +1 -0
- package/lib/outline/visualBasicOutline.d.ts +27 -0
- package/lib/outline/visualBasicOutline.js +750 -0
- package/lib/protocol/filesystem.d.ts +55 -0
- package/lib/protocol/filesystem.js +105 -0
- package/lib/protocol/global.d.ts +42 -0
- package/lib/protocol/global.js +63 -0
- package/lib/protocol/globalFilesystem.d.ts +40 -0
- package/lib/protocol/globalFilesystem.js +59 -0
- package/lib/protocol/index.d.ts +4 -0
- package/lib/protocol/index.js +4 -0
- package/lib/protocol/protocol.d.ts +4 -0
- package/lib/protocol/wire.js +5 -2
- package/lib/protocol/workspace.d.ts +305 -0
- package/lib/protocol/workspace.js +258 -0
- package/lib/receipt/receipt.d.ts +8 -0
- package/lib/registry/content.js +9 -3
- package/lib/runtime/kernelRuntime.js +9 -1
- package/lib/scenario/scenario.js +5 -4
- package/lib/semantic/canonical.d.ts +61 -0
- package/lib/semantic/canonical.js +135 -8
- package/lib/semantic/jsonValue.d.ts +31 -0
- package/lib/semantic/jsonValue.js +122 -0
- package/lib/semantic/sha256.js +3 -0
- package/lib/semantic/time.d.ts +14 -0
- package/lib/semantic/time.js +56 -0
- package/lib/session/context.d.ts +76 -0
- package/lib/session/context.js +419 -0
- package/lib/session/errors.d.ts +24 -0
- package/lib/session/errors.js +22 -0
- package/lib/session/identity.d.ts +24 -0
- package/lib/session/identity.js +56 -0
- package/lib/session/index.d.ts +14 -0
- package/lib/session/index.js +12 -0
- package/lib/session/registry.d.ts +130 -0
- package/lib/session/registry.js +908 -0
- package/lib/session/types.d.ts +227 -0
- package/lib/session/types.js +14 -0
- package/lib/structure/index.d.ts +1 -0
- package/lib/structure/index.js +1 -0
- package/lib/structure/trie.d.ts +88 -0
- package/lib/structure/trie.js +183 -0
- package/lib/syntax/byteIndex.d.ts +44 -0
- package/lib/syntax/byteIndex.js +148 -0
- package/lib/syntax/charset.d.ts +88 -0
- package/lib/syntax/charset.js +276 -0
- package/lib/syntax/index.d.ts +6 -0
- package/lib/syntax/index.js +5 -0
- package/lib/syntax/syntaxRegistry.d.ts +150 -0
- package/lib/syntax/syntaxRegistry.js +314 -0
- package/lib/syntax/syntaxTree.d.ts +106 -0
- package/lib/syntax/syntaxTree.js +668 -0
- package/lib/syntax/types.d.ts +15 -0
- package/lib/syntax/types.js +1 -0
- package/lib/types/common.d.ts +1 -1
- package/package.json +72 -193
- package/.editorconfig +0 -12
- package/.prettierignore +0 -17
- package/MCP-Token/347/250/216/344/270/216/344/270/213/344/270/200/344/273/243/345/267/245/345/205/267/345/215/217/350/256/256.html +0 -1763
- package/docs/annotation-campaign-A.csv +0 -54
- package/docs/annotation-campaign-B.csv +0 -54
- package/docs/annotation-campaign.csv +0 -54
- package/docs/eval/annotations-A.jsonl +0 -16
- package/docs/eval/annotations.json +0 -122
- package/docs/eval/recorded-labels.json +0 -12
- package/docs/eval/replay-cases.json +0 -14
- package/docs/eval/replay-labels-b.json +0 -14
- package/docs/examples/attention-request.json +0 -16
- package/docs/examples/checkpoint.json +0 -15
- package/docs/examples/claim.json +0 -66
- package/docs/examples/collaboration.json +0 -66
- package/docs/examples/concept-checkpoint.json +0 -15
- package/docs/examples/concept-prune-plan.json +0 -45
- package/docs/examples/federation.json +0 -126
- package/docs/examples/frame-chain.json +0 -77
- package/docs/examples/ledger-snapshot.json +0 -108
- package/docs/examples/manifest.json +0 -77
- package/docs/examples/message.json +0 -19
- package/docs/examples/other-model.json +0 -45
- package/docs/examples/plan.json +0 -50
- package/docs/examples/prune-plan.json +0 -48
- package/docs/examples/receipt.json +0 -22
- package/docs/examples/runtime-run.json +0 -573
- package/docs/examples/team.json +0 -66
- package/docs/examples/verb-note.json +0 -11
- package/docs/probes/bayes-scores.json +0 -1452
- package/docs/probes/calibration-imported.json +0 -141
- package/docs/probes/context-ast-deepseek.json +0 -1577
- package/docs/probes/deepseek-probe.json +0 -917
- package/docs/probes/eval-recorded-replay.json +0 -597
- package/docs/probes/eval-replay.json +0 -124
- package/docs/probes/eval-summary.json +0 -42
- package/docs/probes/runtime-eval.json +0 -4230
- package/docs/schemas/collaboration.schema.json +0 -73
- package/docs/schemas/common.schema.json +0 -125
- package/docs/schemas/compaction.schema.json +0 -121
- package/docs/schemas/concept-compaction.schema.json +0 -73
- package/docs/schemas/concept.schema.json +0 -97
- package/docs/schemas/epistemic.schema.json +0 -178
- package/docs/schemas/federation.schema.json +0 -66
- package/docs/schemas/frame.schema.json +0 -86
- package/docs/schemas/ledger-snapshot.schema.json +0 -30
- package/docs/schemas/manifest.schema.json +0 -169
- package/docs/schemas/message.schema.json +0 -41
- package/docs/schemas/plan.schema.json +0 -189
- package/docs/schemas/receipt.schema.json +0 -45
- package/docs/schemas/social.schema.json +0 -153
- package/docs/schemas/team.schema.json +0 -56
- package/docs/schemas/verb.schema.json +0 -120
- package/eslint.config.mts +0 -96
- package/index.html +0 -13
- package/lib/context/workspaceProtocol.d.ts +0 -30
- package/lib/context/workspaceProtocol.js +0 -49
- package/prettier.config.mts +0 -37
- package/public/favicon.svg +0 -1
- package/public/icons.svg +0 -24
- package/src/attention/attention.ts +0 -347
- package/src/attention/budget.ts +0 -72
- package/src/attention/cognition.ts +0 -519
- package/src/attention/index.ts +0 -8
- package/src/attention/interrupts.ts +0 -228
- package/src/attention/resource.ts +0 -316
- package/src/attention/social.ts +0 -217
- package/src/attention/socialTypes.ts +0 -115
- package/src/authz/authz.ts +0 -305
- package/src/authz/index.ts +0 -1
- package/src/bayes/calibration.ts +0 -204
- package/src/bayes/calibrationRegistry.ts +0 -111
- package/src/bayes/calibrationSelection.ts +0 -154
- package/src/bayes/engine.ts +0 -532
- package/src/bayes/index.ts +0 -6
- package/src/bayes/reliability.ts +0 -62
- package/src/bayes/scopedPriors.ts +0 -88
- package/src/boundary/frame.ts +0 -322
- package/src/boundary/ids.ts +0 -14
- package/src/boundary/index.ts +0 -12
- package/src/boundary/refTable.ts +0 -125
- package/src/boundary/toolCall.ts +0 -212
- package/src/concept/concept.ts +0 -75
- package/src/concept/conceptBudget.ts +0 -346
- package/src/concept/conceptBudgetTypes.ts +0 -79
- package/src/concept/index.ts +0 -3
- package/src/concurrency/idempotency.ts +0 -41
- package/src/concurrency/index.ts +0 -5
- package/src/concurrency/mutex.ts +0 -26
- package/src/concurrency/namedLocks.ts +0 -35
- package/src/concurrency/retry.ts +0 -50
- package/src/concurrency/worker.ts +0 -128
- package/src/context/agentContext.ts +0 -308
- package/src/context/ast.ts +0 -499
- package/src/context/contentStore.ts +0 -75
- package/src/context/context.ts +0 -65
- package/src/context/contextIndex.ts +0 -85
- package/src/context/document.ts +0 -137
- package/src/context/fileStorePath.ts +0 -14
- package/src/context/index.ts +0 -43
- package/src/context/lifecycle.ts +0 -221
- package/src/context/projections.ts +0 -151
- package/src/context/workspace.ts +0 -422
- package/src/context/workspaceProtocol.ts +0 -112
- package/src/context/workspaceService.ts +0 -423
- package/src/cooperation/board.ts +0 -104
- package/src/cooperation/collaboration.ts +0 -60
- package/src/cooperation/index.ts +0 -6
- package/src/cooperation/merge.ts +0 -190
- package/src/cooperation/metrics.ts +0 -57
- package/src/cooperation/session.ts +0 -131
- package/src/cooperation/unified.ts +0 -56
- package/src/counter.ts +0 -9
- package/src/database/adapter/adapters.ts +0 -35
- package/src/database/adapter/index.ts +0 -4
- package/src/database/adapter/runtimeSink.ts +0 -74
- package/src/database/adapter/sessionStore.ts +0 -32
- package/src/database/adapter/turnStore.ts +0 -23
- package/src/database/entity/agent.ts +0 -199
- package/src/database/entity/entity.ts +0 -1046
- package/src/database/entity/handle.ts +0 -79
- package/src/database/entity/index.ts +0 -32
- package/src/database/entity/message.ts +0 -74
- package/src/database/entity/meta.ts +0 -11
- package/src/database/entity/object.ts +0 -42
- package/src/database/entity/outbox.ts +0 -15
- package/src/database/entity/process.ts +0 -65
- package/src/database/entity/registry.ts +0 -155
- package/src/database/entity/runtimeApproval.ts +0 -30
- package/src/database/entity/runtimeSession.ts +0 -13
- package/src/database/entity/runtimeTurn.ts +0 -15
- package/src/database/entity/thread.ts +0 -85
- package/src/database/entity/window.ts +0 -85
- package/src/database/entity/worker.ts +0 -90
- package/src/database/index.ts +0 -6
- package/src/database/repository/addressSpaceRepository.ts +0 -72
- package/src/database/repository/agentRepository.ts +0 -460
- package/src/database/repository/base.ts +0 -41
- package/src/database/repository/executionRepository.ts +0 -477
- package/src/database/repository/handleRepository.ts +0 -64
- package/src/database/repository/index.ts +0 -20
- package/src/database/repository/messageRepository.ts +0 -52
- package/src/database/repository/objectRepository.ts +0 -69
- package/src/database/repository/outboxRepository.ts +0 -63
- package/src/database/repository/processRepository.ts +0 -58
- package/src/database/repository/registryRepository.ts +0 -119
- package/src/database/repository/repository.ts +0 -491
- package/src/database/repository/runtimeApprovalRepository.ts +0 -44
- package/src/database/repository/runtimeSessionRepository.ts +0 -27
- package/src/database/repository/runtimeTurnRepository.ts +0 -39
- package/src/database/repository/socialRepository.ts +0 -185
- package/src/database/repository/threadRepository.ts +0 -57
- package/src/database/repository/windowRepository.ts +0 -88
- package/src/database/repository/workerRepository.ts +0 -69
- package/src/database/service/database.ts +0 -90
- package/src/database/service/handleService.ts +0 -48
- package/src/database/service/index.ts +0 -16
- package/src/database/service/messageService.ts +0 -61
- package/src/database/service/objectService.ts +0 -59
- package/src/database/service/processService.ts +0 -61
- package/src/database/service/registryServices.ts +0 -88
- package/src/database/service/service.ts +0 -183
- package/src/database/service/stepService.ts +0 -53
- package/src/database/service/threadService.ts +0 -65
- package/src/database/service/windowService.ts +0 -30
- package/src/database/service/workerService.ts +0 -57
- package/src/database/sql/index.ts +0 -3
- package/src/database/sql/schema.ts +0 -418
- package/src/database/sql/sql.ts +0 -543
- package/src/database/store/database.ts +0 -210
- package/src/database/store/index.ts +0 -3
- package/src/database/store/store.ts +0 -266
- package/src/delegate/index.ts +0 -2
- package/src/delegate/team.ts +0 -268
- package/src/delegate/teamTypes.ts +0 -47
- package/src/diagnosis/checklist.ts +0 -74
- package/src/diagnosis/context.ts +0 -93
- package/src/diagnosis/frame.ts +0 -256
- package/src/diagnosis/index.ts +0 -5
- package/src/diagnosis/router.ts +0 -72
- package/src/diagnosis/types.ts +0 -89
- package/src/error/agentError.ts +0 -16
- package/src/error/ampError.ts +0 -20
- package/src/error/authzError.ts +0 -14
- package/src/error/boundaryRejection.ts +0 -20
- package/src/error/index.ts +0 -7
- package/src/error/kernelError.ts +0 -27
- package/src/error/mailboxError.ts +0 -9
- package/src/error/windowError.ts +0 -12
- package/src/evaluation/agreement.ts +0 -96
- package/src/evaluation/index.ts +0 -2
- package/src/evaluation/labels.ts +0 -241
- package/src/evidence/evidenceGraph.ts +0 -205
- package/src/evidence/index.ts +0 -4
- package/src/evidence/revalidation.ts +0 -191
- package/src/execution/exec.ts +0 -408
- package/src/execution/handles.ts +0 -65
- package/src/execution/index.ts +0 -3
- package/src/execution/pin.ts +0 -154
- package/src/frame/frame.ts +0 -70
- package/src/frame/index.ts +0 -1
- package/src/goal/goal.ts +0 -43
- package/src/goal/index.ts +0 -2
- package/src/goal/plan.ts +0 -196
- package/src/governance/attentionManifest.ts +0 -802
- package/src/governance/audit.ts +0 -362
- package/src/governance/budget.ts +0 -628
- package/src/governance/context.ts +0 -356
- package/src/governance/control.ts +0 -159
- package/src/governance/cooperation.ts +0 -479
- package/src/governance/credential.ts +0 -359
- package/src/governance/httpServer.ts +0 -99
- package/src/governance/index.ts +0 -32
- package/src/governance/legal.ts +0 -574
- package/src/governance/matrix.ts +0 -460
- package/src/governance/perspectives.ts +0 -406
- package/src/governance/signing.ts +0 -407
- package/src/governance/store.ts +0 -125
- package/src/governance/switching.ts +0 -459
- package/src/governance/toolPolicy.ts +0 -80
- package/src/governance/transport.ts +0 -204
- package/src/governance/types.ts +0 -380
- package/src/governance/workflow.ts +0 -743
- package/src/index.ts +0 -11
- package/src/interaction/index.ts +0 -1
- package/src/interaction/interaction.ts +0 -391
- package/src/ipc/index.ts +0 -4
- package/src/ipc/mailbox.ts +0 -132
- package/src/ipc/memorySocialStore.ts +0 -93
- package/src/ipc/social.ts +0 -93
- package/src/kernel/index.ts +0 -14
- package/src/kernel/scheduler.ts +0 -498
- package/src/ledger/checkpoint.ts +0 -304
- package/src/ledger/index.ts +0 -4
- package/src/ledger/ledger.ts +0 -31
- package/src/ledger/persistence.ts +0 -159
- package/src/ledger/share.ts +0 -80
- package/src/lock/index.ts +0 -2
- package/src/lock/lease.ts +0 -74
- package/src/main.ts +0 -199
- package/src/manifest/agentCard.ts +0 -72
- package/src/manifest/cardSign.ts +0 -87
- package/src/manifest/federation.ts +0 -237
- package/src/manifest/federationTypes.ts +0 -55
- package/src/manifest/index.ts +0 -8
- package/src/manifest/keys.ts +0 -643
- package/src/manifest/manifest.ts +0 -114
- package/src/manifest/sign.ts +0 -134
- package/src/manifest/trust.ts +0 -146
- package/src/mission/index.ts +0 -2
- package/src/mission/missionQueue.ts +0 -75
- package/src/module/index.ts +0 -9
- package/src/module/llm/deepseek.ts +0 -214
- package/src/module/llm/llm.ts +0 -84
- package/src/module/mcp/client.ts +0 -110
- package/src/module/mcp/http.ts +0 -102
- package/src/module/mcp/protocol.ts +0 -77
- package/src/module/mcp/server.ts +0 -148
- package/src/module/mcp/transport.ts +0 -30
- package/src/module/mcp/workspaceServer.ts +0 -111
- package/src/module/sandbox/sandbox.ts +0 -29
- package/src/module/tool/mcpExecutor.ts +0 -54
- package/src/module/tool/policy.ts +0 -52
- package/src/module/tool/redact.ts +0 -29
- package/src/module/tool/tool.ts +0 -53
- package/src/module/tool/workspaceExecutor.ts +0 -35
- package/src/policy/guard.ts +0 -240
- package/src/policy/index.ts +0 -2
- package/src/policy/policy.ts +0 -561
- package/src/process/agent.ts +0 -341
- package/src/process/agentService.ts +0 -236
- package/src/process/agentStore.ts +0 -378
- package/src/process/executionStore.ts +0 -151
- package/src/process/index.ts +0 -5
- package/src/process/process.ts +0 -240
- package/src/process/transitions.ts +0 -19
- package/src/progress/index.ts +0 -2
- package/src/progress/progress.ts +0 -85
- package/src/protocol/a2a.ts +0 -120
- package/src/protocol/channel.ts +0 -44
- package/src/protocol/envelope.ts +0 -655
- package/src/protocol/httpChannel.ts +0 -87
- package/src/protocol/index.ts +0 -6
- package/src/protocol/protocol.ts +0 -138
- package/src/protocol/wire.ts +0 -60
- package/src/receipt/index.ts +0 -1
- package/src/receipt/receipt.ts +0 -47
- package/src/registry/content.ts +0 -69
- package/src/registry/index.ts +0 -23
- package/src/registry/registry.ts +0 -599
- package/src/runtime/action.ts +0 -87
- package/src/runtime/behavior.ts +0 -330
- package/src/runtime/behaviorTuning.ts +0 -163
- package/src/runtime/cognitiveRuntime.ts +0 -703
- package/src/runtime/escalation.ts +0 -35
- package/src/runtime/governedTask.ts +0 -233
- package/src/runtime/index.ts +0 -15
- package/src/runtime/kernelRuntime.ts +0 -144
- package/src/runtime/operation.ts +0 -35
- package/src/runtime/replay.ts +0 -71
- package/src/runtime/routing.ts +0 -58
- package/src/runtime/safety.ts +0 -48
- package/src/runtime/session.ts +0 -341
- package/src/runtime/sessionStore.ts +0 -43
- package/src/runtime/telemetry.ts +0 -55
- package/src/runtime/turnStore.ts +0 -30
- package/src/scenario/index.ts +0 -1
- package/src/scenario/scenario.ts +0 -299
- package/src/semantic/canonical.ts +0 -24
- package/src/semantic/index.ts +0 -2
- package/src/semantic/sha256.ts +0 -82
- package/src/storage/appendLog.ts +0 -372
- package/src/storage/fileAppendSink.ts +0 -40
- package/src/storage/index.ts +0 -2
- package/src/store/bindCache.ts +0 -22
- package/src/store/cache.ts +0 -191
- package/src/store/context.ts +0 -31
- package/src/store/handleStore.ts +0 -31
- package/src/store/index.ts +0 -9
- package/src/store/messageStore.ts +0 -31
- package/src/store/objectStore.ts +0 -31
- package/src/store/processStore.ts +0 -31
- package/src/store/threadStore.ts +0 -31
- package/src/store/windowStore.ts +0 -31
- package/src/structure/abstractSyntaxTree.ts +0 -493
- package/src/structure/avlTree.ts +0 -408
- package/src/structure/binarySearchTree.ts +0 -352
- package/src/structure/binaryTree.ts +0 -525
- package/src/structure/bloomFilter.ts +0 -231
- package/src/structure/compare.ts +0 -110
- package/src/structure/cuckooFilter.ts +0 -337
- package/src/structure/deque.ts +0 -223
- package/src/structure/filterKey.ts +0 -36
- package/src/structure/hash.ts +0 -279
- package/src/structure/heap.ts +0 -268
- package/src/structure/index.ts +0 -20
- package/src/structure/iterator.ts +0 -22
- package/src/structure/lru.ts +0 -619
- package/src/structure/ordered.ts +0 -399
- package/src/structure/priority.ts +0 -915
- package/src/structure/queue.ts +0 -168
- package/src/structure/redBlackTree.ts +0 -680
- package/src/structure/segmentTree.ts +0 -248
- package/src/structure/stack.ts +0 -118
- package/src/structure/unordered.ts +0 -407
- package/src/style.css +0 -278
- package/src/thread/index.ts +0 -2
- package/src/thread/thread.ts +0 -176
- package/src/thread/transitions.ts +0 -17
- package/src/types/common.ts +0 -119
- package/src/types/index.ts +0 -23
- package/src/warrant/epistemic.ts +0 -154
- package/src/warrant/index.ts +0 -3
- package/src/warrant/inquiry.ts +0 -166
- package/src/warrant/warrant.ts +0 -179
- package/src/window/compaction.ts +0 -403
- package/src/window/compactionTypes.ts +0 -119
- package/src/window/index.ts +0 -7
- package/src/window/page.ts +0 -18
- package/src/window/window.ts +0 -244
- package/tools/_helpers.ts +0 -34
- package/tools/a2a-check.ts +0 -110
- package/tools/a2a-flow-check.ts +0 -78
- package/tools/agent-card-check.ts +0 -76
- package/tools/agent-check.ts +0 -236
- package/tools/agent-store-check.ts +0 -153
- package/tools/agreement-check.ts +0 -27
- package/tools/annotation-server-check.ts +0 -48
- package/tools/annotation-server.ts +0 -230
- package/tools/annotation-status.ts +0 -65
- package/tools/approval-access-check.ts +0 -66
- package/tools/arch-check.ts +0 -72
- package/tools/attention-core-check.ts +0 -48
- package/tools/attention-resource-check.ts +0 -169
- package/tools/audit-check.ts +0 -207
- package/tools/authority-check.ts +0 -124
- package/tools/authz-check.ts +0 -138
- package/tools/bayes-check.ts +0 -162
- package/tools/bayes-probe.ts +0 -154
- package/tools/behavior-tuning-check.ts +0 -53
- package/tools/board-check.ts +0 -87
- package/tools/boundary-check.ts +0 -199
- package/tools/bundle-trust-check.ts +0 -96
- package/tools/calibrate-imported.ts +0 -108
- package/tools/calibration-check.ts +0 -44
- package/tools/calibration-registry-check.ts +0 -40
- package/tools/calibration-sim.ts +0 -40
- package/tools/card-sign-check.ts +0 -71
- package/tools/card-trust-check.ts +0 -78
- package/tools/channel-check.ts +0 -86
- package/tools/checkpoint-check.ts +0 -620
- package/tools/cleanup-style-configs.ts +0 -29
- package/tools/cognition-check.ts +0 -648
- package/tools/cognitive-runtime-check.ts +0 -609
- package/tools/collaboration-demo.ts +0 -78
- package/tools/compaction-check.ts +0 -266
- package/tools/concept-check.ts +0 -260
- package/tools/concurrency-check.ts +0 -242
- package/tools/conformance-runtime.ts +0 -389
- package/tools/conformance.ts +0 -651
- package/tools/context-ast-check.ts +0 -90
- package/tools/context-ast-deepseek.ts +0 -242
- package/tools/context-graph-bench.ts +0 -50
- package/tools/context-graph-check.ts +0 -229
- package/tools/context-index-check.ts +0 -48
- package/tools/context-lifecycle-check.ts +0 -69
- package/tools/context-projection-check.ts +0 -73
- package/tools/context-scope-check.ts +0 -134
- package/tools/context-storage-check.ts +0 -113
- package/tools/cooperation-check.ts +0 -517
- package/tools/cooperation-http-check.ts +0 -125
- package/tools/deepseek-llm-check.ts +0 -147
- package/tools/deepseek-probe.ts +0 -494
- package/tools/diagnosis-check.ts +0 -109
- package/tools/diagnosis-router-check.ts +0 -50
- package/tools/document-context-check.ts +0 -237
- package/tools/envelope-check.ts +0 -659
- package/tools/eslint-rules/index.ts +0 -26
- package/tools/eslint-rules/rules/jsdoc-comment-format.ts +0 -105
- package/tools/eslint-rules/rules/no-function-keyword.ts +0 -60
- package/tools/eslint-rules/rules/no-multiline-parameters.ts +0 -71
- package/tools/eslint-rules/rules/no-multiline-type-parameters.ts +0 -57
- package/tools/eslint-rules/rules/no-undefined-comparison.ts +0 -115
- package/tools/eslint-rules/rules/prefer-template-for-string-conversion.ts +0 -97
- package/tools/eslint-rules/rules/require-typeof-parentheses.ts +0 -49
- package/tools/eslint-rules/rules/require-variable-type.ts +0 -36
- package/tools/eslint-rules/rules/variable-naming.ts +0 -175
- package/tools/eval-recorded-replay.ts +0 -215
- package/tools/eval-replay.ts +0 -139
- package/tools/eval-summary.ts +0 -136
- package/tools/evidence-revalidation-check.ts +0 -235
- package/tools/exec-check.ts +0 -217
- package/tools/federation-check.ts +0 -166
- package/tools/federation-demo.ts +0 -45
- package/tools/filter-check.ts +0 -243
- package/tools/governance-check.ts +0 -680
- package/tools/governance-store-check.ts +0 -131
- package/tools/governed-task-check.ts +0 -227
- package/tools/guard-check.ts +0 -122
- package/tools/http-channel-check.ts +0 -125
- package/tools/import-campaign.ts +0 -28
- package/tools/inquiry-check.ts +0 -126
- package/tools/interaction-check.ts +0 -171
- package/tools/interrupts-check.ts +0 -173
- package/tools/ipc-check.ts +0 -170
- package/tools/kernel-async-check.ts +0 -136
- package/tools/kernel-check.ts +0 -369
- package/tools/kernel-runtime-check.ts +0 -276
- package/tools/keys-check.ts +0 -559
- package/tools/label-audit.ts +0 -70
- package/tools/labels-workflow-check.ts +0 -49
- package/tools/linear-structure-check.ts +0 -524
- package/tools/live-exec.ts +0 -62
- package/tools/live-governance-eval.ts +0 -813
- package/tools/live-legacy.ts +0 -50
- package/tools/lru-check.ts +0 -182
- package/tools/make-annotation-campaign.ts +0 -57
- package/tools/mcp-executor-check.ts +0 -33
- package/tools/merge-annotations.ts +0 -32
- package/tools/merge-check.ts +0 -98
- package/tools/metrics-check.ts +0 -84
- package/tools/net-probe.ts +0 -107
- package/tools/oauth-probe.ts +0 -117
- package/tools/outbox-check.ts +0 -50
- package/tools/persistence-check.ts +0 -144
- package/tools/pin-check.ts +0 -116
- package/tools/platform-check.ts +0 -281
- package/tools/policy-check.ts +0 -514
- package/tools/prettier-plugin/index.mts +0 -84
- package/tools/priority-check.ts +0 -627
- package/tools/probe-context7.ts +0 -63
- package/tools/registry-check.ts +0 -252
- package/tools/reliability-check.ts +0 -25
- package/tools/retry-check.ts +0 -85
- package/tools/rewrite-declaration-extensions.ts +0 -98
- package/tools/runtime-check.ts +0 -165
- package/tools/runtime-deepseek-check.ts +0 -85
- package/tools/runtime-eval.ts +0 -358
- package/tools/scenario-check.ts +0 -161
- package/tools/scenario-incident.ts +0 -162
- package/tools/scoped-priors-check.ts +0 -35
- package/tools/scoped-priors-pooling.ts +0 -34
- package/tools/segment-ast-check.ts +0 -649
- package/tools/session-check.ts +0 -196
- package/tools/session-store-check.ts +0 -73
- package/tools/share-check.ts +0 -88
- package/tools/sign-check.ts +0 -95
- package/tools/signing-check.ts +0 -275
- package/tools/snapshot-demo.ts +0 -65
- package/tools/social-check.ts +0 -146
- package/tools/structure-compare-check.ts +0 -95
- package/tools/support/documentScanner.ts +0 -577
- package/tools/support/texScanner.ts +0 -631
- package/tools/support/workspaceScanner.ts +0 -476
- package/tools/team-check.ts +0 -163
- package/tools/team-demo.ts +0 -36
- package/tools/telemetry-check.ts +0 -44
- package/tools/tex-context-check.ts +0 -263
- package/tools/tool-gate-check.ts +0 -98
- package/tools/tree-structure-check.ts +0 -786
- package/tools/trust-flow-check.ts +0 -158
- package/tools/turn-store-check.ts +0 -57
- package/tools/unified-check.ts +0 -83
- package/tools/validate.ts +0 -309
- package/tools/wire-check.ts +0 -96
- package/tools/workspace-agent-check.ts +0 -486
- package/tools/workspace-agent-demo.ts +0 -62
- package/tools/workspace-agent-server.ts +0 -101
- package/tools/workspace-context-check.ts +0 -331
- package/tools/workspace-context.ts +0 -131
- package/tsconfig.build.json +0 -14
- package/tsconfig.json +0 -24
- package/tsconfig.tools.json +0 -31
- package/viz/context-ast.json +0 -1577
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Algorithm registry and the portable SHA-256 core.
|
|
3
|
+
*
|
|
4
|
+
* Two rules shape this file. First, the algorithm is named in every reference,
|
|
5
|
+
* so the registry is the only place that knows how long a digest is: parsing,
|
|
6
|
+
* formatting and comparison ask it instead of hard-coding "64 hex characters".
|
|
7
|
+
* Second, the module must stay dependency-free and behave identically in Node
|
|
8
|
+
* and the browser, so `node:crypto` is never imported here; `sha256` is a
|
|
9
|
+
* genuine incremental FIPS 180-4 implementation over raw bytes. `src/semantic/sha256.ts`
|
|
10
|
+
* remains the string-oriented implementation used by `canonical()`; this one
|
|
11
|
+
* hashes bytes so binary content cannot be rewritten by a UTF-8 encoder.
|
|
12
|
+
*
|
|
13
|
+
* The other identifiers are registered but carry no backend in this build. That
|
|
14
|
+
* is deliberate: a reference that names `sha512` must still parse and round-trip
|
|
15
|
+
* (its digest length is a property of the algorithm, not of this build), while
|
|
16
|
+
* asking for a digest raises `UnsupportedAlgorithm` rather than silently
|
|
17
|
+
* falling back to SHA-256.
|
|
18
|
+
*/
|
|
19
|
+
import { FingerprintError, UnsupportedAlgorithm } from "./error.js";
|
|
20
|
+
/**
|
|
21
|
+
* Declaration order is the canonical listing order; nothing in the module
|
|
22
|
+
* depends on iteration order, but diagnostics and future catalogues do.
|
|
23
|
+
*/
|
|
24
|
+
export const AlgorithmIds = ["sha256", "sha512", "sha3-256", "blake2b-512"];
|
|
25
|
+
const Algorithms = new Map([
|
|
26
|
+
["sha256", { id: "sha256", digestBytes: 32, backend: "portable" }],
|
|
27
|
+
["sha512", { id: "sha512", digestBytes: 64, backend: "unavailable" }],
|
|
28
|
+
["sha3-256", { id: "sha3-256", digestBytes: 32, backend: "unavailable" }],
|
|
29
|
+
["blake2b-512", { id: "blake2b-512", digestBytes: 64, backend: "unavailable" }],
|
|
30
|
+
]);
|
|
31
|
+
/**
|
|
32
|
+
* True for a value that is one of the four registered identifiers. Used by the
|
|
33
|
+
* parsers, which must reject an unknown algorithm instead of guessing.
|
|
34
|
+
*/
|
|
35
|
+
export const isAlgorithmId = (value) => Algorithms.has(value);
|
|
36
|
+
/**
|
|
37
|
+
* Look up a registered algorithm. A value that is syntactically fine but not
|
|
38
|
+
* registered is an `UnsupportedAlgorithm`, because at this point a hasher is
|
|
39
|
+
* required and there is nothing safe to substitute.
|
|
40
|
+
*/
|
|
41
|
+
export const algorithmSpec = (algorithm) => {
|
|
42
|
+
const spec = Algorithms.get(algorithm);
|
|
43
|
+
if (spec === (void 0)) {
|
|
44
|
+
throw new UnsupportedAlgorithm([`unknown algorithm "${algorithm}"; known: ${AlgorithmIds.join(", ")}`]);
|
|
45
|
+
}
|
|
46
|
+
return spec;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Expected lowercase-hex length of a digest for this algorithm. Both parsers
|
|
50
|
+
* use it so "wrong length" and "wrong algorithm" cannot be confused.
|
|
51
|
+
*/
|
|
52
|
+
export const digestHexLength = (algorithm) => algorithmSpec(algorithm).digestBytes * 2;
|
|
53
|
+
const HexDigits = "0123456789abcdef";
|
|
54
|
+
const HexMask = 0x0f;
|
|
55
|
+
const HexShift = 4;
|
|
56
|
+
/**
|
|
57
|
+
* Lowercase hex encoding. Lowercase is required by the OCI digest grammar and
|
|
58
|
+
* by every existing `sha256:` reference in this repository; emitting uppercase
|
|
59
|
+
* would create a second spelling of the same digest.
|
|
60
|
+
*/
|
|
61
|
+
export const bytesToHex = (bytes) => {
|
|
62
|
+
let out = "";
|
|
63
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
64
|
+
const byte = bytes[index];
|
|
65
|
+
out += `${HexDigits[byte >>> HexShift]}${HexDigits[byte & HexMask]}`;
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
};
|
|
69
|
+
const hexDigitValue = (code) => {
|
|
70
|
+
if (code >= 0x30 && code <= 0x39) {
|
|
71
|
+
return code - 0x30;
|
|
72
|
+
}
|
|
73
|
+
return code - 0x61 + 10;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Decode a hex digest back to bytes. Used by the tree leaf serialisation, which
|
|
77
|
+
* has to embed a child digest as 32 raw bytes.
|
|
78
|
+
*/
|
|
79
|
+
export const hexToBytes = (hex) => {
|
|
80
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
81
|
+
for (let index = 0; index < bytes.length; index += 1) {
|
|
82
|
+
const offset = index * 2;
|
|
83
|
+
bytes[index] = (hexDigitValue(hex.charCodeAt(offset)) << HexShift) | hexDigitValue(hex.charCodeAt(offset + 1));
|
|
84
|
+
}
|
|
85
|
+
return bytes;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Strict lowercase-hex check. Uppercase is rejected rather than folded, because
|
|
89
|
+
* `sha256:AB...` and `sha256:ab...` are different strings and a parser that
|
|
90
|
+
* accepts both silently creates two names for one digest.
|
|
91
|
+
*/
|
|
92
|
+
export const isLowerHex = (text, length) => {
|
|
93
|
+
if (text.length !== length) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
97
|
+
const code = text.charCodeAt(index);
|
|
98
|
+
const digit = (code >= 0x30 && code <= 0x39) || (code >= 0x61 && code <= 0x66);
|
|
99
|
+
if (!digit) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
};
|
|
105
|
+
const Sha256InitialState = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19];
|
|
106
|
+
const Sha256RoundConstants = new Uint32Array([
|
|
107
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74,
|
|
108
|
+
0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d,
|
|
109
|
+
0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e,
|
|
110
|
+
0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
|
111
|
+
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
112
|
+
]);
|
|
113
|
+
const WordCount = 64;
|
|
114
|
+
const BlockBytes = 64;
|
|
115
|
+
const DigestBytes = 32;
|
|
116
|
+
const PaddingBoundary = 56;
|
|
117
|
+
const HighBitDivisor = 0x20000000;
|
|
118
|
+
const rotr = (value, shift) => ((value >>> shift) | (value << (32 - shift))) >>> 0;
|
|
119
|
+
/**
|
|
120
|
+
* The FIPS 180-4 compression function for one 64-byte block.
|
|
121
|
+
*
|
|
122
|
+
* `words` is caller-provided scratch space so an incremental hasher does not
|
|
123
|
+
* allocate 64 words per block; `src/semantic/sha256.ts` keeps the same loop but
|
|
124
|
+
* reads from a padded copy of the whole input, which is exactly the 2x memory
|
|
125
|
+
* cost this module cannot afford for streamed files.
|
|
126
|
+
*/
|
|
127
|
+
const compressBlock = (state, block, words) => {
|
|
128
|
+
for (let index = 0; index < 16; index += 1) {
|
|
129
|
+
const offset = index * 4;
|
|
130
|
+
words[index] = ((block[offset] << 24) | (block[offset + 1] << 16) | (block[offset + 2] << 8) | block[offset + 3]) >>> 0;
|
|
131
|
+
}
|
|
132
|
+
for (let index = 16; index < WordCount; index += 1) {
|
|
133
|
+
const s0 = rotr(words[index - 15], 7) ^ rotr(words[index - 15], 18) ^ (words[index - 15] >>> 3);
|
|
134
|
+
const s1 = rotr(words[index - 2], 17) ^ rotr(words[index - 2], 19) ^ (words[index - 2] >>> 10);
|
|
135
|
+
words[index] = (words[index - 16] + s0 + words[index - 7] + s1) >>> 0;
|
|
136
|
+
}
|
|
137
|
+
let a = state[0];
|
|
138
|
+
let b = state[1];
|
|
139
|
+
let c = state[2];
|
|
140
|
+
let d = state[3];
|
|
141
|
+
let e = state[4];
|
|
142
|
+
let f = state[5];
|
|
143
|
+
let g = state[6];
|
|
144
|
+
let h = state[7];
|
|
145
|
+
for (let index = 0; index < WordCount; index += 1) {
|
|
146
|
+
const sigma1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
|
|
147
|
+
const choose = (e & f) ^ (~e & g);
|
|
148
|
+
const temp1 = (h + sigma1 + choose + Sha256RoundConstants[index] + words[index]) >>> 0;
|
|
149
|
+
const sigma0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
|
|
150
|
+
const majority = (a & b) ^ (a & c) ^ (b & c);
|
|
151
|
+
const temp2 = (sigma0 + majority) >>> 0;
|
|
152
|
+
h = g;
|
|
153
|
+
g = f;
|
|
154
|
+
f = e;
|
|
155
|
+
e = (d + temp1) >>> 0;
|
|
156
|
+
d = c;
|
|
157
|
+
c = b;
|
|
158
|
+
b = a;
|
|
159
|
+
a = (temp1 + temp2) >>> 0;
|
|
160
|
+
}
|
|
161
|
+
state[0] = (state[0] + a) >>> 0;
|
|
162
|
+
state[1] = (state[1] + b) >>> 0;
|
|
163
|
+
state[2] = (state[2] + c) >>> 0;
|
|
164
|
+
state[3] = (state[3] + d) >>> 0;
|
|
165
|
+
state[4] = (state[4] + e) >>> 0;
|
|
166
|
+
state[5] = (state[5] + f) >>> 0;
|
|
167
|
+
state[6] = (state[6] + g) >>> 0;
|
|
168
|
+
state[7] = (state[7] + h) >>> 0;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Portable incremental SHA-256 over raw bytes.
|
|
172
|
+
*
|
|
173
|
+
* The implementation tracks the total byte count separately from the buffered
|
|
174
|
+
* block because the FIPS padding needs the input length in bits; computing the
|
|
175
|
+
* final eight bytes from `totalBytes` (high = bits >> 32, low = low 32 bits)
|
|
176
|
+
* avoids the overflow a 32-bit byte counter would hit at 512 MiB.
|
|
177
|
+
*/
|
|
178
|
+
export const createSha256 = () => {
|
|
179
|
+
const state = new Uint32Array(Sha256InitialState);
|
|
180
|
+
const block = new Uint8Array(BlockBytes);
|
|
181
|
+
const words = new Uint32Array(WordCount);
|
|
182
|
+
let blockLength = 0;
|
|
183
|
+
let totalBytes = 0;
|
|
184
|
+
let finished = false;
|
|
185
|
+
const hasher = {
|
|
186
|
+
update: (bytes) => {
|
|
187
|
+
if (finished) {
|
|
188
|
+
throw new FingerprintError("hasher_finished", ["sha256 hasher already finalised; digest() is single-shot"]);
|
|
189
|
+
}
|
|
190
|
+
if (!(bytes instanceof Uint8Array)) {
|
|
191
|
+
throw new TypeError(`sha256 hasher accepts Uint8Array, received ${typeof (bytes)}`);
|
|
192
|
+
}
|
|
193
|
+
totalBytes += bytes.length;
|
|
194
|
+
let offset = 0;
|
|
195
|
+
if (blockLength > 0) {
|
|
196
|
+
const taken = Math.min(BlockBytes - blockLength, bytes.length);
|
|
197
|
+
block.set(bytes.subarray(0, taken), blockLength);
|
|
198
|
+
blockLength += taken;
|
|
199
|
+
offset += taken;
|
|
200
|
+
if (blockLength === BlockBytes) {
|
|
201
|
+
compressBlock(state, block, words);
|
|
202
|
+
blockLength = 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
while (offset + BlockBytes <= bytes.length) {
|
|
206
|
+
compressBlock(state, bytes.subarray(offset, offset + BlockBytes), words);
|
|
207
|
+
offset += BlockBytes;
|
|
208
|
+
}
|
|
209
|
+
if (offset < bytes.length) {
|
|
210
|
+
block.set(bytes.subarray(offset), 0);
|
|
211
|
+
blockLength = bytes.length - offset;
|
|
212
|
+
}
|
|
213
|
+
return hasher;
|
|
214
|
+
},
|
|
215
|
+
digest: () => {
|
|
216
|
+
if (finished) {
|
|
217
|
+
throw new FingerprintError("hasher_finished", ["sha256 hasher already finalised; digest() is single-shot"]);
|
|
218
|
+
}
|
|
219
|
+
finished = true;
|
|
220
|
+
const tail = new Uint8Array(blockLength < PaddingBoundary ? BlockBytes : BlockBytes * 2);
|
|
221
|
+
tail.set(block.subarray(0, blockLength));
|
|
222
|
+
tail[blockLength] = 0x80;
|
|
223
|
+
const highBits = Math.floor(totalBytes / HighBitDivisor);
|
|
224
|
+
const lowBits = (totalBytes % HighBitDivisor) * 8;
|
|
225
|
+
const view = new DataView(tail.buffer);
|
|
226
|
+
view.setUint32(tail.length - 8, highBits);
|
|
227
|
+
view.setUint32(tail.length - 4, lowBits);
|
|
228
|
+
for (let offset = 0; offset < tail.length; offset += BlockBytes) {
|
|
229
|
+
compressBlock(state, tail.subarray(offset, offset + BlockBytes), words);
|
|
230
|
+
}
|
|
231
|
+
const digest = new Uint8Array(DigestBytes);
|
|
232
|
+
const digestView = new DataView(digest.buffer);
|
|
233
|
+
for (let index = 0; index < DigestBytes / 4; index += 1) {
|
|
234
|
+
digestView.setUint32(index * 4, state[index]);
|
|
235
|
+
}
|
|
236
|
+
return digest;
|
|
237
|
+
},
|
|
238
|
+
};
|
|
239
|
+
return hasher;
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* One-shot SHA-256 over raw bytes. Thin wrapper so call sites do not repeat the
|
|
243
|
+
* create/update/digest sequence and cannot forget the update.
|
|
244
|
+
*/
|
|
245
|
+
export const sha256Bytes = (bytes) => createSha256().update(bytes).digest();
|
|
246
|
+
/**
|
|
247
|
+
* Fail closed unless this build can actually compute the named algorithm.
|
|
248
|
+
*
|
|
249
|
+
* The registry must answer before any payload is touched: a caller that gets a
|
|
250
|
+
* hasher is entitled to assume the algorithm in the reference is the algorithm
|
|
251
|
+
* that ran. The same guard is called by the file layer before it opens a file,
|
|
252
|
+
* so an unsupported algorithm fails without a pointless read instead of after
|
|
253
|
+
* the work has already been done.
|
|
254
|
+
*/
|
|
255
|
+
export const assertBackend = (algorithm) => {
|
|
256
|
+
const spec = algorithmSpec(algorithm);
|
|
257
|
+
if (spec.backend !== "portable" || spec.id !== "sha256") {
|
|
258
|
+
throw new UnsupportedAlgorithm([`algorithm "${algorithm}" has no backend in this dependency-free build; only sha256 is available`]);
|
|
259
|
+
}
|
|
260
|
+
return spec;
|
|
261
|
+
};
|
|
262
|
+
/**
|
|
263
|
+
* Construct a hasher for any registered algorithm, or fail closed.
|
|
264
|
+
*
|
|
265
|
+
* Kept as a thin wrapper over `assertBackend` so the availability rule lives in
|
|
266
|
+
* exactly one place.
|
|
267
|
+
*/
|
|
268
|
+
export const createHasher = (algorithm) => {
|
|
269
|
+
assertBackend(algorithm);
|
|
270
|
+
return createSha256();
|
|
271
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AlgorithmId } from "./algorithm.js";
|
|
2
|
+
import type { Fingerprint } from "./preimage.js";
|
|
3
|
+
/**
|
|
4
|
+
* Option shape for `fingerprintBytes`. SHA-256 is the only backend in this
|
|
5
|
+
* build; the other registered ids raise `UnsupportedAlgorithm` rather than
|
|
6
|
+
* falling back silently.
|
|
7
|
+
*/
|
|
8
|
+
export interface BytesFingerprintOptions {
|
|
9
|
+
readonly algorithm?: AlgorithmId;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Fingerprint a byte sequence under the `bytes/raw` policy.
|
|
13
|
+
*
|
|
14
|
+
* The `bytes` field of the returned reference is the exact payload length, and
|
|
15
|
+
* `digest` is the CAS-compatible `sha256:<hex>` spelling so callers can keep
|
|
16
|
+
* storing it in the existing content stores unchanged.
|
|
17
|
+
*/
|
|
18
|
+
export declare const fingerprintBytes: (bytes: Uint8Array, options?: BytesFingerprintOptions) => Fingerprint;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw byte fingerprints.
|
|
3
|
+
*
|
|
4
|
+
* This is the primitive every other content kind reduces to: text, JSON and
|
|
5
|
+
* files all end up as a `Uint8Array` and then as a header plus payload. Its one
|
|
6
|
+
* rule is that the bytes are hashed exactly as given 鈥?no decoding, no newline
|
|
7
|
+
* folding, no charset guessing. That is what makes `0x80` and `0x81` different
|
|
8
|
+
* fingerprints, which the legacy `readFile(path, "utf8")` path got wrong (both
|
|
9
|
+
* decode to U+FFFD and collided).
|
|
10
|
+
*/
|
|
11
|
+
import { isAlgorithmId } from "./algorithm.js";
|
|
12
|
+
import { UnsupportedAlgorithm } from "./error.js";
|
|
13
|
+
import { Policy } from "./policy.js";
|
|
14
|
+
import { fingerprintPayload } from "./preimage.js";
|
|
15
|
+
/**
|
|
16
|
+
* Fingerprint a byte sequence under the `bytes/raw` policy.
|
|
17
|
+
*
|
|
18
|
+
* The `bytes` field of the returned reference is the exact payload length, and
|
|
19
|
+
* `digest` is the CAS-compatible `sha256:<hex>` spelling so callers can keep
|
|
20
|
+
* storing it in the existing content stores unchanged.
|
|
21
|
+
*/
|
|
22
|
+
export const fingerprintBytes = (bytes, options) => {
|
|
23
|
+
if (!(bytes instanceof Uint8Array)) {
|
|
24
|
+
throw new TypeError(`fingerprintBytes expects a Uint8Array, received ${typeof (bytes)}`);
|
|
25
|
+
}
|
|
26
|
+
const algorithm = options?.algorithm ?? "sha256";
|
|
27
|
+
if (!isAlgorithmId(algorithm)) {
|
|
28
|
+
throw new UnsupportedAlgorithm([`unknown algorithm "${algorithm}"; known: sha256, sha512, sha3-256, blake2b-512`]);
|
|
29
|
+
}
|
|
30
|
+
return fingerprintPayload(algorithm, "bytes", Policy.bytesRaw, bytes);
|
|
31
|
+
};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The failure taxonomy of the fingerprint module.
|
|
3
|
+
*
|
|
4
|
+
* A caller has to be able to tell four situations apart: the algorithm is not
|
|
5
|
+
* available in this build, the kind is outside the frozen set, the chosen
|
|
6
|
+
* policy refused the input, or a comparison failed. Treating them as one
|
|
7
|
+
* generic error forces the caller either to swallow an integrity failure or to
|
|
8
|
+
* retry a permanent bug, so the code is part of the contract and not just a
|
|
9
|
+
* diagnostic string. The base class mirrors `src/error/ampError.ts`: one
|
|
10
|
+
* machine-readable code plus every problem found in the same attempt.
|
|
11
|
+
*/
|
|
12
|
+
import { AmpError } from "../error/ampError.js";
|
|
13
|
+
/**
|
|
14
|
+
* Stable machine-readable reasons; callers may switch on these.
|
|
15
|
+
*/
|
|
16
|
+
export type FingerprintErrorCode = "unsupported_algorithm" | "unsupported_kind" | "unsupported_policy" | "normalization_rejected" | "fingerprint_mismatch" | "fingerprint_io_error" | "invalid_ref" | "hasher_finished";
|
|
17
|
+
/**
|
|
18
|
+
* Base class for every rejection this module raises.
|
|
19
|
+
*
|
|
20
|
+
* `problems` is plural because one input can violate several rules at once and
|
|
21
|
+
* a caller should see all of them, exactly like the boundary rejections in
|
|
22
|
+
* `src/error/boundaryRejection.ts`. The `name` parameter exists only so the
|
|
23
|
+
* subclasses below can keep `error.name` useful when they call `super`.
|
|
24
|
+
*/
|
|
25
|
+
export declare class FingerprintError extends AmpError {
|
|
26
|
+
constructor(code: FingerprintErrorCode, problems: readonly string[], name?: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The algorithm id is not registered, or it is registered but this build has no
|
|
30
|
+
* backend for it. Never downgraded to SHA-256: a silent fallback would make the
|
|
31
|
+
* algorithm name in the reference a lie.
|
|
32
|
+
*/
|
|
33
|
+
export declare class UnsupportedAlgorithm extends FingerprintError {
|
|
34
|
+
constructor(problems: readonly string[]);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The kind is outside the frozen `FingerprintKind` set, so no preimage header
|
|
38
|
+
* could be built without inventing a field the verifier does not know.
|
|
39
|
+
*/
|
|
40
|
+
export declare class UnsupportedKind extends FingerprintError {
|
|
41
|
+
constructor(problems: readonly string[]);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A policy refused the input: a lone surrogate, `-0`, a non-finite number,
|
|
45
|
+
* invalid UTF-8, a NUL inside `text`. Retrying with the same arguments cannot
|
|
46
|
+
* succeed, which is what separates this from an I/O failure.
|
|
47
|
+
*/
|
|
48
|
+
export declare class NormalizationRejected extends FingerprintError {
|
|
49
|
+
constructor(problems: readonly string[]);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Two references that should describe the same value do not. Both references
|
|
53
|
+
* are in the message because a bare "digest mismatch" cannot be debugged from
|
|
54
|
+
* a log line.
|
|
55
|
+
*/
|
|
56
|
+
export declare class FingerprintMismatch extends FingerprintError {
|
|
57
|
+
constructor(problems: readonly string[]);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The file system refused the read: missing path, directory where a file was
|
|
61
|
+
* expected, a symlink the caller may not follow, or a file that changed size
|
|
62
|
+
* while it was being streamed.
|
|
63
|
+
*/
|
|
64
|
+
export declare class FingerprintIOError extends FingerprintError {
|
|
65
|
+
constructor(problems: readonly string[]);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Render an unknown thrown value for a diagnostic. `String(error)` is avoided
|
|
69
|
+
* on purpose: it turns a thrown object into `[object Object]`, while the
|
|
70
|
+
* `message` of a Node system error (`ENOENT: no such file ...`) is the part a
|
|
71
|
+
* human needs.
|
|
72
|
+
*/
|
|
73
|
+
export declare const describeError: (error: unknown) => string;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The failure taxonomy of the fingerprint module.
|
|
3
|
+
*
|
|
4
|
+
* A caller has to be able to tell four situations apart: the algorithm is not
|
|
5
|
+
* available in this build, the kind is outside the frozen set, the chosen
|
|
6
|
+
* policy refused the input, or a comparison failed. Treating them as one
|
|
7
|
+
* generic error forces the caller either to swallow an integrity failure or to
|
|
8
|
+
* retry a permanent bug, so the code is part of the contract and not just a
|
|
9
|
+
* diagnostic string. The base class mirrors `src/error/ampError.ts`: one
|
|
10
|
+
* machine-readable code plus every problem found in the same attempt.
|
|
11
|
+
*/
|
|
12
|
+
import { AmpError } from "../error/ampError.js";
|
|
13
|
+
/**
|
|
14
|
+
* Base class for every rejection this module raises.
|
|
15
|
+
*
|
|
16
|
+
* `problems` is plural because one input can violate several rules at once and
|
|
17
|
+
* a caller should see all of them, exactly like the boundary rejections in
|
|
18
|
+
* `src/error/boundaryRejection.ts`. The `name` parameter exists only so the
|
|
19
|
+
* subclasses below can keep `error.name` useful when they call `super`.
|
|
20
|
+
*/
|
|
21
|
+
export class FingerprintError extends AmpError {
|
|
22
|
+
constructor(code, problems, name = "FingerprintError") {
|
|
23
|
+
super(name, code, problems);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The algorithm id is not registered, or it is registered but this build has no
|
|
28
|
+
* backend for it. Never downgraded to SHA-256: a silent fallback would make the
|
|
29
|
+
* algorithm name in the reference a lie.
|
|
30
|
+
*/
|
|
31
|
+
export class UnsupportedAlgorithm extends FingerprintError {
|
|
32
|
+
constructor(problems) {
|
|
33
|
+
super("unsupported_algorithm", problems, "UnsupportedAlgorithm");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The kind is outside the frozen `FingerprintKind` set, so no preimage header
|
|
38
|
+
* could be built without inventing a field the verifier does not know.
|
|
39
|
+
*/
|
|
40
|
+
export class UnsupportedKind extends FingerprintError {
|
|
41
|
+
constructor(problems) {
|
|
42
|
+
super("unsupported_kind", problems, "UnsupportedKind");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A policy refused the input: a lone surrogate, `-0`, a non-finite number,
|
|
47
|
+
* invalid UTF-8, a NUL inside `text`. Retrying with the same arguments cannot
|
|
48
|
+
* succeed, which is what separates this from an I/O failure.
|
|
49
|
+
*/
|
|
50
|
+
export class NormalizationRejected extends FingerprintError {
|
|
51
|
+
constructor(problems) {
|
|
52
|
+
super("normalization_rejected", problems, "NormalizationRejected");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Two references that should describe the same value do not. Both references
|
|
57
|
+
* are in the message because a bare "digest mismatch" cannot be debugged from
|
|
58
|
+
* a log line.
|
|
59
|
+
*/
|
|
60
|
+
export class FingerprintMismatch extends FingerprintError {
|
|
61
|
+
constructor(problems) {
|
|
62
|
+
super("fingerprint_mismatch", problems, "FingerprintMismatch");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The file system refused the read: missing path, directory where a file was
|
|
67
|
+
* expected, a symlink the caller may not follow, or a file that changed size
|
|
68
|
+
* while it was being streamed.
|
|
69
|
+
*/
|
|
70
|
+
export class FingerprintIOError extends FingerprintError {
|
|
71
|
+
constructor(problems) {
|
|
72
|
+
super("fingerprint_io_error", problems, "FingerprintIOError");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Render an unknown thrown value for a diagnostic. `String(error)` is avoided
|
|
77
|
+
* on purpose: it turns a thrown object into `[object Object]`, while the
|
|
78
|
+
* `message` of a Node system error (`ENOENT: no such file ...`) is the part a
|
|
79
|
+
* human needs.
|
|
80
|
+
*/
|
|
81
|
+
export const describeError = (error) => {
|
|
82
|
+
if (error instanceof Error) {
|
|
83
|
+
return error.message;
|
|
84
|
+
}
|
|
85
|
+
return `${error}`;
|
|
86
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AlgorithmId } from "./algorithm.js";
|
|
2
|
+
import type { Fingerprint } from "./preimage.js";
|
|
3
|
+
/**
|
|
4
|
+
* How the octets are turned into a payload. `bytes` hashes them verbatim;
|
|
5
|
+
* `text` decodes strictly, then applies `text/utf8+nfc+lf`, so a line-ending or
|
|
6
|
+
* BOM change does not change the digest while invalid UTF-8 does.
|
|
7
|
+
*/
|
|
8
|
+
export type FileFingerprintMode = "bytes" | "text";
|
|
9
|
+
/**
|
|
10
|
+
* Option shape for `fingerprintFile`.
|
|
11
|
+
*
|
|
12
|
+
* `chunkBytes` exists for tests and for callers that already read in a fixed
|
|
13
|
+
* block size; it must not change the digest, which the check verifies with 1,
|
|
14
|
+
* 7 and 1 MiB chunks.
|
|
15
|
+
*/
|
|
16
|
+
export interface FileFingerprintOptions {
|
|
17
|
+
readonly algorithm?: AlgorithmId;
|
|
18
|
+
readonly mode?: FileFingerprintMode;
|
|
19
|
+
readonly chunkBytes?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A file fingerprint plus the on-disk size.
|
|
23
|
+
*
|
|
24
|
+
* `size` is the file's byte length; `ref.bytes` is the payload that was hashed.
|
|
25
|
+
* They are equal for `mode: "bytes"` and differ for `mode: "text"` when
|
|
26
|
+
* normalisation changes the UTF-8 length (for example, CRLF folding), which is
|
|
27
|
+
* why both numbers are reported instead of one.
|
|
28
|
+
*/
|
|
29
|
+
export interface FileFingerprint extends Fingerprint {
|
|
30
|
+
readonly size: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate the chunk size once, in one place, so a zero or negative value fails
|
|
34
|
+
* before a file is opened instead of producing an infinite loop of zero-byte
|
|
35
|
+
* reads.
|
|
36
|
+
*/
|
|
37
|
+
export declare const resolveChunkBytes: (value: number | undefined) => number;
|
|
38
|
+
/**
|
|
39
|
+
* Fingerprint a file's content.
|
|
40
|
+
*
|
|
41
|
+
* `mode: "bytes"` hashes the octets (`file/bytes+chunked`). `mode: "text"`
|
|
42
|
+
* decodes strictly, applies the `text/utf8+nfc+lf` normalisation and hashes the
|
|
43
|
+
* re-encoded payload (`file/text+nfc`); invalid UTF-8 is `NormalizationRejected`,
|
|
44
|
+
* never U+FFFD. Text mode has to hold the decoded string because Unicode
|
|
45
|
+
* normalisation can join characters across chunk boundaries; the read itself is
|
|
46
|
+
* still streamed, and the payload is only re-encoded once.
|
|
47
|
+
*/
|
|
48
|
+
export declare const fingerprintFile: (path: string, options?: FileFingerprintOptions) => Promise<FileFingerprint>;
|
|
49
|
+
/**
|
|
50
|
+
* Weak change-detection fingerprint of a file's metadata: `size\0mtimeNs`.
|
|
51
|
+
*
|
|
52
|
+
* This is **not an integrity fingerprint**. It cannot distinguish two files of
|
|
53
|
+
* the same size and the same nanosecond mtime, it says nothing about content,
|
|
54
|
+
* and both fields are attacker-controlled (a caller can set mtime with
|
|
55
|
+
* `utimes`). It exists for cache invalidation and "did this path change since
|
|
56
|
+
* the last sweep" decisions; use `fingerprintFile` when the question is whether
|
|
57
|
+
* the content is the same. It follows symlinks, unlike the content
|
|
58
|
+
* fingerprints, because it describes the object a path currently resolves to.
|
|
59
|
+
*
|
|
60
|
+
* The `bytes` field counts the metadata payload, not the file size —the file
|
|
61
|
+
* size is embedded verbatim in the payload (`size\0mtimeNs`) so a reader can
|
|
62
|
+
* recover it from the preimage description.
|
|
63
|
+
*/
|
|
64
|
+
export declare const fingerprintFileMeta: (path: string) => Promise<Fingerprint>;
|
|
65
|
+
/**
|
|
66
|
+
* Content digest of a regular file as bare lowercase hex, with no preimage
|
|
67
|
+
* header. Used by `tree.ts`, whose leaf serialisation embeds a child digest as
|
|
68
|
+
* 32 raw bytes; the file's own type and mode are bound by the leaf, so a second
|
|
69
|
+
* header here would only add a field the tree format does not define.
|
|
70
|
+
*/
|
|
71
|
+
export declare const fileContentDigest: (path: string, expectedSize: number, chunkBytes: number) => string;
|