@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,78 @@
|
|
|
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 { TermSet } from "../../negotiation/domain/common.js";
|
|
17
|
+
import type { NegotiationAction } from "../../negotiation/domain/objects.js";
|
|
18
|
+
import type { DecisionAction, Proposal, StockState } from "../../negotiation/types.js";
|
|
19
|
+
import type { TranslationNote } from "./types.js";
|
|
20
|
+
/** legacy action → KNP action。`requires_human` = legacy 无 KNP 等价物(§35 unsupported → human)。 */
|
|
21
|
+
export declare const LEGACY_TO_KNP_ACTION: Record<DecisionAction, NegotiationAction | "requires_human">;
|
|
22
|
+
/** KNP action → legacy action。`fail_closed` = 受保护语义无法表达;`requires_human` = unsupported。 */
|
|
23
|
+
export declare const KNP_TO_LEGACY_ACTION: Record<NegotiationAction, DecisionAction | "fail_closed" | "requires_human">;
|
|
24
|
+
/** legacy 消息 id(int)→ KNP message_id(可逆)。 */
|
|
25
|
+
export declare function legacyMessageIdToKnp(messageId: number): string;
|
|
26
|
+
/** KNP message_id → legacy 消息 id(int);非 `msg_legacy_<int>` 形态返回 null。 */
|
|
27
|
+
export declare function knpMessageIdToLegacy(messageId: string): number | null;
|
|
28
|
+
/** legacy 消息承载的 offer → KNP offer_id(可逆,消息路径)。 */
|
|
29
|
+
export declare function offerIdOfLegacyMessage(messageId: number): string;
|
|
30
|
+
/** KNP offer_id → legacy 消息 id;非 `off_legacy_<int>` 形态返回 null。 */
|
|
31
|
+
export declare function legacyOfferIdFromKnp(offerId: string): number | null;
|
|
32
|
+
/** 内容寻址 id:同一 legacy 决策/terms 产生同一 KNP id(重试幂等,§6.3/§6.4)。 */
|
|
33
|
+
export declare function deterministicId(prefix: "ex" | "msg" | "off", seed: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* decision 路径的内容种子:不依赖未来才分配的消息 id。
|
|
36
|
+
* 包含完整商业内容(含 public_message),因此 §6.3 的「不同内容不得复用同一
|
|
37
|
+
* message_id」成立;同一决策重试产生同一 message_id(§6.3/§20 idempotency)。
|
|
38
|
+
* 注:created_at 不参与种子 —— 若调用方用适配器时钟缺省填充,重试必须复用
|
|
39
|
+
* 同一 ctx.created_at,否则 digest 变化会触发 idempotency_conflict。
|
|
40
|
+
*/
|
|
41
|
+
export declare function decisionContentSeed(conversationId: string, action: NegotiationAction, inReplyToMessageId: number, terms: TermSet | undefined, publicMessage: string): string;
|
|
42
|
+
export type MoneyLike = {
|
|
43
|
+
currency: string;
|
|
44
|
+
amount_minor: number;
|
|
45
|
+
};
|
|
46
|
+
/** legacy stock 块形状校验:防外来 KNP 注入伪造库存事实。 */
|
|
47
|
+
export declare function isLegacyStockState(value: unknown): value is StockState;
|
|
48
|
+
export interface TermConversion<T> {
|
|
49
|
+
ok: true;
|
|
50
|
+
value: T;
|
|
51
|
+
notes: TranslationNote[];
|
|
52
|
+
}
|
|
53
|
+
export interface TermConversionError {
|
|
54
|
+
ok: false;
|
|
55
|
+
reason: string;
|
|
56
|
+
}
|
|
57
|
+
export type TermConversionResult<T> = TermConversion<T> | TermConversionError;
|
|
58
|
+
/**
|
|
59
|
+
* legacy Proposal → KNP TermSet(§7.4)。
|
|
60
|
+
*
|
|
61
|
+
* 无损路径:sku/quantity/unit_price/currency → items[0];
|
|
62
|
+
* valid_until → terms.valid_until(expiry 语义保真)。
|
|
63
|
+
* legacy-extension(记录 note,不属于 KNP/1.0 定义字段):
|
|
64
|
+
* stock → fulfillment_terms.legacy_stock
|
|
65
|
+
* delivery.eta_start/eta_end/fee → fulfillment_terms.eta_start/eta_end/delivery_fee
|
|
66
|
+
* after_sales_policy_refs → service_terms.after_sales_policy_refs
|
|
67
|
+
* 默认填充(记录 note):quantity.unit 缺省 "piece"。
|
|
68
|
+
* 有损拒绝:金额小数位超出最小单位(§7.1 float 金额禁止)。
|
|
69
|
+
*/
|
|
70
|
+
export declare function proposalToTerms(proposal: Proposal, currencyExponentOf: (currency: string) => number): TermConversionResult<TermSet>;
|
|
71
|
+
/**
|
|
72
|
+
* KNP TermSet → legacy Proposal(decision.schema.json #/$defs/proposal)。
|
|
73
|
+
*
|
|
74
|
+
* legacy proposal 是单 SKU、强制 stock/delivery/valid_until;KNP 缺这些
|
|
75
|
+
* 语义时 fail-closed(expiry 受保护:KNP 无 valid_until 时不得发明一个;
|
|
76
|
+
* 缺 stock / delivery 同理不得发明库存/履约事实)。
|
|
77
|
+
*/
|
|
78
|
+
export declare function termsToProposal(terms: TermSet, currencyExponentOf: (currency: string) => number): TermConversionResult<Proposal>;
|
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
* LegacyNegotiationAdapter 双向字段映射(基线 §35 / 子规范 §32)。
|
|
18
|
+
*
|
|
19
|
+
* 核心约定:
|
|
20
|
+
*
|
|
21
|
+
* 1. conversation_id ↔ negotiation_id —— 直接映射(双方都是 opaque string)。
|
|
22
|
+
* 2. legacy message id(int)↔ KNP message_id(string):
|
|
23
|
+
* `msg_legacy_<int>` 可逆编码。KNP 侧出现非该形态的 message_id /
|
|
24
|
+
* in_reply_to / target_message_id 时,KNP→legacy 无法恢复 int 语义 →
|
|
25
|
+
* fail-closed(identity 语义,§35 不得静默丢弃)。
|
|
26
|
+
* 3. legacy 消息承载的 offer ↔ KNP offer_id:
|
|
27
|
+
* legacy 消息路径(已分配消息 id):`off_legacy_<message_id>`;
|
|
28
|
+
* legacy decision 路径(尚未分配消息 id):内容寻址 `off_<sha256>`,
|
|
29
|
+
* 同一决策重试生成同一 offer_id(幂等,§6.4)。
|
|
30
|
+
* 4. 受保护语义(conditions / expiry / identity / agreement)在 KNP→legacy
|
|
31
|
+
* 方向无法表达即 fail-closed / requires-human,绝不静默丢弃字段。
|
|
32
|
+
*
|
|
33
|
+
* legacy-only 字段(stock / delivery eta / fee / after_sales refs / open_issues)
|
|
34
|
+
* 在 legacy→KNP 方向用 KNP 允许的 terms 域内 legacy-extension 字段保真,
|
|
35
|
+
* 并记录 extension note —— 既不丢失,也明确标注不是 KNP/1.0 定义的字段。
|
|
36
|
+
*/
|
|
37
|
+
import { canonicalize, sha256Hex } from "../../negotiation/jcs.js";
|
|
38
|
+
import { requireIsoTimestamp } from "../../negotiation/domain/common.js";
|
|
39
|
+
import { fromMinorUnits, toMinorUnits } from "./money.js";
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Action 映射
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** legacy action → KNP action。`requires_human` = legacy 无 KNP 等价物(§35 unsupported → human)。 */
|
|
44
|
+
export const LEGACY_TO_KNP_ACTION = {
|
|
45
|
+
ask: "inquiry",
|
|
46
|
+
propose: "offer",
|
|
47
|
+
counter: "counter_offer",
|
|
48
|
+
accept_nonbinding: "accept_nonbinding",
|
|
49
|
+
decline: "decline",
|
|
50
|
+
escalate: "requires_human",
|
|
51
|
+
};
|
|
52
|
+
/** KNP action → legacy action。`fail_closed` = 受保护语义无法表达;`requires_human` = unsupported。 */
|
|
53
|
+
export const KNP_TO_LEGACY_ACTION = {
|
|
54
|
+
inquiry: "ask",
|
|
55
|
+
rfq: "requires_human", // legacy 无 RFQ;结构化 items 无法塞进 legacy ask
|
|
56
|
+
offer: "propose",
|
|
57
|
+
counter_offer: "counter",
|
|
58
|
+
conditional_offer: "fail_closed", // conditions 受保护(§35):legacy 无法表达
|
|
59
|
+
clarification: "ask",
|
|
60
|
+
clarification_response: "requires_human", // legacy 无结构化澄清应答
|
|
61
|
+
accept_nonbinding: "accept_nonbinding",
|
|
62
|
+
withdraw: "requires_human", // legacy 无 withdraw
|
|
63
|
+
decline: "decline",
|
|
64
|
+
cancel: "requires_human", // legacy 无 cancel
|
|
65
|
+
};
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Identifier 编码(§35 identity / §6)
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
const LEGACY_MSG_ID_PATTERN = /^msg_legacy_(\d{1,10})$/;
|
|
70
|
+
const LEGACY_OFFER_ID_PATTERN = /^off_legacy_(\d{1,10})$/;
|
|
71
|
+
/** legacy 消息 id(int)→ KNP message_id(可逆)。 */
|
|
72
|
+
export function legacyMessageIdToKnp(messageId) {
|
|
73
|
+
return `msg_legacy_${messageId}`;
|
|
74
|
+
}
|
|
75
|
+
/** KNP message_id → legacy 消息 id(int);非 `msg_legacy_<int>` 形态返回 null。 */
|
|
76
|
+
export function knpMessageIdToLegacy(messageId) {
|
|
77
|
+
const match = LEGACY_MSG_ID_PATTERN.exec(messageId);
|
|
78
|
+
return match === null ? null : Number(match[1]);
|
|
79
|
+
}
|
|
80
|
+
/** legacy 消息承载的 offer → KNP offer_id(可逆,消息路径)。 */
|
|
81
|
+
export function offerIdOfLegacyMessage(messageId) {
|
|
82
|
+
return `off_legacy_${messageId}`;
|
|
83
|
+
}
|
|
84
|
+
/** KNP offer_id → legacy 消息 id;非 `off_legacy_<int>` 形态返回 null。 */
|
|
85
|
+
export function legacyOfferIdFromKnp(offerId) {
|
|
86
|
+
const match = LEGACY_OFFER_ID_PATTERN.exec(offerId);
|
|
87
|
+
return match === null ? null : Number(match[1]);
|
|
88
|
+
}
|
|
89
|
+
/** 内容寻址 id:同一 legacy 决策/terms 产生同一 KNP id(重试幂等,§6.3/§6.4)。 */
|
|
90
|
+
export function deterministicId(prefix, seed) {
|
|
91
|
+
return `${prefix}_${sha256Hex(seed).slice(0, 16)}`;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* decision 路径的内容种子:不依赖未来才分配的消息 id。
|
|
95
|
+
* 包含完整商业内容(含 public_message),因此 §6.3 的「不同内容不得复用同一
|
|
96
|
+
* message_id」成立;同一决策重试产生同一 message_id(§6.3/§20 idempotency)。
|
|
97
|
+
* 注:created_at 不参与种子 —— 若调用方用适配器时钟缺省填充,重试必须复用
|
|
98
|
+
* 同一 ctx.created_at,否则 digest 变化会触发 idempotency_conflict。
|
|
99
|
+
*/
|
|
100
|
+
export function decisionContentSeed(conversationId, action, inReplyToMessageId, terms, publicMessage) {
|
|
101
|
+
return canonicalize({
|
|
102
|
+
conversation_id: conversationId,
|
|
103
|
+
action,
|
|
104
|
+
in_reply_to_message_id: inReplyToMessageId,
|
|
105
|
+
terms,
|
|
106
|
+
public_message: publicMessage,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const STOCK_STATUSES = ["available", "low", "out_of_stock", "unknown"];
|
|
110
|
+
/** legacy stock 块形状校验:防外来 KNP 注入伪造库存事实。 */
|
|
111
|
+
export function isLegacyStockState(value) {
|
|
112
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
113
|
+
return false;
|
|
114
|
+
const s = value;
|
|
115
|
+
return (typeof s.status === "string" &&
|
|
116
|
+
STOCK_STATUSES.includes(s.status) &&
|
|
117
|
+
typeof s.quantity === "number" &&
|
|
118
|
+
Number.isInteger(s.quantity) &&
|
|
119
|
+
s.quantity >= 0 &&
|
|
120
|
+
typeof s.observed_at === "string" &&
|
|
121
|
+
s.reserved === false);
|
|
122
|
+
}
|
|
123
|
+
function isRfc3339(value) {
|
|
124
|
+
if (typeof value !== "string")
|
|
125
|
+
return false;
|
|
126
|
+
try {
|
|
127
|
+
requireIsoTimestamp(value, "/");
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function isMoneyLike(value) {
|
|
135
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
136
|
+
return false;
|
|
137
|
+
const m = value;
|
|
138
|
+
return (typeof m.currency === "string" &&
|
|
139
|
+
typeof m.amount_minor === "number" &&
|
|
140
|
+
Number.isInteger(m.amount_minor) &&
|
|
141
|
+
m.amount_minor >= 0);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* legacy Proposal → KNP TermSet(§7.4)。
|
|
145
|
+
*
|
|
146
|
+
* 无损路径:sku/quantity/unit_price/currency → items[0];
|
|
147
|
+
* valid_until → terms.valid_until(expiry 语义保真)。
|
|
148
|
+
* legacy-extension(记录 note,不属于 KNP/1.0 定义字段):
|
|
149
|
+
* stock → fulfillment_terms.legacy_stock
|
|
150
|
+
* delivery.eta_start/eta_end/fee → fulfillment_terms.eta_start/eta_end/delivery_fee
|
|
151
|
+
* after_sales_policy_refs → service_terms.after_sales_policy_refs
|
|
152
|
+
* 默认填充(记录 note):quantity.unit 缺省 "piece"。
|
|
153
|
+
* 有损拒绝:金额小数位超出最小单位(§7.1 float 金额禁止)。
|
|
154
|
+
*/
|
|
155
|
+
export function proposalToTerms(proposal, currencyExponentOf) {
|
|
156
|
+
// 形状守卫(评审项:snapshot schema 的 proposal 只声明 {"type":["object",
|
|
157
|
+
// "null"]} 未 $ref $defs——网关可回传 {sku:"x"} 之类残缺对象,此前
|
|
158
|
+
// proposal.delivery.fee 直接取值抛 TypeError,channel 崩溃而非 fail-closed)。
|
|
159
|
+
if (proposal === null ||
|
|
160
|
+
typeof proposal !== "object" ||
|
|
161
|
+
typeof proposal.currency !== "string" ||
|
|
162
|
+
typeof proposal.unit_price !== "number" ||
|
|
163
|
+
proposal.delivery === null ||
|
|
164
|
+
typeof proposal.delivery !== "object" ||
|
|
165
|
+
typeof proposal.delivery?.fee !== "number") {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
reason: "proposal shape invalid: expected {currency, unit_price, delivery.fee} — got " +
|
|
169
|
+
JSON.stringify(proposal ?? null).slice(0, 200),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const notes = [];
|
|
173
|
+
const exponent = currencyExponentOf(proposal.currency);
|
|
174
|
+
const unitPrice = toMinorUnitsLossy(proposal.unit_price, exponent);
|
|
175
|
+
if (!unitPrice.ok) {
|
|
176
|
+
return {
|
|
177
|
+
ok: false,
|
|
178
|
+
reason: `unit_price ${proposal.unit_price} ${proposal.currency} is not representable in minor units (exponent ${exponent}): ${unitPrice.reason}`,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const fee = toMinorUnitsLossy(proposal.delivery.fee, exponent);
|
|
182
|
+
if (!fee.ok) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
reason: `delivery.fee ${proposal.delivery.fee} ${proposal.currency} is not representable in minor units (exponent ${exponent}): ${fee.reason}`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
notes.push({
|
|
189
|
+
kind: "default",
|
|
190
|
+
path: "proposal.quantity.unit",
|
|
191
|
+
detail: 'legacy quantity is unit-less; defaulted to "piece"',
|
|
192
|
+
});
|
|
193
|
+
notes.push({
|
|
194
|
+
kind: "extension",
|
|
195
|
+
path: "proposal.stock",
|
|
196
|
+
detail: "stock preserved as terms.fulfillment_terms.legacy_stock (legacy-extension field, not defined by KNP/1.0)",
|
|
197
|
+
});
|
|
198
|
+
notes.push({
|
|
199
|
+
kind: "extension",
|
|
200
|
+
path: "proposal.delivery",
|
|
201
|
+
detail: "eta_start/eta_end/delivery_fee preserved as terms.fulfillment_terms legacy-extension fields",
|
|
202
|
+
});
|
|
203
|
+
notes.push({
|
|
204
|
+
kind: "extension",
|
|
205
|
+
path: "proposal.after_sales_policy_refs",
|
|
206
|
+
detail: "after_sales_policy_refs preserved as terms.service_terms.after_sales_policy_refs (legacy-extension field)",
|
|
207
|
+
});
|
|
208
|
+
const terms = {
|
|
209
|
+
items: [
|
|
210
|
+
{
|
|
211
|
+
sku: proposal.sku,
|
|
212
|
+
quantity: { value: proposal.quantity, unit: "piece" },
|
|
213
|
+
unit_price: { currency: proposal.currency, amount_minor: unitPrice.amount_minor },
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
fulfillment_terms: {
|
|
217
|
+
eta_start: proposal.delivery.eta_start,
|
|
218
|
+
eta_end: proposal.delivery.eta_end,
|
|
219
|
+
delivery_fee: { currency: proposal.currency, amount_minor: fee.amount_minor },
|
|
220
|
+
legacy_stock: proposal.stock,
|
|
221
|
+
},
|
|
222
|
+
service_terms: { after_sales_policy_refs: proposal.after_sales_policy_refs },
|
|
223
|
+
valid_until: proposal.valid_until,
|
|
224
|
+
};
|
|
225
|
+
return { ok: true, value: terms, notes };
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* KNP TermSet → legacy Proposal(decision.schema.json #/$defs/proposal)。
|
|
229
|
+
*
|
|
230
|
+
* legacy proposal 是单 SKU、强制 stock/delivery/valid_until;KNP 缺这些
|
|
231
|
+
* 语义时 fail-closed(expiry 受保护:KNP 无 valid_until 时不得发明一个;
|
|
232
|
+
* 缺 stock / delivery 同理不得发明库存/履约事实)。
|
|
233
|
+
*/
|
|
234
|
+
export function termsToProposal(terms, currencyExponentOf) {
|
|
235
|
+
const notes = [];
|
|
236
|
+
const items = terms.items ?? [];
|
|
237
|
+
if (items.length !== 1) {
|
|
238
|
+
return {
|
|
239
|
+
ok: false,
|
|
240
|
+
reason: `legacy proposal is single-SKU; KNP terms carry ${items.length} item(s)`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const item = items[0];
|
|
244
|
+
if (item.unit_price === undefined) {
|
|
245
|
+
return { ok: false, reason: "legacy proposal requires a unit price; KNP item carries none" };
|
|
246
|
+
}
|
|
247
|
+
const exponent = currencyExponentOf(item.unit_price.currency);
|
|
248
|
+
if (item.quantity.unit !== "piece") {
|
|
249
|
+
notes.push({
|
|
250
|
+
kind: "dropped",
|
|
251
|
+
path: "terms.items[0].quantity.unit",
|
|
252
|
+
detail: `unit "${item.quantity.unit}" dropped; legacy quantity is unit-less`,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
const fulfillment = terms.fulfillment_terms ?? {};
|
|
256
|
+
const etaStart = fulfillment.eta_start;
|
|
257
|
+
const etaEnd = fulfillment.eta_end;
|
|
258
|
+
if (!isRfc3339(etaStart) || !isRfc3339(etaEnd)) {
|
|
259
|
+
return {
|
|
260
|
+
ok: false,
|
|
261
|
+
reason: "legacy proposal requires delivery eta_start/eta_end (RFC 3339); KNP terms carry none",
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const fee = fulfillment.delivery_fee;
|
|
265
|
+
if (!isMoneyLike(fee)) {
|
|
266
|
+
return { ok: false, reason: "legacy proposal requires delivery.fee; KNP terms carry no delivery fee" };
|
|
267
|
+
}
|
|
268
|
+
if (fee.currency !== item.unit_price.currency) {
|
|
269
|
+
return {
|
|
270
|
+
ok: false,
|
|
271
|
+
reason: `delivery_fee currency ${fee.currency} differs from item currency ${item.unit_price.currency}; legacy proposal is single-currency`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
const stock = fulfillment.legacy_stock;
|
|
275
|
+
if (!isLegacyStockState(stock)) {
|
|
276
|
+
return {
|
|
277
|
+
ok: false,
|
|
278
|
+
reason: "legacy proposal requires stock state; KNP terms carry no valid inventory observation",
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const afterSalesRefs = terms.service_terms?.after_sales_policy_refs;
|
|
282
|
+
const afterSales = Array.isArray(afterSalesRefs) ? afterSalesRefs : [];
|
|
283
|
+
if (!Array.isArray(afterSalesRefs)) {
|
|
284
|
+
notes.push({
|
|
285
|
+
kind: "default",
|
|
286
|
+
path: "proposal.after_sales_policy_refs",
|
|
287
|
+
detail: "KNP terms carry no after-sales refs; defaulted to []",
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
if (terms.valid_until === undefined) {
|
|
291
|
+
return {
|
|
292
|
+
ok: false,
|
|
293
|
+
reason: "legacy proposal requires valid_until; KNP offer has no expiry and the adapter must not invent one",
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
const proposal = {
|
|
297
|
+
sku: item.sku,
|
|
298
|
+
quantity: item.quantity.value,
|
|
299
|
+
unit_price: fromMinorUnitsLossy(item.unit_price.amount_minor, exponent),
|
|
300
|
+
currency: item.unit_price.currency,
|
|
301
|
+
stock,
|
|
302
|
+
delivery: { eta_start: etaStart, eta_end: etaEnd, fee: fromMinorUnitsLossy(fee.amount_minor, exponent) },
|
|
303
|
+
after_sales_policy_refs: afterSales,
|
|
304
|
+
valid_until: terms.valid_until,
|
|
305
|
+
};
|
|
306
|
+
return { ok: true, value: proposal, notes };
|
|
307
|
+
}
|
|
308
|
+
function toMinorUnitsLossy(amount, exponent) {
|
|
309
|
+
const conv = toMinorUnits(amount, exponent);
|
|
310
|
+
if (!conv.lossless) {
|
|
311
|
+
return {
|
|
312
|
+
ok: false,
|
|
313
|
+
reason: `amount ${amount} exceeds minor-unit precision (10^${exponent})`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return { ok: true, amount_minor: conv.amount_minor };
|
|
317
|
+
}
|
|
318
|
+
function fromMinorUnitsLossy(amountMinor, exponent) {
|
|
319
|
+
return fromMinorUnits(amountMinor, exponent);
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/protocol/legacy-shopping-negotiation/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
* Money 小数位数与 legacy float ↔ KNP minor-units 转换(子规范 §7.1)。
|
|
18
|
+
*
|
|
19
|
+
* KNP/1.0 禁止 float 金额(§7.1 / §19.1 JCS);shopping.negotiation/0.1 的
|
|
20
|
+
* proposal.unit_price / delivery.fee 是十进制 float。转译仅在 legacy 金额的
|
|
21
|
+
* 精度不超过目标货币最小单位时无损;否则 fail-closed(legacy→KNP 方向由
|
|
22
|
+
* 调用方根据 lossless=false 拒绝,绝不把小数位损失静默抹平)。
|
|
23
|
+
*
|
|
24
|
+
* 货币指数表只覆盖常见结算货币;未知货币默认指数 2(三位大写货币代码的
|
|
25
|
+
* 常见小数位)。需要扩展时通过 LegacyNegotiationAdapter 注入
|
|
26
|
+
* currencyExponentOf。
|
|
27
|
+
*/
|
|
28
|
+
/** 常见货币的最小单位指数(10^exp 个 minor = 1 个主要单位)。 */
|
|
29
|
+
export declare const CURRENCY_EXPONENTS: Readonly<Record<string, number>>;
|
|
30
|
+
export declare const DEFAULT_CURRENCY_EXPONENT = 2;
|
|
31
|
+
/**
|
|
32
|
+
* 绝对 epsilon:`amount * 10^exp` 的 float 表示误差约 1e-9 量级;1e-6 远大于
|
|
33
|
+
* 该误差、又远小于 1 个最小单位,因此可区分「float 表示误差」与「真正超出
|
|
34
|
+
* 最小单位的小数位损失」。
|
|
35
|
+
*/
|
|
36
|
+
export declare const MINOR_UNIT_EPSILON = 0.000001;
|
|
37
|
+
export declare function currencyExponent(currency: string): number;
|
|
38
|
+
export interface MinorUnitConversion {
|
|
39
|
+
amount_minor: number;
|
|
40
|
+
/** true 表示精确可表达;false 表示 float 精度超出最小单位,转译有损。 */
|
|
41
|
+
lossless: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* legacy 十进制金额 → KNP minor units(§7.1)。`lossless=false` 时
|
|
45
|
+
* `amount_minor` 为 NaN,调用方必须 fail-closed,不得使用该值。
|
|
46
|
+
*/
|
|
47
|
+
export declare function toMinorUnits(amount: number, exponent: number): MinorUnitConversion;
|
|
48
|
+
/** KNP minor units → legacy 十进制金额(仅用于 KNP→legacy,无损)。 */
|
|
49
|
+
export declare function fromMinorUnits(amount_minor: number, exponent: number): number;
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
* Money 小数位数与 legacy float ↔ KNP minor-units 转换(子规范 §7.1)。
|
|
18
|
+
*
|
|
19
|
+
* KNP/1.0 禁止 float 金额(§7.1 / §19.1 JCS);shopping.negotiation/0.1 的
|
|
20
|
+
* proposal.unit_price / delivery.fee 是十进制 float。转译仅在 legacy 金额的
|
|
21
|
+
* 精度不超过目标货币最小单位时无损;否则 fail-closed(legacy→KNP 方向由
|
|
22
|
+
* 调用方根据 lossless=false 拒绝,绝不把小数位损失静默抹平)。
|
|
23
|
+
*
|
|
24
|
+
* 货币指数表只覆盖常见结算货币;未知货币默认指数 2(三位大写货币代码的
|
|
25
|
+
* 常见小数位)。需要扩展时通过 LegacyNegotiationAdapter 注入
|
|
26
|
+
* currencyExponentOf。
|
|
27
|
+
*/
|
|
28
|
+
/** 常见货币的最小单位指数(10^exp 个 minor = 1 个主要单位)。 */
|
|
29
|
+
export const CURRENCY_EXPONENTS = {
|
|
30
|
+
CNY: 2,
|
|
31
|
+
USD: 2,
|
|
32
|
+
EUR: 2,
|
|
33
|
+
GBP: 2,
|
|
34
|
+
JPY: 0,
|
|
35
|
+
KRW: 0,
|
|
36
|
+
HKD: 2,
|
|
37
|
+
TWD: 2,
|
|
38
|
+
SGD: 2,
|
|
39
|
+
AUD: 2,
|
|
40
|
+
CAD: 2,
|
|
41
|
+
};
|
|
42
|
+
export const DEFAULT_CURRENCY_EXPONENT = 2;
|
|
43
|
+
/**
|
|
44
|
+
* 绝对 epsilon:`amount * 10^exp` 的 float 表示误差约 1e-9 量级;1e-6 远大于
|
|
45
|
+
* 该误差、又远小于 1 个最小单位,因此可区分「float 表示误差」与「真正超出
|
|
46
|
+
* 最小单位的小数位损失」。
|
|
47
|
+
*/
|
|
48
|
+
export const MINOR_UNIT_EPSILON = 1e-6;
|
|
49
|
+
export function currencyExponent(currency) {
|
|
50
|
+
const exp = CURRENCY_EXPONENTS[currency];
|
|
51
|
+
return exp === undefined ? DEFAULT_CURRENCY_EXPONENT : exp;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* legacy 十进制金额 → KNP minor units(§7.1)。`lossless=false` 时
|
|
55
|
+
* `amount_minor` 为 NaN,调用方必须 fail-closed,不得使用该值。
|
|
56
|
+
*/
|
|
57
|
+
export function toMinorUnits(amount, exponent) {
|
|
58
|
+
if (!Number.isFinite(amount) || amount < 0) {
|
|
59
|
+
return { amount_minor: Number.NaN, lossless: false };
|
|
60
|
+
}
|
|
61
|
+
const scaled = amount * 10 ** exponent;
|
|
62
|
+
const amountMinor = Math.round(scaled);
|
|
63
|
+
const lossless = Math.abs(scaled - amountMinor) <= MINOR_UNIT_EPSILON;
|
|
64
|
+
return { amount_minor: lossless ? amountMinor : Number.NaN, lossless };
|
|
65
|
+
}
|
|
66
|
+
/** KNP minor units → legacy 十进制金额(仅用于 KNP→legacy,无损)。 */
|
|
67
|
+
export function fromMinorUnits(amount_minor, exponent) {
|
|
68
|
+
return amount_minor / 10 ** exponent;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../../../src/protocol/legacy-shopping-negotiation/money.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;GAWG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEvC,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC;AAC7D,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAgB;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACvD,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,kBAAkB,CAAC;IACtE,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;AACzE,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAAC,YAAoB,EAAE,QAAgB;IACnE,OAAO,YAAY,GAAG,EAAE,IAAI,QAAQ,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
* LegacyNegotiationAdapter — shopping.negotiation/0.1 ↔ KNP/1.0 转译结果类型
|
|
18
|
+
* (基线 §35 Legacy Migration / 子规范 §32 Legacy shopping-cli Mapping)。
|
|
19
|
+
*
|
|
20
|
+
* 每条转译路径都必须返回结构化结果,禁止静默降级:
|
|
21
|
+
*
|
|
22
|
+
* { translated, notes } — 成功。notes 逐条记录所有「补默认值 /
|
|
23
|
+
* 丢弃字段 / legacy-extension / identity」
|
|
24
|
+
* 决策,调用方可见、可审计、绝不静默。
|
|
25
|
+
* { fail_closed: true, reason } — 输入在目标协议中无法表达(受保护语义:
|
|
26
|
+
* conditions / expiry / identity /
|
|
27
|
+
* agreement),拒绝并说明原因。
|
|
28
|
+
* { requires_human: true, reason } — 输入超出目标协议表达能力(如 legacy
|
|
29
|
+
* escalate → 人工),转人工/fallback。
|
|
30
|
+
*
|
|
31
|
+
* 不变量 22(基线 §36):Legacy Adapter 不得扩大权限 —— 本模块只做纯数据
|
|
32
|
+
* 转译,不执行任何 side effect,也不把 legacy 消息提升为 KNP 更高权限语义
|
|
33
|
+
* (如伪造 ConditionalOffer 条件、把 accept 变成订单/支付语义)。
|
|
34
|
+
*/
|
|
35
|
+
import type { TermSet } from "../../negotiation/domain/common.js";
|
|
36
|
+
import type { NegotiationActor } from "../../negotiation/domain/objects.js";
|
|
37
|
+
export type TranslationNote = {
|
|
38
|
+
kind: "mapped";
|
|
39
|
+
path: string;
|
|
40
|
+
detail: string;
|
|
41
|
+
} | {
|
|
42
|
+
kind: "default";
|
|
43
|
+
path: string;
|
|
44
|
+
detail: string;
|
|
45
|
+
} | {
|
|
46
|
+
kind: "dropped";
|
|
47
|
+
path: string;
|
|
48
|
+
detail: string;
|
|
49
|
+
} | {
|
|
50
|
+
kind: "extension";
|
|
51
|
+
path: string;
|
|
52
|
+
detail: string;
|
|
53
|
+
} | {
|
|
54
|
+
kind: "identity";
|
|
55
|
+
path: string;
|
|
56
|
+
detail: string;
|
|
57
|
+
};
|
|
58
|
+
export type TranslationResult<T> = {
|
|
59
|
+
translated: T;
|
|
60
|
+
notes: TranslationNote[];
|
|
61
|
+
} | {
|
|
62
|
+
fail_closed: true;
|
|
63
|
+
reason: string;
|
|
64
|
+
} | {
|
|
65
|
+
requires_human: true;
|
|
66
|
+
reason: string;
|
|
67
|
+
};
|
|
68
|
+
export declare function translated<T>(value: T, notes: TranslationNote[]): TranslationResult<T>;
|
|
69
|
+
export declare function failClosed(reason: string): TranslationResult<never>;
|
|
70
|
+
export declare function requiresHuman(reason: string): TranslationResult<never>;
|
|
71
|
+
export declare function isTranslated<T>(r: TranslationResult<T>): r is {
|
|
72
|
+
translated: T;
|
|
73
|
+
notes: TranslationNote[];
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* legacy → KNP 方向所需的上下文。legacy decision/message 不携带 actor、
|
|
77
|
+
* capability、created_at;这些由调用方(运行时的传输/身份层)提供,缺省填
|
|
78
|
+
* 默认值并记录 note。offer 引用解析是 KNP accept/counter 的 terms_digest /
|
|
79
|
+
* responding_to_offer_id 的前置条件,无法解析即 fail-closed。
|
|
80
|
+
*/
|
|
81
|
+
export interface LegacyToKnpContext {
|
|
82
|
+
/** KNP 能力标识(子规范 §4.4)。 */
|
|
83
|
+
capability: string;
|
|
84
|
+
/** legacy 传输层绑定的 actor 身份(子规范 §8.1 / §33-1)。 */
|
|
85
|
+
actor: NegotiationActor;
|
|
86
|
+
/** envelope.created_at(RFC 3339);缺省用适配器时钟,记录 note。 */
|
|
87
|
+
created_at?: string;
|
|
88
|
+
/** 当前产品 sku(legacy ask → KNP inquiry subject 用)。 */
|
|
89
|
+
current_sku?: string;
|
|
90
|
+
/** 解析 legacy accept 所接受的 offer terms,用于计算 §15 terms_digest。 */
|
|
91
|
+
resolveAcceptedTerms?: (conversationId: string, inReplyToMessageId: number) => TermSet | null;
|
|
92
|
+
}
|
|
93
|
+
/** legacy 消息转译上下文:消息本身不携带 negotiation_id / capability / in_reply_to。 */
|
|
94
|
+
export interface LegacyMessageContext extends LegacyToKnpContext {
|
|
95
|
+
conversation_id: string;
|
|
96
|
+
/**
|
|
97
|
+
* 该消息回复的目标(KNP in_reply_to);`msg_legacy_<int>` 形态。
|
|
98
|
+
* counter/decline/accept 消息的目标/被接受 offer 引用依赖它,缺失即 fail-closed。
|
|
99
|
+
*/
|
|
100
|
+
in_reply_to?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* KNP → legacy 方向无需额外上下文:legacy decision 的网关派生字段
|
|
104
|
+
* (retries_remaining、actor 等)不属于转译范围 —— KNP 侧的 actor 语义通过
|
|
105
|
+
* note 显式交给传输层断言(identity,绝不静默丢),其余 KNP-only 字段逐条
|
|
106
|
+
* 记录为 dropped note。
|
|
107
|
+
*/
|