@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,59 @@
|
|
|
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
|
+
import type { LedgerCapabilitySnapshot, LedgerEvent, LedgerIdentitySnapshot } from "../negotiation/ledger/event.js";
|
|
17
|
+
import type { HandoffCandidate } from "./candidate.js";
|
|
18
|
+
import type { HandoffDeliveryEventKind, HandoffEventStore } from "./ledger.js";
|
|
19
|
+
export declare const HANDOFF_DELIVERY_STATES: readonly ["DELIVERED", "LAUNCHED", "OPENED_CONFIRMED", "EXPIRED", "REVOKED"];
|
|
20
|
+
export type HandoffDeliveryState = (typeof HANDOFF_DELIVERY_STATES)[number];
|
|
21
|
+
/** 允许的 OPENED_CONFIRMED 证据种类(KTH rev0.3 §9)。 */
|
|
22
|
+
export declare const OPEN_EVIDENCE_KINDS: readonly ["local_callback", "merchant_callback", "platform_callback", "verified_return_uri"];
|
|
23
|
+
export type OpenEvidenceKind = (typeof OPEN_EVIDENCE_KINDS)[number];
|
|
24
|
+
/** 可归属打开证据:必须绑定 handoff_id + 时间戳。 */
|
|
25
|
+
export interface OpenEvidence {
|
|
26
|
+
readonly kind: OpenEvidenceKind;
|
|
27
|
+
readonly handoff_id: string;
|
|
28
|
+
readonly at: string;
|
|
29
|
+
readonly details?: Readonly<Record<string, unknown>>;
|
|
30
|
+
}
|
|
31
|
+
/** 从 Ledger 交付事件投影交付状态(纯函数,最后事件胜出)。 */
|
|
32
|
+
export declare function deliveryState(events: readonly Pick<LedgerEvent, "event_kind" | "event_id">[]): HandoffDeliveryState | undefined;
|
|
33
|
+
/** 迁移校验:非法转换抛 schemaError(fail-closed)。 */
|
|
34
|
+
export declare function transitionDeliveryState(current: HandoffDeliveryState | undefined, eventKind: HandoffDeliveryEventKind): HandoffDeliveryState;
|
|
35
|
+
export declare function isHandoffDeliveryEventKind(kind: string): kind is HandoffDeliveryEventKind;
|
|
36
|
+
/** 校验打开证据(fail-closed):kind 白名单 + handoff_id 绑定 + RFC 3339。 */
|
|
37
|
+
export declare function validateOpenEvidence(value: unknown, path?: string): OpenEvidence;
|
|
38
|
+
export interface DeliveryEventDeps {
|
|
39
|
+
ledger: HandoffEventStore;
|
|
40
|
+
candidate: HandoffCandidate;
|
|
41
|
+
handoff_id: string;
|
|
42
|
+
identity: LedgerIdentitySnapshot;
|
|
43
|
+
capability: LedgerCapabilitySnapshot;
|
|
44
|
+
now?: () => string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 记录 LAUNCHED:只表示成功请求 OS/browser/deep-link handler 启动目的地,
|
|
48
|
+
* 不证明页面加载(§36-28)。
|
|
49
|
+
*/
|
|
50
|
+
export declare function recordLaunch(deps: DeliveryEventDeps): void;
|
|
51
|
+
/**
|
|
52
|
+
* 记录 OPENED_CONFIRMED —— 证据门:只有通过 validateOpenEvidence 的
|
|
53
|
+
* 可归属证据才允许进入该状态;无证据的 launch 永不成为 OPENED_CONFIRMED。
|
|
54
|
+
*/
|
|
55
|
+
export declare function recordOpenEvidence(deps: DeliveryEventDeps & {
|
|
56
|
+
evidence: unknown;
|
|
57
|
+
}): OpenEvidence;
|
|
58
|
+
/** 记录 REVOKED(仅当目的地支持撤销;§9)。 */
|
|
59
|
+
export declare function recordRevoked(deps: DeliveryEventDeps, reason?: string): void;
|
|
@@ -0,0 +1,185 @@
|
|
|
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
|
+
* KTH/0.1 交付观察状态(rev0.3 §9;架构 rev1.4.1 §36-27/28)。
|
|
18
|
+
*
|
|
19
|
+
* DELIVERED / LAUNCHED / OPENED_CONFIRMED / EXPIRED / REVOKED ——
|
|
20
|
+
* 这些状态只描述「交接动作」,**绝不**伪装成 ORDER_CREATED / PAID /
|
|
21
|
+
* FULFILLED(外部交易结果必须由外部 authority 明确回传)。
|
|
22
|
+
*
|
|
23
|
+
* 证据门:`LAUNCHED` 只表示成功请求 OS/browser/deep-link handler 启动
|
|
24
|
+
* 目的地,不证明页面加载;`OPENED_CONFIRMED` 必须由**可归属证据**触发
|
|
25
|
+
* (local_callback 绑定 handoff_id / merchant_callback / platform_callback /
|
|
26
|
+
* verified_return_uri)。无证据永不 OPENED_CONFIRMED(完成定义 #19、
|
|
27
|
+
* 完成标准 12)。明确拒绝:button click / openURL 成功 / 计时 / UA 猜测。
|
|
28
|
+
*/
|
|
29
|
+
import { requireIsoTimestamp, requireNonEmptyString, schemaError } from "../negotiation/domain/common.js";
|
|
30
|
+
export const HANDOFF_DELIVERY_STATES = [
|
|
31
|
+
"DELIVERED",
|
|
32
|
+
"LAUNCHED",
|
|
33
|
+
"OPENED_CONFIRMED",
|
|
34
|
+
"EXPIRED",
|
|
35
|
+
"REVOKED",
|
|
36
|
+
];
|
|
37
|
+
/** 允许的 OPENED_CONFIRMED 证据种类(KTH rev0.3 §9)。 */
|
|
38
|
+
export const OPEN_EVIDENCE_KINDS = [
|
|
39
|
+
"local_callback",
|
|
40
|
+
"merchant_callback",
|
|
41
|
+
"platform_callback",
|
|
42
|
+
"verified_return_uri",
|
|
43
|
+
];
|
|
44
|
+
// handoff_delivery_failed 不在此表:失败交付不产生观察状态,fold 时保留
|
|
45
|
+
// 前态(此前映射为 DELIVERED 会把 LAUNCHED 倒退成 DELIVERED)。
|
|
46
|
+
const DELIVERY_EVENT_TO_STATE = {
|
|
47
|
+
handoff_delivered: "DELIVERED",
|
|
48
|
+
handoff_launched: "LAUNCHED",
|
|
49
|
+
handoff_opened_confirmed: "OPENED_CONFIRMED",
|
|
50
|
+
handoff_expired: "EXPIRED",
|
|
51
|
+
handoff_revoked: "REVOKED",
|
|
52
|
+
};
|
|
53
|
+
/** 从 Ledger 交付事件投影交付状态(纯函数,最后事件胜出)。 */
|
|
54
|
+
export function deliveryState(events) {
|
|
55
|
+
let state;
|
|
56
|
+
for (const event of events) {
|
|
57
|
+
if (!isHandoffDeliveryEventKind(event.event_kind))
|
|
58
|
+
continue;
|
|
59
|
+
const next = DELIVERY_EVENT_TO_STATE[event.event_kind];
|
|
60
|
+
if (next !== undefined)
|
|
61
|
+
state = next;
|
|
62
|
+
}
|
|
63
|
+
return state;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 显式迁移表(评审项:delivery 域补齐与 candidate lifecycle 对称的状态机)。
|
|
67
|
+
* `handoff_delivery_failed` 不映射状态(保留前态),不出现在表中。
|
|
68
|
+
*
|
|
69
|
+
* (none) --delivered--> DELIVERED (交付事件必须是首个)
|
|
70
|
+
* DELIVERED --launched--> LAUNCHED
|
|
71
|
+
* DELIVERED/LAUNCHED --opened--> OPENED_CONFIRMED
|
|
72
|
+
* DELIVERED/LAUNCHED --expired--> EXPIRED (打开时限过期,终态)
|
|
73
|
+
* DELIVERED/LAUNCHED --revoked--> REVOKED (终态)
|
|
74
|
+
* OPENED_CONFIRMED/EXPIRED/REVOKED 无后继
|
|
75
|
+
*
|
|
76
|
+
* 由此拒绝:无 delivered 的 launch(审计污染)、REVOKED/EXPIRED 后的任何
|
|
77
|
+
* 事件(终态)、OPENED_CONFIRMED 后的倒退(expired/launch/再次确认)。
|
|
78
|
+
*/
|
|
79
|
+
const DELIVERY_TRANSITIONS = {
|
|
80
|
+
"": new Set(["DELIVERED"]),
|
|
81
|
+
DELIVERED: new Set(["LAUNCHED", "OPENED_CONFIRMED", "EXPIRED", "REVOKED"]),
|
|
82
|
+
LAUNCHED: new Set(["OPENED_CONFIRMED", "EXPIRED", "REVOKED"]),
|
|
83
|
+
OPENED_CONFIRMED: new Set(),
|
|
84
|
+
EXPIRED: new Set(),
|
|
85
|
+
REVOKED: new Set(),
|
|
86
|
+
};
|
|
87
|
+
/** 迁移校验:非法转换抛 schemaError(fail-closed)。 */
|
|
88
|
+
export function transitionDeliveryState(current, eventKind) {
|
|
89
|
+
const target = DELIVERY_EVENT_TO_STATE[eventKind];
|
|
90
|
+
if (target === undefined) {
|
|
91
|
+
throw schemaError("handoff_delivery_state", `event kind ${eventKind} has no delivery state mapping`);
|
|
92
|
+
}
|
|
93
|
+
const allowed = DELIVERY_TRANSITIONS[current ?? ""] ?? new Set();
|
|
94
|
+
if (!allowed.has(target)) {
|
|
95
|
+
throw schemaError("handoff_delivery_state", `illegal handoff delivery transition ${current ?? "(none)"} --${eventKind}--> ${target}`);
|
|
96
|
+
}
|
|
97
|
+
return target;
|
|
98
|
+
}
|
|
99
|
+
export function isHandoffDeliveryEventKind(kind) {
|
|
100
|
+
return (kind === "handoff_delivered" ||
|
|
101
|
+
kind === "handoff_launched" ||
|
|
102
|
+
kind === "handoff_opened_confirmed" ||
|
|
103
|
+
kind === "handoff_expired" ||
|
|
104
|
+
kind === "handoff_revoked" ||
|
|
105
|
+
kind === "handoff_delivery_failed");
|
|
106
|
+
}
|
|
107
|
+
/** 校验打开证据(fail-closed):kind 白名单 + handoff_id 绑定 + RFC 3339。 */
|
|
108
|
+
export function validateOpenEvidence(value, path = "open_evidence") {
|
|
109
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
110
|
+
throw schemaError(path, "open evidence must be an object");
|
|
111
|
+
}
|
|
112
|
+
const obj = value;
|
|
113
|
+
const kind = obj.kind;
|
|
114
|
+
if (!OPEN_EVIDENCE_KINDS.includes(String(kind))) {
|
|
115
|
+
throw schemaError(path, `unsupported open evidence kind "${String(kind)}" (allowed: ${OPEN_EVIDENCE_KINDS.join(", ")})`);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
kind: kind,
|
|
119
|
+
handoff_id: requireNonEmptyString(obj.handoff_id, `${path}/handoff_id`),
|
|
120
|
+
at: requireIsoTimestamp(obj.at, `${path}/at`),
|
|
121
|
+
...(obj.details !== undefined ? { details: obj.details } : {}),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 记录 LAUNCHED:只表示成功请求 OS/browser/deep-link handler 启动目的地,
|
|
126
|
+
* 不证明页面加载(§36-28)。
|
|
127
|
+
*/
|
|
128
|
+
export function recordLaunch(deps) {
|
|
129
|
+
deps.ledger.appendDeliveryEvent({
|
|
130
|
+
kind: "handoff_launched",
|
|
131
|
+
candidate: deps.candidate,
|
|
132
|
+
handoff_id: deps.handoff_id,
|
|
133
|
+
identity: deps.identity,
|
|
134
|
+
capability: deps.capability,
|
|
135
|
+
occurred_at: deps.now?.() ?? new Date().toISOString(),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 记录 OPENED_CONFIRMED —— 证据门:只有通过 validateOpenEvidence 的
|
|
140
|
+
* 可归属证据才允许进入该状态;无证据的 launch 永不成为 OPENED_CONFIRMED。
|
|
141
|
+
*/
|
|
142
|
+
export function recordOpenEvidence(deps) {
|
|
143
|
+
const evidence = validateOpenEvidence(deps.evidence);
|
|
144
|
+
if (evidence.handoff_id !== deps.handoff_id) {
|
|
145
|
+
throw schemaError("open_evidence/handoff_id", `evidence handoff_id ${evidence.handoff_id} does not match ${deps.handoff_id}`);
|
|
146
|
+
}
|
|
147
|
+
// 前置状态门:只允许对已交付的 handoff 记录打开确认(交付观察层此前无
|
|
148
|
+
// 状态机——链上根本没有 delivered 事件也可直接落 opened_confirmed,审计可被污染)。
|
|
149
|
+
const delivered = deps.ledger
|
|
150
|
+
.events(deps.candidate.negotiation_id)
|
|
151
|
+
.find((e) => e.event_kind === "handoff_delivered" && e.handoff_id === deps.handoff_id);
|
|
152
|
+
if (delivered === undefined) {
|
|
153
|
+
throw schemaError("handoff_id", `cannot confirm opened for handoff ${deps.handoff_id}: no delivered event on chain`);
|
|
154
|
+
}
|
|
155
|
+
deps.ledger.appendDeliveryEvent({
|
|
156
|
+
kind: "handoff_opened_confirmed",
|
|
157
|
+
candidate: deps.candidate,
|
|
158
|
+
handoff_id: deps.handoff_id,
|
|
159
|
+
identity: deps.identity,
|
|
160
|
+
capability: deps.capability,
|
|
161
|
+
evidence: { ...evidence },
|
|
162
|
+
occurred_at: deps.now?.() ?? new Date().toISOString(),
|
|
163
|
+
});
|
|
164
|
+
return evidence;
|
|
165
|
+
}
|
|
166
|
+
/** 记录 REVOKED(仅当目的地支持撤销;§9)。 */
|
|
167
|
+
export function recordRevoked(deps, reason = "operator revocation") {
|
|
168
|
+
// 前置状态门:只允许对已交付的 handoff 撤销(同 recordOpenEvidence)。
|
|
169
|
+
const delivered = deps.ledger
|
|
170
|
+
.events(deps.candidate.negotiation_id)
|
|
171
|
+
.find((e) => e.event_kind === "handoff_delivered" && e.handoff_id === deps.handoff_id);
|
|
172
|
+
if (delivered === undefined) {
|
|
173
|
+
throw schemaError("handoff_id", `cannot revoke handoff ${deps.handoff_id}: no delivered event on chain`);
|
|
174
|
+
}
|
|
175
|
+
deps.ledger.appendDeliveryEvent({
|
|
176
|
+
kind: "handoff_revoked",
|
|
177
|
+
candidate: deps.candidate,
|
|
178
|
+
handoff_id: deps.handoff_id,
|
|
179
|
+
identity: deps.identity,
|
|
180
|
+
capability: deps.capability,
|
|
181
|
+
evidence: { reason },
|
|
182
|
+
occurred_at: deps.now?.() ?? new Date().toISOString(),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/handoff/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
/** KTH/0.1 目的地类型(rev0.3 §7;顺序即文档枚举顺序)。 */
|
|
17
|
+
export declare const DESTINATION_TYPES: readonly ["ucp_checkout", "ucp_order", "external_checkout_url", "merchant_checkout_session", "platform_deep_link", "buyer_erp_request", "procurement_request", "purchase_order_draft", "quote_document", "merchant_contact", "sales_handoff"];
|
|
18
|
+
export type DestinationType = (typeof DESTINATION_TYPES)[number];
|
|
19
|
+
/**
|
|
20
|
+
* 归一化后的目的地(不可变)。`payload` 必须是最小化、schema-validated、
|
|
21
|
+
* 非秘密数据(KTH rev0.3 §5/§11.3)。
|
|
22
|
+
*/
|
|
23
|
+
export interface Destination {
|
|
24
|
+
readonly type: DestinationType;
|
|
25
|
+
/** 目的地引用:URL 类为 http(s) URL,会话/文档类为 opaque ref。 */
|
|
26
|
+
readonly ref: string;
|
|
27
|
+
/** 最小化目的地载荷(可选)。 */
|
|
28
|
+
readonly payload?: Readonly<Record<string, unknown>>;
|
|
29
|
+
}
|
|
30
|
+
/** URL 承载类目的地(external checkout / deep link)——URL 安全策略适用。 */
|
|
31
|
+
export declare function isUrlDestinationType(type: DestinationType): boolean;
|
|
32
|
+
/** 校验是否为目标类型已知值。 */
|
|
33
|
+
export declare function isDestinationType(value: unknown): value is DestinationType;
|
|
34
|
+
/**
|
|
35
|
+
* 结构校验一个目的地。URL 类要求 http(s);其余要求非空 opaque ref。
|
|
36
|
+
* 安全策略(scheme 白名单 / redirect / phishing)在 url-safety.ts 执行。
|
|
37
|
+
* 校验失败抛 schemaError(fail-closed)。
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateDestination(input: unknown, path?: string): Destination;
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
* KTH/0.1 —— destination_type 词表(单一来源,KTH rev0.3 §7)。
|
|
18
|
+
*
|
|
19
|
+
* ⚠️ 禁止平行词表:kiwi-catalog 搜索词表、shopping-cli Handoff 元数据、Agent
|
|
20
|
+
* 公开发现元数据一律从本模块 import(架构 rev1.4.1 §35A 一致性原则:
|
|
21
|
+
* "destination vocabulary = KTH destination_type vocabulary")。任何地方不得
|
|
22
|
+
* 再发明 supports_* 之类的第二套命名。
|
|
23
|
+
*
|
|
24
|
+
* URL 类目的地的安全策略(HTTPS / redirect / anti-phishing)在 url-safety.ts
|
|
25
|
+
* (WP-C2)实施;本模块只做结构校验(类型 + ref 形状 + payload 最小化约束)。
|
|
26
|
+
*/
|
|
27
|
+
import { requireNonEmptyString, requireObject, schemaError } from "../negotiation/domain/common.js";
|
|
28
|
+
/** KTH/0.1 目的地类型(rev0.3 §7;顺序即文档枚举顺序)。 */
|
|
29
|
+
export const DESTINATION_TYPES = [
|
|
30
|
+
"ucp_checkout",
|
|
31
|
+
"ucp_order",
|
|
32
|
+
"external_checkout_url",
|
|
33
|
+
"merchant_checkout_session",
|
|
34
|
+
"platform_deep_link",
|
|
35
|
+
"buyer_erp_request",
|
|
36
|
+
"procurement_request",
|
|
37
|
+
"purchase_order_draft",
|
|
38
|
+
"quote_document",
|
|
39
|
+
"merchant_contact",
|
|
40
|
+
"sales_handoff",
|
|
41
|
+
];
|
|
42
|
+
/** URL 承载类目的地:ref 必须是 http(s) URL(scheme 白名单在 url-safety.ts)。 */
|
|
43
|
+
const URL_DESTINATION_TYPES = new Set([
|
|
44
|
+
"external_checkout_url",
|
|
45
|
+
"platform_deep_link",
|
|
46
|
+
]);
|
|
47
|
+
/** 会话/引用类目的地:ref 是 opaque 会话或引用 id。 */
|
|
48
|
+
const SESSION_DESTINATION_TYPES = new Set([
|
|
49
|
+
"ucp_checkout",
|
|
50
|
+
"ucp_order",
|
|
51
|
+
"merchant_checkout_session",
|
|
52
|
+
]);
|
|
53
|
+
/** 文档/联系人类目的地:ref 是 opaque 引用(PO/quote 草稿、联系方式)。 */
|
|
54
|
+
const DOCUMENT_DESTINATION_TYPES = new Set([
|
|
55
|
+
"buyer_erp_request",
|
|
56
|
+
"procurement_request",
|
|
57
|
+
"purchase_order_draft",
|
|
58
|
+
"quote_document",
|
|
59
|
+
"merchant_contact",
|
|
60
|
+
"sales_handoff",
|
|
61
|
+
]);
|
|
62
|
+
/** URL 承载类目的地(external checkout / deep link)——URL 安全策略适用。 */
|
|
63
|
+
export function isUrlDestinationType(type) {
|
|
64
|
+
return URL_DESTINATION_TYPES.has(type);
|
|
65
|
+
}
|
|
66
|
+
/** 校验是否为目标类型已知值。 */
|
|
67
|
+
export function isDestinationType(value) {
|
|
68
|
+
return typeof value === "string" && DESTINATION_TYPES.includes(value);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 结构校验一个目的地。URL 类要求 http(s);其余要求非空 opaque ref。
|
|
72
|
+
* 安全策略(scheme 白名单 / redirect / phishing)在 url-safety.ts 执行。
|
|
73
|
+
* 校验失败抛 schemaError(fail-closed)。
|
|
74
|
+
*/
|
|
75
|
+
export function validateDestination(input, path = "destination") {
|
|
76
|
+
const obj = requireObject(input, path);
|
|
77
|
+
const typeRaw = obj.type;
|
|
78
|
+
if (!isDestinationType(typeRaw)) {
|
|
79
|
+
throw schemaError(`${path}/type`, `unknown destination type (must be one of: ${DESTINATION_TYPES.join(", ")})`);
|
|
80
|
+
}
|
|
81
|
+
const type = typeRaw;
|
|
82
|
+
const ref = requireNonEmptyString(obj.ref, `${path}/ref`);
|
|
83
|
+
if (URL_DESTINATION_TYPES.has(type) && !/^https?:\/\/\S+$/.test(ref)) {
|
|
84
|
+
throw schemaError(`${path}/ref`, `destination type "${type}" requires an http(s) URL ref`);
|
|
85
|
+
}
|
|
86
|
+
if (SESSION_DESTINATION_TYPES.has(type) || DOCUMENT_DESTINATION_TYPES.has(type)) {
|
|
87
|
+
if (/^https?:\/\//.test(ref) && !URL_DESTINATION_TYPES.has(type)) {
|
|
88
|
+
// 会话/文档类目的地不禁止 URL(如 buyer_erp_request 的 ERP 端点引用),
|
|
89
|
+
// 但不会被当作可点击链接处理——ref 语义由 destination type 决定。
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
let payload;
|
|
93
|
+
if (obj.payload !== undefined) {
|
|
94
|
+
const payloadObj = requireObject(obj.payload, `${path}/payload`);
|
|
95
|
+
payload = Object.freeze({ ...payloadObj });
|
|
96
|
+
}
|
|
97
|
+
return Object.freeze({ type, ref, ...(payload !== undefined ? { payload } : {}) });
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=destination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destination.js","sourceRoot":"","sources":["../../src/handoff/destination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
* Kiwi v0.7.0 Transaction Handoff(WP1)错误模型。
|
|
18
|
+
*
|
|
19
|
+
* 交接域内两类失败语义分得很开:
|
|
20
|
+
* - 结构化结果(HandoffChannel / AuthorizationProvider 返回 `{ok}` /
|
|
21
|
+
* `{fail_closed}` / `{requires_user}`)表达「运行时拒绝」,调用方按结果分支;
|
|
22
|
+
* - `HandoffError` 表达「构造/校验失败」,只在工件构造与授权对象构造这类纯函数
|
|
23
|
+
* 里抛出 —— 构造失败即 fail-closed:坏工件绝不会被创建出来。
|
|
24
|
+
*
|
|
25
|
+
* 代码与协议错误词表(§18)保持对齐,`terms_digest_mismatch` 直接复用 KNP 词表。
|
|
26
|
+
*/
|
|
27
|
+
export declare const HANDOFF_ERROR_CODES: readonly ["terms_digest_mismatch", "invalid_agreement", "invalid_authorization", "invalid_session", "invalid_input", "concurrency_lock_timeout"];
|
|
28
|
+
export type HandoffErrorCode = (typeof HANDOFF_ERROR_CODES)[number];
|
|
29
|
+
/** Handoff 工件/授权对象构造失败。`path` 为字段路径(JSON Pointer 风格)。 */
|
|
30
|
+
export declare class HandoffError extends Error {
|
|
31
|
+
readonly code: HandoffErrorCode;
|
|
32
|
+
readonly path?: string;
|
|
33
|
+
constructor(code: HandoffErrorCode, message: string, path?: string);
|
|
34
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
* Kiwi v0.7.0 Transaction Handoff(WP1)错误模型。
|
|
18
|
+
*
|
|
19
|
+
* 交接域内两类失败语义分得很开:
|
|
20
|
+
* - 结构化结果(HandoffChannel / AuthorizationProvider 返回 `{ok}` /
|
|
21
|
+
* `{fail_closed}` / `{requires_user}`)表达「运行时拒绝」,调用方按结果分支;
|
|
22
|
+
* - `HandoffError` 表达「构造/校验失败」,只在工件构造与授权对象构造这类纯函数
|
|
23
|
+
* 里抛出 —— 构造失败即 fail-closed:坏工件绝不会被创建出来。
|
|
24
|
+
*
|
|
25
|
+
* 代码与协议错误词表(§18)保持对齐,`terms_digest_mismatch` 直接复用 KNP 词表。
|
|
26
|
+
*/
|
|
27
|
+
export const HANDOFF_ERROR_CODES = [
|
|
28
|
+
"terms_digest_mismatch",
|
|
29
|
+
"invalid_agreement",
|
|
30
|
+
"invalid_authorization",
|
|
31
|
+
"invalid_session",
|
|
32
|
+
"invalid_input",
|
|
33
|
+
"concurrency_lock_timeout",
|
|
34
|
+
];
|
|
35
|
+
/** Handoff 工件/授权对象构造失败。`path` 为字段路径(JSON Pointer 风格)。 */
|
|
36
|
+
export class HandoffError extends Error {
|
|
37
|
+
code;
|
|
38
|
+
path;
|
|
39
|
+
constructor(code, message, path) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = "HandoffError";
|
|
42
|
+
this.code = code;
|
|
43
|
+
if (path !== undefined)
|
|
44
|
+
this.path = path;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/handoff/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,uBAAuB;IACvB,mBAAmB;IACnB,uBAAuB;IACvB,iBAAiB;IACjB,eAAe;IACf,0BAA0B;CAClB,CAAC;AAGX,yDAAyD;AACzD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,IAAI,CAAU;IACvB,YAAY,IAAsB,EAAE,OAAe,EAAE,IAAa;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
export interface HandoffIdempotencyStoreOptions {
|
|
17
|
+
dir: string;
|
|
18
|
+
/** 保留期(缺省 7 天)。 */
|
|
19
|
+
retentionDays?: number;
|
|
20
|
+
now?: () => string;
|
|
21
|
+
/**
|
|
22
|
+
* 候选执行锁等待上限(ms,缺省 120_000)。executeHandoff 内可能含 URL
|
|
23
|
+
* 探测(最长 15s 超时 × 重定向链),等待上限要容纳完整执行。
|
|
24
|
+
*/
|
|
25
|
+
lockTimeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class HandoffIdempotencyStore {
|
|
28
|
+
private readonly dir;
|
|
29
|
+
private readonly filePath;
|
|
30
|
+
private readonly retentionMs;
|
|
31
|
+
private readonly now;
|
|
32
|
+
private readonly lockTimeoutMs;
|
|
33
|
+
constructor(options: HandoffIdempotencyStoreOptions);
|
|
34
|
+
/**
|
|
35
|
+
* 以候选为粒度的互斥(§10.1 幂等的并发保护):executeHandoff 的
|
|
36
|
+
* lookup→(多次 await)→record 是 check-then-act,两个并发执行会双双通过
|
|
37
|
+
* 幂等检查、同一候选交付两次。锁文件用 `openSync("wx")` 原子创建——
|
|
38
|
+
* 单进程内 async 交错与跨进程共享 dir 两个场景都互斥;持锁期间崩溃由
|
|
39
|
+
* 等待方超时(fail-closed:抛 HandoffError,绝不并发执行)。
|
|
40
|
+
*/
|
|
41
|
+
withCandidateLock<T>(candidateId: string, fn: () => Promise<T>): Promise<T>;
|
|
42
|
+
/** 幂等查询:同候选同 digest 已交付 → 返回 handoff_id。 */
|
|
43
|
+
lookup(candidateId: string, candidateDigest: string): {
|
|
44
|
+
handoff_id: string;
|
|
45
|
+
} | undefined;
|
|
46
|
+
/** 记录一次成功交付(幂等键 → handoff_id)。 */
|
|
47
|
+
record(candidateId: string, candidateDigest: string, handoffId: string): void;
|
|
48
|
+
/** 惰性清理:删除超过保留期的行(重写文件,原子 rename)。 */
|
|
49
|
+
prune(): number;
|
|
50
|
+
private rows;
|
|
51
|
+
}
|