@harrylabsj/kiwi 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +150 -0
- package/contracts/candidate-agent-dto-1.0.README.md +39 -0
- package/contracts/candidate-agent-dto-1.0.schema.json +172 -0
- package/contracts/interop/kiwi-buyer-message-send.json +43 -0
- package/contracts/interop/knp-data-part-examples.json +243 -0
- package/contracts/kiwi-catalog/1.0/agent-record.schema.json +78 -0
- package/contracts/kiwi-catalog/1.0/listing-record.schema.json +88 -0
- package/contracts/kiwi-catalog/1.0/listing-search-result.schema.json +60 -0
- package/contracts/negotiation/1.0/schema.json +501 -0
- package/contracts/shopping.negotiation/0.1/capabilities.schema.json +47 -0
- package/contracts/shopping.negotiation/0.1/decision.schema.json +120 -0
- package/contracts/shopping.negotiation/0.1/policy-result.schema.json +52 -0
- package/contracts/shopping.negotiation/0.1/snapshot.schema.json +172 -0
- package/dist/a2a/client/client.d.ts +33 -0
- package/dist/a2a/client/client.js +161 -0
- package/dist/a2a/client/client.js.map +1 -0
- package/dist/a2a/client/error.d.ts +35 -0
- package/dist/a2a/client/error.js +34 -0
- package/dist/a2a/client/error.js.map +1 -0
- package/dist/a2a/client/index.d.ts +29 -0
- package/dist/a2a/client/index.js +26 -0
- package/dist/a2a/client/index.js.map +1 -0
- package/dist/a2a/client/jsonrpc.d.ts +49 -0
- package/dist/a2a/client/jsonrpc.js +85 -0
- package/dist/a2a/client/jsonrpc.js.map +1 -0
- package/dist/a2a/client/parse.d.ts +18 -0
- package/dist/a2a/client/parse.js +134 -0
- package/dist/a2a/client/parse.js.map +1 -0
- package/dist/a2a/client/types.d.ts +102 -0
- package/dist/a2a/client/types.js +26 -0
- package/dist/a2a/client/types.js.map +1 -0
- package/dist/a2a/client/url-policy.d.ts +44 -0
- package/dist/a2a/client/url-policy.js +242 -0
- package/dist/a2a/client/url-policy.js.map +1 -0
- package/dist/a2a/negotiate.d.ts +68 -0
- package/dist/a2a/negotiate.js +288 -0
- package/dist/a2a/negotiate.js.map +1 -0
- package/dist/a2a/node.d.ts +37 -0
- package/dist/a2a/node.js +155 -0
- package/dist/a2a/node.js.map +1 -0
- package/dist/a2a/server/auth.d.ts +38 -0
- package/dist/a2a/server/auth.js +112 -0
- package/dist/a2a/server/auth.js.map +1 -0
- package/dist/a2a/server/card.d.ts +19 -0
- package/dist/a2a/server/card.js +81 -0
- package/dist/a2a/server/card.js.map +1 -0
- package/dist/a2a/server/errors.d.ts +109 -0
- package/dist/a2a/server/errors.js +178 -0
- package/dist/a2a/server/errors.js.map +1 -0
- package/dist/a2a/server/handler.d.ts +22 -0
- package/dist/a2a/server/handler.js +57 -0
- package/dist/a2a/server/handler.js.map +1 -0
- package/dist/a2a/server/inbound-message.d.ts +37 -0
- package/dist/a2a/server/inbound-message.js +104 -0
- package/dist/a2a/server/inbound-message.js.map +1 -0
- package/dist/a2a/server/index.d.ts +43 -0
- package/dist/a2a/server/index.js +42 -0
- package/dist/a2a/server/index.js.map +1 -0
- package/dist/a2a/server/merchant-handler.d.ts +69 -0
- package/dist/a2a/server/merchant-handler.js +316 -0
- package/dist/a2a/server/merchant-handler.js.map +1 -0
- package/dist/a2a/server/pipeline.d.ts +69 -0
- package/dist/a2a/server/pipeline.js +329 -0
- package/dist/a2a/server/pipeline.js.map +1 -0
- package/dist/a2a/server/server.d.ts +64 -0
- package/dist/a2a/server/server.js +420 -0
- package/dist/a2a/server/server.js.map +1 -0
- package/dist/a2a/server/task-registry.d.ts +31 -0
- package/dist/a2a/server/task-registry.js +67 -0
- package/dist/a2a/server/task-registry.js.map +1 -0
- package/dist/a2a/server/throttle.d.ts +154 -0
- package/dist/a2a/server/throttle.js +289 -0
- package/dist/a2a/server/throttle.js.map +1 -0
- package/dist/a2a/server/types.d.ts +191 -0
- package/dist/a2a/server/types.js +17 -0
- package/dist/a2a/server/types.js.map +1 -0
- package/dist/a2a/server/ucp.d.ts +49 -0
- package/dist/a2a/server/ucp.js +85 -0
- package/dist/a2a/server/ucp.js.map +1 -0
- package/dist/a2a/task/index.d.ts +24 -0
- package/dist/a2a/task/index.js +22 -0
- package/dist/a2a/task/index.js.map +1 -0
- package/dist/a2a/task/ledger.d.ts +48 -0
- package/dist/a2a/task/ledger.js +65 -0
- package/dist/a2a/task/ledger.js.map +1 -0
- package/dist/a2a/task/poller.d.ts +93 -0
- package/dist/a2a/task/poller.js +184 -0
- package/dist/a2a/task/poller.js.map +1 -0
- package/dist/a2a/task/state.d.ts +72 -0
- package/dist/a2a/task/state.js +119 -0
- package/dist/a2a/task/state.js.map +1 -0
- package/dist/a2a/ucp-agent.d.ts +49 -0
- package/dist/a2a/ucp-agent.js +78 -0
- package/dist/a2a/ucp-agent.js.map +1 -0
- package/dist/agent/agent-db.d.ts +31 -0
- package/dist/agent/agent-db.js +91 -0
- package/dist/agent/agent-db.js.map +1 -0
- package/dist/agent/buyer/buyer-tools.d.ts +70 -0
- package/dist/agent/buyer/buyer-tools.js +1353 -0
- package/dist/agent/buyer/buyer-tools.js.map +1 -0
- package/dist/agent/buyer/ranker.d.ts +53 -0
- package/dist/agent/buyer/ranker.js +153 -0
- package/dist/agent/buyer/ranker.js.map +1 -0
- package/dist/agent/buyer/scheduler.d.ts +58 -0
- package/dist/agent/buyer/scheduler.js +317 -0
- package/dist/agent/buyer/scheduler.js.map +1 -0
- package/dist/agent/buyer/search-loop.d.ts +42 -0
- package/dist/agent/buyer/search-loop.js +280 -0
- package/dist/agent/buyer/search-loop.js.map +1 -0
- package/dist/agent/buyer/task-store.d.ts +178 -0
- package/dist/agent/buyer/task-store.js +637 -0
- package/dist/agent/buyer/task-store.js.map +1 -0
- package/dist/agent/buyer/types.d.ts +222 -0
- package/dist/agent/buyer/types.js +124 -0
- package/dist/agent/buyer/types.js.map +1 -0
- package/dist/agent/chat-tools.d.ts +41 -0
- package/dist/agent/chat-tools.js +193 -0
- package/dist/agent/chat-tools.js.map +1 -0
- package/dist/agent/chat-tui.d.ts +49 -0
- package/dist/agent/chat-tui.js +314 -0
- package/dist/agent/chat-tui.js.map +1 -0
- package/dist/agent/connector/fake-connector.d.ts +50 -0
- package/dist/agent/connector/fake-connector.js +138 -0
- package/dist/agent/connector/fake-connector.js.map +1 -0
- package/dist/agent/connector/http-connector.d.ts +49 -0
- package/dist/agent/connector/http-connector.js +208 -0
- package/dist/agent/connector/http-connector.js.map +1 -0
- package/dist/agent/connector/types.d.ts +103 -0
- package/dist/agent/connector/types.js +97 -0
- package/dist/agent/connector/types.js.map +1 -0
- package/dist/agent/fake-chat-model.d.ts +22 -0
- package/dist/agent/fake-chat-model.js +134 -0
- package/dist/agent/fake-chat-model.js.map +1 -0
- package/dist/agent/kernel.d.ts +258 -0
- package/dist/agent/kernel.js +1099 -0
- package/dist/agent/kernel.js.map +1 -0
- package/dist/agent/memory/schema.d.ts +32 -0
- package/dist/agent/memory/schema.js +291 -0
- package/dist/agent/memory/schema.js.map +1 -0
- package/dist/agent/memory/store.d.ts +193 -0
- package/dist/agent/memory/store.js +881 -0
- package/dist/agent/memory/store.js.map +1 -0
- package/dist/agent/memory/types.d.ts +139 -0
- package/dist/agent/memory/types.js +119 -0
- package/dist/agent/memory/types.js.map +1 -0
- package/dist/agent/memory/vault.d.ts +49 -0
- package/dist/agent/memory/vault.js +125 -0
- package/dist/agent/memory/vault.js.map +1 -0
- package/dist/agent/merchant/action-candidate.d.ts +106 -0
- package/dist/agent/merchant/action-candidate.js +241 -0
- package/dist/agent/merchant/action-candidate.js.map +1 -0
- package/dist/agent/merchant/credential-broker.d.ts +67 -0
- package/dist/agent/merchant/credential-broker.js +76 -0
- package/dist/agent/merchant/credential-broker.js.map +1 -0
- package/dist/agent/merchant/fake-merchant-client.d.ts +47 -0
- package/dist/agent/merchant/fake-merchant-client.js +143 -0
- package/dist/agent/merchant/fake-merchant-client.js.map +1 -0
- package/dist/agent/merchant/merchant-client.d.ts +49 -0
- package/dist/agent/merchant/merchant-client.js +186 -0
- package/dist/agent/merchant/merchant-client.js.map +1 -0
- package/dist/agent/merchant/merchant-tools.d.ts +74 -0
- package/dist/agent/merchant/merchant-tools.js +582 -0
- package/dist/agent/merchant/merchant-tools.js.map +1 -0
- package/dist/agent/merchant/types.d.ts +119 -0
- package/dist/agent/merchant/types.js +133 -0
- package/dist/agent/merchant/types.js.map +1 -0
- package/dist/agent/mode.d.ts +32 -0
- package/dist/agent/mode.js +34 -0
- package/dist/agent/mode.js.map +1 -0
- package/dist/agent/negotiation-chat.d.ts +81 -0
- package/dist/agent/negotiation-chat.js +330 -0
- package/dist/agent/negotiation-chat.js.map +1 -0
- package/dist/agent/session.d.ts +22 -0
- package/dist/agent/session.js +164 -0
- package/dist/agent/session.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +26 -0
- package/dist/agent/system-prompt.js +77 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/write-gate.d.ts +98 -0
- package/dist/agent/write-gate.js +76 -0
- package/dist/agent/write-gate.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.js +1139 -0
- package/dist/cli.js.map +1 -0
- package/dist/commerce/data-source.d.ts +88 -0
- package/dist/commerce/data-source.js +25 -0
- package/dist/commerce/data-source.js.map +1 -0
- package/dist/commerce/erp-source.d.ts +51 -0
- package/dist/commerce/erp-source.js +184 -0
- package/dist/commerce/erp-source.js.map +1 -0
- package/dist/commerce/fake-client.d.ts +167 -0
- package/dist/commerce/fake-client.js +549 -0
- package/dist/commerce/fake-client.js.map +1 -0
- package/dist/commerce/http-client.d.ts +73 -0
- package/dist/commerce/http-client.js +284 -0
- package/dist/commerce/http-client.js.map +1 -0
- package/dist/commerce/local-db-source.d.ts +50 -0
- package/dist/commerce/local-db-source.js +162 -0
- package/dist/commerce/local-db-source.js.map +1 -0
- package/dist/commerce/shopping-cli-source.d.ts +57 -0
- package/dist/commerce/shopping-cli-source.js +206 -0
- package/dist/commerce/shopping-cli-source.js.map +1 -0
- package/dist/commerce/types.d.ts +146 -0
- package/dist/commerce/types.js +31 -0
- package/dist/commerce/types.js.map +1 -0
- package/dist/config/profile.d.ts +122 -0
- package/dist/config/profile.js +386 -0
- package/dist/config/profile.js.map +1 -0
- package/dist/contracts/negotiation-schema.d.ts +28 -0
- package/dist/contracts/negotiation-schema.js +101 -0
- package/dist/contracts/negotiation-schema.js.map +1 -0
- package/dist/contracts/schemas.d.ts +31 -0
- package/dist/contracts/schemas.js +122 -0
- package/dist/contracts/schemas.js.map +1 -0
- package/dist/counterparty/a2a-direct/index.d.ts +41 -0
- package/dist/counterparty/a2a-direct/index.js +330 -0
- package/dist/counterparty/a2a-direct/index.js.map +1 -0
- package/dist/counterparty/channel.d.ts +200 -0
- package/dist/counterparty/channel.js +61 -0
- package/dist/counterparty/channel.js.map +1 -0
- package/dist/counterparty/index.d.ts +28 -0
- package/dist/counterparty/index.js +24 -0
- package/dist/counterparty/index.js.map +1 -0
- package/dist/counterparty/platform-api/index.d.ts +41 -0
- package/dist/counterparty/platform-api/index.js +65 -0
- package/dist/counterparty/platform-api/index.js.map +1 -0
- package/dist/counterparty/registry.d.ts +51 -0
- package/dist/counterparty/registry.js +71 -0
- package/dist/counterparty/registry.js.map +1 -0
- package/dist/counterparty/shopping-cli-hosted/index.d.ts +36 -0
- package/dist/counterparty/shopping-cli-hosted/index.js +337 -0
- package/dist/counterparty/shopping-cli-hosted/index.js.map +1 -0
- package/dist/discovery/agent-card/error.d.ts +28 -0
- package/dist/discovery/agent-card/error.js +31 -0
- package/dist/discovery/agent-card/error.js.map +1 -0
- package/dist/discovery/agent-card/extensions.d.ts +20 -0
- package/dist/discovery/agent-card/extensions.js +59 -0
- package/dist/discovery/agent-card/extensions.js.map +1 -0
- package/dist/discovery/agent-card/index.d.ts +29 -0
- package/dist/discovery/agent-card/index.js +38 -0
- package/dist/discovery/agent-card/index.js.map +1 -0
- package/dist/discovery/agent-card/secrets.d.ts +30 -0
- package/dist/discovery/agent-card/secrets.js +240 -0
- package/dist/discovery/agent-card/secrets.js.map +1 -0
- package/dist/discovery/agent-card/types.d.ts +110 -0
- package/dist/discovery/agent-card/types.js +37 -0
- package/dist/discovery/agent-card/types.js.map +1 -0
- package/dist/discovery/agent-card/validate.d.ts +31 -0
- package/dist/discovery/agent-card/validate.js +210 -0
- package/dist/discovery/agent-card/validate.js.map +1 -0
- package/dist/discovery/capability/error.d.ts +23 -0
- package/dist/discovery/capability/error.js +28 -0
- package/dist/discovery/capability/error.js.map +1 -0
- package/dist/discovery/capability/index.d.ts +21 -0
- package/dist/discovery/capability/index.js +21 -0
- package/dist/discovery/capability/index.js.map +1 -0
- package/dist/discovery/capability/intersect.d.ts +56 -0
- package/dist/discovery/capability/intersect.js +137 -0
- package/dist/discovery/capability/intersect.js.map +1 -0
- package/dist/discovery/catalog-source/errors.d.ts +32 -0
- package/dist/discovery/catalog-source/errors.js +41 -0
- package/dist/discovery/catalog-source/errors.js.map +1 -0
- package/dist/discovery/catalog-source/index.d.ts +30 -0
- package/dist/discovery/catalog-source/index.js +29 -0
- package/dist/discovery/catalog-source/index.js.map +1 -0
- package/dist/discovery/catalog-source/kiwi-record.d.ts +183 -0
- package/dist/discovery/catalog-source/kiwi-record.js +72 -0
- package/dist/discovery/catalog-source/kiwi-record.js.map +1 -0
- package/dist/discovery/catalog-source/kiwi-schema.d.ts +33 -0
- package/dist/discovery/catalog-source/kiwi-schema.js +106 -0
- package/dist/discovery/catalog-source/kiwi-schema.js.map +1 -0
- package/dist/discovery/catalog-source/kiwi-source.d.ts +38 -0
- package/dist/discovery/catalog-source/kiwi-source.js +318 -0
- package/dist/discovery/catalog-source/kiwi-source.js.map +1 -0
- package/dist/discovery/catalog-source/register.d.ts +48 -0
- package/dist/discovery/catalog-source/register.js +83 -0
- package/dist/discovery/catalog-source/register.js.map +1 -0
- package/dist/discovery/catalog-source/schema.d.ts +21 -0
- package/dist/discovery/catalog-source/schema.js +63 -0
- package/dist/discovery/catalog-source/schema.js.map +1 -0
- package/dist/discovery/catalog-source/source.d.ts +45 -0
- package/dist/discovery/catalog-source/source.js +197 -0
- package/dist/discovery/catalog-source/source.js.map +1 -0
- package/dist/discovery/catalog-source/types.d.ts +122 -0
- package/dist/discovery/catalog-source/types.js +30 -0
- package/dist/discovery/catalog-source/types.js.map +1 -0
- package/dist/discovery/index.d.ts +25 -0
- package/dist/discovery/index.js +25 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/resolve.d.ts +175 -0
- package/dist/discovery/resolve.js +367 -0
- package/dist/discovery/resolve.js.map +1 -0
- package/dist/discovery/ucp/error.d.ts +25 -0
- package/dist/discovery/ucp/error.js +27 -0
- package/dist/discovery/ucp/error.js.map +1 -0
- package/dist/discovery/ucp/index.d.ts +33 -0
- package/dist/discovery/ucp/index.js +28 -0
- package/dist/discovery/ucp/index.js.map +1 -0
- package/dist/discovery/ucp/intersect.d.ts +148 -0
- package/dist/discovery/ucp/intersect.js +312 -0
- package/dist/discovery/ucp/intersect.js.map +1 -0
- package/dist/discovery/ucp/resolver.d.ts +62 -0
- package/dist/discovery/ucp/resolver.js +214 -0
- package/dist/discovery/ucp/resolver.js.map +1 -0
- package/dist/discovery/ucp/types.d.ts +97 -0
- package/dist/discovery/ucp/types.js +103 -0
- package/dist/discovery/ucp/types.js.map +1 -0
- package/dist/discovery/ucp/validate.d.ts +38 -0
- package/dist/discovery/ucp/validate.js +232 -0
- package/dist/discovery/ucp/validate.js.map +1 -0
- package/dist/discovery/ucp/vendor.d.ts +60 -0
- package/dist/discovery/ucp/vendor.js +61 -0
- package/dist/discovery/ucp/vendor.js.map +1 -0
- package/dist/doctor.d.ts +26 -0
- package/dist/doctor.js +113 -0
- package/dist/doctor.js.map +1 -0
- package/dist/exit-codes.d.ts +26 -0
- package/dist/exit-codes.js +27 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/fanout/disclosure.d.ts +138 -0
- package/dist/fanout/disclosure.js +188 -0
- package/dist/fanout/disclosure.js.map +1 -0
- package/dist/fanout/index.d.ts +32 -0
- package/dist/fanout/index.js +30 -0
- package/dist/fanout/index.js.map +1 -0
- package/dist/fanout/orchestrator.d.ts +153 -0
- package/dist/fanout/orchestrator.js +439 -0
- package/dist/fanout/orchestrator.js.map +1 -0
- package/dist/fanout/policy.d.ts +128 -0
- package/dist/fanout/policy.js +130 -0
- package/dist/fanout/policy.js.map +1 -0
- package/dist/handoff/acp-commerce.d.ts +58 -0
- package/dist/handoff/acp-commerce.js +69 -0
- package/dist/handoff/acp-commerce.js.map +1 -0
- package/dist/handoff/authorization.d.ts +127 -0
- package/dist/handoff/authorization.js +107 -0
- package/dist/handoff/authorization.js.map +1 -0
- package/dist/handoff/candidate.d.ts +94 -0
- package/dist/handoff/candidate.js +172 -0
- package/dist/handoff/candidate.js.map +1 -0
- package/dist/handoff/channel.d.ts +88 -0
- package/dist/handoff/channel.js +189 -0
- package/dist/handoff/channel.js.map +1 -0
- package/dist/handoff/completion.d.ts +44 -0
- package/dist/handoff/completion.js +136 -0
- package/dist/handoff/completion.js.map +1 -0
- package/dist/handoff/delivery.d.ts +59 -0
- package/dist/handoff/delivery.js +185 -0
- package/dist/handoff/delivery.js.map +1 -0
- package/dist/handoff/destination.d.ts +39 -0
- package/dist/handoff/destination.js +99 -0
- package/dist/handoff/destination.js.map +1 -0
- package/dist/handoff/errors.d.ts +34 -0
- package/dist/handoff/errors.js +47 -0
- package/dist/handoff/errors.js.map +1 -0
- package/dist/handoff/idempotency.d.ts +51 -0
- package/dist/handoff/idempotency.js +168 -0
- package/dist/handoff/idempotency.js.map +1 -0
- package/dist/handoff/index.d.ts +46 -0
- package/dist/handoff/index.js +48 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/ledger.d.ts +94 -0
- package/dist/handoff/ledger.js +195 -0
- package/dist/handoff/ledger.js.map +1 -0
- package/dist/handoff/lifecycle.d.ts +29 -0
- package/dist/handoff/lifecycle.js +102 -0
- package/dist/handoff/lifecycle.js.map +1 -0
- package/dist/handoff/metrics.d.ts +56 -0
- package/dist/handoff/metrics.js +78 -0
- package/dist/handoff/metrics.js.map +1 -0
- package/dist/handoff/operator-approval.d.ts +143 -0
- package/dist/handoff/operator-approval.js +287 -0
- package/dist/handoff/operator-approval.js.map +1 -0
- package/dist/handoff/order-record.d.ts +104 -0
- package/dist/handoff/order-record.js +235 -0
- package/dist/handoff/order-record.js.map +1 -0
- package/dist/handoff/package.d.ts +102 -0
- package/dist/handoff/package.js +132 -0
- package/dist/handoff/package.js.map +1 -0
- package/dist/handoff/transaction.d.ts +96 -0
- package/dist/handoff/transaction.js +263 -0
- package/dist/handoff/transaction.js.map +1 -0
- package/dist/handoff/ucp-checkout/cart-channel.d.ts +111 -0
- package/dist/handoff/ucp-checkout/cart-channel.js +370 -0
- package/dist/handoff/ucp-checkout/cart-channel.js.map +1 -0
- package/dist/handoff/ucp-checkout/cart-parse.d.ts +22 -0
- package/dist/handoff/ucp-checkout/cart-parse.js +102 -0
- package/dist/handoff/ucp-checkout/cart-parse.js.map +1 -0
- package/dist/handoff/ucp-checkout/cart-types.d.ts +93 -0
- package/dist/handoff/ucp-checkout/cart-types.js +38 -0
- package/dist/handoff/ucp-checkout/cart-types.js.map +1 -0
- package/dist/handoff/ucp-checkout/channel.d.ts +159 -0
- package/dist/handoff/ucp-checkout/channel.js +636 -0
- package/dist/handoff/ucp-checkout/channel.js.map +1 -0
- package/dist/handoff/ucp-checkout/client.d.ts +88 -0
- package/dist/handoff/ucp-checkout/client.js +228 -0
- package/dist/handoff/ucp-checkout/client.js.map +1 -0
- package/dist/handoff/ucp-checkout/endpoint.d.ts +36 -0
- package/dist/handoff/ucp-checkout/endpoint.js +145 -0
- package/dist/handoff/ucp-checkout/endpoint.js.map +1 -0
- package/dist/handoff/ucp-checkout/index.d.ts +35 -0
- package/dist/handoff/ucp-checkout/index.js +36 -0
- package/dist/handoff/ucp-checkout/index.js.map +1 -0
- package/dist/handoff/ucp-checkout/parse.d.ts +71 -0
- package/dist/handoff/ucp-checkout/parse.js +349 -0
- package/dist/handoff/ucp-checkout/parse.js.map +1 -0
- package/dist/handoff/ucp-checkout/totals.d.ts +41 -0
- package/dist/handoff/ucp-checkout/totals.js +36 -0
- package/dist/handoff/ucp-checkout/totals.js.map +1 -0
- package/dist/handoff/ucp-checkout/types.d.ts +149 -0
- package/dist/handoff/ucp-checkout/types.js +58 -0
- package/dist/handoff/ucp-checkout/types.js.map +1 -0
- package/dist/handoff/url-safety.d.ts +44 -0
- package/dist/handoff/url-safety.js +121 -0
- package/dist/handoff/url-safety.js.map +1 -0
- package/dist/i18n.d.ts +24 -0
- package/dist/i18n.js +27 -0
- package/dist/i18n.js.map +1 -0
- package/dist/negotiation/action-candidate.d.ts +97 -0
- package/dist/negotiation/action-candidate.js +160 -0
- package/dist/negotiation/action-candidate.js.map +1 -0
- package/dist/negotiation/condition/evaluator.d.ts +36 -0
- package/dist/negotiation/condition/evaluator.js +123 -0
- package/dist/negotiation/condition/evaluator.js.map +1 -0
- package/dist/negotiation/context-map/index.d.ts +23 -0
- package/dist/negotiation/context-map/index.js +22 -0
- package/dist/negotiation/context-map/index.js.map +1 -0
- package/dist/negotiation/context-map/store.d.ts +51 -0
- package/dist/negotiation/context-map/store.js +186 -0
- package/dist/negotiation/context-map/store.js.map +1 -0
- package/dist/negotiation/context-map/types.d.ts +29 -0
- package/dist/negotiation/context-map/types.js +57 -0
- package/dist/negotiation/context-map/types.js.map +1 -0
- package/dist/negotiation/domain/common.d.ts +95 -0
- package/dist/negotiation/domain/common.js +216 -0
- package/dist/negotiation/domain/common.js.map +1 -0
- package/dist/negotiation/domain/envelope.d.ts +55 -0
- package/dist/negotiation/domain/envelope.js +110 -0
- package/dist/negotiation/domain/envelope.js.map +1 -0
- package/dist/negotiation/domain/identifiers.d.ts +65 -0
- package/dist/negotiation/domain/identifiers.js +130 -0
- package/dist/negotiation/domain/identifiers.js.map +1 -0
- package/dist/negotiation/domain/objects.d.ts +149 -0
- package/dist/negotiation/domain/objects.js +335 -0
- package/dist/negotiation/domain/objects.js.map +1 -0
- package/dist/negotiation/idempotency/index.d.ts +26 -0
- package/dist/negotiation/idempotency/index.js +25 -0
- package/dist/negotiation/idempotency/index.js.map +1 -0
- package/dist/negotiation/idempotency/store.d.ts +52 -0
- package/dist/negotiation/idempotency/store.js +189 -0
- package/dist/negotiation/idempotency/store.js.map +1 -0
- package/dist/negotiation/idempotency/types.d.ts +102 -0
- package/dist/negotiation/idempotency/types.js +47 -0
- package/dist/negotiation/idempotency/types.js.map +1 -0
- package/dist/negotiation/jcs.d.ts +21 -0
- package/dist/negotiation/jcs.js +114 -0
- package/dist/negotiation/jcs.js.map +1 -0
- package/dist/negotiation/ledger/event.d.ts +142 -0
- package/dist/negotiation/ledger/event.js +206 -0
- package/dist/negotiation/ledger/event.js.map +1 -0
- package/dist/negotiation/ledger/index.d.ts +26 -0
- package/dist/negotiation/ledger/index.js +25 -0
- package/dist/negotiation/ledger/index.js.map +1 -0
- package/dist/negotiation/ledger/store.d.ts +97 -0
- package/dist/negotiation/ledger/store.js +338 -0
- package/dist/negotiation/ledger/store.js.map +1 -0
- package/dist/negotiation/prompt.d.ts +34 -0
- package/dist/negotiation/prompt.js +113 -0
- package/dist/negotiation/prompt.js.map +1 -0
- package/dist/negotiation/recovery/index.d.ts +26 -0
- package/dist/negotiation/recovery/index.js +24 -0
- package/dist/negotiation/recovery/index.js.map +1 -0
- package/dist/negotiation/recovery/outbound.d.ts +49 -0
- package/dist/negotiation/recovery/outbound.js +34 -0
- package/dist/negotiation/recovery/outbound.js.map +1 -0
- package/dist/negotiation/recovery/recover.d.ts +59 -0
- package/dist/negotiation/recovery/recover.js +486 -0
- package/dist/negotiation/recovery/recover.js.map +1 -0
- package/dist/negotiation/recovery/types.d.ts +85 -0
- package/dist/negotiation/recovery/types.js +17 -0
- package/dist/negotiation/recovery/types.js.map +1 -0
- package/dist/negotiation/state/phase.d.ts +70 -0
- package/dist/negotiation/state/phase.js +200 -0
- package/dist/negotiation/state/phase.js.map +1 -0
- package/dist/negotiation/types.d.ts +139 -0
- package/dist/negotiation/types.js +24 -0
- package/dist/negotiation/types.js.map +1 -0
- package/dist/net/safe-http.d.ts +54 -0
- package/dist/net/safe-http.js +116 -0
- package/dist/net/safe-http.js.map +1 -0
- package/dist/operator/controller.d.ts +181 -0
- package/dist/operator/controller.js +784 -0
- package/dist/operator/controller.js.map +1 -0
- package/dist/operator/runner.d.ts +128 -0
- package/dist/operator/runner.js +248 -0
- package/dist/operator/runner.js.map +1 -0
- package/dist/operator/store.d.ts +39 -0
- package/dist/operator/store.js +169 -0
- package/dist/operator/store.js.map +1 -0
- package/dist/operator/strategy.d.ts +54 -0
- package/dist/operator/strategy.js +249 -0
- package/dist/operator/strategy.js.map +1 -0
- package/dist/operator/tui.d.ts +27 -0
- package/dist/operator/tui.js +395 -0
- package/dist/operator/tui.js.map +1 -0
- package/dist/operator/types.d.ts +224 -0
- package/dist/operator/types.js +17 -0
- package/dist/operator/types.js.map +1 -0
- package/dist/product-buyer.d.ts +74 -0
- package/dist/product-buyer.js +161 -0
- package/dist/product-buyer.js.map +1 -0
- package/dist/product-cli.d.ts +56 -0
- package/dist/product-cli.js +175 -0
- package/dist/product-cli.js.map +1 -0
- package/dist/product-compat.d.ts +50 -0
- package/dist/product-compat.js +63 -0
- package/dist/product-compat.js.map +1 -0
- package/dist/product-init.d.ts +73 -0
- package/dist/product-init.js +203 -0
- package/dist/product-init.js.map +1 -0
- package/dist/product-publish.d.ts +85 -0
- package/dist/product-publish.js +216 -0
- package/dist/product-publish.js.map +1 -0
- package/dist/protocol/legacy-shopping-negotiation/adapter.d.ts +42 -0
- package/dist/protocol/legacy-shopping-negotiation/adapter.js +561 -0
- package/dist/protocol/legacy-shopping-negotiation/adapter.js.map +1 -0
- package/dist/protocol/legacy-shopping-negotiation/mapping.d.ts +78 -0
- package/dist/protocol/legacy-shopping-negotiation/mapping.js +321 -0
- package/dist/protocol/legacy-shopping-negotiation/mapping.js.map +1 -0
- package/dist/protocol/legacy-shopping-negotiation/money.d.ts +49 -0
- package/dist/protocol/legacy-shopping-negotiation/money.js +70 -0
- package/dist/protocol/legacy-shopping-negotiation/money.js.map +1 -0
- package/dist/protocol/legacy-shopping-negotiation/types.d.ts +107 -0
- package/dist/protocol/legacy-shopping-negotiation/types.js +34 -0
- package/dist/protocol/legacy-shopping-negotiation/types.js.map +1 -0
- package/dist/runtime/buyer-policy.d.ts +58 -0
- package/dist/runtime/buyer-policy.js +89 -0
- package/dist/runtime/buyer-policy.js.map +1 -0
- package/dist/runtime/fake-model.d.ts +77 -0
- package/dist/runtime/fake-model.js +307 -0
- package/dist/runtime/fake-model.js.map +1 -0
- package/dist/runtime/foreground.d.ts +56 -0
- package/dist/runtime/foreground.js +97 -0
- package/dist/runtime/foreground.js.map +1 -0
- package/dist/runtime/heartbeat.d.ts +36 -0
- package/dist/runtime/heartbeat.js +49 -0
- package/dist/runtime/heartbeat.js.map +1 -0
- package/dist/runtime/merchant-turn.d.ts +35 -0
- package/dist/runtime/merchant-turn.js +20 -0
- package/dist/runtime/merchant-turn.js.map +1 -0
- package/dist/runtime/model.d.ts +40 -0
- package/dist/runtime/model.js +86 -0
- package/dist/runtime/model.js.map +1 -0
- package/dist/runtime/negotiation-turn.d.ts +101 -0
- package/dist/runtime/negotiation-turn.js +317 -0
- package/dist/runtime/negotiation-turn.js.map +1 -0
- package/dist/runtime/tools.d.ts +64 -0
- package/dist/runtime/tools.js +236 -0
- package/dist/runtime/tools.js.map +1 -0
- package/dist/supervisor/init.d.ts +31 -0
- package/dist/supervisor/init.js +222 -0
- package/dist/supervisor/init.js.map +1 -0
- package/dist/supervisor/logs.d.ts +28 -0
- package/dist/supervisor/logs.js +101 -0
- package/dist/supervisor/logs.js.map +1 -0
- package/dist/supervisor/manage.d.ts +72 -0
- package/dist/supervisor/manage.js +419 -0
- package/dist/supervisor/manage.js.map +1 -0
- package/dist/supervisor/manifest.d.ts +69 -0
- package/dist/supervisor/manifest.js +209 -0
- package/dist/supervisor/manifest.js.map +1 -0
- package/dist/supervisor/stack-config.d.ts +79 -0
- package/dist/supervisor/stack-config.js +262 -0
- package/dist/supervisor/stack-config.js.map +1 -0
- package/dist/supervisor/wrapper.d.ts +17 -0
- package/dist/supervisor/wrapper.js +138 -0
- package/dist/supervisor/wrapper.js.map +1 -0
- package/dist/trust/identity/auth-verifier.d.ts +96 -0
- package/dist/trust/identity/auth-verifier.js +166 -0
- package/dist/trust/identity/auth-verifier.js.map +1 -0
- package/dist/trust/identity/identity-binding.d.ts +63 -0
- package/dist/trust/identity/identity-binding.js +59 -0
- package/dist/trust/identity/identity-binding.js.map +1 -0
- package/dist/trust/identity/index.d.ts +38 -0
- package/dist/trust/identity/index.js +31 -0
- package/dist/trust/identity/index.js.map +1 -0
- package/dist/trust/identity/jws.d.ts +64 -0
- package/dist/trust/identity/jws.js +178 -0
- package/dist/trust/identity/jws.js.map +1 -0
- package/dist/trust/identity/keys.d.ts +71 -0
- package/dist/trust/identity/keys.js +118 -0
- package/dist/trust/identity/keys.js.map +1 -0
- package/dist/trust/identity/message-signature.d.ts +105 -0
- package/dist/trust/identity/message-signature.js +297 -0
- package/dist/trust/identity/message-signature.js.map +1 -0
- package/dist/trust/identity/nonce.d.ts +45 -0
- package/dist/trust/identity/nonce.js +50 -0
- package/dist/trust/identity/nonce.js.map +1 -0
- package/dist/trust/identity/signature-base.d.ts +84 -0
- package/dist/trust/identity/signature-base.js +261 -0
- package/dist/trust/identity/signature-base.js.map +1 -0
- package/dist/trust/identity/trust-policy.d.ts +92 -0
- package/dist/trust/identity/trust-policy.js +95 -0
- package/dist/trust/identity/trust-policy.js.map +1 -0
- package/dist/trust/index.d.ts +21 -0
- package/dist/trust/index.js +22 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/records/evaluator.d.ts +76 -0
- package/dist/trust/records/evaluator.js +122 -0
- package/dist/trust/records/evaluator.js.map +1 -0
- package/dist/trust/records/index.d.ts +28 -0
- package/dist/trust/records/index.js +26 -0
- package/dist/trust/records/index.js.map +1 -0
- package/dist/trust/records/store.d.ts +75 -0
- package/dist/trust/records/store.js +339 -0
- package/dist/trust/records/store.js.map +1 -0
- package/dist/trust/records/types.d.ts +159 -0
- package/dist/trust/records/types.js +40 -0
- package/dist/trust/records/types.js.map +1 -0
- package/dist/tui/banner.d.ts +46 -0
- package/dist/tui/banner.js +99 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/styles.d.ts +70 -0
- package/dist/tui/styles.js +197 -0
- package/dist/tui/styles.js.map +1 -0
- package/dist/tui/theme.d.ts +63 -0
- package/dist/tui/theme.js +136 -0
- package/dist/tui/theme.js.map +1 -0
- package/examples/profiles/buyer.deepseek.yaml +34 -0
- package/examples/profiles/buyer.fake.yaml +36 -0
- package/examples/profiles/buyer.local.yaml +40 -0
- package/examples/profiles/merchant.deepseek.yaml +32 -0
- package/examples/profiles/merchant.fake.yaml +31 -0
- package/examples/profiles/merchant.local.yaml +34 -0
- package/package.json +55 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Compact JWS 验签(EdDSA / ES256)与 Agent Card JWS 绑定验证(基线 §27 / §31)。
|
|
18
|
+
*
|
|
19
|
+
* - `verifyCompactJws`:RFC 7515 compact 形态 `header.payload.signature`
|
|
20
|
+
* (各段 base64url)。EdDSA → Ed25519;ES256 → P-256 + SHA-256(原始 r||s)。
|
|
21
|
+
* - `verifyAgentCardJws`:JWS 负载必须是该 Agent Card 的规范化 JSON;比较用
|
|
22
|
+
* JCS(RFC 8785),因此 key 顺序 / 可选字段缺省不影响比对。
|
|
23
|
+
*
|
|
24
|
+
* 是否强制 JWS 由 TrustPolicy.requireCardJws(level) 决定(§31),本模块只提供
|
|
25
|
+
* 「验签 + 卡片绑定」能力,不做强制决策。
|
|
26
|
+
*/
|
|
27
|
+
import { KeyObject, type JsonWebKey } from "node:crypto";
|
|
28
|
+
import type { AgentCard } from "../../discovery/agent-card/index.js";
|
|
29
|
+
import { type KeyResolver, type SigningKey } from "./keys.js";
|
|
30
|
+
export type JwsErrorCode = "malformed" | "unsupported_algorithm" | "missing_key" | "invalid_signature";
|
|
31
|
+
export declare class JwsError extends Error {
|
|
32
|
+
readonly code: JwsErrorCode;
|
|
33
|
+
constructor(code: JwsErrorCode, message: string);
|
|
34
|
+
}
|
|
35
|
+
export interface VerifiedJws {
|
|
36
|
+
/** 解码后的 JWS header。 */
|
|
37
|
+
header: Record<string, unknown>;
|
|
38
|
+
/** 解码后的负载字节。 */
|
|
39
|
+
payload: Buffer;
|
|
40
|
+
/** alg 值(EdDSA | ES256)。 */
|
|
41
|
+
alg: string;
|
|
42
|
+
/** header.kid(如有)。 */
|
|
43
|
+
keyid?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 验签一个 compact JWS。publicKey 可以是 SigningKey(推荐,算法自动取)、
|
|
47
|
+
* JsonWebKey 或 KeyObject。
|
|
48
|
+
*/
|
|
49
|
+
export declare function verifyCompactJws(jws: string, publicKey: SigningKey | JsonWebKey | KeyObject): VerifiedJws;
|
|
50
|
+
/** 读取 compact JWS 的 kid(不验签);畸形返回 undefined。 */
|
|
51
|
+
export declare function jwsKid(jws: string): string | undefined;
|
|
52
|
+
export type AgentCardJwsResult = {
|
|
53
|
+
ok: true;
|
|
54
|
+
keyid?: string;
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
reason: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 验证「Agent Card + 其 JWS」绑定:JWS 验签通过,且 JWS 负载规范化后与该
|
|
61
|
+
* card 一致。card 必须先过 parseAgentCard(结构校验 + secret 扫描);负载经
|
|
62
|
+
* parseAgentCard 归一后再比对,双方都过 JCS。
|
|
63
|
+
*/
|
|
64
|
+
export declare function verifyAgentCardJws(card: AgentCard, jws: string, resolver: KeyResolver): AgentCardJwsResult;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Compact JWS 验签(EdDSA / ES256)与 Agent Card JWS 绑定验证(基线 §27 / §31)。
|
|
18
|
+
*
|
|
19
|
+
* - `verifyCompactJws`:RFC 7515 compact 形态 `header.payload.signature`
|
|
20
|
+
* (各段 base64url)。EdDSA → Ed25519;ES256 → P-256 + SHA-256(原始 r||s)。
|
|
21
|
+
* - `verifyAgentCardJws`:JWS 负载必须是该 Agent Card 的规范化 JSON;比较用
|
|
22
|
+
* JCS(RFC 8785),因此 key 顺序 / 可选字段缺省不影响比对。
|
|
23
|
+
*
|
|
24
|
+
* 是否强制 JWS 由 TrustPolicy.requireCardJws(level) 决定(§31),本模块只提供
|
|
25
|
+
* 「验签 + 卡片绑定」能力,不做强制决策。
|
|
26
|
+
*/
|
|
27
|
+
import { createPublicKey, KeyObject, verify as nodeVerify } from "node:crypto";
|
|
28
|
+
import { parseAgentCard } from "../../discovery/agent-card/index.js";
|
|
29
|
+
import { canonicalize } from "../../negotiation/jcs.js";
|
|
30
|
+
import { publicKeyObject } from "./keys.js";
|
|
31
|
+
export class JwsError extends Error {
|
|
32
|
+
code;
|
|
33
|
+
constructor(code, message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = "JwsError";
|
|
36
|
+
this.code = code;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function malformed(detail) {
|
|
40
|
+
return new JwsError("malformed", `malformed compact JWS: ${detail}`);
|
|
41
|
+
}
|
|
42
|
+
function base64urlToBuffer(value, what) {
|
|
43
|
+
if (!/^[A-Za-z0-9_-]*$/.test(value))
|
|
44
|
+
throw malformed(`${what} is not base64url`);
|
|
45
|
+
return Buffer.from(value, "base64url");
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 验签一个 compact JWS。publicKey 可以是 SigningKey(推荐,算法自动取)、
|
|
49
|
+
* JsonWebKey 或 KeyObject。
|
|
50
|
+
*/
|
|
51
|
+
export function verifyCompactJws(jws, publicKey) {
|
|
52
|
+
const parts = jws.split(".");
|
|
53
|
+
if (parts.length !== 3)
|
|
54
|
+
throw malformed("must have exactly 3 segments");
|
|
55
|
+
const headerSegment = parts[0] ?? "";
|
|
56
|
+
const payloadSegment = parts[1] ?? "";
|
|
57
|
+
const signatureSegment = parts[2] ?? "";
|
|
58
|
+
const headerBytes = base64urlToBuffer(headerSegment, "header");
|
|
59
|
+
let header;
|
|
60
|
+
try {
|
|
61
|
+
header = JSON.parse(headerBytes.toString("utf8"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw malformed("header is not valid JSON");
|
|
65
|
+
}
|
|
66
|
+
if (header === null || typeof header !== "object" || Array.isArray(header)) {
|
|
67
|
+
throw malformed("header must be a JSON object");
|
|
68
|
+
}
|
|
69
|
+
const headerRecord = header;
|
|
70
|
+
if (typeof headerRecord.alg !== "string" || headerRecord.alg.length === 0) {
|
|
71
|
+
throw malformed("header has no alg");
|
|
72
|
+
}
|
|
73
|
+
const alg = headerRecord.alg;
|
|
74
|
+
const keyid = typeof headerRecord.kid === "string" ? headerRecord.kid : undefined;
|
|
75
|
+
const payload = base64urlToBuffer(payloadSegment, "payload");
|
|
76
|
+
const signature = base64urlToBuffer(signatureSegment, "signature");
|
|
77
|
+
const signingInput = Buffer.from(`${headerSegment}.${payloadSegment}`, "utf8");
|
|
78
|
+
const key = resolveJwsKey(publicKey, alg);
|
|
79
|
+
if (!verifyJwsSignature(alg, signingInput, signature, key)) {
|
|
80
|
+
throw new JwsError("invalid_signature", "JWS signature verification failed");
|
|
81
|
+
}
|
|
82
|
+
return { header: headerRecord, payload, alg, keyid };
|
|
83
|
+
}
|
|
84
|
+
function resolveJwsKey(publicKey, alg) {
|
|
85
|
+
if (publicKey instanceof KeyObject)
|
|
86
|
+
return publicKey;
|
|
87
|
+
if (typeof publicKey === "object" && "keyid" in publicKey && "algorithm" in publicKey) {
|
|
88
|
+
const key = publicKey;
|
|
89
|
+
if (key.algorithm !== jwsAlgToSignatureAlgorithm(alg)) {
|
|
90
|
+
throw new JwsError("unsupported_algorithm", `JWS alg ${alg} does not match key algorithm ${key.algorithm}`);
|
|
91
|
+
}
|
|
92
|
+
return publicKeyObject(key);
|
|
93
|
+
}
|
|
94
|
+
const jwk = publicKey;
|
|
95
|
+
if (jwk.kty === "OKP" && jwk.crv === "Ed25519" && alg !== "EdDSA") {
|
|
96
|
+
throw new JwsError("unsupported_algorithm", `key is Ed25519 but JWS alg is ${alg}`);
|
|
97
|
+
}
|
|
98
|
+
if (jwk.kty === "EC" && jwk.crv === "P-256" && alg !== "ES256") {
|
|
99
|
+
throw new JwsError("unsupported_algorithm", `key is P-256 but JWS alg is ${alg}`);
|
|
100
|
+
}
|
|
101
|
+
return createPublicKey({ key: jwk, format: "jwk" });
|
|
102
|
+
}
|
|
103
|
+
function jwsAlgToSignatureAlgorithm(alg) {
|
|
104
|
+
if (alg === "EdDSA")
|
|
105
|
+
return "ed25519";
|
|
106
|
+
if (alg === "ES256")
|
|
107
|
+
return "es256";
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
function verifyJwsSignature(alg, signingInput, signature, key) {
|
|
111
|
+
switch (alg) {
|
|
112
|
+
case "EdDSA":
|
|
113
|
+
return nodeVerify(null, signingInput, key, signature);
|
|
114
|
+
case "ES256":
|
|
115
|
+
return nodeVerify("sha256", signingInput, { key, dsaEncoding: "ieee-p1363" }, signature);
|
|
116
|
+
default:
|
|
117
|
+
throw new JwsError("unsupported_algorithm", `unsupported JWS alg ${alg}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** 读取 compact JWS 的 kid(不验签);畸形返回 undefined。 */
|
|
121
|
+
export function jwsKid(jws) {
|
|
122
|
+
const firstDot = jws.indexOf(".");
|
|
123
|
+
if (firstDot <= 0)
|
|
124
|
+
return undefined;
|
|
125
|
+
const headerSegment = jws.slice(0, firstDot);
|
|
126
|
+
let header;
|
|
127
|
+
try {
|
|
128
|
+
header = JSON.parse(base64urlToBuffer(headerSegment, "header").toString("utf8"));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
if (header === null || typeof header !== "object")
|
|
134
|
+
return undefined;
|
|
135
|
+
const kid = header.kid;
|
|
136
|
+
return typeof kid === "string" ? kid : undefined;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 验证「Agent Card + 其 JWS」绑定:JWS 验签通过,且 JWS 负载规范化后与该
|
|
140
|
+
* card 一致。card 必须先过 parseAgentCard(结构校验 + secret 扫描);负载经
|
|
141
|
+
* parseAgentCard 归一后再比对,双方都过 JCS。
|
|
142
|
+
*/
|
|
143
|
+
export function verifyAgentCardJws(card, jws, resolver) {
|
|
144
|
+
const kid = jwsKid(jws);
|
|
145
|
+
const key = kid === undefined ? undefined : resolver(kid);
|
|
146
|
+
if (key === undefined) {
|
|
147
|
+
return { ok: false, reason: `no signing key for JWS kid "${kid ?? "(missing)"}"` };
|
|
148
|
+
}
|
|
149
|
+
let verified;
|
|
150
|
+
try {
|
|
151
|
+
verified = verifyCompactJws(jws, key);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
return {
|
|
155
|
+
ok: false,
|
|
156
|
+
reason: err instanceof JwsError ? err.message : String(err),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
let parsed;
|
|
160
|
+
try {
|
|
161
|
+
parsed = JSON.parse(verified.payload.toString("utf8"));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return { ok: false, reason: "JWS payload is not valid JSON" };
|
|
165
|
+
}
|
|
166
|
+
let normalized;
|
|
167
|
+
try {
|
|
168
|
+
normalized = parseAgentCard(parsed);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return { ok: false, reason: `JWS payload is not a valid Agent Card: ${err instanceof Error ? err.message : String(err)}` };
|
|
172
|
+
}
|
|
173
|
+
if (canonicalize(normalized) !== canonicalize(card)) {
|
|
174
|
+
return { ok: false, reason: "JWS payload does not match the presented Agent Card" };
|
|
175
|
+
}
|
|
176
|
+
return { ok: true, keyid: verified.keyid };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=jws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jws.js","sourceRoot":"","sources":["../../../src/trust/identity/jws.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 签名密钥模型与 keyid → 公钥解析接缝。
|
|
18
|
+
*
|
|
19
|
+
* 两个来源(基线 §27 Identity Trust:HTTP Message Signatures / UCP signing keys):
|
|
20
|
+
* - `signing_keys` 本地配置信任锚:{ keyid, algorithm, publicKey, profile };
|
|
21
|
+
* - JWKS 接缝:{ keys: JsonWebKey[] },kid → OKP(Ed25519) / EC(P-256)。
|
|
22
|
+
*
|
|
23
|
+
* 公钥材料三种等价形态:SPKI PEM、JWK、raw 字节(Ed25519=32B,P-256=64B
|
|
24
|
+
* 未压缩点 x||y)。`publicKeyObject` 归一为 node:crypto KeyObject 供验签。
|
|
25
|
+
* 私钥仅存在于出站签名器(signer.ts);本模块不保存、不解析私钥除外的任何 secret。
|
|
26
|
+
*/
|
|
27
|
+
import { type JsonWebKey, type KeyObject } from "node:crypto";
|
|
28
|
+
import type { TrustLevel } from "./trust-policy.js";
|
|
29
|
+
/** 本实现支持的签名算法(RFC 9421 alg 名见 RFC9421_ALG_NAMES)。 */
|
|
30
|
+
export type SignatureAlgorithm = "ed25519" | "es256";
|
|
31
|
+
/** 与密钥绑定的身份档案(身份绑定冲突 → identity_rejected 的比对输入)。 */
|
|
32
|
+
export interface KeyProfile {
|
|
33
|
+
/** 该 key 绑定的规范身份(幂等主键 sender 侧)。 */
|
|
34
|
+
identity?: string;
|
|
35
|
+
/** 组织名。 */
|
|
36
|
+
organization?: string;
|
|
37
|
+
/** KNP 角色(buyer|merchant)。 */
|
|
38
|
+
role?: "buyer" | "merchant";
|
|
39
|
+
/** 该密钥对应对端的信任等级。 */
|
|
40
|
+
trustLevel?: TrustLevel;
|
|
41
|
+
}
|
|
42
|
+
/** 一个签名密钥的验证方视图(只含公钥材料 + 绑定档案)。 */
|
|
43
|
+
export interface SigningKey {
|
|
44
|
+
keyid: string;
|
|
45
|
+
algorithm: SignatureAlgorithm;
|
|
46
|
+
/** SPKI PEM 公钥。 */
|
|
47
|
+
publicKeyPem?: string;
|
|
48
|
+
/** raw 公钥:Ed25519=32B;P-256=64B(x||y 未压缩点)。 */
|
|
49
|
+
publicKeyRaw?: Buffer;
|
|
50
|
+
/** JWK 公钥。 */
|
|
51
|
+
jwk?: JsonWebKey;
|
|
52
|
+
/** 本地配置的信任档案。 */
|
|
53
|
+
profile?: KeyProfile;
|
|
54
|
+
}
|
|
55
|
+
/** keyid → 公钥。返回 undefined 表示未知 keyid(验证方不认识该签名者)。 */
|
|
56
|
+
export type KeyResolver = (keyid: string) => SigningKey | undefined;
|
|
57
|
+
/** 校验 raw 长度并按算法归一为 JWK。 */
|
|
58
|
+
export declare function publicKeyJwkFromRaw(algorithm: SignatureAlgorithm, raw: Buffer): JsonWebKey;
|
|
59
|
+
/** 把 SigningKey 归一为 node:crypto 公钥 KeyObject。 */
|
|
60
|
+
export declare function publicKeyObject(key: SigningKey): KeyObject;
|
|
61
|
+
/**
|
|
62
|
+
* 由 32 字节 Ed25519 seed 构造私钥 KeyObject(PKCS8 DER,固定前缀)。
|
|
63
|
+
* 确定性:同一 seed 恒得同一密钥,供测试与确定性签名器使用。
|
|
64
|
+
*/
|
|
65
|
+
export declare function ed25519PrivateKeyFromSeed(seed: Buffer): KeyObject;
|
|
66
|
+
/** 由 PEM PKCS8 或 JWK 构造私钥 KeyObject(出站签名用)。 */
|
|
67
|
+
export declare function privateKeyObject(input: string | JsonWebKey): KeyObject;
|
|
68
|
+
/** 从本地 signing_keys 配置构建 resolver(精确 keyid 匹配)。 */
|
|
69
|
+
export declare function resolveFromSigningKeys(keys: SigningKey[]): KeyResolver;
|
|
70
|
+
/** 从 JWKS 构造 resolver:kid 匹配,kty/crv 推断算法,未知算法跳过。 */
|
|
71
|
+
export declare function resolveFromJwks(keys: JsonWebKey[]): KeyResolver;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* 签名密钥模型与 keyid → 公钥解析接缝。
|
|
18
|
+
*
|
|
19
|
+
* 两个来源(基线 §27 Identity Trust:HTTP Message Signatures / UCP signing keys):
|
|
20
|
+
* - `signing_keys` 本地配置信任锚:{ keyid, algorithm, publicKey, profile };
|
|
21
|
+
* - JWKS 接缝:{ keys: JsonWebKey[] },kid → OKP(Ed25519) / EC(P-256)。
|
|
22
|
+
*
|
|
23
|
+
* 公钥材料三种等价形态:SPKI PEM、JWK、raw 字节(Ed25519=32B,P-256=64B
|
|
24
|
+
* 未压缩点 x||y)。`publicKeyObject` 归一为 node:crypto KeyObject 供验签。
|
|
25
|
+
* 私钥仅存在于出站签名器(signer.ts);本模块不保存、不解析私钥除外的任何 secret。
|
|
26
|
+
*/
|
|
27
|
+
import { createPrivateKey, createPublicKey } from "node:crypto";
|
|
28
|
+
/** 校验 raw 长度并按算法归一为 JWK。 */
|
|
29
|
+
export function publicKeyJwkFromRaw(algorithm, raw) {
|
|
30
|
+
if (algorithm === "ed25519") {
|
|
31
|
+
if (raw.length !== 32) {
|
|
32
|
+
throw new Error(`Ed25519 raw public key must be 32 bytes (got ${raw.length})`);
|
|
33
|
+
}
|
|
34
|
+
return { kty: "OKP", crv: "Ed25519", x: raw.toString("base64url") };
|
|
35
|
+
}
|
|
36
|
+
if (raw.length !== 64) {
|
|
37
|
+
throw new Error(`P-256 raw public key must be 64 bytes (got ${raw.length})`);
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
kty: "EC",
|
|
41
|
+
crv: "P-256",
|
|
42
|
+
x: raw.subarray(0, 32).toString("base64url"),
|
|
43
|
+
y: raw.subarray(32, 64).toString("base64url"),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** 把 SigningKey 归一为 node:crypto 公钥 KeyObject。 */
|
|
47
|
+
export function publicKeyObject(key) {
|
|
48
|
+
if (key.publicKeyPem !== undefined) {
|
|
49
|
+
return createPublicKey(key.publicKeyPem);
|
|
50
|
+
}
|
|
51
|
+
if (key.jwk !== undefined) {
|
|
52
|
+
return createPublicKey({ key: key.jwk, format: "jwk" });
|
|
53
|
+
}
|
|
54
|
+
if (key.publicKeyRaw !== undefined) {
|
|
55
|
+
return createPublicKey({
|
|
56
|
+
key: publicKeyJwkFromRaw(key.algorithm, key.publicKeyRaw),
|
|
57
|
+
format: "jwk",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`SigningKey ${key.keyid} has no public key material`);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 由 32 字节 Ed25519 seed 构造私钥 KeyObject(PKCS8 DER,固定前缀)。
|
|
64
|
+
* 确定性:同一 seed 恒得同一密钥,供测试与确定性签名器使用。
|
|
65
|
+
*/
|
|
66
|
+
export function ed25519PrivateKeyFromSeed(seed) {
|
|
67
|
+
if (seed.length !== 32) {
|
|
68
|
+
throw new Error(`Ed25519 private seed must be 32 bytes (got ${seed.length})`);
|
|
69
|
+
}
|
|
70
|
+
const DER_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
|
|
71
|
+
return createPrivateKey({
|
|
72
|
+
key: Buffer.concat([DER_PREFIX, seed]),
|
|
73
|
+
format: "der",
|
|
74
|
+
type: "pkcs8",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** 由 PEM PKCS8 或 JWK 构造私钥 KeyObject(出站签名用)。 */
|
|
78
|
+
export function privateKeyObject(input) {
|
|
79
|
+
if (typeof input === "string")
|
|
80
|
+
return createPrivateKey(input);
|
|
81
|
+
return createPrivateKey({ key: input, format: "jwk" });
|
|
82
|
+
}
|
|
83
|
+
/** 从本地 signing_keys 配置构建 resolver(精确 keyid 匹配)。 */
|
|
84
|
+
export function resolveFromSigningKeys(keys) {
|
|
85
|
+
const byId = new Map();
|
|
86
|
+
for (const key of keys) {
|
|
87
|
+
if (key.keyid.length === 0) {
|
|
88
|
+
throw new Error("resolveFromSigningKeys: keyid must be a non-empty string");
|
|
89
|
+
}
|
|
90
|
+
if (byId.has(key.keyid)) {
|
|
91
|
+
throw new Error(`resolveFromSigningKeys: duplicate keyid "${key.keyid}"`);
|
|
92
|
+
}
|
|
93
|
+
byId.set(key.keyid, key);
|
|
94
|
+
}
|
|
95
|
+
return (keyid) => byId.get(keyid);
|
|
96
|
+
}
|
|
97
|
+
/** 从 JWKS 构造 resolver:kid 匹配,kty/crv 推断算法,未知算法跳过。 */
|
|
98
|
+
export function resolveFromJwks(keys) {
|
|
99
|
+
const byKid = new Map();
|
|
100
|
+
for (const jwk of keys) {
|
|
101
|
+
if (typeof jwk.kid !== "string" || jwk.kid.length === 0)
|
|
102
|
+
continue;
|
|
103
|
+
const algorithm = algorithmFromJwk(jwk);
|
|
104
|
+
if (algorithm === undefined)
|
|
105
|
+
continue;
|
|
106
|
+
byKid.set(jwk.kid, { keyid: jwk.kid, algorithm, jwk });
|
|
107
|
+
}
|
|
108
|
+
return (keyid) => byKid.get(keyid);
|
|
109
|
+
}
|
|
110
|
+
/** 由 JWK 推断算法:OKP+Ed25519 → ed25519;EC+P-256 → es256;其余不支持。 */
|
|
111
|
+
function algorithmFromJwk(jwk) {
|
|
112
|
+
if (jwk.kty === "OKP" && jwk.crv === "Ed25519")
|
|
113
|
+
return "ed25519";
|
|
114
|
+
if (jwk.kty === "EC" && jwk.crv === "P-256")
|
|
115
|
+
return "es256";
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/trust/identity/keys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* HTTP Message Signatures(RFC 9421)—— 出站签名器 + 入站验签核心。
|
|
18
|
+
*
|
|
19
|
+
* 覆盖组件默认集:@method @target-uri @authority content-digest。
|
|
20
|
+
* - @method / @target-uri / @authority 是派生组件(请求语义);
|
|
21
|
+
* - content-digest(RFC 9530)把请求体绑定进签名 —— 篡改任一 covered
|
|
22
|
+
* component 都会导致验签失败,这是 §31「digest ≠ authentication」的落点:
|
|
23
|
+
* envelope digest 只证完整性,HTTP Message Signature 证明「由持有该 key 的
|
|
24
|
+
* 身份发出」。
|
|
25
|
+
*
|
|
26
|
+
* 支持算法:Ed25519(RFC 9421 alg="ed25519")与 ES256(P-256 + SHA-256,
|
|
27
|
+
* alg="ecdsa-p256-sha256",原始 r||s 编码 = node:dns ieee-p1363)。零新增依赖。
|
|
28
|
+
*/
|
|
29
|
+
import { type JsonWebKey } from "node:crypto";
|
|
30
|
+
import type { A2AOutboundRequest } from "../../a2a/client/types.js";
|
|
31
|
+
import { type SignatureParams } from "./signature-base.js";
|
|
32
|
+
import { type KeyProfile, type KeyResolver, type SignatureAlgorithm } from "./keys.js";
|
|
33
|
+
import type { NonceStore } from "./nonce.js";
|
|
34
|
+
/** RFC 9421 alg 名(Signature-Input 的 alg 参数)。 */
|
|
35
|
+
export declare const RFC9421_ALG_NAMES: Record<SignatureAlgorithm, string>;
|
|
36
|
+
/** 默认覆盖组件:把方法、目标、authority、请求体全部绑定进签名。 */
|
|
37
|
+
export declare const DEFAULT_COVERED_COMPONENTS: readonly string[];
|
|
38
|
+
/** 计算请求体的 content-digest 头值:`sha-256=:<base64>:`。 */
|
|
39
|
+
export declare function contentDigestHeader(body: Buffer): string;
|
|
40
|
+
/** 重算请求体 digest 并与头声明比较(内容完整性,§31)。 */
|
|
41
|
+
export declare function verifyContentDigest(body: Buffer, header: string): boolean;
|
|
42
|
+
export interface HttpMessageSignerOptions {
|
|
43
|
+
keyid: string;
|
|
44
|
+
algorithm: SignatureAlgorithm;
|
|
45
|
+
/** 私钥:PEM PKCS8,或 JWK,或(Ed25519 专用)32 字节 raw seed。 */
|
|
46
|
+
privateKey: string | JsonWebKey | Buffer;
|
|
47
|
+
/** 覆盖组件;默认 DEFAULT_COVERED_COMPONENTS。 */
|
|
48
|
+
coveredComponents?: readonly string[];
|
|
49
|
+
/** created 覆盖(unix 秒);默认 now()。 */
|
|
50
|
+
created?: number;
|
|
51
|
+
/** expires(unix 秒,可选)。 */
|
|
52
|
+
expires?: number;
|
|
53
|
+
/** nonce 值(可选;T3 强制由策略决定,签名器侧可自行注入)。 */
|
|
54
|
+
nonce?: string;
|
|
55
|
+
/** 时钟(unix 秒);默认 Date.now()/1000。 */
|
|
56
|
+
now?: () => number;
|
|
57
|
+
}
|
|
58
|
+
/** 出站 HTTP Message Signature 签名器。 */
|
|
59
|
+
export declare class HttpMessageSigner {
|
|
60
|
+
readonly keyid: string;
|
|
61
|
+
readonly algorithm: SignatureAlgorithm;
|
|
62
|
+
private readonly privateKey;
|
|
63
|
+
private readonly coveredComponents;
|
|
64
|
+
private readonly created;
|
|
65
|
+
private readonly expires;
|
|
66
|
+
private readonly nonce;
|
|
67
|
+
private readonly now;
|
|
68
|
+
constructor(options: HttpMessageSignerOptions);
|
|
69
|
+
/** 为一次出站请求计算签名头(content-digest / signature-input / signature)。 */
|
|
70
|
+
sign(input: A2AOutboundRequest): Record<string, string>;
|
|
71
|
+
}
|
|
72
|
+
export interface VerifyHttpSignatureInput {
|
|
73
|
+
method: string;
|
|
74
|
+
/** 绝对 target URI(或 origin-form 请求目标)。 */
|
|
75
|
+
targetUri: string;
|
|
76
|
+
/** @authority 值(Host 头)。 */
|
|
77
|
+
authority: string;
|
|
78
|
+
/** 请求头(小写名)。 */
|
|
79
|
+
headers: Record<string, string | string[] | undefined>;
|
|
80
|
+
/** 请求体字节(用于 content-digest 重算)。 */
|
|
81
|
+
body: Buffer;
|
|
82
|
+
resolver: KeyResolver;
|
|
83
|
+
nonceStore?: NonceStore;
|
|
84
|
+
/** 时钟(unix 秒);默认 Date.now()/1000。 */
|
|
85
|
+
now?: () => number;
|
|
86
|
+
maxClockSkewSeconds?: number;
|
|
87
|
+
maxSignatureAgeSeconds?: number;
|
|
88
|
+
}
|
|
89
|
+
export type HttpSignatureVerifyResult = {
|
|
90
|
+
ok: true;
|
|
91
|
+
keyid: string;
|
|
92
|
+
algorithm: SignatureAlgorithm;
|
|
93
|
+
params: SignatureParams;
|
|
94
|
+
profile?: KeyProfile;
|
|
95
|
+
} | {
|
|
96
|
+
ok: false;
|
|
97
|
+
code: "authentication_required" | "authorization_failed" | "replay_detected";
|
|
98
|
+
reason: string;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* 验签:解析 Signature-Input / Signature,逐项验证(keyid → 公钥、时间窗口、
|
|
102
|
+
* nonce、signature base、content-digest 完整性)。任一 signature 验证通过即成功;
|
|
103
|
+
* 全部失败返回第一个错误(fail-closed,§4.6)。
|
|
104
|
+
*/
|
|
105
|
+
export declare function verifyHttpMessageSignature(input: VerifyHttpSignatureInput): HttpSignatureVerifyResult;
|