@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,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* `kiwi up` / `kiwi status` / `kiwi down` — managed-local lifecycle.
|
|
18
|
+
*
|
|
19
|
+
* up starts the shopping-cli gateway, waits for /health, then starts the
|
|
20
|
+
* enabled buyer/merchant foreground agents — each through the child-runner
|
|
21
|
+
* with a random nonce. All spawns use argv arrays (never shell strings).
|
|
22
|
+
* up validates config/profiles/env BEFORE leaving any background process
|
|
23
|
+
* behind and rolls back only processes it created on partial failure. It is
|
|
24
|
+
* idempotent when its own instance is already healthy.
|
|
25
|
+
*
|
|
26
|
+
* down signals only verified wrapper PIDs (instance id + uid + live argv
|
|
27
|
+
* nonce + fingerprint), waits a bounded time, escalates to SIGKILL only for
|
|
28
|
+
* its own surviving verified wrapper, and reports — never kills — anything
|
|
29
|
+
* unverifiable. Both are idempotent; cleanup touches only this instance's
|
|
30
|
+
* run/ files.
|
|
31
|
+
*/
|
|
32
|
+
import { randomBytes } from "node:crypto";
|
|
33
|
+
import { spawn } from "node:child_process";
|
|
34
|
+
import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
35
|
+
import path from "node:path";
|
|
36
|
+
import { fileURLToPath } from "node:url";
|
|
37
|
+
import { loadProfile, ProfileError } from "../config/profile.js";
|
|
38
|
+
import { exitPathFor, fingerprint, logPathFor, manifestPathFor, newNonce, pidAlive, readExitRecord, readManifest, verifyProcess, wrapperArgv, writeManifestAtomic, } from "./manifest.js";
|
|
39
|
+
import { instancePaths, MANAGED_ROLES, parseStackConfig, resolveProfilePath, StackConfigError, } from "./stack-config.js";
|
|
40
|
+
const HEALTH_TIMEOUT_MS = 30_000;
|
|
41
|
+
const HEALTH_POLL_MS = 250;
|
|
42
|
+
const AGENT_GRACE_MS = 750;
|
|
43
|
+
const SIGTERM_WAIT_MS = 5_000;
|
|
44
|
+
const SIGKILL_WAIT_MS = 2_000;
|
|
45
|
+
const WAIT_POLL_MS = 100;
|
|
46
|
+
export class SupervisorError extends Error {
|
|
47
|
+
constructor(message) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.name = "SupervisorError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function cliPath() {
|
|
53
|
+
const sibling = path.join(path.dirname(fileURLToPath(import.meta.url)), "..", "cli.js");
|
|
54
|
+
if (existsSync(sibling))
|
|
55
|
+
return sibling;
|
|
56
|
+
// Dev/test (running from src/): use the built CLI from dist/.
|
|
57
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "dist", "cli.js");
|
|
58
|
+
}
|
|
59
|
+
/** Resolve an agent profile with proven containment inside the instance. */
|
|
60
|
+
function safeProfilePath(ctx, role) {
|
|
61
|
+
try {
|
|
62
|
+
return resolveProfilePath(ctx.paths.root, ctx.config.agents[role].profile, "stack config");
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof StackConfigError)
|
|
66
|
+
throw new SupervisorError(err.message);
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function loadInstance(dir) {
|
|
71
|
+
const paths = instancePaths(dir);
|
|
72
|
+
let raw;
|
|
73
|
+
try {
|
|
74
|
+
raw = readFileSync(paths.config, "utf-8");
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
throw new SupervisorError(`no Kiwi instance at ${paths.root} (missing ${path.basename(paths.config)}); run kiwi init first`);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
return { paths, config: parseStackConfig(raw, paths.config) };
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (err instanceof StackConfigError)
|
|
84
|
+
throw new SupervisorError(err.message);
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function sleep(ms) {
|
|
89
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
90
|
+
}
|
|
91
|
+
/** Bounded wait for a file to appear. */
|
|
92
|
+
async function waitForFile(file, timeoutMs) {
|
|
93
|
+
const deadline = Date.now() + timeoutMs;
|
|
94
|
+
while (Date.now() < deadline) {
|
|
95
|
+
if (existsSync(file))
|
|
96
|
+
return true;
|
|
97
|
+
await sleep(25);
|
|
98
|
+
}
|
|
99
|
+
return existsSync(file);
|
|
100
|
+
}
|
|
101
|
+
const READY_WAIT_MS = 3_000;
|
|
102
|
+
/** Spawn one managed process through the child-runner and write its manifest. */
|
|
103
|
+
export async function spawnManaged(ctx, role, command, env) {
|
|
104
|
+
const nonce = newNonce();
|
|
105
|
+
const manifestPath = manifestPathFor(ctx.paths.run, role);
|
|
106
|
+
const logPath = logPathFor(ctx.paths.logs, role);
|
|
107
|
+
const exitPath = exitPathFor(ctx.paths.run, role);
|
|
108
|
+
rmSync(exitPath, { force: true });
|
|
109
|
+
rmSync(`${manifestPath}.ready`, { force: true });
|
|
110
|
+
const argv = wrapperArgv(nonce, manifestPath, logPath, exitPath, command);
|
|
111
|
+
const child = spawn(process.execPath, argv, {
|
|
112
|
+
detached: true,
|
|
113
|
+
stdio: "ignore",
|
|
114
|
+
env: { ...process.env, ...env },
|
|
115
|
+
});
|
|
116
|
+
child.unref();
|
|
117
|
+
if (child.pid === undefined) {
|
|
118
|
+
throw new SupervisorError(`failed to spawn ${role}`);
|
|
119
|
+
}
|
|
120
|
+
const manifest = {
|
|
121
|
+
manifest_version: 1,
|
|
122
|
+
instance_id: ctx.config.instance_id,
|
|
123
|
+
uid: typeof process.getuid === "function" ? process.getuid() : 0,
|
|
124
|
+
nonce,
|
|
125
|
+
role,
|
|
126
|
+
pid: child.pid,
|
|
127
|
+
command,
|
|
128
|
+
wrapper_argv: argv,
|
|
129
|
+
command_fingerprint: fingerprint(argv),
|
|
130
|
+
started_at: new Date().toISOString(),
|
|
131
|
+
log_path: logPath,
|
|
132
|
+
exit_path: exitPath,
|
|
133
|
+
};
|
|
134
|
+
writeManifestAtomic(manifestPath, manifest);
|
|
135
|
+
// The child-runner marks readiness only after its signal handlers are
|
|
136
|
+
// registered; no signal sent after this point can be lost.
|
|
137
|
+
const ready = await waitForFile(`${manifestPath}.ready`, READY_WAIT_MS);
|
|
138
|
+
if (!ready) {
|
|
139
|
+
const exit = readExitRecord(exitPath);
|
|
140
|
+
throw new SupervisorError(`${role} child-runner did not become ready` +
|
|
141
|
+
(exit ? ` (exit_code=${String(exit.exit_code)})` : ""));
|
|
142
|
+
}
|
|
143
|
+
return manifest;
|
|
144
|
+
}
|
|
145
|
+
async function waitHealth(baseUrl, timeoutMs) {
|
|
146
|
+
const deadline = Date.now() + timeoutMs;
|
|
147
|
+
for (;;) {
|
|
148
|
+
try {
|
|
149
|
+
const controller = new AbortController();
|
|
150
|
+
const timer = setTimeout(() => controller.abort(), 2_000);
|
|
151
|
+
const res = await fetch(`${baseUrl}/health`, { signal: controller.signal });
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
if (res.ok)
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// not up yet
|
|
158
|
+
}
|
|
159
|
+
if (Date.now() > deadline)
|
|
160
|
+
return false;
|
|
161
|
+
await sleep(HEALTH_POLL_MS);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async function waitExit(pid, timeoutMs) {
|
|
165
|
+
const deadline = Date.now() + timeoutMs;
|
|
166
|
+
while (Date.now() < deadline) {
|
|
167
|
+
if (!pidAlive(pid))
|
|
168
|
+
return true;
|
|
169
|
+
await sleep(WAIT_POLL_MS);
|
|
170
|
+
}
|
|
171
|
+
return !pidAlive(pid);
|
|
172
|
+
}
|
|
173
|
+
function roleEnabled(config, role) {
|
|
174
|
+
if (role === "gateway")
|
|
175
|
+
return true;
|
|
176
|
+
return config.agents[role].enabled;
|
|
177
|
+
}
|
|
178
|
+
function roleState(ctx, role) {
|
|
179
|
+
const enabled = roleEnabled(ctx.config, role);
|
|
180
|
+
const manifestPath = manifestPathFor(ctx.paths.run, role);
|
|
181
|
+
const manifest = readManifest(manifestPath);
|
|
182
|
+
if (!manifest) {
|
|
183
|
+
return { role, enabled, verified: false, running: false, detail: "not started" };
|
|
184
|
+
}
|
|
185
|
+
// The manifest's role must match the file it lives in; a mismatch means
|
|
186
|
+
// the file cannot be trusted and the process is never signaled.
|
|
187
|
+
if (manifest.role !== role) {
|
|
188
|
+
return {
|
|
189
|
+
role,
|
|
190
|
+
enabled,
|
|
191
|
+
verified: false,
|
|
192
|
+
running: pidAlive(manifest.pid),
|
|
193
|
+
detail: `manifest role mismatch: ${role}.json describes role "${manifest.role}"`,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
const verification = verifyProcess(manifest, ctx.config.instance_id);
|
|
197
|
+
const exited = verification.running ? undefined : readExitRecord(manifest.exit_path);
|
|
198
|
+
return {
|
|
199
|
+
role,
|
|
200
|
+
enabled,
|
|
201
|
+
verified: verification.verified,
|
|
202
|
+
running: verification.running,
|
|
203
|
+
exited,
|
|
204
|
+
detail: verification.detail,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/** Remove this instance's stale (not-running) run/ state for a role. */
|
|
208
|
+
function cleanStaleRunState(ctx, role) {
|
|
209
|
+
rmSync(manifestPathFor(ctx.paths.run, role), { force: true });
|
|
210
|
+
rmSync(`${manifestPathFor(ctx.paths.run, role)}.ready`, { force: true });
|
|
211
|
+
rmSync(exitPathFor(ctx.paths.run, role), { force: true });
|
|
212
|
+
}
|
|
213
|
+
export async function runUp(dir, options) {
|
|
214
|
+
const healthTimeoutMs = options?.healthTimeoutMs ?? HEALTH_TIMEOUT_MS;
|
|
215
|
+
const agentGraceMs = options?.agentGraceMs ?? AGENT_GRACE_MS;
|
|
216
|
+
const ctx = loadInstance(dir);
|
|
217
|
+
if (ctx.config.mode !== "managed-local") {
|
|
218
|
+
throw new SupervisorError(`mode ${ctx.config.mode} is not managed by kiwi 0.5.0: start the gateway yourself and use kiwi agent run / doctor`);
|
|
219
|
+
}
|
|
220
|
+
// 1. Ownership/running state FIRST (safe, needs no secrets): an already
|
|
221
|
+
// verified+running stack must be idempotent even from a fresh shell
|
|
222
|
+
// without the agent tokens in its environment.
|
|
223
|
+
const started = [];
|
|
224
|
+
const alreadyRunning = [];
|
|
225
|
+
const disabled = [];
|
|
226
|
+
const toStart = [];
|
|
227
|
+
for (const role of MANAGED_ROLES) {
|
|
228
|
+
if (!roleEnabled(ctx.config, role)) {
|
|
229
|
+
disabled.push(role);
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
const state = roleState(ctx, role);
|
|
233
|
+
if (state.running && state.verified) {
|
|
234
|
+
alreadyRunning.push(role);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (state.running && !state.verified) {
|
|
238
|
+
throw new SupervisorError(`${role}: pid in manifest is alive but failed ownership verification (${state.detail}); refusing to disturb it — inspect ${ctx.paths.run} manually`);
|
|
239
|
+
}
|
|
240
|
+
cleanStaleRunState(ctx, role); // only this instance's run/ files
|
|
241
|
+
toStart.push(role);
|
|
242
|
+
}
|
|
243
|
+
// 2. Validate profiles and required env vars — only for agent roles that
|
|
244
|
+
// actually need to start, and still before any process is spawned.
|
|
245
|
+
const agentsToStart = toStart.filter((role) => role !== "gateway");
|
|
246
|
+
if (agentsToStart.length > 0) {
|
|
247
|
+
const missing = [];
|
|
248
|
+
for (const role of agentsToStart) {
|
|
249
|
+
// Containment is proven against the instance root, not by substring.
|
|
250
|
+
const profilePath = safeProfilePath(ctx, role);
|
|
251
|
+
try {
|
|
252
|
+
const profile = loadProfile(profilePath);
|
|
253
|
+
if (process.env[profile.commerce.token_env] === undefined) {
|
|
254
|
+
missing.push(`${profile.commerce.token_env} (${role} commerce token)`);
|
|
255
|
+
}
|
|
256
|
+
if (profile.model.provider !== "fake" && profile.model.api_key_env !== undefined) {
|
|
257
|
+
if (process.env[profile.model.api_key_env] === undefined) {
|
|
258
|
+
missing.push(`${profile.model.api_key_env} (${role} model API key)`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (err) {
|
|
263
|
+
if (err instanceof ProfileError) {
|
|
264
|
+
throw new SupervisorError(`${role} profile invalid: ${err.message}`);
|
|
265
|
+
}
|
|
266
|
+
throw err;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (missing.length > 0) {
|
|
270
|
+
throw new SupervisorError(`missing required environment variables: ${missing.join(", ")} (names only; values are never printed)`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 3. Gateway health is a precondition for starting agents — even when the
|
|
274
|
+
// gateway wrapper is already verified+running. If it stays unhealthy,
|
|
275
|
+
// fail clearly: no agents are started and the pre-existing gateway is
|
|
276
|
+
// left untouched.
|
|
277
|
+
const gatewayInToStart = toStart.includes("gateway");
|
|
278
|
+
if (agentsToStart.length > 0 && !gatewayInToStart) {
|
|
279
|
+
if (!(await waitHealth(ctx.config.gateway.base_url, healthTimeoutMs))) {
|
|
280
|
+
throw new SupervisorError(`gateway is already running but not healthy at ${ctx.config.gateway.base_url}; refusing to start agents (the running gateway was left untouched)`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// 4. Start gateway, wait for health, then agents. Roll back only what we
|
|
284
|
+
// started on any partial failure.
|
|
285
|
+
const gatewayEnv = {
|
|
286
|
+
...ctx.config.gateway.env,
|
|
287
|
+
SHOPPING_DEPLOYMENT_PROFILE: process.env.SHOPPING_DEPLOYMENT_PROFILE ?? "local",
|
|
288
|
+
SHOPPING_ADMIN_TOKEN: process.env.SHOPPING_ADMIN_TOKEN ?? randomBytes(24).toString("base64url"),
|
|
289
|
+
SHOPPING_BUYER_BOOTSTRAP_TOKEN: process.env.SHOPPING_BUYER_BOOTSTRAP_TOKEN ?? randomBytes(24).toString("base64url"),
|
|
290
|
+
};
|
|
291
|
+
const rollback = async () => {
|
|
292
|
+
for (const role of [...started].reverse()) {
|
|
293
|
+
const manifest = readManifest(manifestPathFor(ctx.paths.run, role));
|
|
294
|
+
if (manifest)
|
|
295
|
+
await stopVerified(ctx, manifest);
|
|
296
|
+
cleanStaleRunState(ctx, role);
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
try {
|
|
300
|
+
for (const role of toStart) {
|
|
301
|
+
if (role === "gateway") {
|
|
302
|
+
await spawnManaged(ctx, role, ctx.config.gateway.command, gatewayEnv);
|
|
303
|
+
started.push(role);
|
|
304
|
+
if (!(await waitHealth(ctx.config.gateway.base_url, healthTimeoutMs))) {
|
|
305
|
+
throw new SupervisorError(`gateway did not become healthy within ${healthTimeoutMs / 1000}s at ${ctx.config.gateway.base_url}`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
const profilePath = safeProfilePath(ctx, role);
|
|
310
|
+
await spawnManaged(ctx, role, [process.execPath, cliPath(), "agent", "run", "--profile", profilePath], {});
|
|
311
|
+
started.push(role);
|
|
312
|
+
await sleep(agentGraceMs);
|
|
313
|
+
const state = roleState(ctx, role);
|
|
314
|
+
if (!state.running || state.exited !== undefined) {
|
|
315
|
+
throw new SupervisorError(`${role} agent exited during startup (see ${logPathFor(ctx.paths.logs, role)})`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
await rollback();
|
|
322
|
+
throw err;
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
instance_id: ctx.config.instance_id,
|
|
326
|
+
started,
|
|
327
|
+
already_running: alreadyRunning,
|
|
328
|
+
disabled,
|
|
329
|
+
base_url: ctx.config.gateway.base_url,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/** Stop one manifest-owned process after verification. Never touches anything unverifiable. */
|
|
333
|
+
export async function stopVerified(ctx, manifest) {
|
|
334
|
+
const verification = verifyProcess(manifest, ctx.config.instance_id);
|
|
335
|
+
if (!verification.running)
|
|
336
|
+
return "not_running";
|
|
337
|
+
if (!verification.verified)
|
|
338
|
+
return "unverified";
|
|
339
|
+
// Never signal a child-runner whose readiness cannot be proven (the ready
|
|
340
|
+
// marker is written only after its signal handlers are installed). If the
|
|
341
|
+
// marker never appears, do NOT signal: report instead of risking a kill
|
|
342
|
+
// before the handlers exist.
|
|
343
|
+
const readyPath = `${manifestPathFor(ctx.paths.run, manifest.role)}.ready`;
|
|
344
|
+
if (!existsSync(readyPath) && !(await waitForFile(readyPath, READY_WAIT_MS))) {
|
|
345
|
+
return "unverified";
|
|
346
|
+
}
|
|
347
|
+
process.kill(manifest.pid, "SIGTERM");
|
|
348
|
+
if (await waitExit(manifest.pid, SIGTERM_WAIT_MS))
|
|
349
|
+
return "stopped";
|
|
350
|
+
// Escalate only against our own still-verified wrapper.
|
|
351
|
+
const again = verifyProcess(manifest, ctx.config.instance_id);
|
|
352
|
+
if (!again.running)
|
|
353
|
+
return "stopped";
|
|
354
|
+
if (!again.verified)
|
|
355
|
+
return "unverified";
|
|
356
|
+
process.kill(manifest.pid, "SIGKILL");
|
|
357
|
+
return (await waitExit(manifest.pid, SIGKILL_WAIT_MS)) ? "killed" : "unverified";
|
|
358
|
+
}
|
|
359
|
+
export async function runDown(dir) {
|
|
360
|
+
const ctx = loadInstance(dir);
|
|
361
|
+
const results = [];
|
|
362
|
+
// Agents first, gateway last.
|
|
363
|
+
for (const role of [...MANAGED_ROLES].reverse()) {
|
|
364
|
+
const manifest = readManifest(manifestPathFor(ctx.paths.run, role));
|
|
365
|
+
if (!manifest) {
|
|
366
|
+
results.push({ role, outcome: "not_started", detail: "no manifest" });
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
if (manifest.role !== role) {
|
|
370
|
+
// Report, never signal: the file cannot be trusted for this role.
|
|
371
|
+
results.push({
|
|
372
|
+
role,
|
|
373
|
+
outcome: "unverified",
|
|
374
|
+
detail: `manifest role mismatch: ${role}.json describes role "${manifest.role}"`,
|
|
375
|
+
});
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
const verification = verifyProcess(manifest, ctx.config.instance_id);
|
|
379
|
+
if (verification.running && !verification.verified) {
|
|
380
|
+
// Report, never kill: this process cannot be proven to be ours.
|
|
381
|
+
results.push({ role, outcome: "unverified", detail: verification.detail });
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
const outcome = await stopVerified(ctx, manifest);
|
|
385
|
+
if (outcome !== "unverified") {
|
|
386
|
+
cleanStaleRunState(ctx, role);
|
|
387
|
+
}
|
|
388
|
+
results.push({ role, outcome, detail: verification.detail });
|
|
389
|
+
}
|
|
390
|
+
return { instance_id: ctx.config.instance_id, results };
|
|
391
|
+
}
|
|
392
|
+
export async function runStatus(dir) {
|
|
393
|
+
const ctx = loadInstance(dir);
|
|
394
|
+
let health;
|
|
395
|
+
try {
|
|
396
|
+
const controller = new AbortController();
|
|
397
|
+
const timer = setTimeout(() => controller.abort(), 2_000);
|
|
398
|
+
const res = await fetch(`${ctx.config.gateway.base_url}/health`, {
|
|
399
|
+
signal: controller.signal,
|
|
400
|
+
});
|
|
401
|
+
clearTimeout(timer);
|
|
402
|
+
const body = (await res.json());
|
|
403
|
+
health = { ok: res.ok && body.ok === true, ...(body.version ? { version: body.version } : {}) };
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
health = undefined;
|
|
407
|
+
}
|
|
408
|
+
const processes = MANAGED_ROLES.map((role) => roleState(ctx, role));
|
|
409
|
+
const ok = (health?.ok ?? false) && processes.every((p) => !p.enabled || (p.running && p.verified));
|
|
410
|
+
return {
|
|
411
|
+
ok,
|
|
412
|
+
instance_id: ctx.config.instance_id,
|
|
413
|
+
mode: ctx.config.mode,
|
|
414
|
+
base_url: ctx.config.gateway.base_url,
|
|
415
|
+
gateway_health: health,
|
|
416
|
+
processes,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=manage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manage.js","sourceRoot":"","sources":["../../src/supervisor/manage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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 { ManagedRole } from "./stack-config.js";
|
|
17
|
+
export interface ProcessManifest {
|
|
18
|
+
manifest_version: 1;
|
|
19
|
+
instance_id: string;
|
|
20
|
+
uid: number;
|
|
21
|
+
nonce: string;
|
|
22
|
+
role: ManagedRole;
|
|
23
|
+
/** PID of the wrapper (the only PID ever signaled). */
|
|
24
|
+
pid: number;
|
|
25
|
+
/** Exact child command argv (never a shell string). */
|
|
26
|
+
command: string[];
|
|
27
|
+
/** Full wrapper argv as spawned (includes the nonce). */
|
|
28
|
+
wrapper_argv: string[];
|
|
29
|
+
/** sha256 of JSON.stringify(wrapper_argv). */
|
|
30
|
+
command_fingerprint: string;
|
|
31
|
+
started_at: string;
|
|
32
|
+
log_path: string;
|
|
33
|
+
exit_path: string;
|
|
34
|
+
}
|
|
35
|
+
export interface Verification {
|
|
36
|
+
verified: boolean;
|
|
37
|
+
running: boolean;
|
|
38
|
+
detail: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function newNonce(): string;
|
|
41
|
+
export declare function wrapperPath(): string;
|
|
42
|
+
/** Full wrapper argv: the nonce is always visible to ps for verification. */
|
|
43
|
+
export declare function wrapperArgv(nonce: string, manifestPath: string, logPath: string, exitPath: string, command: string[]): string[];
|
|
44
|
+
export declare function fingerprint(argv: string[]): string;
|
|
45
|
+
export declare function manifestPathFor(runDir: string, role: ManagedRole): string;
|
|
46
|
+
export declare function exitPathFor(runDir: string, role: ManagedRole): string;
|
|
47
|
+
export declare function logPathFor(logsDir: string, role: ManagedRole): string;
|
|
48
|
+
/** Atomic mode-0600 write: temp file in the same dir, fsync, rename. */
|
|
49
|
+
export declare function writeManifestAtomic(manifestPath: string, manifest: ProcessManifest): void;
|
|
50
|
+
/**
|
|
51
|
+
* Parse a manifest file, fail closed: any malformed or tampered field makes
|
|
52
|
+
* the whole manifest unreadable, and an unreadable manifest is never
|
|
53
|
+
* signaled.
|
|
54
|
+
*/
|
|
55
|
+
export declare function readManifest(manifestPath: string): ProcessManifest | undefined;
|
|
56
|
+
export declare function pidAlive(pid: number): boolean;
|
|
57
|
+
export interface ExitRecord {
|
|
58
|
+
exit_code: number | null;
|
|
59
|
+
signal: string | null;
|
|
60
|
+
at: string;
|
|
61
|
+
}
|
|
62
|
+
export declare function readExitRecord(exitPath: string): ExitRecord | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Verify that the live process at manifest.pid is exactly the wrapper this
|
|
65
|
+
* instance started: same instance, same uid, alive, argv carries the exact
|
|
66
|
+
* nonce and wrapper path, and the stored fingerprint matches the recomputed
|
|
67
|
+
* wrapper argv.
|
|
68
|
+
*/
|
|
69
|
+
export declare function verifyProcess(manifest: ProcessManifest, expectedInstanceId: string): Verification;
|