@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,160 @@
|
|
|
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
|
+
* A2A v0.4 candidate model (docs/kiwi-a2a-architecture-baseline.md §7).
|
|
18
|
+
*
|
|
19
|
+
* ActionCandidate is the unified base class semantics: "Agent 建议执行、但尚未
|
|
20
|
+
* 真正执行的外部有副作用动作" — an external side-effectful action the agent
|
|
21
|
+
* suggests but has not yet executed. NegotiationActionCandidate is its
|
|
22
|
+
* negotiation subtype. DecisionCandidate is retained ONLY as a v0.2
|
|
23
|
+
* compatibility term and bridged by toNegotiationActionCandidate(); new code
|
|
24
|
+
* must not create a third candidate model.
|
|
25
|
+
*
|
|
26
|
+
* Nothing in a candidate proves execution. The approval pipeline (§19) binds
|
|
27
|
+
* candidate_digest + expected_remote_revision + policy_version +
|
|
28
|
+
* counterparty_identity, and re-reads + re-validates remote state before any
|
|
29
|
+
* send — any bound-field change makes the candidate STALE.
|
|
30
|
+
*/
|
|
31
|
+
import { contentDigest } from "./jcs.js";
|
|
32
|
+
export const ACTION_CANDIDATE_KINDS = ["negotiation"];
|
|
33
|
+
/** Risk levels bound to a candidate (mirrors the operator's strategy risk). */
|
|
34
|
+
export const CANDIDATE_RISK_LEVELS = ["ok", "confirm", "blocked"];
|
|
35
|
+
export class CandidateAdapterError extends Error {
|
|
36
|
+
code;
|
|
37
|
+
field;
|
|
38
|
+
constructor(code, message, field) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = "CandidateAdapterError";
|
|
41
|
+
this.code = code;
|
|
42
|
+
if (field !== undefined)
|
|
43
|
+
this.field = field;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Adapter: DecisionCandidate (v0.2) -> NegotiationActionCandidate
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
const DECISION_ACTIONS = [
|
|
50
|
+
"ask",
|
|
51
|
+
"propose",
|
|
52
|
+
"counter",
|
|
53
|
+
"accept_nonbinding",
|
|
54
|
+
"decline",
|
|
55
|
+
"escalate",
|
|
56
|
+
];
|
|
57
|
+
function requireNonEmptyString(value, field) {
|
|
58
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
59
|
+
throw new CandidateAdapterError("missing_field", `${field} is required`, field);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
function requirePositiveInt(value, field) {
|
|
64
|
+
if (typeof value !== "number" || !Number.isInteger(value) || value < 1) {
|
|
65
|
+
throw new CandidateAdapterError("invalid_field", `${field} must be a positive integer`, field);
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
function requireDecisionAction(value) {
|
|
70
|
+
if (typeof value !== "string" || !DECISION_ACTIONS.includes(value)) {
|
|
71
|
+
throw new CandidateAdapterError("invalid_field", `action must be one of ${DECISION_ACTIONS.join("/")}`, "action");
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
function requireStringArray(value, field) {
|
|
76
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
|
|
77
|
+
throw new CandidateAdapterError("invalid_field", `${field} must be a string array`, field);
|
|
78
|
+
}
|
|
79
|
+
return [...value];
|
|
80
|
+
}
|
|
81
|
+
function requireRisk(value, field) {
|
|
82
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
83
|
+
throw new CandidateAdapterError("missing_field", `${field} is required`, field);
|
|
84
|
+
}
|
|
85
|
+
const risk = value;
|
|
86
|
+
const level = risk.level;
|
|
87
|
+
if (typeof level !== "string" || !CANDIDATE_RISK_LEVELS.includes(level)) {
|
|
88
|
+
throw new CandidateAdapterError("invalid_field", `${field}.level must be ${CANDIDATE_RISK_LEVELS.join("|")}`, `${field}.level`);
|
|
89
|
+
}
|
|
90
|
+
const reason = risk.reason;
|
|
91
|
+
if (typeof reason !== "string" || reason.length === 0) {
|
|
92
|
+
throw new CandidateAdapterError("missing_field", `${field}.reason is required`, `${field}.reason`);
|
|
93
|
+
}
|
|
94
|
+
return { level: level, reason };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Bridge the v0.2 DecisionCandidate into the v0.4 NegotiationActionCandidate.
|
|
98
|
+
* Missing or malformed binding fields fail closed (CandidateAdapterError); the
|
|
99
|
+
* digest is always recomputed from the mapped fields, never trusted from input.
|
|
100
|
+
*/
|
|
101
|
+
export function toNegotiationActionCandidate(decision, context) {
|
|
102
|
+
const candidateId = requireNonEmptyString(decision.candidate_id, "candidate_id");
|
|
103
|
+
const negotiationId = requireNonEmptyString(decision.binding?.conversation_id, "binding.conversation_id");
|
|
104
|
+
requirePositiveInt(decision.binding?.message_id, "binding.message_id");
|
|
105
|
+
const d = decision.decision;
|
|
106
|
+
if (d === null || typeof d !== "object" || Array.isArray(d)) {
|
|
107
|
+
throw new CandidateAdapterError("invalid_field", "decision must be an object", "decision");
|
|
108
|
+
}
|
|
109
|
+
const action = requireDecisionAction(d.action);
|
|
110
|
+
const publicMessage = requireNonEmptyString(d.public_message, "decision.public_message");
|
|
111
|
+
const reasonCodes = requireStringArray(d.reason_codes, "decision.reason_codes");
|
|
112
|
+
const expectedRemoteRevision = requireNonEmptyString(context.expected_remote_revision, "context.expected_remote_revision");
|
|
113
|
+
const policyVersion = requireNonEmptyString(context.policy_version, "context.policy_version");
|
|
114
|
+
const counterpartyIdentity = requireNonEmptyString(context.counterparty_identity, "context.counterparty_identity");
|
|
115
|
+
const risk = requireRisk(context.risk, "context.risk");
|
|
116
|
+
const fields = {
|
|
117
|
+
kind: "negotiation",
|
|
118
|
+
candidate_id: candidateId,
|
|
119
|
+
negotiation_id: negotiationId,
|
|
120
|
+
action,
|
|
121
|
+
payload: d,
|
|
122
|
+
expected_remote_revision: expectedRemoteRevision,
|
|
123
|
+
policy_version: policyVersion,
|
|
124
|
+
counterparty_identity: counterpartyIdentity,
|
|
125
|
+
public_message: publicMessage,
|
|
126
|
+
reason_codes: reasonCodes,
|
|
127
|
+
risk,
|
|
128
|
+
};
|
|
129
|
+
return { ...fields, candidate_digest: candidateDigest(fields) };
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Digest
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
/**
|
|
135
|
+
* RFC 8785 JCS + SHA-256 digest over the bound candidate fields (docs §17).
|
|
136
|
+
* `candidate_digest` itself is excluded — content addressing never hashes its
|
|
137
|
+
* own envelope. Equal candidates always produce the same digest; any bound
|
|
138
|
+
* field change produces a different one.
|
|
139
|
+
*/
|
|
140
|
+
export function candidateDigest(input) {
|
|
141
|
+
return contentDigest({
|
|
142
|
+
kind: input.kind,
|
|
143
|
+
candidate_id: input.candidate_id,
|
|
144
|
+
negotiation_id: input.negotiation_id,
|
|
145
|
+
action: input.action,
|
|
146
|
+
payload: input.payload,
|
|
147
|
+
expected_remote_revision: input.expected_remote_revision,
|
|
148
|
+
policy_version: input.policy_version,
|
|
149
|
+
counterparty_identity: input.counterparty_identity,
|
|
150
|
+
public_message: input.public_message,
|
|
151
|
+
reason_codes: input.reason_codes,
|
|
152
|
+
risk: input.risk,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/** Recomputed-digest check; false means the candidate is stale (§19). */
|
|
156
|
+
export function verifyCandidateDigest(candidate) {
|
|
157
|
+
const { candidate_digest, ...rest } = candidate;
|
|
158
|
+
return candidateDigest(rest) === candidate_digest;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=action-candidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-candidate.js","sourceRoot":"","sources":["../../src/negotiation/action-candidate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,aAAa,CAAU,CAAC;AAG/D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAgE3E,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,IAAI,CAAoC;IACxC,KAAK,CAAU;IACxB,YAAY,IAAmC,EAAE,OAAe,EAAE,KAAc;QAC9E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAC9C,CAAC;CACF;AAED,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG;IACvB,KAAK;IACL,SAAS;IACT,SAAS;IACT,mBAAmB;IACnB,SAAS;IACT,UAAU;CACF,CAAC;AAEX,SAAS,qBAAqB,CAAC,KAAc,EAAE,KAAa;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,KAAK,cAAc,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,KAAa;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,KAAK,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAE,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,qBAAqB,CAC7B,eAAe,EACf,yBAAyB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EACrD,QAAQ,CACT,CAAC;IACJ,CAAC;IACD,OAAO,KAAuB,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,KAAa;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,KAAK,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,KAAK,cAAc,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAE,qBAA2C,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,qBAAqB,CAC7B,eAAe,EACf,GAAG,KAAK,kBAAkB,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC3D,GAAG,KAAK,QAAQ,CACjB,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,GAAG,KAAK,qBAAqB,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAA2B,EAAE,MAAM,EAAE,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAA2B,EAC3B,OAA0C;IAE1C,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IACjF,MAAM,aAAa,GAAG,qBAAqB,CACzC,QAAQ,CAAC,OAAO,EAAE,eAAe,EACjC,yBAAyB,CAC1B,CAAC;IACF,kBAAkB,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAC;IACvE,MAAM,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC5B,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,qBAAqB,CAAC,eAAe,EAAE,4BAA4B,EAAE,UAAU,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,qBAAqB,CAAC,CAAC,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IAChF,MAAM,sBAAsB,GAAG,qBAAqB,CAClD,OAAO,CAAC,wBAAwB,EAChC,kCAAkC,CACnC,CAAC;IACF,MAAM,aAAa,GAAG,qBAAqB,CAAC,OAAO,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;IAC9F,MAAM,oBAAoB,GAAG,qBAAqB,CAChD,OAAO,CAAC,qBAAqB,EAC7B,+BAA+B,CAChC,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,WAAW;QACzB,cAAc,EAAE,aAAa;QAC7B,MAAM;QACN,OAAO,EAAE,CAAC;QACV,wBAAwB,EAAE,sBAAsB;QAChD,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,oBAAoB;QAC3C,cAAc,EAAE,aAAa;QAC7B,YAAY,EAAE,WAAW;QACzB,IAAI;KAC0D,CAAC;IAEjE,OAAO,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2D;IACzF,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;QACxD,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;QAClD,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CAAC,SAAqC;IACzE,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 "../domain/common.js";
|
|
17
|
+
import { type ConditionNode, type ConditionalOffer } from "../domain/objects.js";
|
|
18
|
+
/** 单个 condition field 在事实上下文中的值。协议治理字段当前均为数值量。 */
|
|
19
|
+
export type FactValue = number | string;
|
|
20
|
+
/**
|
|
21
|
+
* 已披露事实集:以协议 field 标识(§13.5)为键。只含已通过
|
|
22
|
+
* NetworkDisclosurePolicy 允许公开的 Buyer 属性(§12.3)。
|
|
23
|
+
*/
|
|
24
|
+
export type FactContext = Readonly<Record<string, FactValue>>;
|
|
25
|
+
/**
|
|
26
|
+
* 求值一个 condition 节点。`depth` 为根(`when`)以下层数;> 2 视为非法结构
|
|
27
|
+
* (§13.3),与 validateConditionalOffer 的深度约束一致(fail-closed)。
|
|
28
|
+
*/
|
|
29
|
+
export declare function evaluateNode(node: ConditionNode, facts: FactContext, path?: string, depth?: number): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 求值整个 ConditionalOffer,返回结果 TermSet(§13.6 / §12.2)。
|
|
32
|
+
*
|
|
33
|
+
* 多个 rule 命中且 canonical then_terms 完全一致时视为同一结果;结果不同时抛
|
|
34
|
+
* condition_conflict。不会把不同 then_terms 按字段 merge,也不做模型选择。
|
|
35
|
+
*/
|
|
36
|
+
export declare function evaluateConditionalOffer(offer: ConditionalOffer, facts: FactContext): TermSet;
|
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
* KNP/1.0 ConditionalOffer 确定性求值器(子规范 §13,基线 §12)。
|
|
18
|
+
*
|
|
19
|
+
* 输入 ConditionalOffer + 已披露事实集 → 输出结果 TermSet。纯数据解释器:
|
|
20
|
+
* 只识别 all/any(深度 ≤ 2)与 eq/neq/gt/gte/lt/lte/in 比较符,无 eval/exec、
|
|
21
|
+
* 无网络回调、无模型参与(§13.2 / §12 禁止可执行表达式)。
|
|
22
|
+
*
|
|
23
|
+
* 求值规则(§13.6 / §12.2):
|
|
24
|
+
* 无 rule 命中 → base_terms;
|
|
25
|
+
* 单个 rule 命中 → 该 rule 的完整 then_terms;
|
|
26
|
+
* 多个 rule 命中且 canonical then_terms 完全一致 → 视为同一结果;
|
|
27
|
+
* 多个 rule 命中且结果不同 → condition_conflict;
|
|
28
|
+
* MUST NOT 逐字段隐式 merge 不同的 then_terms;LLM MUST NOT 在冲突间选择。
|
|
29
|
+
*
|
|
30
|
+
* 披露约束(§12.3):本求值器只接受"已披露事实集"——调用方必须只传入
|
|
31
|
+
* NetworkDisclosurePolicy 已允许公开的字段值。求值器自身对不在 allowlist 的
|
|
32
|
+
* field 求值请求 fail-closed(field_unsupported);缺失/未披露的事实永远不命中
|
|
33
|
+
* (含 neq,防止借反例探测私有 buyer 属性)。
|
|
34
|
+
*/
|
|
35
|
+
import { NegotiationValidationError, schemaError } from "../domain/common.js";
|
|
36
|
+
import { CONDITION_FIELDS, } from "../domain/objects.js";
|
|
37
|
+
import { canonicalize } from "../jcs.js";
|
|
38
|
+
/** 顺序比较仅对有限数值定义;任一操作数非有限数值返回 null(求值失败 → 不命中)。 */
|
|
39
|
+
function numericRelation(left, right) {
|
|
40
|
+
if (typeof left !== "number" || typeof right !== "number")
|
|
41
|
+
return null;
|
|
42
|
+
if (!Number.isFinite(left) || !Number.isFinite(right))
|
|
43
|
+
return null;
|
|
44
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
45
|
+
}
|
|
46
|
+
function evaluateLeaf(leaf, facts, path) {
|
|
47
|
+
// 防御性 allowlist 校验(schema 校验通常已前置拦截;此处 fail-closed)。
|
|
48
|
+
if (!CONDITION_FIELDS.includes(leaf.field)) {
|
|
49
|
+
throw new NegotiationValidationError("field_unsupported", `condition field ${leaf.field} is not in the KNP/1.0 allowlist`, `${path}/field`);
|
|
50
|
+
}
|
|
51
|
+
const fact = facts[leaf.field];
|
|
52
|
+
// 缺失/未披露的事实永远不命中:既保持确定性,也防止条件集借 neq/gt 等
|
|
53
|
+
// 反例形状推断私有属性。
|
|
54
|
+
if (fact === undefined)
|
|
55
|
+
return false;
|
|
56
|
+
switch (leaf.op) {
|
|
57
|
+
case "eq":
|
|
58
|
+
return fact === leaf.value;
|
|
59
|
+
case "neq":
|
|
60
|
+
return fact !== leaf.value;
|
|
61
|
+
case "in": {
|
|
62
|
+
return (Array.isArray(leaf.value) &&
|
|
63
|
+
leaf.value.some((candidate) => candidate === fact));
|
|
64
|
+
}
|
|
65
|
+
case "gt": {
|
|
66
|
+
const relation = numericRelation(fact, leaf.value);
|
|
67
|
+
return relation !== null && relation > 0;
|
|
68
|
+
}
|
|
69
|
+
case "gte": {
|
|
70
|
+
const relation = numericRelation(fact, leaf.value);
|
|
71
|
+
return relation !== null && relation >= 0;
|
|
72
|
+
}
|
|
73
|
+
case "lt": {
|
|
74
|
+
const relation = numericRelation(fact, leaf.value);
|
|
75
|
+
return relation !== null && relation < 0;
|
|
76
|
+
}
|
|
77
|
+
case "lte": {
|
|
78
|
+
const relation = numericRelation(fact, leaf.value);
|
|
79
|
+
return relation !== null && relation <= 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 求值一个 condition 节点。`depth` 为根(`when`)以下层数;> 2 视为非法结构
|
|
85
|
+
* (§13.3),与 validateConditionalOffer 的深度约束一致(fail-closed)。
|
|
86
|
+
*/
|
|
87
|
+
export function evaluateNode(node, facts, path = "/conditions", depth = 0) {
|
|
88
|
+
if (depth > 2) {
|
|
89
|
+
throw schemaError(path, "condition nesting must not exceed 2 levels below the root");
|
|
90
|
+
}
|
|
91
|
+
if ("all" in node) {
|
|
92
|
+
return node.all.every((child, i) => evaluateNode(child, facts, `${path}/all/${i}`, depth + 1));
|
|
93
|
+
}
|
|
94
|
+
if ("any" in node) {
|
|
95
|
+
return node.any.some((child, i) => evaluateNode(child, facts, `${path}/any/${i}`, depth + 1));
|
|
96
|
+
}
|
|
97
|
+
return evaluateLeaf(node, facts, path);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* 求值整个 ConditionalOffer,返回结果 TermSet(§13.6 / §12.2)。
|
|
101
|
+
*
|
|
102
|
+
* 多个 rule 命中且 canonical then_terms 完全一致时视为同一结果;结果不同时抛
|
|
103
|
+
* condition_conflict。不会把不同 then_terms 按字段 merge,也不做模型选择。
|
|
104
|
+
*/
|
|
105
|
+
export function evaluateConditionalOffer(offer, facts) {
|
|
106
|
+
const matched = [];
|
|
107
|
+
offer.conditions.forEach((rule, i) => {
|
|
108
|
+
if (evaluateNode(rule.when, facts, `/conditions/${i}/when`)) {
|
|
109
|
+
matched.push(rule);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
if (matched.length === 0)
|
|
113
|
+
return offer.base_terms;
|
|
114
|
+
if (matched.length === 1)
|
|
115
|
+
return matched[0].then_terms;
|
|
116
|
+
// 多命中:比较 canonical then_terms(RFC 8785 JCS 字节),而非引用或对象形状。
|
|
117
|
+
const firstCanonical = canonicalize(matched[0].then_terms);
|
|
118
|
+
if (matched.slice(1).every((rule) => canonicalize(rule.then_terms) === firstCanonical)) {
|
|
119
|
+
return matched[0].then_terms;
|
|
120
|
+
}
|
|
121
|
+
throw new NegotiationValidationError("condition_conflict", `${matched.length} conditions matched with differing then_terms; refusing to merge or pick`, "/conditions");
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/negotiation/condition/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
* context-map — negotiation_id ↔ 远端 A2A contextId / taskId 持久化映射
|
|
18
|
+
* (WP3,基线 §9.2 / §24.4–§24.5)。
|
|
19
|
+
*/
|
|
20
|
+
export { ContextMapError, ContextMapStore, contextMapFileName } from "./store.js";
|
|
21
|
+
export type { ContextMapErrorCode, ContextMapStoreOptions } from "./store.js";
|
|
22
|
+
export { parseContextMapping } from "./types.js";
|
|
23
|
+
export type { ContextMapping, ContextMappingPatch } from "./types.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
* context-map — negotiation_id ↔ 远端 A2A contextId / taskId 持久化映射
|
|
18
|
+
* (WP3,基线 §9.2 / §24.4–§24.5)。
|
|
19
|
+
*/
|
|
20
|
+
export { ContextMapError, ContextMapStore, contextMapFileName } from "./store.js";
|
|
21
|
+
export { parseContextMapping } from "./types.js";
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/negotiation/context-map/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -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
|
+
import { type ContextMapping, type ContextMappingPatch } from "./types.js";
|
|
17
|
+
export type ContextMapErrorCode = "corrupt" | "invalid_input";
|
|
18
|
+
export declare class ContextMapError extends Error {
|
|
19
|
+
readonly code: ContextMapErrorCode;
|
|
20
|
+
constructor(code: ContextMapErrorCode, message: string);
|
|
21
|
+
}
|
|
22
|
+
export interface ContextMapStoreOptions {
|
|
23
|
+
/** 基础数据目录;映射文件落在 `<dir>/context-map/`。 */
|
|
24
|
+
dir: string;
|
|
25
|
+
/** 可注入时钟(RFC 3339);缺省用 new Date().toISOString()。 */
|
|
26
|
+
now?: () => string;
|
|
27
|
+
}
|
|
28
|
+
/** opaque negotiation_id → 安全文件名(同 ledgerFileName:归一化 + sha256 前缀)。 */
|
|
29
|
+
export declare function contextMapFileName(negotiationId: string): string;
|
|
30
|
+
export declare class ContextMapStore {
|
|
31
|
+
private readonly baseDir;
|
|
32
|
+
private readonly mapDir;
|
|
33
|
+
private readonly now;
|
|
34
|
+
constructor(options: ContextMapStoreOptions);
|
|
35
|
+
private ensureMapDir;
|
|
36
|
+
private filePathFor;
|
|
37
|
+
private writeFileAtomic;
|
|
38
|
+
private readMapping;
|
|
39
|
+
/** 取映射;不存在返回 null。文件损坏 → ContextMapError(fail-closed)。 */
|
|
40
|
+
get(negotiationId: string): ContextMapping | null;
|
|
41
|
+
has(negotiationId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 创建/更新映射。remote_context_id 变更以最后一次为准(§24.4 SHOULD reuse)。
|
|
44
|
+
* task_ids 由 addTask 追加;set 不删除已有 taskIds。
|
|
45
|
+
*/
|
|
46
|
+
set(negotiationId: string, patch: ContextMappingPatch): ContextMapping;
|
|
47
|
+
/** 追加一个 taskId(去重)。同 negotiation 首个 task 时创建映射。 */
|
|
48
|
+
addTask(negotiationId: string, taskId: string): ContextMapping;
|
|
49
|
+
/** 所有已持久化的映射(按文件名扫描;损坏文件抛 ContextMapError)。 */
|
|
50
|
+
list(): ContextMapping[];
|
|
51
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
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
|
+
* negotiation_id ↔ remote contextId 持久化存储(基线 §9.2 / §24.4)。
|
|
18
|
+
*
|
|
19
|
+
* 与 Ledger / Idempotency store 同构:目录 0700、文件 0600、同目录临时文件
|
|
20
|
+
* (wx + fsync)+ rename 原子写(对齐 supervisor/manifest.ts)。每个 negotiation
|
|
21
|
+
* 一个 JSON 文件,`<dir>/context-map/<safe>.json`(safe 文件名沿用 ledgerFileName
|
|
22
|
+
* 的归一化 + sha256 前缀策略,防目录逃逸与碰撞)。
|
|
23
|
+
*
|
|
24
|
+
* 远端 contextId 对 Kiwi opaque:只做结构校验(parseContextMapping),不解析
|
|
25
|
+
* 不推断。文件损坏 / 字段违规 fail-closed 抛 ContextMapError,绝不静默返回残缺映射。
|
|
26
|
+
*/
|
|
27
|
+
import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, writeSync, } from "node:fs";
|
|
28
|
+
import path from "node:path";
|
|
29
|
+
import { sha256Hex } from "../jcs.js";
|
|
30
|
+
import { validateContextId, validateIdentifier, validateTaskId } from "../domain/identifiers.js";
|
|
31
|
+
import { parseContextMapping } from "./types.js";
|
|
32
|
+
export class ContextMapError extends Error {
|
|
33
|
+
code;
|
|
34
|
+
constructor(code, message) {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = "ContextMapError";
|
|
37
|
+
this.code = code;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
let tmpSeq = 0;
|
|
41
|
+
/** opaque negotiation_id → 安全文件名(同 ledgerFileName:归一化 + sha256 前缀)。 */
|
|
42
|
+
export function contextMapFileName(negotiationId) {
|
|
43
|
+
const sanitized = negotiationId.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
44
|
+
return `${sanitized}.${sha256Hex(negotiationId).slice(0, 12)}.json`;
|
|
45
|
+
}
|
|
46
|
+
export class ContextMapStore {
|
|
47
|
+
baseDir;
|
|
48
|
+
mapDir;
|
|
49
|
+
now;
|
|
50
|
+
constructor(options) {
|
|
51
|
+
this.baseDir = options.dir;
|
|
52
|
+
this.mapDir = path.join(options.dir, "context-map");
|
|
53
|
+
this.now = options.now ?? (() => new Date().toISOString());
|
|
54
|
+
}
|
|
55
|
+
ensureMapDir() {
|
|
56
|
+
mkdirSync(this.mapDir, { recursive: true, mode: 0o700 });
|
|
57
|
+
chmodSync(this.mapDir, 0o700);
|
|
58
|
+
return this.mapDir;
|
|
59
|
+
}
|
|
60
|
+
filePathFor(negotiationId) {
|
|
61
|
+
const dir = this.ensureMapDir();
|
|
62
|
+
const resolved = path.resolve(dir, contextMapFileName(negotiationId));
|
|
63
|
+
if (!resolved.startsWith(`${dir}${path.sep}`)) {
|
|
64
|
+
throw new ContextMapError("invalid_input", `negotiation_id escapes context-map dir`);
|
|
65
|
+
}
|
|
66
|
+
return resolved;
|
|
67
|
+
}
|
|
68
|
+
writeFileAtomic(filePath, mapping) {
|
|
69
|
+
const tmp = `${filePath}.tmp-${process.pid}-${++tmpSeq}`;
|
|
70
|
+
const fd = openSync(tmp, "wx", 0o600);
|
|
71
|
+
try {
|
|
72
|
+
writeSync(fd, `${JSON.stringify(mapping)}\n`);
|
|
73
|
+
fsyncSync(fd);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
closeSync(fd);
|
|
77
|
+
}
|
|
78
|
+
renameSync(tmp, filePath);
|
|
79
|
+
chmodSync(filePath, 0o600);
|
|
80
|
+
}
|
|
81
|
+
readMapping(negotiationId) {
|
|
82
|
+
const filePath = this.filePathFor(negotiationId);
|
|
83
|
+
if (!existsSync(filePath))
|
|
84
|
+
return null;
|
|
85
|
+
let raw;
|
|
86
|
+
try {
|
|
87
|
+
raw = readFileSync(filePath, "utf-8");
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
throw new ContextMapError("corrupt", `cannot read context map for ${negotiationId}: ${String(err)}`);
|
|
91
|
+
}
|
|
92
|
+
let parsed;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new ContextMapError("corrupt", `context map for ${negotiationId} is not valid JSON`);
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
return parseContextMapping(parsed);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
throw new ContextMapError("corrupt", `context map for ${negotiationId} failed validation: ${err instanceof Error ? err.message : String(err)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** 取映射;不存在返回 null。文件损坏 → ContextMapError(fail-closed)。 */
|
|
107
|
+
get(negotiationId) {
|
|
108
|
+
return this.readMapping(negotiationId);
|
|
109
|
+
}
|
|
110
|
+
has(negotiationId) {
|
|
111
|
+
return this.get(negotiationId) !== null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 创建/更新映射。remote_context_id 变更以最后一次为准(§24.4 SHOULD reuse)。
|
|
115
|
+
* task_ids 由 addTask 追加;set 不删除已有 taskIds。
|
|
116
|
+
*/
|
|
117
|
+
set(negotiationId, patch) {
|
|
118
|
+
validateIdentifier(negotiationId, "negotiation_id");
|
|
119
|
+
if (patch.remote_context_id !== undefined) {
|
|
120
|
+
validateContextId(patch.remote_context_id, "remote_context_id");
|
|
121
|
+
}
|
|
122
|
+
const existing = this.readMapping(negotiationId);
|
|
123
|
+
const now = this.now();
|
|
124
|
+
const mapping = {
|
|
125
|
+
negotiation_id: negotiationId,
|
|
126
|
+
task_ids: existing?.task_ids ?? [],
|
|
127
|
+
updated_at: now,
|
|
128
|
+
};
|
|
129
|
+
if (patch.remote_context_id !== undefined || existing?.remote_context_id !== undefined) {
|
|
130
|
+
mapping.remote_context_id = patch.remote_context_id ?? existing?.remote_context_id;
|
|
131
|
+
}
|
|
132
|
+
this.writeFileAtomic(this.filePathFor(negotiationId), mapping);
|
|
133
|
+
return mapping;
|
|
134
|
+
}
|
|
135
|
+
/** 追加一个 taskId(去重)。同 negotiation 首个 task 时创建映射。 */
|
|
136
|
+
addTask(negotiationId, taskId) {
|
|
137
|
+
validateIdentifier(negotiationId, "negotiation_id");
|
|
138
|
+
validateTaskId(taskId, "task_id");
|
|
139
|
+
const existing = this.readMapping(negotiationId);
|
|
140
|
+
const taskIds = existing?.task_ids.includes(taskId)
|
|
141
|
+
? existing.task_ids
|
|
142
|
+
: [...(existing?.task_ids ?? []), taskId];
|
|
143
|
+
const mapping = {
|
|
144
|
+
negotiation_id: negotiationId,
|
|
145
|
+
task_ids: taskIds,
|
|
146
|
+
updated_at: this.now(),
|
|
147
|
+
};
|
|
148
|
+
if (existing?.remote_context_id !== undefined) {
|
|
149
|
+
mapping.remote_context_id = existing.remote_context_id;
|
|
150
|
+
}
|
|
151
|
+
this.writeFileAtomic(this.filePathFor(negotiationId), mapping);
|
|
152
|
+
return mapping;
|
|
153
|
+
}
|
|
154
|
+
/** 所有已持久化的映射(按文件名扫描;损坏文件抛 ContextMapError)。 */
|
|
155
|
+
list() {
|
|
156
|
+
const dir = this.ensureMapDir();
|
|
157
|
+
const result = [];
|
|
158
|
+
for (const name of readdirSync(dir)) {
|
|
159
|
+
if (!name.endsWith(".json"))
|
|
160
|
+
continue;
|
|
161
|
+
const filePath = path.join(dir, name);
|
|
162
|
+
let raw;
|
|
163
|
+
try {
|
|
164
|
+
raw = readFileSync(filePath, "utf-8");
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
throw new ContextMapError("corrupt", `cannot read ${name}: ${String(err)}`);
|
|
168
|
+
}
|
|
169
|
+
let parsed;
|
|
170
|
+
try {
|
|
171
|
+
parsed = JSON.parse(raw);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
throw new ContextMapError("corrupt", `${name} is not valid JSON`);
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
result.push(parseContextMapping(parsed));
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
throw new ContextMapError("corrupt", `${name} failed validation: ${err instanceof Error ? err.message : String(err)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return result;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/negotiation/context-map/store.ts"],"names":[],"mappings":"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"}
|