@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,209 @@
|
|
|
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
|
+
* Process manifest and ownership verification (M4).
|
|
18
|
+
*
|
|
19
|
+
* Every managed process is started through the internal child-runner
|
|
20
|
+
* (supervisor/wrapper.ts) with a cryptographically random per-process nonce
|
|
21
|
+
* visible in the wrapper argv. The manifest (mode 0600, atomically renamed
|
|
22
|
+
* into the private run/ dir) binds: instance id, uid, nonce, exact role,
|
|
23
|
+
* wrapper pid, command fingerprint and start metadata.
|
|
24
|
+
*
|
|
25
|
+
* status/down NEVER use pgrep, fuzzy name matching, or kill-by-port. A
|
|
26
|
+
* process is only signaled after: instance id + uid match, the pid is
|
|
27
|
+
* alive, and the live process argv contains the exact nonce and wrapper
|
|
28
|
+
* path — which makes PID-reuse kills cryptographically improbable.
|
|
29
|
+
*/
|
|
30
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
31
|
+
import { execFileSync } from "node:child_process";
|
|
32
|
+
import { closeSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, writeSync, } from "node:fs";
|
|
33
|
+
import path from "node:path";
|
|
34
|
+
import { fileURLToPath } from "node:url";
|
|
35
|
+
export function newNonce() {
|
|
36
|
+
return randomBytes(16).toString("hex");
|
|
37
|
+
}
|
|
38
|
+
export function wrapperPath() {
|
|
39
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
const sibling = path.join(here, "wrapper.js");
|
|
41
|
+
if (existsSync(sibling))
|
|
42
|
+
return sibling;
|
|
43
|
+
// Dev/test (running from src/): use the built wrapper from dist/.
|
|
44
|
+
return path.resolve(here, "..", "..", "dist", "supervisor", "wrapper.js");
|
|
45
|
+
}
|
|
46
|
+
/** Full wrapper argv: the nonce is always visible to ps for verification. */
|
|
47
|
+
export function wrapperArgv(nonce, manifestPath, logPath, exitPath, command) {
|
|
48
|
+
return [
|
|
49
|
+
wrapperPath(),
|
|
50
|
+
"--kiwi-nonce",
|
|
51
|
+
nonce,
|
|
52
|
+
"--manifest",
|
|
53
|
+
manifestPath,
|
|
54
|
+
"--log",
|
|
55
|
+
logPath,
|
|
56
|
+
"--exit",
|
|
57
|
+
exitPath,
|
|
58
|
+
"--",
|
|
59
|
+
...command,
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
export function fingerprint(argv) {
|
|
63
|
+
return createHash("sha256").update(JSON.stringify(argv)).digest("hex");
|
|
64
|
+
}
|
|
65
|
+
export function manifestPathFor(runDir, role) {
|
|
66
|
+
return path.join(runDir, `${role}.json`);
|
|
67
|
+
}
|
|
68
|
+
export function exitPathFor(runDir, role) {
|
|
69
|
+
return path.join(runDir, `${role}.exit.json`);
|
|
70
|
+
}
|
|
71
|
+
export function logPathFor(logsDir, role) {
|
|
72
|
+
return path.join(logsDir, `${role}.log`);
|
|
73
|
+
}
|
|
74
|
+
/** Atomic mode-0600 write: temp file in the same dir, fsync, rename. */
|
|
75
|
+
export function writeManifestAtomic(manifestPath, manifest) {
|
|
76
|
+
const tmp = `${manifestPath}.tmp-${process.pid}`;
|
|
77
|
+
const fd = openSync(tmp, "wx", 0o600);
|
|
78
|
+
try {
|
|
79
|
+
writeSync(fd, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
80
|
+
fsyncSync(fd);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
closeSync(fd);
|
|
84
|
+
}
|
|
85
|
+
renameSync(tmp, manifestPath);
|
|
86
|
+
}
|
|
87
|
+
function isNonEmptyStringArray(value) {
|
|
88
|
+
return (Array.isArray(value) &&
|
|
89
|
+
value.length > 0 &&
|
|
90
|
+
value.every((v) => typeof v === "string" && v.length > 0));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Parse a manifest file, fail closed: any malformed or tampered field makes
|
|
94
|
+
* the whole manifest unreadable, and an unreadable manifest is never
|
|
95
|
+
* signaled.
|
|
96
|
+
*/
|
|
97
|
+
export function readManifest(manifestPath) {
|
|
98
|
+
let raw;
|
|
99
|
+
try {
|
|
100
|
+
raw = readFileSync(manifestPath, "utf-8");
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const data = JSON.parse(raw);
|
|
107
|
+
if (data.manifest_version !== 1 ||
|
|
108
|
+
typeof data.instance_id !== "string" ||
|
|
109
|
+
!/^[0-9a-f]{32}$/.test(data.instance_id) ||
|
|
110
|
+
typeof data.uid !== "number" ||
|
|
111
|
+
!Number.isSafeInteger(data.uid) ||
|
|
112
|
+
data.uid < 0 ||
|
|
113
|
+
typeof data.nonce !== "string" ||
|
|
114
|
+
!/^[0-9a-f]{32}$/.test(data.nonce) ||
|
|
115
|
+
(data.role !== "gateway" && data.role !== "merchant" && data.role !== "buyer") ||
|
|
116
|
+
typeof data.pid !== "number" ||
|
|
117
|
+
!Number.isSafeInteger(data.pid) ||
|
|
118
|
+
data.pid <= 0 ||
|
|
119
|
+
!isNonEmptyStringArray(data.command) ||
|
|
120
|
+
!isNonEmptyStringArray(data.wrapper_argv) ||
|
|
121
|
+
typeof data.command_fingerprint !== "string" ||
|
|
122
|
+
data.command_fingerprint.length === 0 ||
|
|
123
|
+
typeof data.started_at !== "string" ||
|
|
124
|
+
typeof data.log_path !== "string" ||
|
|
125
|
+
typeof data.exit_path !== "string") {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function pidAlive(pid) {
|
|
135
|
+
try {
|
|
136
|
+
process.kill(pid, 0);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
// EPERM means the process exists but is owned by someone else: alive,
|
|
141
|
+
// and the uid check in verifyProcess will refuse to touch it.
|
|
142
|
+
return err.code === "EPERM";
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** argv of a live pid via ps for the exact PID (never pgrep/name matching). */
|
|
146
|
+
function psArgs(pid) {
|
|
147
|
+
try {
|
|
148
|
+
return execFileSync("ps", ["-p", String(pid), "-o", "args="], {
|
|
149
|
+
encoding: "utf-8",
|
|
150
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function readExitRecord(exitPath) {
|
|
158
|
+
try {
|
|
159
|
+
const data = JSON.parse(readFileSync(exitPath, "utf-8"));
|
|
160
|
+
if (typeof data.at !== "string")
|
|
161
|
+
return undefined;
|
|
162
|
+
return data;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Verify that the live process at manifest.pid is exactly the wrapper this
|
|
170
|
+
* instance started: same instance, same uid, alive, argv carries the exact
|
|
171
|
+
* nonce and wrapper path, and the stored fingerprint matches the recomputed
|
|
172
|
+
* wrapper argv.
|
|
173
|
+
*/
|
|
174
|
+
export function verifyProcess(manifest, expectedInstanceId) {
|
|
175
|
+
if (manifest.instance_id !== expectedInstanceId) {
|
|
176
|
+
return { verified: false, running: false, detail: "manifest belongs to a different instance" };
|
|
177
|
+
}
|
|
178
|
+
const uid = typeof process.getuid === "function" ? process.getuid() : -1;
|
|
179
|
+
if (uid >= 0 && manifest.uid !== uid) {
|
|
180
|
+
return {
|
|
181
|
+
verified: false,
|
|
182
|
+
running: false,
|
|
183
|
+
detail: `manifest uid ${manifest.uid} != current uid ${uid}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (!pidAlive(manifest.pid)) {
|
|
187
|
+
return { verified: true, running: false, detail: `pid ${manifest.pid} is not running` };
|
|
188
|
+
}
|
|
189
|
+
const args = psArgs(manifest.pid);
|
|
190
|
+
if (args === undefined) {
|
|
191
|
+
return { verified: false, running: true, detail: `cannot read argv of pid ${manifest.pid}` };
|
|
192
|
+
}
|
|
193
|
+
// ps joins argv with single spaces; argv elements may themselves contain
|
|
194
|
+
// whitespace, so verify by anchored substrings, not token equality.
|
|
195
|
+
const head = `${wrapperPath()} --kiwi-nonce ${manifest.nonce} `;
|
|
196
|
+
if (!args.includes(head)) {
|
|
197
|
+
return {
|
|
198
|
+
verified: false,
|
|
199
|
+
running: true,
|
|
200
|
+
detail: `pid ${manifest.pid} lacks the expected nonce/wrapper signature`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Tamper check: the stored fingerprint must match the stored argv.
|
|
204
|
+
if (fingerprint(manifest.wrapper_argv) !== manifest.command_fingerprint) {
|
|
205
|
+
return { verified: false, running: true, detail: "command fingerprint mismatch" };
|
|
206
|
+
}
|
|
207
|
+
return { verified: true, running: true, detail: `pid ${manifest.pid} verified (nonce match)` };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/supervisor/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export declare const STACK_VERSION = 1;
|
|
17
|
+
export declare const STACK_CONFIG_FILE = "kiwi.stack.json";
|
|
18
|
+
export type StackMode = "managed-local" | "connected";
|
|
19
|
+
export type ManagedRole = "gateway" | "merchant" | "buyer";
|
|
20
|
+
export declare const MANAGED_ROLES: readonly ManagedRole[];
|
|
21
|
+
export interface StackAgentConfig {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
/** Path to the agent profile, relative to the instance dir. */
|
|
24
|
+
profile: string;
|
|
25
|
+
}
|
|
26
|
+
export interface StackConfig {
|
|
27
|
+
stack_version: number;
|
|
28
|
+
/** Random per-instance id; binds manifests to this instance. */
|
|
29
|
+
instance_id: string;
|
|
30
|
+
mode: StackMode;
|
|
31
|
+
created_at: string;
|
|
32
|
+
gateway: {
|
|
33
|
+
base_url: string;
|
|
34
|
+
/** Exact argv for the shopping-cli API server (never a shell string). */
|
|
35
|
+
command: string[];
|
|
36
|
+
/** Extra environment for the gateway child (e.g. PYTHONPATH). */
|
|
37
|
+
env: Record<string, string>;
|
|
38
|
+
};
|
|
39
|
+
agents: {
|
|
40
|
+
merchant: StackAgentConfig;
|
|
41
|
+
buyer: StackAgentConfig;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export declare class StackConfigError extends Error {
|
|
45
|
+
constructor(message: string);
|
|
46
|
+
}
|
|
47
|
+
/** Instance layout: the only paths the supervisor ever creates or removes. */
|
|
48
|
+
export declare function instancePaths(dir: string): {
|
|
49
|
+
root: string;
|
|
50
|
+
config: string;
|
|
51
|
+
data: string;
|
|
52
|
+
logs: string;
|
|
53
|
+
run: string;
|
|
54
|
+
profiles: string;
|
|
55
|
+
};
|
|
56
|
+
/** Resolve and validate an instance directory for init. */
|
|
57
|
+
export declare function assertSafeInstanceDir(dir: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Structurally validate gateway.base_url: no credentials, no fragment, no
|
|
60
|
+
* query. managed-local must be cleartext HTTP on a loopback host with an
|
|
61
|
+
* explicit valid port; connected may be HTTPS (any host) and keeps the same
|
|
62
|
+
* loopback-only rule for HTTP.
|
|
63
|
+
*/
|
|
64
|
+
export declare function validateGatewayBaseUrl(value: unknown, mode: StackMode, source: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve an agent profile path against the instance root and prove
|
|
67
|
+
* containment. Absolute paths and traversal escaping the root are rejected;
|
|
68
|
+
* harmless filenames containing two dots are fine.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveProfilePath(instanceRoot: string, profile: string, source: string): string;
|
|
71
|
+
/** Validate a parsed stack config object, fail closed. */
|
|
72
|
+
export declare function validateStackConfig(data: unknown, source: string): StackConfig;
|
|
73
|
+
/** Parse and validate a stack config from raw text. */
|
|
74
|
+
export declare function parseStackConfig(raw: string, source: string): StackConfig;
|
|
75
|
+
/** A free loopback port (best effort; the usual bind-after-close race applies). */
|
|
76
|
+
export declare function pickFreePort(): Promise<number>;
|
|
77
|
+
export declare function newInstanceId(): string;
|
|
78
|
+
/** Detect the shopping-cli source checkout (sibling of the Kiwi package). */
|
|
79
|
+
export declare function detectShoppingCliSrc(packageRoot: string): string | undefined;
|
|
@@ -0,0 +1,262 @@
|
|
|
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
|
+
* Stack config (`kiwi.stack.json`) — the self-contained instance definition
|
|
18
|
+
* written by `kiwi init` and consumed by up/status/logs/down.
|
|
19
|
+
*
|
|
20
|
+
* Parsing is fail-closed: unknown fields at every level are rejected, types
|
|
21
|
+
* are checked, and instance-directory safety rules refuse broad targets
|
|
22
|
+
* (filesystem root, the user's home, /tmp itself, …). Secrets never appear
|
|
23
|
+
* in this file: profiles and env mappings only NAME environment variables.
|
|
24
|
+
*/
|
|
25
|
+
import { randomBytes } from "node:crypto";
|
|
26
|
+
import { existsSync } from "node:fs";
|
|
27
|
+
import { homedir } from "node:os";
|
|
28
|
+
import path from "node:path";
|
|
29
|
+
export const STACK_VERSION = 1;
|
|
30
|
+
export const STACK_CONFIG_FILE = "kiwi.stack.json";
|
|
31
|
+
export const MANAGED_ROLES = ["gateway", "merchant", "buyer"];
|
|
32
|
+
export class StackConfigError extends Error {
|
|
33
|
+
constructor(message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = "StackConfigError";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function fail(message) {
|
|
39
|
+
throw new StackConfigError(message);
|
|
40
|
+
}
|
|
41
|
+
function isObject(v) {
|
|
42
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
43
|
+
}
|
|
44
|
+
function rejectUnknown(obj, allowed, section) {
|
|
45
|
+
for (const key of Object.keys(obj)) {
|
|
46
|
+
if (!allowed.includes(key))
|
|
47
|
+
fail(`stack config: ${section} has unknown field "${key}"`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Instance layout: the only paths the supervisor ever creates or removes. */
|
|
51
|
+
export function instancePaths(dir) {
|
|
52
|
+
const root = path.resolve(dir);
|
|
53
|
+
return {
|
|
54
|
+
root,
|
|
55
|
+
config: path.join(root, STACK_CONFIG_FILE),
|
|
56
|
+
data: path.join(root, "data"),
|
|
57
|
+
logs: path.join(root, "logs"),
|
|
58
|
+
run: path.join(root, "run"),
|
|
59
|
+
profiles: path.join(root, "profiles"),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Directories that may never become an instance target: the supervisor
|
|
64
|
+
* creates/deletes state there, so broad roots are refused outright.
|
|
65
|
+
*/
|
|
66
|
+
function blockedInstanceDirs() {
|
|
67
|
+
const home = path.resolve(homedir());
|
|
68
|
+
return new Set([
|
|
69
|
+
path.parse(home).root, // filesystem root ("/")
|
|
70
|
+
home,
|
|
71
|
+
path.dirname(home), // "/Users" or "/home"
|
|
72
|
+
"/tmp",
|
|
73
|
+
"/var",
|
|
74
|
+
"/etc",
|
|
75
|
+
"/usr",
|
|
76
|
+
"/opt",
|
|
77
|
+
]);
|
|
78
|
+
}
|
|
79
|
+
/** Resolve and validate an instance directory for init. */
|
|
80
|
+
export function assertSafeInstanceDir(dir) {
|
|
81
|
+
const resolved = path.resolve(dir);
|
|
82
|
+
if (blockedInstanceDirs().has(resolved)) {
|
|
83
|
+
fail(`refusing unsafe instance directory: ${resolved}`);
|
|
84
|
+
}
|
|
85
|
+
const segments = resolved.split(path.sep).filter((s) => s.length > 0);
|
|
86
|
+
if (segments.length < 2) {
|
|
87
|
+
fail(`refusing too-broad instance directory: ${resolved}`);
|
|
88
|
+
}
|
|
89
|
+
return resolved;
|
|
90
|
+
}
|
|
91
|
+
/** Hosts allowed to use cleartext HTTP for a managed-local gateway. */
|
|
92
|
+
const LOOPBACK_HOSTNAMES = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
|
|
93
|
+
/**
|
|
94
|
+
* Structurally validate gateway.base_url: no credentials, no fragment, no
|
|
95
|
+
* query. managed-local must be cleartext HTTP on a loopback host with an
|
|
96
|
+
* explicit valid port; connected may be HTTPS (any host) and keeps the same
|
|
97
|
+
* loopback-only rule for HTTP.
|
|
98
|
+
*/
|
|
99
|
+
export function validateGatewayBaseUrl(value, mode, source) {
|
|
100
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
101
|
+
fail(`${source}: gateway.base_url is required`);
|
|
102
|
+
}
|
|
103
|
+
let url;
|
|
104
|
+
try {
|
|
105
|
+
url = new URL(value);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
fail(`${source}: gateway.base_url must be a valid URL`);
|
|
109
|
+
}
|
|
110
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
111
|
+
fail(`${source}: gateway.base_url must use http or https (got ${url.protocol})`);
|
|
112
|
+
}
|
|
113
|
+
if (url.username !== "" || url.password !== "") {
|
|
114
|
+
fail(`${source}: gateway.base_url must not embed credentials`);
|
|
115
|
+
}
|
|
116
|
+
if (url.hash !== "" || url.search !== "") {
|
|
117
|
+
fail(`${source}: gateway.base_url must not contain a fragment or query`);
|
|
118
|
+
}
|
|
119
|
+
const loopback = LOOPBACK_HOSTNAMES.has(url.hostname.toLowerCase());
|
|
120
|
+
if (mode === "managed-local") {
|
|
121
|
+
if (url.protocol !== "http:" || !loopback) {
|
|
122
|
+
fail(`${source}: managed-local gateway.base_url must be HTTP on a loopback host`);
|
|
123
|
+
}
|
|
124
|
+
// Explicit valid port is required for the managed gateway.
|
|
125
|
+
if (!/^\d+$/.test(url.port)) {
|
|
126
|
+
fail(`${source}: managed-local gateway.base_url must carry an explicit port`);
|
|
127
|
+
}
|
|
128
|
+
const port = Number(url.port);
|
|
129
|
+
if (port < 1 || port > 65535) {
|
|
130
|
+
fail(`${source}: gateway.base_url port must be between 1 and 65535`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (url.protocol === "http:" && !loopback) {
|
|
134
|
+
fail(`${source}: gateway.base_url uses cleartext HTTP; only loopback hosts may use HTTP`);
|
|
135
|
+
}
|
|
136
|
+
return value;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve an agent profile path against the instance root and prove
|
|
140
|
+
* containment. Absolute paths and traversal escaping the root are rejected;
|
|
141
|
+
* harmless filenames containing two dots are fine.
|
|
142
|
+
*/
|
|
143
|
+
export function resolveProfilePath(instanceRoot, profile, source) {
|
|
144
|
+
if (path.isAbsolute(profile)) {
|
|
145
|
+
fail(`${source}: agent profile must be a relative path inside the instance`);
|
|
146
|
+
}
|
|
147
|
+
const root = path.resolve(instanceRoot);
|
|
148
|
+
const resolved = path.resolve(root, profile);
|
|
149
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
150
|
+
fail(`${source}: agent profile escapes the instance directory: ${profile}`);
|
|
151
|
+
}
|
|
152
|
+
return resolved;
|
|
153
|
+
}
|
|
154
|
+
/** Validate a parsed stack config object, fail closed. */
|
|
155
|
+
export function validateStackConfig(data, source) {
|
|
156
|
+
if (!isObject(data))
|
|
157
|
+
fail(`${source}: stack config must be a JSON object`);
|
|
158
|
+
rejectUnknown(data, ["stack_version", "instance_id", "mode", "created_at", "gateway", "agents"], "root");
|
|
159
|
+
if (data.stack_version !== STACK_VERSION) {
|
|
160
|
+
fail(`${source}: stack_version must be ${STACK_VERSION}`);
|
|
161
|
+
}
|
|
162
|
+
if (typeof data.instance_id !== "string" || !/^[0-9a-f]{32}$/.test(data.instance_id)) {
|
|
163
|
+
fail(`${source}: instance_id must be a 32-char hex string`);
|
|
164
|
+
}
|
|
165
|
+
if (data.mode !== "managed-local" && data.mode !== "connected") {
|
|
166
|
+
fail(`${source}: mode must be managed-local or connected`);
|
|
167
|
+
}
|
|
168
|
+
if (typeof data.created_at !== "string" || Number.isNaN(Date.parse(data.created_at))) {
|
|
169
|
+
fail(`${source}: created_at must be an ISO timestamp`);
|
|
170
|
+
}
|
|
171
|
+
if (!isObject(data.gateway))
|
|
172
|
+
fail(`${source}: gateway section is required`);
|
|
173
|
+
const gw = data.gateway;
|
|
174
|
+
rejectUnknown(gw, ["base_url", "command", "env"], "gateway");
|
|
175
|
+
const baseUrl = validateGatewayBaseUrl(gw.base_url, data.mode, source);
|
|
176
|
+
if (!Array.isArray(gw.command) ||
|
|
177
|
+
gw.command.length === 0 ||
|
|
178
|
+
!gw.command.every((c) => typeof c === "string" && c.length > 0)) {
|
|
179
|
+
fail(`${source}: gateway.command must be a non-empty string array (argv, never a shell string)`);
|
|
180
|
+
}
|
|
181
|
+
if (!isObject(gw.env) || !Object.values(gw.env).every((v) => typeof v === "string")) {
|
|
182
|
+
fail(`${source}: gateway.env must be a string map`);
|
|
183
|
+
}
|
|
184
|
+
if (!isObject(data.agents))
|
|
185
|
+
fail(`${source}: agents section is required`);
|
|
186
|
+
rejectUnknown(data.agents, ["merchant", "buyer"], "agents");
|
|
187
|
+
const parseAgent = (value, name) => {
|
|
188
|
+
if (!isObject(value))
|
|
189
|
+
fail(`${source}: agents.${name} must be an object`);
|
|
190
|
+
rejectUnknown(value, ["enabled", "profile"], `agents.${name}`);
|
|
191
|
+
if (typeof value.enabled !== "boolean")
|
|
192
|
+
fail(`${source}: agents.${name}.enabled must be a boolean`);
|
|
193
|
+
if (typeof value.profile !== "string" || value.profile.length === 0) {
|
|
194
|
+
fail(`${source}: agents.${name}.profile must be a non-empty string`);
|
|
195
|
+
}
|
|
196
|
+
if (path.isAbsolute(value.profile)) {
|
|
197
|
+
fail(`${source}: agents.${name}.profile must be a relative path inside the instance`);
|
|
198
|
+
}
|
|
199
|
+
// Normalized traversal out of the configured location is rejected here;
|
|
200
|
+
// full containment inside the instance root is proven at load/use time
|
|
201
|
+
// via resolveProfilePath. Filenames containing ".." harmlessly (e.g.
|
|
202
|
+
// "merchant.v1..yaml") are allowed.
|
|
203
|
+
const normalized = path.posix.normalize(value.profile.split(path.sep).join("/"));
|
|
204
|
+
if (normalized === ".." || normalized.startsWith("../")) {
|
|
205
|
+
fail(`${source}: agents.${name}.profile must not traverse outside its directory`);
|
|
206
|
+
}
|
|
207
|
+
return { enabled: value.enabled, profile: value.profile };
|
|
208
|
+
};
|
|
209
|
+
return {
|
|
210
|
+
stack_version: STACK_VERSION,
|
|
211
|
+
instance_id: data.instance_id,
|
|
212
|
+
mode: data.mode,
|
|
213
|
+
created_at: data.created_at,
|
|
214
|
+
gateway: {
|
|
215
|
+
base_url: baseUrl,
|
|
216
|
+
command: gw.command,
|
|
217
|
+
env: { ...gw.env },
|
|
218
|
+
},
|
|
219
|
+
agents: {
|
|
220
|
+
merchant: parseAgent(data.agents.merchant, "merchant"),
|
|
221
|
+
buyer: parseAgent(data.agents.buyer, "buyer"),
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/** Parse and validate a stack config from raw text. */
|
|
226
|
+
export function parseStackConfig(raw, source) {
|
|
227
|
+
let data;
|
|
228
|
+
try {
|
|
229
|
+
data = JSON.parse(raw);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
fail(`${source}: invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
233
|
+
}
|
|
234
|
+
return validateStackConfig(data, source);
|
|
235
|
+
}
|
|
236
|
+
/** A free loopback port (best effort; the usual bind-after-close race applies). */
|
|
237
|
+
export async function pickFreePort() {
|
|
238
|
+
const { createServer } = await import("node:net");
|
|
239
|
+
return new Promise((resolve, reject) => {
|
|
240
|
+
const server = createServer();
|
|
241
|
+
server.once("error", reject);
|
|
242
|
+
server.listen(0, "127.0.0.1", () => {
|
|
243
|
+
const address = server.address();
|
|
244
|
+
if (address === null || (typeof address === "object") !== true) {
|
|
245
|
+
server.close();
|
|
246
|
+
reject(new StackConfigError("could not allocate a free loopback port"));
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const port = address.port;
|
|
250
|
+
server.close(() => resolve(port));
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
export function newInstanceId() {
|
|
255
|
+
return randomBytes(16).toString("hex");
|
|
256
|
+
}
|
|
257
|
+
/** Detect the shopping-cli source checkout (sibling of the Kiwi package). */
|
|
258
|
+
export function detectShoppingCliSrc(packageRoot) {
|
|
259
|
+
const candidate = path.resolve(packageRoot, "..", "shopping-cli");
|
|
260
|
+
return existsSync(path.join(candidate, "shopping_cli")) ? candidate : undefined;
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=stack-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-config.js","sourceRoot":"","sources":["../../src/supervisor/stack-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2026 harrylabsj
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
export {};
|