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
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Canonical JSON (RFC 8785 spirit: sorted keys, no whitespace).
|
|
3
3
|
* Everything that gets signed or digested must go through this first.
|
|
4
|
+
*
|
|
5
|
+
* Only strict I-JSON values are accepted. `undefined`, non-finite numbers,
|
|
6
|
+
* functions, `Date`/`Map`/`Set`, sparse arrays, cycles and accessors are
|
|
7
|
+
* rejected with a `TypeError` naming the offending path, because
|
|
8
|
+
* `JSON.stringify` would otherwise silently rewrite them and a digest would no
|
|
9
|
+
* longer bind the value the caller passed.
|
|
10
|
+
*
|
|
11
|
+
* Two further cases are rejected because RFC 8785 rejects them, even though
|
|
12
|
+
* `JSON.stringify` happily rewrites both:
|
|
13
|
+
*
|
|
14
|
+
* - an unpaired surrogate (§3.2.2.2). `JSON.stringify` escapes it and
|
|
15
|
+
* `TextEncoder` replaces it with U+FFFD, so two different strings can hash to
|
|
16
|
+
* the same digest while a compliant verifier re-derives a different byte
|
|
17
|
+
* string. A signature over such a value cannot be re-checked.
|
|
18
|
+
* - `-0` (appendix B). JCS serialises `-0` as `0`, so `-0` and `0` are one
|
|
19
|
+
* digest. That is legal JCS but it is a silent rewrite of the caller's value,
|
|
20
|
+
* which is exactly what this module refuses elsewhere. Callers that really
|
|
21
|
+
* mean "treat -0 as 0" must say so with `negativeZero: "as-zero"`, which turns
|
|
22
|
+
* an accidental collision into a declared policy.
|
|
23
|
+
*
|
|
24
|
+
* Unicode normalization is deliberately **not** applied: RFC 8785 §3.1 requires
|
|
25
|
+
* string data to be preserved as-is, and a digest that normalises would no
|
|
26
|
+
* longer be a digest of the bytes the caller supplied. Text-level normalisation
|
|
27
|
+
* belongs to a caller that records the policy, which is what `src/fingerprint`
|
|
28
|
+
* does for its `text` kind.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* How `-0` is treated when canonicalising.
|
|
32
|
+
*
|
|
33
|
+
* `"reject"` is the default and matches this module's contract that a digest
|
|
34
|
+
* must never cover a value `JSON.stringify` silently rewrote. `"as-zero"` is
|
|
35
|
+
* the explicit opt-in for a caller that has to interoperate with a plain JCS
|
|
36
|
+
* implementation, which maps `-0` to `0`.
|
|
37
|
+
*/
|
|
38
|
+
export type NegativeZeroPolicy = "reject" | "as-zero";
|
|
39
|
+
/**
|
|
40
|
+
* Options for {@link canonicalJson} and {@link canonical} may only affect the
|
|
41
|
+
* documented policy, never the shape of the output.
|
|
42
|
+
*/
|
|
43
|
+
export interface CanonicalOptions {
|
|
44
|
+
negativeZero?: NegativeZeroPolicy;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Report the first value the strict policy cannot bind, or `undefined`.
|
|
48
|
+
*
|
|
49
|
+
* Structural problems are already covered by `jsonValueProblem`; this pass adds
|
|
50
|
+
* the two policy rules that depend on the caller's options. Keeping it as a
|
|
51
|
+
* pure function instead of a thrower lets `src/fingerprint` translate the same
|
|
52
|
+
* decision into its own error type rather than re-implementing RFC 8785.
|
|
53
|
+
*/
|
|
54
|
+
export declare const canonicalProblem: (value: unknown, options?: CanonicalOptions) => string | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Canonical JSON with the documented policy options.
|
|
57
|
+
*
|
|
58
|
+
* One definition of "the bytes a digest covers" is the whole point: signing,
|
|
59
|
+
* pinning, ledger chaining and fingerprints all call this instead of each
|
|
60
|
+
* re-deriving the rules.
|
|
61
|
+
*/
|
|
62
|
+
export declare const canonicalJson: (value: unknown, options?: CanonicalOptions) => string;
|
|
63
|
+
/**
|
|
64
|
+
* Canonical JSON with the default policy (`-0` rejected).
|
|
4
65
|
*/
|
|
5
66
|
export declare const canonical: (value: unknown) => string;
|
|
6
67
|
export declare const digestOf: (value: unknown) => string;
|
|
@@ -1,22 +1,149 @@
|
|
|
1
|
+
import { jsonValueProblem } from "./jsonValue.js";
|
|
1
2
|
import { sha256Hex } from "./sha256.js";
|
|
3
|
+
const SurrogateHighStart = 0xd800;
|
|
4
|
+
const SurrogateHighEnd = 0xdbff;
|
|
5
|
+
const SurrogateLowStart = 0xdc00;
|
|
6
|
+
const SurrogateLowEnd = 0xdfff;
|
|
2
7
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
8
|
+
* Report the first unpaired surrogate in one string.
|
|
9
|
+
*
|
|
10
|
+
* JS strings are UTF-16 code units, so a string can hold half of a surrogate
|
|
11
|
+
* pair. JSON can represent it with an escape, but UTF-8 cannot encode it, and
|
|
12
|
+
* `TextEncoder` silently substitutes U+FFFD —which is why this is an error
|
|
13
|
+
* rather than a normalisation.
|
|
5
14
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
const surrogateProblem = (text, at) => {
|
|
16
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
17
|
+
const unit = text.charCodeAt(index);
|
|
18
|
+
if (unit >= SurrogateHighStart && unit <= SurrogateHighEnd) {
|
|
19
|
+
const next = index + 1 < text.length ? text.charCodeAt(index + 1) : 0;
|
|
20
|
+
if (next < SurrogateLowStart || next > SurrogateLowEnd) {
|
|
21
|
+
return `${at} contains an unpaired high surrogate at index ${index}`;
|
|
22
|
+
}
|
|
23
|
+
index += 1;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (unit >= SurrogateLowStart && unit <= SurrogateLowEnd) {
|
|
27
|
+
return `${at} contains an unpaired low surrogate at index ${index}`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return (void 0);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Report the first value the strict policy cannot bind, or `undefined`.
|
|
34
|
+
*
|
|
35
|
+
* Structural problems are already covered by `jsonValueProblem`; this pass adds
|
|
36
|
+
* the two policy rules that depend on the caller's options. Keeping it as a
|
|
37
|
+
* pure function instead of a thrower lets `src/fingerprint` translate the same
|
|
38
|
+
* decision into its own error type rather than re-implementing RFC 8785.
|
|
39
|
+
*/
|
|
40
|
+
export const canonicalProblem = (value, options = {}) => {
|
|
41
|
+
const negativeZero = options.negativeZero ?? "reject";
|
|
42
|
+
if (negativeZero !== "reject" && negativeZero !== "as-zero") {
|
|
43
|
+
throw new TypeError(`unknown negativeZero policy "${negativeZero}"; expected "reject" or "as-zero"`);
|
|
44
|
+
}
|
|
45
|
+
const walk = (item, at) => {
|
|
46
|
+
if (item === null) {
|
|
47
|
+
return (void 0);
|
|
48
|
+
}
|
|
49
|
+
const kind = typeof (item);
|
|
50
|
+
if (kind === "string") {
|
|
51
|
+
return surrogateProblem(item, at);
|
|
52
|
+
}
|
|
53
|
+
if (kind === "number") {
|
|
54
|
+
return negativeZero === "reject" && Object.is(item, -0) ? `${at} is -0; pass { negativeZero: "as-zero" } to accept it explicitly` : (void 0);
|
|
55
|
+
}
|
|
56
|
+
if (kind !== "object") {
|
|
57
|
+
return (void 0);
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(item)) {
|
|
60
|
+
for (let index = 0; index < item.length; index += 1) {
|
|
61
|
+
const problem = walk(item[index], `${at}[${index}]`);
|
|
62
|
+
if (problem !== (void 0)) {
|
|
63
|
+
return problem;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return (void 0);
|
|
67
|
+
}
|
|
68
|
+
const record = item;
|
|
69
|
+
const keys = Object.keys(record);
|
|
70
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
71
|
+
const key = keys[index];
|
|
72
|
+
const keyProblem = surrogateProblem(key, `${at} key`);
|
|
73
|
+
if (keyProblem !== (void 0)) {
|
|
74
|
+
return keyProblem;
|
|
75
|
+
}
|
|
76
|
+
const problem = walk(record[key], `${at}.${key}`);
|
|
77
|
+
if (problem !== (void 0)) {
|
|
78
|
+
return problem;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return (void 0);
|
|
82
|
+
};
|
|
83
|
+
return walk(value, "$");
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Throw a `TypeError` naming the first reason the value cannot be canonicalised.
|
|
87
|
+
*
|
|
88
|
+
* Structural and policy problems share one error type because the caller's only
|
|
89
|
+
* useful response is the same: fix the value. The message names the path.
|
|
90
|
+
*/
|
|
91
|
+
const assertStrictCanonical = (value, options) => {
|
|
92
|
+
const structural = jsonValueProblem(value);
|
|
93
|
+
if (structural !== (void 0)) {
|
|
94
|
+
throw new TypeError(structural);
|
|
95
|
+
}
|
|
96
|
+
const policy = canonicalProblem(value, options);
|
|
97
|
+
if (policy !== (void 0)) {
|
|
98
|
+
throw new TypeError(policy);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Encode a value already proven canonicalisable by `assertStrictCanonical`.
|
|
103
|
+
*/
|
|
104
|
+
const encodeCanonical = (value) => {
|
|
105
|
+
if (value === null) {
|
|
8
106
|
return "null";
|
|
9
107
|
}
|
|
10
|
-
|
|
108
|
+
const kind = typeof (value);
|
|
109
|
+
if (kind === "boolean") {
|
|
110
|
+
return value === true ? "true" : "false";
|
|
111
|
+
}
|
|
112
|
+
if (kind === "string" || kind === "number") {
|
|
11
113
|
return JSON.stringify(value);
|
|
12
114
|
}
|
|
13
115
|
if (Array.isArray(value)) {
|
|
14
|
-
|
|
116
|
+
const elements = [];
|
|
117
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
118
|
+
elements.push(encodeCanonical(value[index]));
|
|
119
|
+
}
|
|
120
|
+
return `[${elements.join(",")}]`;
|
|
15
121
|
}
|
|
16
122
|
const record = value;
|
|
17
123
|
const keys = Object.keys(record).sort();
|
|
18
|
-
|
|
124
|
+
const members = [];
|
|
125
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
126
|
+
const key = keys[index];
|
|
127
|
+
members.push(`${JSON.stringify(key)}:${encodeCanonical(record[key])}`);
|
|
128
|
+
}
|
|
129
|
+
return `{${members.join(",")}}`;
|
|
19
130
|
};
|
|
131
|
+
/**
|
|
132
|
+
* Canonical JSON with the documented policy options.
|
|
133
|
+
*
|
|
134
|
+
* One definition of "the bytes a digest covers" is the whole point: signing,
|
|
135
|
+
* pinning, ledger chaining and fingerprints all call this instead of each
|
|
136
|
+
* re-deriving the rules.
|
|
137
|
+
*/
|
|
138
|
+
export const canonicalJson = (value, options = {}) => {
|
|
139
|
+
assertStrictCanonical(value, options);
|
|
140
|
+
return encodeCanonical(value);
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Canonical JSON with the default policy (`-0` rejected).
|
|
144
|
+
*/
|
|
145
|
+
export const canonical = (value) => canonicalJson(value);
|
|
20
146
|
export const digestOf = (value) => {
|
|
21
|
-
|
|
147
|
+
const text = canonicalJson(value);
|
|
148
|
+
return `sha256:${sha256Hex(text)}`;
|
|
22
149
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict I-JSON value inspection.
|
|
3
|
+
*
|
|
4
|
+
* `canonical()`, the construction boundary and the persistence layers all need
|
|
5
|
+
* one definition of "this value can be represented as JSON". JavaScript values
|
|
6
|
+
* outside that domain (`undefined`, `NaN`, functions, `Date`, sparse arrays,
|
|
7
|
+
* cycles) must be rejected instead of being silently rewritten by
|
|
8
|
+
* `JSON.stringify`, because a digest that covers a rewritten value no longer
|
|
9
|
+
* binds what the caller passed.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Describe why `value` is not I-JSON, or `undefined` when it is.
|
|
13
|
+
*/
|
|
14
|
+
export declare const jsonValueProblem: (value: unknown, at?: string) => string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* True when the value is exactly representable as JSON without rewriting.
|
|
17
|
+
*/
|
|
18
|
+
export declare const isJsonValue: (value: unknown) => boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Throw a `TypeError` naming the first non-JSON path.
|
|
21
|
+
*/
|
|
22
|
+
export declare const assertJsonValue: (value: unknown, at?: string) => void;
|
|
23
|
+
/**
|
|
24
|
+
* Deep-copy a JSON value. Asserts first, so the result cannot contain values
|
|
25
|
+
* that `JSON.stringify` would drop or rewrite.
|
|
26
|
+
*/
|
|
27
|
+
export declare const cloneJson: <T>(value: T) => T;
|
|
28
|
+
/**
|
|
29
|
+
* Recursively freeze a JSON value. Assumes the value is acyclic (assert first).
|
|
30
|
+
*/
|
|
31
|
+
export declare const deepFreezeJson: <T>(value: T) => T;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict I-JSON value inspection.
|
|
3
|
+
*
|
|
4
|
+
* `canonical()`, the construction boundary and the persistence layers all need
|
|
5
|
+
* one definition of "this value can be represented as JSON". JavaScript values
|
|
6
|
+
* outside that domain (`undefined`, `NaN`, functions, `Date`, sparse arrays,
|
|
7
|
+
* cycles) must be rejected instead of being silently rewritten by
|
|
8
|
+
* `JSON.stringify`, because a digest that covers a rewritten value no longer
|
|
9
|
+
* binds what the caller passed.
|
|
10
|
+
*/
|
|
11
|
+
const constructorName = (value) => {
|
|
12
|
+
const prototype = Object.getPrototypeOf(value);
|
|
13
|
+
if (prototype === null) {
|
|
14
|
+
return "null-prototype object";
|
|
15
|
+
}
|
|
16
|
+
const name = prototype.constructor?.name;
|
|
17
|
+
return typeof (name) === "string" && name.length > 0 ? name : "object";
|
|
18
|
+
};
|
|
19
|
+
const problemAt = (value, at, seen) => {
|
|
20
|
+
if (value === null) {
|
|
21
|
+
return (void 0);
|
|
22
|
+
}
|
|
23
|
+
const kind = typeof (value);
|
|
24
|
+
if (kind === "string" || kind === "boolean") {
|
|
25
|
+
return (void 0);
|
|
26
|
+
}
|
|
27
|
+
if (kind === "number") {
|
|
28
|
+
return Number.isFinite(value) ? (void 0) : `${at} is not a finite number`;
|
|
29
|
+
}
|
|
30
|
+
if (kind === "undefined") {
|
|
31
|
+
return `${at} is undefined`;
|
|
32
|
+
}
|
|
33
|
+
if (kind === "bigint" || kind === "function" || kind === "symbol") {
|
|
34
|
+
return `${at} is a ${kind}`;
|
|
35
|
+
}
|
|
36
|
+
const object = value;
|
|
37
|
+
if (seen.has(object)) {
|
|
38
|
+
return `${at} contains a cycle`;
|
|
39
|
+
}
|
|
40
|
+
seen.add(object);
|
|
41
|
+
try {
|
|
42
|
+
if (Array.isArray(value)) {
|
|
43
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
44
|
+
if (!(index in value)) {
|
|
45
|
+
return `${at}[${index}] is a hole`;
|
|
46
|
+
}
|
|
47
|
+
const problem = problemAt(value[index], `${at}[${index}]`, seen);
|
|
48
|
+
if (problem !== (void 0)) {
|
|
49
|
+
return problem;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return (void 0);
|
|
53
|
+
}
|
|
54
|
+
const prototype = Object.getPrototypeOf(object);
|
|
55
|
+
if (prototype !== null && prototype !== Object.prototype) {
|
|
56
|
+
return `${at} is a ${constructorName(object)}, not a plain object`;
|
|
57
|
+
}
|
|
58
|
+
if (Object.getOwnPropertySymbols(object).length > 0) {
|
|
59
|
+
return `${at} has symbol keys`;
|
|
60
|
+
}
|
|
61
|
+
const keys = Object.keys(object);
|
|
62
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
63
|
+
const key = keys[index];
|
|
64
|
+
const descriptor = Object.getOwnPropertyDescriptor(object, key);
|
|
65
|
+
if (descriptor === (void 0) || !("value" in descriptor)) {
|
|
66
|
+
return `${at}.${key} is an accessor`;
|
|
67
|
+
}
|
|
68
|
+
const problem = problemAt(descriptor.value, `${at}.${key}`, seen);
|
|
69
|
+
if (problem !== (void 0)) {
|
|
70
|
+
return problem;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return (void 0);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
seen.delete(object);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Describe why `value` is not I-JSON, or `undefined` when it is.
|
|
81
|
+
*/
|
|
82
|
+
export const jsonValueProblem = (value, at = "$") => problemAt(value, at, new Set());
|
|
83
|
+
/**
|
|
84
|
+
* True when the value is exactly representable as JSON without rewriting.
|
|
85
|
+
*/
|
|
86
|
+
export const isJsonValue = (value) => jsonValueProblem(value) === (void 0);
|
|
87
|
+
/**
|
|
88
|
+
* Throw a `TypeError` naming the first non-JSON path.
|
|
89
|
+
*/
|
|
90
|
+
export const assertJsonValue = (value, at = "$") => {
|
|
91
|
+
const problem = jsonValueProblem(value, at);
|
|
92
|
+
if (problem !== (void 0)) {
|
|
93
|
+
throw new TypeError(problem);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Deep-copy a JSON value. Asserts first, so the result cannot contain values
|
|
98
|
+
* that `JSON.stringify` would drop or rewrite.
|
|
99
|
+
*/
|
|
100
|
+
export const cloneJson = (value) => {
|
|
101
|
+
assertJsonValue(value);
|
|
102
|
+
return JSON.parse(JSON.stringify(value));
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Recursively freeze a JSON value. Assumes the value is acyclic (assert first).
|
|
106
|
+
*/
|
|
107
|
+
export const deepFreezeJson = (value) => {
|
|
108
|
+
const freeze = (item) => {
|
|
109
|
+
if (item === null || typeof (item) !== "object" || Object.isFrozen(item)) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
Object.freeze(item);
|
|
113
|
+
if (Array.isArray(item)) {
|
|
114
|
+
item.forEach(freeze);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
Object.keys(item).forEach((key) => freeze(item[key]));
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
freeze(value);
|
|
121
|
+
return value;
|
|
122
|
+
};
|
package/lib/semantic/sha256.js
CHANGED
|
@@ -11,6 +11,9 @@ const K = new Uint32Array([
|
|
|
11
11
|
]);
|
|
12
12
|
const rotr = (x, n) => ((x >>> n) | (x << (32 - n))) >>> 0;
|
|
13
13
|
export const sha256Hex = (input) => {
|
|
14
|
+
if (typeof (input) !== "string") {
|
|
15
|
+
throw new TypeError(`sha256Hex expects a string, received ${typeof (input)}`);
|
|
16
|
+
}
|
|
14
17
|
const bytes = new TextEncoder().encode(input);
|
|
15
18
|
const length = bytes.length;
|
|
16
19
|
const padded = new Uint8Array(((length + 9 + 63) >> 6) << 6);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 3339 `date-time` validation with calendar and range checks.
|
|
3
|
+
*
|
|
4
|
+
* `Date.parse()` is deliberately not used: it accepts date-only strings,
|
|
5
|
+
* offset-less local times and legacy numeric strings, and normalizes impossible
|
|
6
|
+
* dates such as `2026-02-30` into March. The construction boundary and the
|
|
7
|
+
* schema validator must agree on exactly one grammar.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* True for one RFC 3339 date-time with a mandatory offset.
|
|
11
|
+
*
|
|
12
|
+
* Leap seconds (`:60`) are accepted only at 23:59, as RFC 3339 permits.
|
|
13
|
+
*/
|
|
14
|
+
export declare const isDateTime: (value: unknown) => boolean;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 3339 `date-time` validation with calendar and range checks.
|
|
3
|
+
*
|
|
4
|
+
* `Date.parse()` is deliberately not used: it accepts date-only strings,
|
|
5
|
+
* offset-less local times and legacy numeric strings, and normalizes impossible
|
|
6
|
+
* dates such as `2026-02-30` into March. The construction boundary and the
|
|
7
|
+
* schema validator must agree on exactly one grammar.
|
|
8
|
+
*/
|
|
9
|
+
const DateTimePattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(Z|[+-]\d{2}:\d{2})$/;
|
|
10
|
+
const daysInMonth = (year, month) => {
|
|
11
|
+
if (month === 2) {
|
|
12
|
+
const leap = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
|
|
13
|
+
return leap ? 29 : 28;
|
|
14
|
+
}
|
|
15
|
+
return [4, 6, 9, 11].includes(month) ? 30 : 31;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* True for one RFC 3339 date-time with a mandatory offset.
|
|
19
|
+
*
|
|
20
|
+
* Leap seconds (`:60`) are accepted only at 23:59, as RFC 3339 permits.
|
|
21
|
+
*/
|
|
22
|
+
export const isDateTime = (value) => {
|
|
23
|
+
if (typeof (value) !== "string") {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const match = DateTimePattern.exec(value);
|
|
27
|
+
if (match === null) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const year = Number(match[1]);
|
|
31
|
+
const month = Number(match[2]);
|
|
32
|
+
const day = Number(match[3]);
|
|
33
|
+
const hour = Number(match[4]);
|
|
34
|
+
const minute = Number(match[5]);
|
|
35
|
+
const second = Number(match[6]);
|
|
36
|
+
if (month < 1 || month > 12) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (day < 1 || day > daysInMonth(year, month)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (hour > 23 || minute > 59 || second > 60) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (second === 60 && (hour !== 23 || minute !== 59)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (match[8] !== "Z") {
|
|
49
|
+
const offsetHour = Number(match[8].slice(1, 3));
|
|
50
|
+
const offsetMinute = Number(match[8].slice(4, 6));
|
|
51
|
+
if (offsetHour > 23 || offsetMinute > 59) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { SessionClock, SessionContextEntry, SessionContextSnapshot, SessionContextStore, SessionId, SessionJson, SessionRegistryLimits } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Construction options for {@link SessionContexts}. Limits are registry-wide so
|
|
4
|
+
* a caller cannot raise a per-session budget after construction.
|
|
5
|
+
*/
|
|
6
|
+
export interface SessionContextOptions {
|
|
7
|
+
readonly persistence?: SessionContextStore;
|
|
8
|
+
readonly clock?: SessionClock;
|
|
9
|
+
readonly limits?: Pick<SessionRegistryLimits, "maxContextEntries" | "maxContextBytes">;
|
|
10
|
+
}
|
|
11
|
+
export declare class SessionContexts {
|
|
12
|
+
private readonly persistence?;
|
|
13
|
+
private readonly clock;
|
|
14
|
+
private readonly maxEntries;
|
|
15
|
+
private readonly maxBytes;
|
|
16
|
+
private readonly sessions;
|
|
17
|
+
private readonly sizes;
|
|
18
|
+
private readonly loaded;
|
|
19
|
+
constructor(options?: SessionContextOptions);
|
|
20
|
+
/**
|
|
21
|
+
* Load one session's persisted entries exactly once. An absent store, a
|
|
22
|
+
* store that has no row for the session and an empty result all mean "this
|
|
23
|
+
* session has no entries yet". A persisted partition that exceeds the
|
|
24
|
+
* current limits is rejected with `context_quota` rather than silently
|
|
25
|
+
* bypassing the quota; `clear` and `remove` still work without loading.
|
|
26
|
+
*/
|
|
27
|
+
ensure(sessionId: SessionId): void;
|
|
28
|
+
/**
|
|
29
|
+
* Return one entry, or `undefined`. A missing session is an empty context,
|
|
30
|
+
* not an error: the registry owns session existence.
|
|
31
|
+
*/
|
|
32
|
+
get(sessionId: SessionId, namespace: string, key: string): SessionContextEntry | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Canonicalise, quota-check and store one value, returning the stored entry
|
|
35
|
+
* as a detached copy.
|
|
36
|
+
*/
|
|
37
|
+
set(sessionId: SessionId, namespace: string, key: string, value: SessionJson, at: string): SessionContextEntry;
|
|
38
|
+
/**
|
|
39
|
+
* Remove one entry. Returns `false` when it never existed.
|
|
40
|
+
*/
|
|
41
|
+
delete(sessionId: SessionId, namespace: string, key: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* List entries for one session, optionally narrowed to one namespace.
|
|
44
|
+
* Ordering is deterministic (namespace, then key) so snapshots diff cleanly.
|
|
45
|
+
*/
|
|
46
|
+
list(sessionId: SessionId, namespace?: string): SessionContextEntry[];
|
|
47
|
+
/**
|
|
48
|
+
* Immutable view of one session's whole context.
|
|
49
|
+
*/
|
|
50
|
+
snapshot(sessionId: SessionId): SessionContextSnapshot;
|
|
51
|
+
/**
|
|
52
|
+
* Canonical UTF-8 bytes charged against one session.
|
|
53
|
+
*/
|
|
54
|
+
bytes(sessionId: SessionId): number;
|
|
55
|
+
/**
|
|
56
|
+
* Drop every entry for one session. The empty state is persisted as a
|
|
57
|
+
* `replace`, which is atomic for an adapter that honours the port. This is
|
|
58
|
+
* deliberately an overwrite rather than a load-then-clear: a corrupt or
|
|
59
|
+
* over-quota persisted partition must still be removable by its host.
|
|
60
|
+
*/
|
|
61
|
+
clear(sessionId: SessionId): void;
|
|
62
|
+
/**
|
|
63
|
+
* Copy the source context into the target session. Values are deep copies,
|
|
64
|
+
* so the two sessions share no mutable object. The target's previous
|
|
65
|
+
* context, if any, is replaced.
|
|
66
|
+
*/
|
|
67
|
+
fork(from: SessionId, to: SessionId): void;
|
|
68
|
+
/**
|
|
69
|
+
* Remove every entry for one session and its persisted partition.
|
|
70
|
+
*/
|
|
71
|
+
remove(sessionId: SessionId): void;
|
|
72
|
+
private partitionOf;
|
|
73
|
+
private countOf;
|
|
74
|
+
private storedEntryIsValid;
|
|
75
|
+
private persistPut;
|
|
76
|
+
}
|