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,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook layer contracts for the agent workspace.
|
|
3
|
+
*
|
|
4
|
+
* A hook is the composition layer between a host/UI and one bound filesystem
|
|
5
|
+
* session. It owns three things that a raw service call does not:
|
|
6
|
+
*
|
|
7
|
+
* - a small observable state machine (`idle`/`loading`/`ready`/`error`) so a
|
|
8
|
+
* caller can render progress without inventing its own flags;
|
|
9
|
+
* - a run journal (`HookRunEntry`) that is persisted through an injected
|
|
10
|
+
* `HookRecorder`, which is how the SQLite `hook_runs` table is fed;
|
|
11
|
+
* - an optional bounded cache keyed by the canonical request, so a read whose
|
|
12
|
+
* request is unchanged can avoid repeating the work.
|
|
13
|
+
*
|
|
14
|
+
* The layer is deliberately read-heavy: every hook except `useWrite` delegates
|
|
15
|
+
* to a read-only session method. `useWrite` is the single mutating hook and it
|
|
16
|
+
* forwards one `WriteRequest` to `FilesystemSession.write`; it never writes on
|
|
17
|
+
* its own and it disables the cache, because replaying a mutation from cache
|
|
18
|
+
* would make "write once" indistinguishable from "do nothing".
|
|
19
|
+
*/
|
|
20
|
+
import { Buffer } from "node:buffer";
|
|
21
|
+
import { createHash } from "node:crypto";
|
|
22
|
+
import { isFilesystemError } from "../file/errors.js";
|
|
23
|
+
import { canonical, digestOf } from "../semantic/canonical.js";
|
|
24
|
+
import { isSessionError } from "../session/errors.js";
|
|
25
|
+
import { LRUOrderedMap } from "../structure/lru.js";
|
|
26
|
+
/**
|
|
27
|
+
* Default cache capacity and its hard ceiling. A hook result can be a whole
|
|
28
|
+
* outline, so the default is intentionally small.
|
|
29
|
+
*/
|
|
30
|
+
const DefaultCacheEntries = 32;
|
|
31
|
+
const MaxCacheEntries = 256;
|
|
32
|
+
/**
|
|
33
|
+
* Convert an arbitrary request/output into a value `digestOf` can canonicalise.
|
|
34
|
+
*
|
|
35
|
+
* `canonical` rejects `bigint`, `Uint8Array` and `undefined`, all of which
|
|
36
|
+
* occur in filesystem results and write requests. The conversion is for audit
|
|
37
|
+
* only: it must be deterministic, not reversible.
|
|
38
|
+
*/
|
|
39
|
+
const digestable = (value) => {
|
|
40
|
+
if (value === null) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const kind = typeof (value);
|
|
44
|
+
if (kind === "string" || kind === "number" || kind === "boolean") {
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
if (kind === "bigint") {
|
|
48
|
+
return `${value}`;
|
|
49
|
+
}
|
|
50
|
+
if (value === (void 0)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (value instanceof Uint8Array) {
|
|
54
|
+
return { encoding: "base64", bytes: Buffer.from(value).toString("base64") };
|
|
55
|
+
}
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
return value.map((entry) => digestable(entry));
|
|
58
|
+
}
|
|
59
|
+
if (kind === "object") {
|
|
60
|
+
const source = value;
|
|
61
|
+
const target = {};
|
|
62
|
+
const keys = Object.keys(source);
|
|
63
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
64
|
+
const key = keys[index];
|
|
65
|
+
const entry = source[key];
|
|
66
|
+
if (entry === (void 0)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
target[key] = digestable(entry);
|
|
70
|
+
}
|
|
71
|
+
return target;
|
|
72
|
+
}
|
|
73
|
+
return "<unsupported>";
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Digest of an arbitrary value, falling back to a constant when a caller passes
|
|
77
|
+
* something canonical JSON cannot express. The fallback keeps the run entry
|
|
78
|
+
* well-formed instead of failing the operation it is supposed to audit.
|
|
79
|
+
*/
|
|
80
|
+
const safeDigest = (value) => {
|
|
81
|
+
try {
|
|
82
|
+
return digestOf(digestable(value));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return digestOf({ digest: "unavailable" });
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* SHA-256 of the canonical request, used as the cache key. An uncanonicalisable
|
|
90
|
+
* request yields an empty key, which the runtime treats as "do not cache".
|
|
91
|
+
*/
|
|
92
|
+
const cacheKeyOf = (request) => {
|
|
93
|
+
try {
|
|
94
|
+
const text = canonical(digestable(request));
|
|
95
|
+
return createHash("sha256").update(text, "utf8").digest("hex");
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return "";
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Translate an unknown thrown value into the closed hook error surface.
|
|
103
|
+
*/
|
|
104
|
+
const mapHookError = (error) => {
|
|
105
|
+
if (isFilesystemError(error)) {
|
|
106
|
+
return error.code;
|
|
107
|
+
}
|
|
108
|
+
if (isSessionError(error)) {
|
|
109
|
+
if (error.code === "invalid_arguments") {
|
|
110
|
+
return "invalid_arguments";
|
|
111
|
+
}
|
|
112
|
+
if (error.code === "invalid_identity" || error.code === "session_forbidden") {
|
|
113
|
+
return "permission_denied";
|
|
114
|
+
}
|
|
115
|
+
return "session_unavailable";
|
|
116
|
+
}
|
|
117
|
+
if (error instanceof TypeError || error instanceof RangeError) {
|
|
118
|
+
return "invalid_arguments";
|
|
119
|
+
}
|
|
120
|
+
return "internal_error";
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Clamp `maxCacheEntries` into a positive bound.
|
|
124
|
+
*/
|
|
125
|
+
const cacheCapacity = (value) => {
|
|
126
|
+
if (value === (void 0) || !Number.isSafeInteger(value) || value < 1) {
|
|
127
|
+
return DefaultCacheEntries;
|
|
128
|
+
}
|
|
129
|
+
return Math.min(value, MaxCacheEntries);
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Concrete hook runtime. Kept private so the public surface is the `Hook`
|
|
133
|
+
* interface and the `createHook` factory.
|
|
134
|
+
*
|
|
135
|
+
* @typeParam TRequest - Request accepted by `run`.
|
|
136
|
+
* @typeParam TResult - Value produced by a successful run.
|
|
137
|
+
*/
|
|
138
|
+
class HookRuntime {
|
|
139
|
+
definition;
|
|
140
|
+
recorder;
|
|
141
|
+
cache;
|
|
142
|
+
listeners = new Set();
|
|
143
|
+
current;
|
|
144
|
+
generation = 0;
|
|
145
|
+
/**
|
|
146
|
+
* Create one runtime from a definition.
|
|
147
|
+
*
|
|
148
|
+
* @param definition - Name, session, executor and options.
|
|
149
|
+
*/
|
|
150
|
+
constructor(definition) {
|
|
151
|
+
const options = definition.options ?? {};
|
|
152
|
+
this.definition = definition;
|
|
153
|
+
this.recorder = options.recorder;
|
|
154
|
+
this.cache =
|
|
155
|
+
options.cache === true
|
|
156
|
+
? new LRUOrderedMap(cacheCapacity(options.maxCacheEntries))
|
|
157
|
+
: (void 0);
|
|
158
|
+
this.current = Object.freeze({ status: "idle", revision: "" });
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Current observable state.
|
|
162
|
+
*/
|
|
163
|
+
get state() {
|
|
164
|
+
return this.current;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Run one request. The state moves to `loading` synchronously and the
|
|
168
|
+
* executor starts on the next microtask, so a caller that renders after
|
|
169
|
+
* calling `run` can observe the loading state even for a synchronous
|
|
170
|
+
* service method.
|
|
171
|
+
*
|
|
172
|
+
* A newer run (or a `reset`) increments the generation; an older run that
|
|
173
|
+
* finishes later still records and returns its own state but does not
|
|
174
|
+
* overwrite the newer observable state.
|
|
175
|
+
*
|
|
176
|
+
* @param request - Hook request.
|
|
177
|
+
* @returns The state produced by this run.
|
|
178
|
+
*/
|
|
179
|
+
async run(request) {
|
|
180
|
+
const started = new Date();
|
|
181
|
+
const generation = this.generation + 1;
|
|
182
|
+
this.generation = generation;
|
|
183
|
+
this.update({ status: "loading", revision: this.current.revision });
|
|
184
|
+
const inputDigest = safeDigest(request);
|
|
185
|
+
const path = this.pathOf(request);
|
|
186
|
+
const cacheKey = this.cache === (void 0) ? "" : cacheKeyOf(request);
|
|
187
|
+
const cached = this.cachedFor(cacheKey);
|
|
188
|
+
await Promise.resolve();
|
|
189
|
+
if (cached !== (void 0)) {
|
|
190
|
+
const next = { status: "ready", value: cached.value, revision: cached.revision };
|
|
191
|
+
if (generation === this.generation) {
|
|
192
|
+
this.update(next);
|
|
193
|
+
}
|
|
194
|
+
this.emit({
|
|
195
|
+
hook: this.definition.name,
|
|
196
|
+
sessionId: this.definition.session.sessionId,
|
|
197
|
+
...(path === (void 0) ? {} : { path }),
|
|
198
|
+
status: "ready",
|
|
199
|
+
revision: next.revision,
|
|
200
|
+
startedAt: started.toISOString(),
|
|
201
|
+
durationMs: Date.now() - started.getTime(),
|
|
202
|
+
inputDigest,
|
|
203
|
+
outputDigest: safeDigest(cached.value),
|
|
204
|
+
});
|
|
205
|
+
return next;
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const value = await this.definition.execute(request);
|
|
209
|
+
const revision = this.revisionFor(value);
|
|
210
|
+
const next = { status: "ready", value, revision };
|
|
211
|
+
if (generation === this.generation) {
|
|
212
|
+
if (this.cache !== (void 0) && cacheKey.length > 0) {
|
|
213
|
+
this.cache.set(cacheKey, { value, revision });
|
|
214
|
+
}
|
|
215
|
+
this.update(next);
|
|
216
|
+
}
|
|
217
|
+
this.emit({
|
|
218
|
+
hook: this.definition.name,
|
|
219
|
+
sessionId: this.definition.session.sessionId,
|
|
220
|
+
...(path === (void 0) ? {} : { path }),
|
|
221
|
+
status: "ready",
|
|
222
|
+
revision,
|
|
223
|
+
startedAt: started.toISOString(),
|
|
224
|
+
durationMs: Date.now() - started.getTime(),
|
|
225
|
+
inputDigest,
|
|
226
|
+
outputDigest: safeDigest(value),
|
|
227
|
+
});
|
|
228
|
+
return next;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const code = mapHookError(error);
|
|
232
|
+
const revision = this.currentRevision();
|
|
233
|
+
const next = { status: "error", error: code, revision };
|
|
234
|
+
if (generation === this.generation) {
|
|
235
|
+
this.update(next);
|
|
236
|
+
}
|
|
237
|
+
this.emit({
|
|
238
|
+
hook: this.definition.name,
|
|
239
|
+
sessionId: this.definition.session.sessionId,
|
|
240
|
+
...(path === (void 0) ? {} : { path }),
|
|
241
|
+
status: "error",
|
|
242
|
+
error: code,
|
|
243
|
+
revision,
|
|
244
|
+
startedAt: started.toISOString(),
|
|
245
|
+
durationMs: Date.now() - started.getTime(),
|
|
246
|
+
inputDigest,
|
|
247
|
+
outputDigest: "",
|
|
248
|
+
});
|
|
249
|
+
return next;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Subscribe to state changes. The listener is not invoked immediately; it
|
|
254
|
+
* receives every subsequent `loading`, `ready`, `error` and reset state.
|
|
255
|
+
*
|
|
256
|
+
* @param listener - Callback invoked with each new state.
|
|
257
|
+
* @returns Unsubscribe function.
|
|
258
|
+
*/
|
|
259
|
+
subscribe(listener) {
|
|
260
|
+
this.listeners.add(listener);
|
|
261
|
+
return () => {
|
|
262
|
+
this.listeners.delete(listener);
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Return to `idle` and drop cached values. The last revision is retained so
|
|
267
|
+
* a view that resets does not lose its workspace coordinate. In-flight runs
|
|
268
|
+
* are invalidated so they cannot overwrite the idle state.
|
|
269
|
+
*/
|
|
270
|
+
reset() {
|
|
271
|
+
this.generation += 1;
|
|
272
|
+
if (this.cache !== (void 0)) {
|
|
273
|
+
this.cache.clear();
|
|
274
|
+
}
|
|
275
|
+
this.update({ status: "idle", revision: this.current.revision });
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Read a cached result only when it was produced at the current workspace
|
|
279
|
+
* revision. The request-only cache key cannot see a file change by itself,
|
|
280
|
+
* so the revision is the freshness check that makes `cache: true` safe for
|
|
281
|
+
* read hooks.
|
|
282
|
+
*
|
|
283
|
+
* @param cacheKey - Canonical request key.
|
|
284
|
+
* @returns Cached result, or `undefined` when absent or stale.
|
|
285
|
+
*/
|
|
286
|
+
cachedFor(cacheKey) {
|
|
287
|
+
if (this.cache === (void 0) || cacheKey.length === 0) {
|
|
288
|
+
return (void 0);
|
|
289
|
+
}
|
|
290
|
+
const entry = this.cache.peek(cacheKey);
|
|
291
|
+
if (entry === (void 0)) {
|
|
292
|
+
return (void 0);
|
|
293
|
+
}
|
|
294
|
+
const revision = this.sessionRevision();
|
|
295
|
+
if (revision === (void 0) || revision.length === 0 || entry.revision !== revision) {
|
|
296
|
+
this.cache.delete(cacheKey);
|
|
297
|
+
return (void 0);
|
|
298
|
+
}
|
|
299
|
+
return this.cache.get(cacheKey);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Revision reported by the bound session, or `undefined` when the session
|
|
303
|
+
* cannot answer (revoked, expired, store failure). A cache hit is never
|
|
304
|
+
* trusted without this value.
|
|
305
|
+
*
|
|
306
|
+
* @returns Current workspace revision, or `undefined`.
|
|
307
|
+
*/
|
|
308
|
+
sessionRevision() {
|
|
309
|
+
try {
|
|
310
|
+
return this.definition.session.revision();
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
return (void 0);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Last known revision from the bound session, falling back to the state.
|
|
318
|
+
*/
|
|
319
|
+
currentRevision() {
|
|
320
|
+
const revision = this.sessionRevision();
|
|
321
|
+
return revision === (void 0) || revision.length === 0 ? this.current.revision : revision;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Revision reported for a successful value.
|
|
325
|
+
*
|
|
326
|
+
* @param value - Successful hook output.
|
|
327
|
+
* @returns Result revision or the session revision.
|
|
328
|
+
*/
|
|
329
|
+
revisionFor(value) {
|
|
330
|
+
const revisionOf = this.definition.revisionOf;
|
|
331
|
+
if (revisionOf === (void 0)) {
|
|
332
|
+
return this.currentRevision();
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
return revisionOf(value);
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return this.currentRevision();
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Optional request path for the run journal.
|
|
343
|
+
*
|
|
344
|
+
* @param request - Hook request.
|
|
345
|
+
* @returns Path, or `undefined` when the request has none.
|
|
346
|
+
*/
|
|
347
|
+
pathOf(request) {
|
|
348
|
+
const pathOf = this.definition.pathOf;
|
|
349
|
+
if (pathOf === (void 0)) {
|
|
350
|
+
return (void 0);
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
return pathOf(request);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return (void 0);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Publish one state to every subscriber. A listener that throws is skipped
|
|
361
|
+
* so one broken view cannot stop the others from updating.
|
|
362
|
+
*
|
|
363
|
+
* @param next - New state.
|
|
364
|
+
*/
|
|
365
|
+
update(next) {
|
|
366
|
+
const frozen = Object.freeze(next);
|
|
367
|
+
this.current = frozen;
|
|
368
|
+
const listeners = [...this.listeners];
|
|
369
|
+
for (let index = 0; index < listeners.length; index += 1) {
|
|
370
|
+
try {
|
|
371
|
+
listeners[index](frozen);
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Forward one entry to the recorder; an audit failure is swallowed by
|
|
380
|
+
* contract and never changes the hook result.
|
|
381
|
+
*
|
|
382
|
+
* @param entry - Run entry.
|
|
383
|
+
*/
|
|
384
|
+
emit(entry) {
|
|
385
|
+
const recorder = this.recorder;
|
|
386
|
+
if (recorder === (void 0)) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
try {
|
|
390
|
+
recorder.record(entry);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Create one observable hook from a definition. This is the shared factory the
|
|
399
|
+
* concrete `use*` hooks are built on.
|
|
400
|
+
*
|
|
401
|
+
* @typeParam TRequest - Request accepted by `run`.
|
|
402
|
+
* @typeParam TResult - Value produced by a successful run.
|
|
403
|
+
* @param definition - Name, session, executor, optional revision/path mapping
|
|
404
|
+
* and options.
|
|
405
|
+
* @returns A hook with state, subscription, reset and bounded caching.
|
|
406
|
+
*/
|
|
407
|
+
export const createHook = (definition) => new HookRuntime(definition);
|
package/lib/index.d.ts
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
* subpaths, for example `attention-manifest-protocol/governance`.
|
|
4
4
|
*/
|
|
5
5
|
export * from "./attention/index.js";
|
|
6
|
+
export * from "./assignment/index.js";
|
|
6
7
|
export * from "./context/index.js";
|
|
8
|
+
export * from "./discover/index.js";
|
|
9
|
+
export * as file from "./file/index.js";
|
|
10
|
+
export * as filesystem from "./file/index.js";
|
|
11
|
+
export * as syntax from "./syntax/index.js";
|
|
12
|
+
export * as outline from "./outline/index.js";
|
|
13
|
+
export * as global from "./global/index.js";
|
|
14
|
+
export * as hook from "./hook/index.js";
|
|
15
|
+
export * as session from "./session/index.js";
|
|
7
16
|
export * from "./frame/index.js";
|
|
8
17
|
export * from "./ledger/index.js";
|
|
9
18
|
export * from "./manifest/index.js";
|
package/lib/index.js
CHANGED
|
@@ -3,7 +3,16 @@
|
|
|
3
3
|
* subpaths, for example `attention-manifest-protocol/governance`.
|
|
4
4
|
*/
|
|
5
5
|
export * from "./attention/index.js";
|
|
6
|
+
export * from "./assignment/index.js";
|
|
6
7
|
export * from "./context/index.js";
|
|
8
|
+
export * from "./discover/index.js";
|
|
9
|
+
export * as file from "./file/index.js";
|
|
10
|
+
export * as filesystem from "./file/index.js";
|
|
11
|
+
export * as syntax from "./syntax/index.js";
|
|
12
|
+
export * as outline from "./outline/index.js";
|
|
13
|
+
export * as global from "./global/index.js";
|
|
14
|
+
export * as hook from "./hook/index.js";
|
|
15
|
+
export * as session from "./session/index.js";
|
|
7
16
|
export * from "./frame/index.js";
|
|
8
17
|
export * from "./ledger/index.js";
|
|
9
18
|
export * from "./manifest/index.js";
|
package/lib/lock/lease.js
CHANGED
|
@@ -5,7 +5,25 @@ const toRecord = (row) => ({
|
|
|
5
5
|
acquiredAt: row.acquired_at,
|
|
6
6
|
expiresAt: row.expires_at,
|
|
7
7
|
});
|
|
8
|
-
const expiry = (at, ttlMs) =>
|
|
8
|
+
const expiry = (at, ttlMs) => {
|
|
9
|
+
const timestamp = Date.parse(at);
|
|
10
|
+
if (!Number.isFinite(timestamp)) {
|
|
11
|
+
throw new RangeError("at must be a valid timestamp");
|
|
12
|
+
}
|
|
13
|
+
if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0) {
|
|
14
|
+
throw new RangeError("ttlMs must be a positive safe integer");
|
|
15
|
+
}
|
|
16
|
+
const expires = timestamp + ttlMs;
|
|
17
|
+
if (!Number.isFinite(expires) || Math.abs(expires) > 8.64e15) {
|
|
18
|
+
throw new RangeError("lease expiry is outside the supported date range");
|
|
19
|
+
}
|
|
20
|
+
return new Date(expires).toISOString();
|
|
21
|
+
};
|
|
22
|
+
const assertLeaseIdentity = (name, holder) => {
|
|
23
|
+
if (name.trim().length === 0 || holder.trim().length === 0) {
|
|
24
|
+
throw new TypeError("lock name and holder must not be empty");
|
|
25
|
+
}
|
|
26
|
+
};
|
|
9
27
|
export const getLock = (db, name) => {
|
|
10
28
|
const row = db.prepare("SELECT * FROM resource_locks WHERE name = ?").get(name);
|
|
11
29
|
return row === (void 0) ? undefined : toRecord(row);
|
|
@@ -15,6 +33,8 @@ export const getLock = (db, name) => {
|
|
|
15
33
|
* Returns `undefined` when another holder owns a live lease.
|
|
16
34
|
*/
|
|
17
35
|
export const acquireLock = (db, name, holder, at, ttlMs = 15_000) => {
|
|
36
|
+
assertLeaseIdentity(name, holder);
|
|
37
|
+
const expiresAt = expiry(at, ttlMs);
|
|
18
38
|
const result = db
|
|
19
39
|
.prepare(`INSERT INTO resource_locks (name, holder, fencing, acquired_at, expires_at)
|
|
20
40
|
VALUES (?, ?, 1, ?, ?)
|
|
@@ -24,16 +44,21 @@ export const acquireLock = (db, name, holder, at, ttlMs = 15_000) => {
|
|
|
24
44
|
acquired_at = excluded.acquired_at,
|
|
25
45
|
expires_at = excluded.expires_at
|
|
26
46
|
WHERE resource_locks.expires_at <= ? OR resource_locks.holder = ?`)
|
|
27
|
-
.run(name, holder, at,
|
|
47
|
+
.run(name, holder, at, expiresAt, at, holder);
|
|
28
48
|
if (Number(result.changes) !== 1) {
|
|
29
49
|
return undefined;
|
|
30
50
|
}
|
|
31
51
|
return getLock(db, name);
|
|
32
52
|
};
|
|
33
53
|
export const renewLock = (db, name, holder, fencing, at, ttlMs = 15_000) => {
|
|
54
|
+
assertLeaseIdentity(name, holder);
|
|
55
|
+
if (!Number.isSafeInteger(fencing) || fencing <= 0) {
|
|
56
|
+
throw new RangeError("fencing must be a positive safe integer");
|
|
57
|
+
}
|
|
58
|
+
const expiresAt = expiry(at, ttlMs);
|
|
34
59
|
const result = db
|
|
35
60
|
.prepare("UPDATE resource_locks SET expires_at = ? WHERE name = ? AND holder = ? AND fencing = ?")
|
|
36
|
-
.run(
|
|
61
|
+
.run(expiresAt, name, holder, fencing);
|
|
37
62
|
return Number(result.changes) === 1;
|
|
38
63
|
};
|
|
39
64
|
export const releaseLock = (db, name, holder, fencing) => {
|
|
@@ -19,7 +19,7 @@ export declare function verifyCardSignature(card: AgentCard, signature: CardSign
|
|
|
19
19
|
* Resolves the signing key from a trust registry (which Federation bundles can
|
|
20
20
|
* populate) instead of trusting a key embedded in the card itself.
|
|
21
21
|
*/
|
|
22
|
-
export declare function verifyCardWithRegistry(card: AgentCard, signature: CardSignature, registry: KeyRegistry): Promise<{
|
|
22
|
+
export declare function verifyCardWithRegistry(card: AgentCard, signature: CardSignature, registry: KeyRegistry, expectedKid?: string): Promise<{
|
|
23
23
|
ok: boolean;
|
|
24
24
|
reasons: string[];
|
|
25
25
|
}>;
|
package/lib/manifest/cardSign.js
CHANGED
|
@@ -9,6 +9,9 @@ function toBase64Url(bytes) {
|
|
|
9
9
|
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
10
10
|
}
|
|
11
11
|
function fromBase64Url(text) {
|
|
12
|
+
if (!/^[A-Za-z0-9_-]*$/.test(text) || text.length % 4 === 1) {
|
|
13
|
+
throw new Error("invalid base64url");
|
|
14
|
+
}
|
|
12
15
|
const padded = text.replace(/-/g, "+").replace(/_/g, "/");
|
|
13
16
|
const pad = padded.length % 4 ? "=".repeat(4 - (padded.length % 4)) : "";
|
|
14
17
|
const binary = atob(padded + pad);
|
|
@@ -30,10 +33,18 @@ export async function signCard(card, key) {
|
|
|
30
33
|
return { protected: protectedHeader, signature: toBase64Url(signature) };
|
|
31
34
|
}
|
|
32
35
|
export async function verifyCardSignature(card, signature, publicKey) {
|
|
36
|
+
if (typeof signature?.protected !== "string" || typeof signature.signature !== "string") {
|
|
37
|
+
return { ok: false, reasons: ["signature must contain protected and signature strings"] };
|
|
38
|
+
}
|
|
33
39
|
const reasons = [];
|
|
34
40
|
let header;
|
|
35
41
|
try {
|
|
36
|
-
|
|
42
|
+
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(fromBase64Url(signature.protected));
|
|
43
|
+
const parsed = JSON.parse(decoded);
|
|
44
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
45
|
+
return { ok: false, reasons: ["protected header must be a JSON object"] };
|
|
46
|
+
}
|
|
47
|
+
header = parsed;
|
|
37
48
|
}
|
|
38
49
|
catch {
|
|
39
50
|
return { ok: false, reasons: ["protected header is not base64url JSON"] };
|
|
@@ -41,9 +52,17 @@ export async function verifyCardSignature(card, signature, publicKey) {
|
|
|
41
52
|
if (header.alg !== "EdDSA") {
|
|
42
53
|
reasons.push(`unsupported alg ${`${header.alg}`}`);
|
|
43
54
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
if (typeof header.kid !== "string" || header.kid.length === 0) {
|
|
56
|
+
reasons.push("protected header has no kid");
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const valid = await crypto.subtle.verify("Ed25519", publicKey, fromBase64Url(signature.signature), signingInput(signature.protected, payloadOf(card)));
|
|
60
|
+
if (!valid) {
|
|
61
|
+
reasons.push("card signature does not verify");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
reasons.push("card signature is malformed");
|
|
47
66
|
}
|
|
48
67
|
return { ok: reasons.length === 0, reasons };
|
|
49
68
|
}
|
|
@@ -51,17 +70,28 @@ export async function verifyCardSignature(card, signature, publicKey) {
|
|
|
51
70
|
* Resolves the signing key from a trust registry (which Federation bundles can
|
|
52
71
|
* populate) instead of trusting a key embedded in the card itself.
|
|
53
72
|
*/
|
|
54
|
-
export async function verifyCardWithRegistry(card, signature, registry) {
|
|
73
|
+
export async function verifyCardWithRegistry(card, signature, registry, expectedKid) {
|
|
74
|
+
if (typeof signature?.protected !== "string") {
|
|
75
|
+
return { ok: false, reasons: ["signature must contain a protected header"] };
|
|
76
|
+
}
|
|
55
77
|
let header;
|
|
56
78
|
try {
|
|
57
|
-
|
|
79
|
+
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(fromBase64Url(signature.protected));
|
|
80
|
+
const parsed = JSON.parse(decoded);
|
|
81
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
82
|
+
return { ok: false, reasons: ["protected header must be a JSON object"] };
|
|
83
|
+
}
|
|
84
|
+
header = parsed;
|
|
58
85
|
}
|
|
59
86
|
catch {
|
|
60
87
|
return { ok: false, reasons: ["protected header is not base64url JSON"] };
|
|
61
88
|
}
|
|
62
|
-
if (
|
|
89
|
+
if (typeof header.kid !== "string" || header.kid.length === 0) {
|
|
63
90
|
return { ok: false, reasons: ["signature carries no kid"] };
|
|
64
91
|
}
|
|
92
|
+
if (expectedKid !== undefined && header.kid !== expectedKid) {
|
|
93
|
+
return { ok: false, reasons: [`card signer ${header.kid} does not match manifest signer ${expectedKid}`] };
|
|
94
|
+
}
|
|
65
95
|
const key = registry.get(header.kid);
|
|
66
96
|
if (!key) {
|
|
67
97
|
return { ok: false, reasons: [`unknown or revoked key: ${header.kid}`] };
|
|
@@ -31,6 +31,8 @@ async function importPublicKey(material) {
|
|
|
31
31
|
*/
|
|
32
32
|
export function bundleDigest(bundle) {
|
|
33
33
|
return digestOf({
|
|
34
|
+
amp: bundle.amp,
|
|
35
|
+
kind: bundle.kind,
|
|
34
36
|
manifest: bundle.manifest,
|
|
35
37
|
keys: bundle.keys,
|
|
36
38
|
revoked: bundle.revoked ?? [],
|
|
@@ -177,11 +179,16 @@ export async function verifyAttestation(attestation, issuerKey) {
|
|
|
177
179
|
* Public-key variant so a verifier does not need the issuer's private key.
|
|
178
180
|
*/
|
|
179
181
|
export async function verifyAttestationWithKey(attestation, publicKey) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
try {
|
|
183
|
+
const { signatures, ...body } = attestation;
|
|
184
|
+
const signature = signatures[0];
|
|
185
|
+
if (!signature) {
|
|
186
|
+
return { ok: false, reasons: ["attestation has no signature"] };
|
|
187
|
+
}
|
|
188
|
+
const valid = await crypto.subtle.verify("Ed25519", publicKey, fromBase64Url(signature.sig), encoder.encode(canonical(body)));
|
|
189
|
+
return { ok: valid, reasons: valid ? [] : ["attestation signature does not verify"] };
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return { ok: false, reasons: ["attestation signature is malformed"] };
|
|
184
193
|
}
|
|
185
|
-
const valid = await crypto.subtle.verify("Ed25519", publicKey, fromBase64Url(signature.sig), encoder.encode(canonical(body)));
|
|
186
|
-
return { ok: valid, reasons: valid ? [] : ["attestation signature does not verify"] };
|
|
187
194
|
}
|
package/lib/manifest/trust.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ interface TrustCardInput {
|
|
|
21
21
|
bundle: ManifestBundle;
|
|
22
22
|
policy: TrustPolicy;
|
|
23
23
|
issuerKeys?: KeyRegistry;
|
|
24
|
+
revoked?: string[];
|
|
24
25
|
/**
|
|
25
26
|
* Verification time. Defaults to the real clock.
|
|
26
27
|
*/
|
|
@@ -30,6 +31,7 @@ interface FetchTrustedOptions {
|
|
|
30
31
|
bundle: ManifestBundle;
|
|
31
32
|
policy: TrustPolicy;
|
|
32
33
|
issuerKeys?: KeyRegistry;
|
|
34
|
+
revoked?: string[];
|
|
33
35
|
timeoutMs?: number;
|
|
34
36
|
/**
|
|
35
37
|
* Verification time. Defaults to the real clock.
|