@aeolus-fleet/gateway 0.0.0-stage → 0.28.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 +105 -2
- package/dist/adapters/crypto/call-keys.d.ts +7 -0
- package/dist/adapters/crypto/call-keys.js +18 -0
- package/dist/adapters/crypto/call-keys.js.map +1 -0
- package/dist/adapters/crypto/oauth-secrets.d.ts +3 -0
- package/dist/adapters/crypto/oauth-secrets.js +10 -0
- package/dist/adapters/crypto/oauth-secrets.js.map +1 -0
- package/dist/adapters/crypto/page-sessions.d.ts +15 -0
- package/dist/adapters/crypto/page-sessions.js +40 -0
- package/dist/adapters/crypto/page-sessions.js.map +1 -0
- package/dist/adapters/crypto/request-hasher.d.ts +3 -0
- package/dist/adapters/crypto/request-hasher.js +4 -0
- package/dist/adapters/crypto/request-hasher.js.map +1 -0
- package/dist/adapters/crypto/request-ids.d.ts +4 -0
- package/dist/adapters/crypto/request-ids.js +7 -0
- package/dist/adapters/crypto/request-ids.js.map +1 -0
- package/dist/adapters/crypto/sealer.d.ts +14 -0
- package/dist/adapters/crypto/sealer.js +41 -0
- package/dist/adapters/crypto/sealer.js.map +1 -0
- package/dist/adapters/crypto/ship-aliases.d.ts +7 -0
- package/dist/adapters/crypto/ship-aliases.js +19 -0
- package/dist/adapters/crypto/ship-aliases.js.map +1 -0
- package/dist/adapters/crypto/sign-in-seals.d.ts +7 -0
- package/dist/adapters/crypto/sign-in-seals.js +25 -0
- package/dist/adapters/crypto/sign-in-seals.js.map +1 -0
- package/dist/adapters/crypto/waiting-seals.d.ts +3 -0
- package/dist/adapters/crypto/waiting-seals.js +24 -0
- package/dist/adapters/crypto/waiting-seals.js.map +1 -0
- package/dist/adapters/fleet/actor-door.d.ts +20 -0
- package/dist/adapters/fleet/actor-door.js +75 -0
- package/dist/adapters/fleet/actor-door.js.map +1 -0
- package/dist/adapters/fleet/console-sessions.d.ts +2 -0
- package/dist/adapters/fleet/console-sessions.js +23 -0
- package/dist/adapters/fleet/console-sessions.js.map +1 -0
- package/dist/adapters/fleet/core-version.d.ts +11 -0
- package/dist/adapters/fleet/core-version.js +18 -0
- package/dist/adapters/fleet/core-version.js.map +1 -0
- package/dist/adapters/fleet/fleet-network.d.ts +2 -0
- package/dist/adapters/fleet/fleet-network.js +34 -0
- package/dist/adapters/fleet/fleet-network.js.map +1 -0
- package/dist/adapters/fleet/logged-verified-facts.d.ts +13 -0
- package/dist/adapters/fleet/logged-verified-facts.js +18 -0
- package/dist/adapters/fleet/logged-verified-facts.js.map +1 -0
- package/dist/adapters/fleet/proxy-ship-reads.d.ts +7 -0
- package/dist/adapters/fleet/proxy-ship-reads.js +24 -0
- package/dist/adapters/fleet/proxy-ship-reads.js.map +1 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.d.ts +3 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.js +25 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.js.map +1 -0
- package/dist/adapters/fleet/rest-fleet-door.d.ts +14 -0
- package/dist/adapters/fleet/rest-fleet-door.js +205 -0
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -0
- package/dist/adapters/http/add-server-page.d.ts +7 -0
- package/dist/adapters/http/add-server-page.js +175 -0
- package/dist/adapters/http/add-server-page.js.map +1 -0
- package/dist/adapters/http/delivery-page.d.ts +24 -0
- package/dist/adapters/http/delivery-page.js +115 -0
- package/dist/adapters/http/delivery-page.js.map +1 -0
- package/dist/adapters/http/html.d.ts +15 -0
- package/dist/adapters/http/html.js +53 -0
- package/dist/adapters/http/html.js.map +1 -0
- package/dist/adapters/http/live.d.ts +29 -0
- package/dist/adapters/http/live.js +100 -0
- package/dist/adapters/http/live.js.map +1 -0
- package/dist/adapters/http/mcp-endpoint.d.ts +20 -0
- package/dist/adapters/http/mcp-endpoint.js +164 -0
- package/dist/adapters/http/mcp-endpoint.js.map +1 -0
- package/dist/adapters/http/mcp-task.d.ts +45 -0
- package/dist/adapters/http/mcp-task.js +35 -0
- package/dist/adapters/http/mcp-task.js.map +1 -0
- package/dist/adapters/http/oauth-routes.d.ts +47 -0
- package/dist/adapters/http/oauth-routes.js +337 -0
- package/dist/adapters/http/oauth-routes.js.map +1 -0
- package/dist/adapters/http/outside-parties-page.d.ts +33 -0
- package/dist/adapters/http/outside-parties-page.js +153 -0
- package/dist/adapters/http/outside-parties-page.js.map +1 -0
- package/dist/adapters/http/outside-party-page.d.ts +7 -0
- package/dist/adapters/http/outside-party-page.js +212 -0
- package/dist/adapters/http/outside-party-page.js.map +1 -0
- package/dist/adapters/http/overview-page.d.ts +17 -0
- package/dist/adapters/http/overview-page.js +298 -0
- package/dist/adapters/http/overview-page.js.map +1 -0
- package/dist/adapters/http/parties-page.d.ts +7 -0
- package/dist/adapters/http/parties-page.js +139 -0
- package/dist/adapters/http/parties-page.js.map +1 -0
- package/dist/adapters/http/person-tools.d.ts +22 -0
- package/dist/adapters/http/person-tools.js +98 -0
- package/dist/adapters/http/person-tools.js.map +1 -0
- package/dist/adapters/http/scope-rows.d.ts +10 -0
- package/dist/adapters/http/scope-rows.js +30 -0
- package/dist/adapters/http/scope-rows.js.map +1 -0
- package/dist/adapters/http/signal.d.ts +61 -0
- package/dist/adapters/http/signal.js +263 -0
- package/dist/adapters/http/signal.js.map +1 -0
- package/dist/adapters/http/version.d.ts +6 -0
- package/dist/adapters/http/version.js +12 -0
- package/dist/adapters/http/version.js.map +1 -0
- package/dist/adapters/mcp/mcp-servers.d.ts +2 -0
- package/dist/adapters/mcp/mcp-servers.js +154 -0
- package/dist/adapters/mcp/mcp-servers.js.map +1 -0
- package/dist/adapters/oauth/client-metadata-documents.d.ts +9 -0
- package/dist/adapters/oauth/client-metadata-documents.js +25 -0
- package/dist/adapters/oauth/client-metadata-documents.js.map +1 -0
- package/dist/adapters/pagasae/pagasae-client.d.ts +8 -0
- package/dist/adapters/pagasae/pagasae-client.js +88 -0
- package/dist/adapters/pagasae/pagasae-client.js.map +1 -0
- package/dist/adapters/prisma/account-grants.d.ts +4 -0
- package/dist/adapters/prisma/account-grants.js +27 -0
- package/dist/adapters/prisma/account-grants.js.map +1 -0
- package/dist/adapters/prisma/calls.d.ts +4 -0
- package/dist/adapters/prisma/calls.js +35 -0
- package/dist/adapters/prisma/calls.js.map +1 -0
- package/dist/adapters/prisma/changes.d.ts +21 -0
- package/dist/adapters/prisma/changes.js +86 -0
- package/dist/adapters/prisma/changes.js.map +1 -0
- package/dist/adapters/prisma/client-calls.d.ts +4 -0
- package/dist/adapters/prisma/client-calls.js +59 -0
- package/dist/adapters/prisma/client-calls.js.map +1 -0
- package/dist/adapters/prisma/client.d.ts +8 -0
- package/dist/adapters/prisma/client.js +11 -0
- package/dist/adapters/prisma/client.js.map +1 -0
- package/dist/adapters/prisma/connection-store.d.ts +4 -0
- package/dist/adapters/prisma/connection-store.js +28 -0
- package/dist/adapters/prisma/connection-store.js.map +1 -0
- package/dist/adapters/prisma/fleet-forgetter.d.ts +4 -0
- package/dist/adapters/prisma/fleet-forgetter.js +10 -0
- package/dist/adapters/prisma/fleet-forgetter.js.map +1 -0
- package/dist/adapters/prisma/fleet-switches.d.ts +4 -0
- package/dist/adapters/prisma/fleet-switches.js +10 -0
- package/dist/adapters/prisma/fleet-switches.js.map +1 -0
- package/dist/adapters/prisma/generated/browser.d.ts +108 -0
- package/dist/adapters/prisma/generated/browser.js +18 -0
- package/dist/adapters/prisma/generated/browser.js.map +1 -0
- package/dist/adapters/prisma/generated/client.d.ts +127 -0
- package/dist/adapters/prisma/generated/client.js +38 -0
- package/dist/adapters/prisma/generated/client.js.map +1 -0
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +490 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
- package/dist/adapters/prisma/generated/enums.d.ts +1 -0
- package/dist/adapters/prisma/generated/enums.js +12 -0
- package/dist/adapters/prisma/generated/enums.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +319 -0
- package/dist/adapters/prisma/generated/internal/class.js +50 -0
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2102 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +294 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +264 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +1088 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.js +2 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.js.map +1 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.d.ts +1171 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.js +2 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Call.d.ts +994 -0
- package/dist/adapters/prisma/generated/models/Call.js +2 -0
- package/dist/adapters/prisma/generated/models/Call.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ClientCall.d.ts +1119 -0
- package/dist/adapters/prisma/generated/models/ClientCall.js +2 -0
- package/dist/adapters/prisma/generated/models/ClientCall.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.d.ts +1129 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.js +2 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Connection.d.ts +1011 -0
- package/dist/adapters/prisma/generated/models/Connection.js +2 -0
- package/dist/adapters/prisma/generated/models/Connection.js.map +1 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.d.ts +945 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.js +2 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.js.map +1 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1030 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.d.ts +1224 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.js +2 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.d.ts +1005 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.js +2 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.d.ts +1087 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.js +2 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.d.ts +942 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js +2 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.d.ts +1035 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.js +2 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Party.d.ts +1310 -0
- package/dist/adapters/prisma/generated/models/Party.js +2 -0
- package/dist/adapters/prisma/generated/models/Party.js.map +1 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.d.ts +1252 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.d.ts +974 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.js +2 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.js.map +1 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.d.ts +1120 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js +2 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ToolMark.d.ts +947 -0
- package/dist/adapters/prisma/generated/models/ToolMark.js +2 -0
- package/dist/adapters/prisma/generated/models/ToolMark.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +19 -0
- package/dist/adapters/prisma/generated/models.js +2 -0
- package/dist/adapters/prisma/generated/models.js.map +1 -0
- package/dist/adapters/prisma/installation-requests.d.ts +4 -0
- package/dist/adapters/prisma/installation-requests.js +25 -0
- package/dist/adapters/prisma/installation-requests.js.map +1 -0
- package/dist/adapters/prisma/migrate.d.ts +5 -0
- package/dist/adapters/prisma/migrate.js +53 -0
- package/dist/adapters/prisma/migrate.js.map +1 -0
- package/dist/adapters/prisma/oauth-stores.d.ts +5 -0
- package/dist/adapters/prisma/oauth-stores.js +85 -0
- package/dist/adapters/prisma/oauth-stores.js.map +1 -0
- package/dist/adapters/prisma/opened-deliveries.d.ts +4 -0
- package/dist/adapters/prisma/opened-deliveries.js +29 -0
- package/dist/adapters/prisma/opened-deliveries.js.map +1 -0
- package/dist/adapters/prisma/outcome-notices.d.ts +4 -0
- package/dist/adapters/prisma/outcome-notices.js +24 -0
- package/dist/adapters/prisma/outcome-notices.js.map +1 -0
- package/dist/adapters/prisma/outside-party-switches.d.ts +4 -0
- package/dist/adapters/prisma/outside-party-switches.js +10 -0
- package/dist/adapters/prisma/outside-party-switches.js.map +1 -0
- package/dist/adapters/prisma/owner-questions.d.ts +8 -0
- package/dist/adapters/prisma/owner-questions.js +54 -0
- package/dist/adapters/prisma/owner-questions.js.map +1 -0
- package/dist/adapters/prisma/party-store.d.ts +7 -0
- package/dist/adapters/prisma/party-store.js +71 -0
- package/dist/adapters/prisma/party-store.js.map +1 -0
- package/dist/adapters/prisma/pending-requests.d.ts +11 -0
- package/dist/adapters/prisma/pending-requests.js +128 -0
- package/dist/adapters/prisma/pending-requests.js.map +1 -0
- package/dist/adapters/prisma/person-crews.d.ts +4 -0
- package/dist/adapters/prisma/person-crews.js +18 -0
- package/dist/adapters/prisma/person-crews.js.map +1 -0
- package/dist/adapters/prisma/tool-marks.d.ts +4 -0
- package/dist/adapters/prisma/tool-marks.js +15 -0
- package/dist/adapters/prisma/tool-marks.js.map +1 -0
- package/dist/adapters/timers/sleep.d.ts +3 -0
- package/dist/adapters/timers/sleep.js +11 -0
- package/dist/adapters/timers/sleep.js.map +1 -0
- package/dist/adapters/trpc/router.d.ts +606 -0
- package/dist/adapters/trpc/router.js +519 -0
- package/dist/adapters/trpc/router.js.map +1 -0
- package/dist/app.d.ts +43 -0
- package/dist/app.js +446 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/aeolus-gateway.d.ts +2 -0
- package/dist/bin/aeolus-gateway.js +65 -0
- package/dist/bin/aeolus-gateway.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -0
- package/dist/core/actors/authenticate-actor.d.ts +54 -0
- package/dist/core/actors/authenticate-actor.js +42 -0
- package/dist/core/actors/authenticate-actor.js.map +1 -0
- package/dist/core/actors/credential-of.d.ts +27 -0
- package/dist/core/actors/credential-of.js +25 -0
- package/dist/core/actors/credential-of.js.map +1 -0
- package/dist/core/connection/connect.d.ts +26 -0
- package/dist/core/connection/connect.js +58 -0
- package/dist/core/connection/connect.js.map +1 -0
- package/dist/core/connection/ports.d.ts +92 -0
- package/dist/core/connection/ports.js +2 -0
- package/dist/core/connection/ports.js.map +1 -0
- package/dist/core/connection/read-connection.d.ts +14 -0
- package/dist/core/connection/read-connection.js +24 -0
- package/dist/core/connection/read-connection.js.map +1 -0
- package/dist/core/installation/delete-fleet.d.ts +21 -0
- package/dist/core/installation/delete-fleet.js +21 -0
- package/dist/core/installation/delete-fleet.js.map +1 -0
- package/dist/core/installation/ports.d.ts +43 -0
- package/dist/core/installation/ports.js +2 -0
- package/dist/core/installation/ports.js.map +1 -0
- package/dist/core/installation/read-fleet.d.ts +18 -0
- package/dist/core/installation/read-fleet.js +9 -0
- package/dist/core/installation/read-fleet.js.map +1 -0
- package/dist/core/installation/request-id.d.ts +8 -0
- package/dist/core/installation/request-id.js +10 -0
- package/dist/core/installation/request-id.js.map +1 -0
- package/dist/core/installation/served.d.ts +12 -0
- package/dist/core/installation/served.js +8 -0
- package/dist/core/installation/served.js.map +1 -0
- package/dist/core/installation/set-fleet-enabled.d.ts +25 -0
- package/dist/core/installation/set-fleet-enabled.js +22 -0
- package/dist/core/installation/set-fleet-enabled.js.map +1 -0
- package/dist/core/mcp-in/call-tool.d.ts +42 -0
- package/dist/core/mcp-in/call-tool.js +82 -0
- package/dist/core/mcp-in/call-tool.js.map +1 -0
- package/dist/core/mcp-in/client-call.d.ts +51 -0
- package/dist/core/mcp-in/client-call.js +39 -0
- package/dist/core/mcp-in/client-call.js.map +1 -0
- package/dist/core/mcp-in/collect-replies.d.ts +22 -0
- package/dist/core/mcp-in/collect-replies.js +66 -0
- package/dist/core/mcp-in/collect-replies.js.map +1 -0
- package/dist/core/mcp-in/list-tools.d.ts +48 -0
- package/dist/core/mcp-in/list-tools.js +70 -0
- package/dist/core/mcp-in/list-tools.js.map +1 -0
- package/dist/core/mcp-in/ports.d.ts +108 -0
- package/dist/core/mcp-in/ports.js +2 -0
- package/dist/core/mcp-in/ports.js.map +1 -0
- package/dist/core/mcp-in/read-client-call.d.ts +23 -0
- package/dist/core/mcp-in/read-client-call.js +15 -0
- package/dist/core/mcp-in/read-client-call.js.map +1 -0
- package/dist/core/mcp-out/content-types.d.ts +12 -0
- package/dist/core/mcp-out/content-types.js +28 -0
- package/dist/core/mcp-out/content-types.js.map +1 -0
- package/dist/core/mcp-out/hand-call.d.ts +105 -0
- package/dist/core/mcp-out/hand-call.js +118 -0
- package/dist/core/mcp-out/hand-call.js.map +1 -0
- package/dist/core/mcp-out/mark-tool.d.ts +20 -0
- package/dist/core/mcp-out/mark-tool.js +17 -0
- package/dist/core/mcp-out/mark-tool.js.map +1 -0
- package/dist/core/mcp-out/ports.d.ts +66 -0
- package/dist/core/mcp-out/ports.js +2 -0
- package/dist/core/mcp-out/ports.js.map +1 -0
- package/dist/core/mcp-out/run-party.d.ts +26 -0
- package/dist/core/mcp-out/run-party.js +62 -0
- package/dist/core/mcp-out/run-party.js.map +1 -0
- package/dist/core/mcp-out/state-party.d.ts +39 -0
- package/dist/core/mcp-out/state-party.js +30 -0
- package/dist/core/mcp-out/state-party.js.map +1 -0
- package/dist/core/mcp-out/statement.d.ts +36 -0
- package/dist/core/mcp-out/statement.js +34 -0
- package/dist/core/mcp-out/statement.js.map +1 -0
- package/dist/core/oauth/authenticate-access-token.d.ts +25 -0
- package/dist/core/oauth/authenticate-access-token.js +19 -0
- package/dist/core/oauth/authenticate-access-token.js.map +1 -0
- package/dist/core/oauth/exchange-token.d.ts +32 -0
- package/dist/core/oauth/exchange-token.js +98 -0
- package/dist/core/oauth/exchange-token.js.map +1 -0
- package/dist/core/oauth/issue-code.d.ts +23 -0
- package/dist/core/oauth/issue-code.js +34 -0
- package/dist/core/oauth/issue-code.js.map +1 -0
- package/dist/core/oauth/ports.d.ts +105 -0
- package/dist/core/oauth/ports.js +2 -0
- package/dist/core/oauth/ports.js.map +1 -0
- package/dist/core/oauth/read-authorization.d.ts +43 -0
- package/dist/core/oauth/read-authorization.js +74 -0
- package/dist/core/oauth/read-authorization.js.map +1 -0
- package/dist/core/oauth/redirect-uri.d.ts +6 -0
- package/dist/core/oauth/redirect-uri.js +20 -0
- package/dist/core/oauth/redirect-uri.js.map +1 -0
- package/dist/core/oauth/register-client.d.ts +22 -0
- package/dist/core/oauth/register-client.js +20 -0
- package/dist/core/oauth/register-client.js.map +1 -0
- package/dist/core/operator/authenticate-operator.d.ts +22 -0
- package/dist/core/operator/authenticate-operator.js +26 -0
- package/dist/core/operator/authenticate-operator.js.map +1 -0
- package/dist/core/operator/ports.d.ts +15 -0
- package/dist/core/operator/ports.js +2 -0
- package/dist/core/operator/ports.js.map +1 -0
- package/dist/core/outside-parties/ports.d.ts +17 -0
- package/dist/core/outside-parties/ports.js +2 -0
- package/dist/core/outside-parties/ports.js.map +1 -0
- package/dist/core/outside-parties/set-outside-parties.d.ts +36 -0
- package/dist/core/outside-parties/set-outside-parties.js +38 -0
- package/dist/core/outside-parties/set-outside-parties.js.map +1 -0
- package/dist/core/parties/approve-party.d.ts +55 -0
- package/dist/core/parties/approve-party.js +127 -0
- package/dist/core/parties/approve-party.js.map +1 -0
- package/dist/core/parties/change-party.d.ts +42 -0
- package/dist/core/parties/change-party.js +49 -0
- package/dist/core/parties/change-party.js.map +1 -0
- package/dist/core/parties/check-server.d.ts +24 -0
- package/dist/core/parties/check-server.js +21 -0
- package/dist/core/parties/check-server.js.map +1 -0
- package/dist/core/parties/crew-party.d.ts +21 -0
- package/dist/core/parties/crew-party.js +29 -0
- package/dist/core/parties/crew-party.js.map +1 -0
- package/dist/core/parties/list-parties.d.ts +29 -0
- package/dist/core/parties/list-parties.js +39 -0
- package/dist/core/parties/list-parties.js.map +1 -0
- package/dist/core/parties/party.d.ts +52 -0
- package/dist/core/parties/party.js +24 -0
- package/dist/core/parties/party.js.map +1 -0
- package/dist/core/parties/ports.d.ts +74 -0
- package/dist/core/parties/ports.js +2 -0
- package/dist/core/parties/ports.js.map +1 -0
- package/dist/core/parties/read-party-tools.d.ts +22 -0
- package/dist/core/parties/read-party-tools.js +22 -0
- package/dist/core/parties/read-party-tools.js.map +1 -0
- package/dist/core/parties/retire-party.d.ts +29 -0
- package/dist/core/parties/retire-party.js +43 -0
- package/dist/core/parties/retire-party.js.map +1 -0
- package/dist/core/parties/shown-party.d.ts +27 -0
- package/dist/core/parties/shown-party.js +10 -0
- package/dist/core/parties/shown-party.js.map +1 -0
- package/dist/core/people/answer-delivery.d.ts +24 -0
- package/dist/core/people/answer-delivery.js +28 -0
- package/dist/core/people/answer-delivery.js.map +1 -0
- package/dist/core/people/crew-person-ship.d.ts +42 -0
- package/dist/core/people/crew-person-ship.js +59 -0
- package/dist/core/people/crew-person-ship.js.map +1 -0
- package/dist/core/people/done-delivery.d.ts +16 -0
- package/dist/core/people/done-delivery.js +9 -0
- package/dist/core/people/done-delivery.js.map +1 -0
- package/dist/core/people/inbox-entry.d.ts +14 -0
- package/dist/core/people/inbox-entry.js +11 -0
- package/dist/core/people/inbox-entry.js.map +1 -0
- package/dist/core/people/open-delivery.d.ts +30 -0
- package/dist/core/people/open-delivery.js +40 -0
- package/dist/core/people/open-delivery.js.map +1 -0
- package/dist/core/people/opened-of.d.ts +29 -0
- package/dist/core/people/opened-of.js +30 -0
- package/dist/core/people/opened-of.js.map +1 -0
- package/dist/core/people/person-crew.d.ts +39 -0
- package/dist/core/people/person-crew.js +61 -0
- package/dist/core/people/person-crew.js.map +1 -0
- package/dist/core/people/ports.d.ts +102 -0
- package/dist/core/people/ports.js +2 -0
- package/dist/core/people/ports.js.map +1 -0
- package/dist/core/people/read-inbox.d.ts +37 -0
- package/dist/core/people/read-inbox.js +36 -0
- package/dist/core/people/read-inbox.js.map +1 -0
- package/dist/core/requests/ask-for-client.d.ts +45 -0
- package/dist/core/requests/ask-for-client.js +33 -0
- package/dist/core/requests/ask-for-client.js.map +1 -0
- package/dist/core/requests/ask-for-server.d.ts +32 -0
- package/dist/core/requests/ask-for-server.js +42 -0
- package/dist/core/requests/ask-for-server.js.map +1 -0
- package/dist/core/requests/ask-owners.d.ts +28 -0
- package/dist/core/requests/ask-owners.js +85 -0
- package/dist/core/requests/ask-owners.js.map +1 -0
- package/dist/core/requests/decide-request.d.ts +53 -0
- package/dist/core/requests/decide-request.js +83 -0
- package/dist/core/requests/decide-request.js.map +1 -0
- package/dist/core/requests/expire-requests.d.ts +14 -0
- package/dist/core/requests/expire-requests.js +21 -0
- package/dist/core/requests/expire-requests.js.map +1 -0
- package/dist/core/requests/list-mine.d.ts +16 -0
- package/dist/core/requests/list-mine.js +20 -0
- package/dist/core/requests/list-mine.js.map +1 -0
- package/dist/core/requests/list-to-decide.d.ts +11 -0
- package/dist/core/requests/list-to-decide.js +13 -0
- package/dist/core/requests/list-to-decide.js.map +1 -0
- package/dist/core/requests/open-request.d.ts +21 -0
- package/dist/core/requests/open-request.js +26 -0
- package/dist/core/requests/open-request.js.map +1 -0
- package/dist/core/requests/outcome-notice.d.ts +13 -0
- package/dist/core/requests/outcome-notice.js +26 -0
- package/dist/core/requests/outcome-notice.js.map +1 -0
- package/dist/core/requests/ports.d.ts +191 -0
- package/dist/core/requests/ports.js +2 -0
- package/dist/core/requests/ports.js.map +1 -0
- package/dist/core/requests/read-waiting.d.ts +46 -0
- package/dist/core/requests/read-waiting.js +41 -0
- package/dist/core/requests/read-waiting.js.map +1 -0
- package/dist/core/requests/request-state.d.ts +5 -0
- package/dist/core/requests/request-state.js +10 -0
- package/dist/core/requests/request-state.js.map +1 -0
- package/dist/core/requests/tell-outcomes.d.ts +24 -0
- package/dist/core/requests/tell-outcomes.js +39 -0
- package/dist/core/requests/tell-outcomes.js.map +1 -0
- package/dist/core/requests/watch-waiting.d.ts +32 -0
- package/dist/core/requests/watch-waiting.js +31 -0
- package/dist/core/requests/watch-waiting.js.map +1 -0
- package/dist/core/shared/clock.d.ts +4 -0
- package/dist/core/shared/clock.js +2 -0
- package/dist/core/shared/clock.js.map +1 -0
- package/dist/core/shared/errors.d.ts +10 -0
- package/dist/core/shared/errors.js +6 -0
- package/dist/core/shared/errors.js.map +1 -0
- package/dist/core/shared/result.d.ts +16 -0
- package/dist/core/shared/result.js +7 -0
- package/dist/core/shared/result.js.map +1 -0
- package/dist/core/sign-in/account-token.d.ts +42 -0
- package/dist/core/sign-in/account-token.js +46 -0
- package/dist/core/sign-in/account-token.js.map +1 -0
- package/dist/core/sign-in/complete-sign-in.d.ts +66 -0
- package/dist/core/sign-in/complete-sign-in.js +73 -0
- package/dist/core/sign-in/complete-sign-in.js.map +1 -0
- package/dist/core/sign-in/end-sign-ins.d.ts +19 -0
- package/dist/core/sign-in/end-sign-ins.js +17 -0
- package/dist/core/sign-in/end-sign-ins.js.map +1 -0
- package/dist/core/sign-in/ports.d.ts +115 -0
- package/dist/core/sign-in/ports.js +2 -0
- package/dist/core/sign-in/ports.js.map +1 -0
- package/dist/core/sign-in/sign-out.d.ts +10 -0
- package/dist/core/sign-in/sign-out.js +9 -0
- package/dist/core/sign-in/sign-out.js.map +1 -0
- package/dist/core/sign-in/start-page-sign-in.d.ts +25 -0
- package/dist/core/sign-in/start-page-sign-in.js +30 -0
- package/dist/core/sign-in/start-page-sign-in.js.map +1 -0
- package/dist/core/sign-in/start-sign-in.d.ts +30 -0
- package/dist/core/sign-in/start-sign-in.js +25 -0
- package/dist/core/sign-in/start-sign-in.js.map +1 -0
- package/dist/core/vault/credential.d.ts +18 -0
- package/dist/core/vault/credential.js +2 -0
- package/dist/core/vault/credential.js.map +1 -0
- package/dist/outcome-worker.d.ts +29 -0
- package/dist/outcome-worker.js +60 -0
- package/dist/outcome-worker.js.map +1 -0
- package/dist/party-workers.d.ts +32 -0
- package/dist/party-workers.js +57 -0
- package/dist/party-workers.js.map +1 -0
- package/package.json +70 -4
- package/prisma.config.ts +18 -0
- package/src/adapters/prisma/migrations/20261018200000_init/migration.sql +35 -0
- package/src/adapters/prisma/migrations/20261018210000_parties/migration.sql +19 -0
- package/src/adapters/prisma/migrations/20261018220000_tool_marks/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018230000_calls/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261019090000_oauth/migration.sql +60 -0
- package/src/adapters/prisma/migrations/20261019100000_client_parties/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261019110000_oauth_parties/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261019120000_client_calls/migration.sql +15 -0
- package/src/adapters/prisma/migrations/20261019130000_client_call_replies/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261019140000_identity_providers/migration.sql +10 -0
- package/src/adapters/prisma/migrations/20261020090000_no_identity_providers/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020100000_account_grants_in_tokens/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261020110000_account_grants/migration.sql +15 -0
- package/src/adapters/prisma/migrations/20261020120000_person_crews/migration.sql +9 -0
- package/src/adapters/prisma/migrations/20261020130000_opened_deliveries/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261020140000_pending_requests/migration.sql +26 -0
- package/src/adapters/prisma/migrations/20261020150000_outside_party_switches/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261020160000_pending_requests_told/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020170000_request_outcome_notices/migration.sql +17 -0
- package/src/adapters/prisma/migrations/20261020180000_owner_questions/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261020190000_request_changes/migration.sql +12 -0
- package/src/adapters/prisma/migrations/20261020200000_account_grant_scopes/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020210000_party_owner_from_fleet/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020220000_client_call_deadline_optional/migration.sql +2 -0
- package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
- package/src/adapters/prisma/schema.prisma +312 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { err, ok } from '../shared/result.js';
|
|
3
|
+
/** The scope that changes an outside party's owner (0053). */
|
|
4
|
+
export const OWNING_SCOPE = 'fleet:owner';
|
|
5
|
+
/** The scope that grants and revokes an outside party's scopes (0046). */
|
|
6
|
+
export const GRANTING_SCOPE = 'scopes:grant';
|
|
7
|
+
/** The party's proxy ship and the credential to call the fleet on it with as the actor, who holds the call's scope. */
|
|
8
|
+
async function proxyShipFor(deps, call) {
|
|
9
|
+
const { actor, as, name, scope } = call;
|
|
10
|
+
if (!actor.scopes.includes(scope)) {
|
|
11
|
+
return refuse('SCOPE_NOT_HELD', `Changing an outside party this way needs ${scope}`);
|
|
12
|
+
}
|
|
13
|
+
const party = await deps.parties.find(actor.fleetId, name);
|
|
14
|
+
if (party === undefined) {
|
|
15
|
+
return refuse('NO_SUCH_PARTY', `There is no outside party ${name}`);
|
|
16
|
+
}
|
|
17
|
+
if (party.proxyShipId === null) {
|
|
18
|
+
return refuse('PARTY_NOT_COMMISSIONED', `${name}'s proxy ship is not commissioned yet`);
|
|
19
|
+
}
|
|
20
|
+
const credential = await deps.credentialOf(actor, as);
|
|
21
|
+
return credential.isOk ? ok({ shipId: party.proxyShipId, credential: credential.value }) : credential;
|
|
22
|
+
}
|
|
23
|
+
/** The fleet's refusal of a change, as the gateway states it. */
|
|
24
|
+
function refusalOf(refusal) {
|
|
25
|
+
return refusal.code === 'UNAVAILABLE' ? { kind: 'FLEET_UNAVAILABLE', message: `The fleet did not answer: ${refusal.message}` } : { kind: 'CHANGE_REFUSED', message: refusal.message };
|
|
26
|
+
}
|
|
27
|
+
/** Use case: an actor holding fleet:owner sets the owner of an outside party's proxy ship, as itself. */
|
|
28
|
+
export function createChangePartyOwner(deps) {
|
|
29
|
+
return async ({ ownerShipId, ...call }) => {
|
|
30
|
+
const target = await proxyShipFor(deps, { ...call, scope: OWNING_SCOPE });
|
|
31
|
+
if (!target.isOk) {
|
|
32
|
+
return target;
|
|
33
|
+
}
|
|
34
|
+
const set = await deps.fleet.setOwner(target.value.credential, { shipId: target.value.shipId, ownerShipId });
|
|
35
|
+
return set.isOk ? ok(undefined) : err(refusalOf(set.error));
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Use case: an actor holding scopes:grant grants and revokes scopes on an outside party's proxy ship, as itself: every scope it holds now. */
|
|
39
|
+
export function createChangePartyScopes(deps) {
|
|
40
|
+
return async ({ grant, revoke, ...call }) => {
|
|
41
|
+
const target = await proxyShipFor(deps, { ...call, scope: GRANTING_SCOPE });
|
|
42
|
+
if (!target.isOk) {
|
|
43
|
+
return target;
|
|
44
|
+
}
|
|
45
|
+
const changed = await deps.fleet.grantScopes(target.value.credential, { shipId: target.value.shipId, grant, revoke });
|
|
46
|
+
return changed.isOk ? ok(changed.value) : err(refusalOf(changed.error));
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=change-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-party.js","sourceRoot":"","sources":["../../../src/core/parties/change-party.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAG3D,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAoB7C,uHAAuH;AACvH,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,IAAoC;IAChF,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,gBAAgB,EAAE,4CAA4C,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC,wBAAwB,EAAE,GAAG,IAAI,uCAAuC,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AACxG,CAAC;AAED,iEAAiE;AACjE,SAAS,SAAS,CAAC,OAAqB;IACtC,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,6BAA6B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;AACxL,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,sBAAsB,CAAC,IAAgB;IACrD,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7G,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED,+IAA+I;AAC/I,MAAM,UAAU,uBAAuB,CAAC,IAAgB;IACtD,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;QAC1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACtH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { McpServerConnection, McpServers } from '../mcp-out/ports.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
/** A tool as the check shows it: its name, and its short description when the server gives one. */
|
|
6
|
+
export interface CheckedTool {
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export type CheckServer = (input: {
|
|
11
|
+
fleetId: FleetId;
|
|
12
|
+
} & McpServerConnection) => Promise<Result<{
|
|
13
|
+
tools: CheckedTool[];
|
|
14
|
+
}, DomainError<'OUTSIDE_PARTIES_OFF' | 'SERVER_UNREACHABLE'>>>;
|
|
15
|
+
/**
|
|
16
|
+
* Use case: the gateway checks an outside MCP server before it is added
|
|
17
|
+
* (flow F10): the tools its server lists, with the credential the approver
|
|
18
|
+
* typed. It keeps nothing and commissions nothing; approving does that.
|
|
19
|
+
* Only while the fleet's outside parties are on, as approving.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createCheckServer(deps: {
|
|
22
|
+
servers: McpServers;
|
|
23
|
+
servesOutsideParties: (fleetId: FleetId) => Promise<boolean>;
|
|
24
|
+
}): CheckServer;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the gateway checks an outside MCP server before it is added
|
|
5
|
+
* (flow F10): the tools its server lists, with the credential the approver
|
|
6
|
+
* typed. It keeps nothing and commissions nothing; approving does that.
|
|
7
|
+
* Only while the fleet's outside parties are on, as approving.
|
|
8
|
+
*/
|
|
9
|
+
export function createCheckServer(deps) {
|
|
10
|
+
return async ({ fleetId, url, credential }) => {
|
|
11
|
+
if (!(await deps.servesOutsideParties(fleetId))) {
|
|
12
|
+
return refuse('OUTSIDE_PARTIES_OFF', "This fleet's outside parties are off: turn them on first");
|
|
13
|
+
}
|
|
14
|
+
const listed = await deps.servers.listTools({ url, credential });
|
|
15
|
+
if (!listed.isOk) {
|
|
16
|
+
return refuse('SERVER_UNREACHABLE', `The MCP server could not be listed: ${listed.error.reason}`);
|
|
17
|
+
}
|
|
18
|
+
return ok({ tools: listed.value.map(({ name, description }) => ({ name, ...(description === undefined ? {} : { description }) })) });
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=check-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-server.js","sourceRoot":"","sources":["../../../src/core/parties/check-server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAUtD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2F;IAC3H,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;QAC5C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,qBAAqB,EAAE,0DAA0D,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,oBAAoB,EAAE,uCAAuC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
import { type ShownParty } from './shown-party.js';
|
|
5
|
+
import type { PartyStore, ProxyShipDoor } from './ports.js';
|
|
6
|
+
export type CrewParty = (input: {
|
|
7
|
+
operatorFleetId: FleetId;
|
|
8
|
+
name: string;
|
|
9
|
+
secret: string;
|
|
10
|
+
}) => Promise<Result<ShownParty, DomainError<'NO_SUCH_PARTY' | 'NOT_AWAITING_CREW' | 'SECRET_REFUSED'>>>;
|
|
11
|
+
/**
|
|
12
|
+
* Use case: argo hands over a new secret for a party's proxy ship that awaits
|
|
13
|
+
* crew, taken from a new starting prompt in the console: the commission's
|
|
14
|
+
* answer was lost, and its secret with it, and the gateway's ship may not ask
|
|
15
|
+
* for a new one (orchestrator-1 on aeolus-fleet#876, Q6). The gateway crews
|
|
16
|
+
* the ship with it and keeps the crew token; the secret is never kept.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createCrewParty(deps: {
|
|
19
|
+
parties: PartyStore;
|
|
20
|
+
door: ProxyShipDoor;
|
|
21
|
+
}): CrewParty;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { shownPartyOf } from './shown-party.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: argo hands over a new secret for a party's proxy ship that awaits
|
|
6
|
+
* crew, taken from a new starting prompt in the console: the commission's
|
|
7
|
+
* answer was lost, and its secret with it, and the gateway's ship may not ask
|
|
8
|
+
* for a new one (orchestrator-1 on aeolus-fleet#876, Q6). The gateway crews
|
|
9
|
+
* the ship with it and keeps the crew token; the secret is never kept.
|
|
10
|
+
*/
|
|
11
|
+
export function createCrewParty(deps) {
|
|
12
|
+
return async ({ operatorFleetId, name, secret }) => {
|
|
13
|
+
const party = await deps.parties.find(operatorFleetId, name);
|
|
14
|
+
if (!party) {
|
|
15
|
+
return refuse('NO_SUCH_PARTY', `No party named ${name}`);
|
|
16
|
+
}
|
|
17
|
+
if (party.state !== 'awaitingCrew' || party.proxyShipId === null) {
|
|
18
|
+
return refuse('NOT_AWAITING_CREW', `The proxy ship of ${name} does not await crew`);
|
|
19
|
+
}
|
|
20
|
+
const registered = await deps.door.register({ shipId: party.proxyShipId, secret });
|
|
21
|
+
if (!registered.isOk) {
|
|
22
|
+
return refuse('SECRET_REFUSED', `The fleet refused the secret: ${registered.error.message}`);
|
|
23
|
+
}
|
|
24
|
+
const crewed = { ...party, state: 'crewed', secret: null, crewToken: registered.value.crewToken };
|
|
25
|
+
await deps.parties.save(crewed);
|
|
26
|
+
return ok(shownPartyOf(crewed));
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=crew-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crew-party.js","sourceRoot":"","sources":["../../../src/core/parties/crew-party.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAQjE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkD;IAChF,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,eAAe,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,KAAK,cAAc,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YACjE,OAAO,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,IAAI,sBAAsB,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,MAAM,GAAU,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACzG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import { type ListedParty } from './shown-party.js';
|
|
6
|
+
import type { PartyStore, ProxyShipReads } from './ports.js';
|
|
7
|
+
interface ReadCall {
|
|
8
|
+
actor: Actor;
|
|
9
|
+
as: ActorCredential;
|
|
10
|
+
}
|
|
11
|
+
export type ListParties = (call: ReadCall) => Promise<ListedParty[]>;
|
|
12
|
+
export type ReadParty = (call: ReadCall & {
|
|
13
|
+
name: string;
|
|
14
|
+
}) => Promise<Result<ListedParty, DomainError<'NO_SUCH_PARTY'>>>;
|
|
15
|
+
interface ReadDeps {
|
|
16
|
+
parties: PartyStore;
|
|
17
|
+
fleet: ProxyShipReads;
|
|
18
|
+
credentialOf: CredentialOf;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Use case: the actor's fleet's outside parties, by name: never a credential
|
|
22
|
+
* or a crew token. Each proxy ship's owner and scopes are the fleet's alone
|
|
23
|
+
* (decision 0056), read as the actor, so the fleet answers within its read
|
|
24
|
+
* reach.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createListParties(deps: ReadDeps): ListParties;
|
|
27
|
+
/** Use case: one outside party by name, as the list shows it. */
|
|
28
|
+
export declare function createReadParty(deps: ReadDeps): ReadParty;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { shownPartyOf } from './shown-party.js';
|
|
4
|
+
const UNKNOWN = { ownerShipId: null, scopes: null };
|
|
5
|
+
/** The parties with what the fleet holds for each proxy ship, read as the actor; unknown outside its read reach, or while it cannot be read. */
|
|
6
|
+
async function listed(deps, call) {
|
|
7
|
+
const credential = await deps.credentialOf(call.actor, call.as);
|
|
8
|
+
return Promise.all(call.parties.map(async (party) => {
|
|
9
|
+
if (party.proxyShipId === null || !credential.isOk) {
|
|
10
|
+
return { ...shownPartyOf(party), ...UNKNOWN };
|
|
11
|
+
}
|
|
12
|
+
const read = await deps.fleet.read(credential.value, { shipId: party.proxyShipId });
|
|
13
|
+
return { ...shownPartyOf(party), ...(read.isOk ? read.value : UNKNOWN) };
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Use case: the actor's fleet's outside parties, by name: never a credential
|
|
18
|
+
* or a crew token. Each proxy ship's owner and scopes are the fleet's alone
|
|
19
|
+
* (decision 0056), read as the actor, so the fleet answers within its read
|
|
20
|
+
* reach.
|
|
21
|
+
*/
|
|
22
|
+
export function createListParties(deps) {
|
|
23
|
+
return async ({ actor, as }) => {
|
|
24
|
+
const parties = (await deps.parties.list(actor.fleetId)).sort((left, right) => left.name.localeCompare(right.name));
|
|
25
|
+
return listed(deps, { actor, as, parties });
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Use case: one outside party by name, as the list shows it. */
|
|
29
|
+
export function createReadParty(deps) {
|
|
30
|
+
return async ({ actor, as, name }) => {
|
|
31
|
+
const party = await deps.parties.find(actor.fleetId, name);
|
|
32
|
+
if (party === undefined) {
|
|
33
|
+
return refuse('NO_SUCH_PARTY', `There is no outside party ${name}`);
|
|
34
|
+
}
|
|
35
|
+
const [shown] = await listed(deps, { actor, as, parties: [party] });
|
|
36
|
+
return shown === undefined ? refuse('NO_SUCH_PARTY', `There is no outside party ${name}`) : ok(shown);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=list-parties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-parties.js","sourceRoot":"","sources":["../../../src/core/parties/list-parties.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAoC,MAAM,kBAAkB,CAAC;AAkBlF,MAAM,OAAO,GAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAE/D,gJAAgJ;AAChJ,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,IAAqC;IACzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpH,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACxG,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { FleetId, ShipId, VerifiedFact } from '@aeolus-fleet/common';
|
|
2
|
+
import type { McpServerCredential } from '../vault/credential.js';
|
|
3
|
+
/**
|
|
4
|
+
* Where an approved party's proxy ship stands (interop I-5):
|
|
5
|
+
* - commissioning: argo approved it; the gateway has not seen the fleet commission its ship yet;
|
|
6
|
+
* - awaitingCrew: its ship is commissioned, and the gateway does not hold its crew token;
|
|
7
|
+
* - crewed: the gateway crews its ship.
|
|
8
|
+
*/
|
|
9
|
+
export type PartyState = 'commissioning' | 'awaitingCrew' | 'crewed';
|
|
10
|
+
/**
|
|
11
|
+
* What every party has: one app proxy ship (decision 0044), crewed by the
|
|
12
|
+
* gateway. Known by its ship's name, unique in the fleet. Its owner, the
|
|
13
|
+
* person inside who answers for it (0045), is the fleet's alone: the gateway
|
|
14
|
+
* names it at the commission and reads it after (decision 0056).
|
|
15
|
+
*/
|
|
16
|
+
interface PartyBase {
|
|
17
|
+
readonly fleetId: FleetId;
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly state: PartyState;
|
|
20
|
+
readonly proxyShipId: ShipId | null;
|
|
21
|
+
/** The proxy ship's secret, kept only from its commission until the gateway crews it, so a crash between them loses nothing. */
|
|
22
|
+
readonly secret: string | null;
|
|
23
|
+
readonly crewToken: string | null;
|
|
24
|
+
/** argo's request id for the approval: the commission's idempotency key, and how a repeat is told from another approval. */
|
|
25
|
+
readonly requestId: string;
|
|
26
|
+
readonly requestHash: string;
|
|
27
|
+
readonly approvedAt: Date;
|
|
28
|
+
}
|
|
29
|
+
/** An outside MCP server argo approved for its fleet: fleet ships call its tools through its proxy ship (MCP out). */
|
|
30
|
+
export interface McpServerParty extends PartyBase {
|
|
31
|
+
readonly kind: 'mcpServer';
|
|
32
|
+
/** The server's Streamable HTTP endpoint. */
|
|
33
|
+
readonly url: string;
|
|
34
|
+
readonly credential: McpServerCredential;
|
|
35
|
+
/** The most calls the gateway has in flight to the server at once. */
|
|
36
|
+
readonly concurrencyLimit: number;
|
|
37
|
+
}
|
|
38
|
+
/** An outside MCP client argo approved at /authorize: it calls fleet ships as its proxy ship (MCP in). */
|
|
39
|
+
export interface McpClientParty extends PartyBase {
|
|
40
|
+
readonly kind: 'mcpClient';
|
|
41
|
+
/** Its OAuth client id: pre-registered, or its metadata document's URL. */
|
|
42
|
+
readonly clientId: string;
|
|
43
|
+
}
|
|
44
|
+
export type Party = McpServerParty | McpClientParty;
|
|
45
|
+
/**
|
|
46
|
+
* What the gateway checked about the party behind a proxy ship (decision
|
|
47
|
+
* 0059): the host it reached an MCP server at over TLS, and the domain of the
|
|
48
|
+
* metadata document it read an MCP client's id from over TLS. A client argo
|
|
49
|
+
* registered has no document, and an address without TLS proves no host.
|
|
50
|
+
*/
|
|
51
|
+
export declare function verifiedFactsOf(party: Party): VerifiedFact[];
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** The host of an https address, or none: only an address reached over TLS shows who answers it. */
|
|
2
|
+
function tlsHostOf(address) {
|
|
3
|
+
try {
|
|
4
|
+
const url = new URL(address);
|
|
5
|
+
return url.protocol === 'https:' ? url.hostname : undefined;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* What the gateway checked about the party behind a proxy ship (decision
|
|
13
|
+
* 0059): the host it reached an MCP server at over TLS, and the domain of the
|
|
14
|
+
* metadata document it read an MCP client's id from over TLS. A client argo
|
|
15
|
+
* registered has no document, and an address without TLS proves no host.
|
|
16
|
+
*/
|
|
17
|
+
export function verifiedFactsOf(party) {
|
|
18
|
+
const host = tlsHostOf(party.kind === 'mcpServer' ? party.url : party.clientId);
|
|
19
|
+
if (host === undefined) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return [party.kind === 'mcpServer' ? { checked: 'tlsHost', value: host } : { checked: 'clientIdDocumentDomain', value: host }];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party.js","sourceRoot":"","sources":["../../../src/core/parties/party.ts"],"names":[],"mappings":"AAmDA,oGAAoG;AACpG,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjI,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { FleetId, ShipId, VerifiedFact } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ActorCredential } from '../actors/credential-of.js';
|
|
3
|
+
import type { FleetRefusal } from '../connection/ports.js';
|
|
4
|
+
import type { Result } from '../shared/result.js';
|
|
5
|
+
import type { Party } from './party.js';
|
|
6
|
+
/** Outbound port: the parties argo approved, one per proxy ship name in a fleet. */
|
|
7
|
+
export interface PartyStore {
|
|
8
|
+
find(fleetId: FleetId, name: string): Promise<Party | undefined>;
|
|
9
|
+
list(fleetId: FleetId): Promise<Party[]>;
|
|
10
|
+
/** The party an MCP client is in the fleet, if argo approved it. */
|
|
11
|
+
findByClient(fleetId: FleetId, clientId: string): Promise<Party | undefined>;
|
|
12
|
+
save(party: Party): Promise<void>;
|
|
13
|
+
remove(fleetId: FleetId, name: string): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/** Outbound port: the fleet's calls the gateway makes for a party's proxy ship. */
|
|
16
|
+
export interface ProxyShipDoor {
|
|
17
|
+
/**
|
|
18
|
+
* Commissions an app ship as the gateway's ship (fleet:commission and
|
|
19
|
+
* fleet:on-behalf, decision 0044), owned by the owner argo picked (0045),
|
|
20
|
+
* with the scopes granted, only ones the gateway's ship holds (0053),
|
|
21
|
+
* under the gateway's idempotency key: its id, and on the first commission
|
|
22
|
+
* its secret. A repeat under the same key answers the same ship without one.
|
|
23
|
+
*/
|
|
24
|
+
commissionAppShip(crewToken: string, ship: {
|
|
25
|
+
name: string;
|
|
26
|
+
type: string;
|
|
27
|
+
owner: ShipId;
|
|
28
|
+
idempotencyKey: string;
|
|
29
|
+
scopes: readonly string[];
|
|
30
|
+
}): Promise<Result<{
|
|
31
|
+
shipId: ShipId;
|
|
32
|
+
secret: string | null;
|
|
33
|
+
}, FleetRefusal>>;
|
|
34
|
+
register(claim: {
|
|
35
|
+
shipId: ShipId;
|
|
36
|
+
secret: string;
|
|
37
|
+
}): Promise<Result<{
|
|
38
|
+
crewToken: string;
|
|
39
|
+
}, FleetRefusal>>;
|
|
40
|
+
/** Sets the gateway's facts about the proxy ship whole (fleet.setVerifiedFacts, fleet:verify, decision 0059). */
|
|
41
|
+
setVerifiedFacts(crewToken: string, written: {
|
|
42
|
+
shipId: ShipId;
|
|
43
|
+
facts: readonly VerifiedFact[];
|
|
44
|
+
}): Promise<Result<undefined, FleetRefusal>>;
|
|
45
|
+
}
|
|
46
|
+
/** Outbound port: the fleet's calls on a party's proxy ship made as the actor (decision 0057), so the fleet checks its scopes and reach. */
|
|
47
|
+
export interface ProxyShipsAsActor {
|
|
48
|
+
/** Retires the proxy ship (fleet.retire); a ship retired already is refused with CONFLICT. */
|
|
49
|
+
retire(as: ActorCredential, ship: {
|
|
50
|
+
shipId: ShipId;
|
|
51
|
+
}): Promise<Result<undefined, FleetRefusal>>;
|
|
52
|
+
/** Sets the proxy ship's owner (fleet.setOwner, fleet:owner). */
|
|
53
|
+
setOwner(as: ActorCredential, ship: {
|
|
54
|
+
shipId: ShipId;
|
|
55
|
+
ownerShipId: ShipId;
|
|
56
|
+
}): Promise<Result<undefined, FleetRefusal>>;
|
|
57
|
+
/** Grants and revokes the proxy ship's scopes (fleet.grantScopes, scopes:grant): every scope it holds now. */
|
|
58
|
+
grantScopes(as: ActorCredential, change: {
|
|
59
|
+
shipId: ShipId;
|
|
60
|
+
grant: readonly string[];
|
|
61
|
+
revoke: readonly string[];
|
|
62
|
+
}): Promise<Result<{
|
|
63
|
+
scopes: string[];
|
|
64
|
+
}, FleetRefusal>>;
|
|
65
|
+
}
|
|
66
|
+
/** Outbound port: what the fleet holds for a proxy ship, read as the actor (fleet:read): its owner and scopes, neither outside the actor's read reach. */
|
|
67
|
+
export interface ProxyShipReads {
|
|
68
|
+
read(as: ActorCredential, ship: {
|
|
69
|
+
shipId: ShipId;
|
|
70
|
+
}): Promise<Result<{
|
|
71
|
+
ownerShipId: ShipId | null;
|
|
72
|
+
scopes: string[] | null;
|
|
73
|
+
}, FleetRefusal>>;
|
|
74
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/parties/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { McpServers } from '../mcp-out/ports.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { CheckedTool } from './check-server.js';
|
|
6
|
+
import type { PartyStore } from './ports.js';
|
|
7
|
+
export type ReadPartyTools = (party: {
|
|
8
|
+
fleetId: FleetId;
|
|
9
|
+
name: string;
|
|
10
|
+
}) => Promise<Result<{
|
|
11
|
+
tools: CheckedTool[];
|
|
12
|
+
}, DomainError<'NO_SUCH_PARTY' | 'SERVER_UNREACHABLE'>>>;
|
|
13
|
+
/**
|
|
14
|
+
* Use case: an outside MCP server's tools, as the server lists them now,
|
|
15
|
+
* asked with the credential the gateway keeps for it. It keeps nothing:
|
|
16
|
+
* the proxy ship's statement in the fleet is where the tools live, and
|
|
17
|
+
* core does not answer a statement to a reader yet, so the server is asked.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createReadPartyTools(deps: {
|
|
20
|
+
parties: PartyStore;
|
|
21
|
+
servers: McpServers;
|
|
22
|
+
}): ReadPartyTools;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: an outside MCP server's tools, as the server lists them now,
|
|
5
|
+
* asked with the credential the gateway keeps for it. It keeps nothing:
|
|
6
|
+
* the proxy ship's statement in the fleet is where the tools live, and
|
|
7
|
+
* core does not answer a statement to a reader yet, so the server is asked.
|
|
8
|
+
*/
|
|
9
|
+
export function createReadPartyTools(deps) {
|
|
10
|
+
return async ({ fleetId, name }) => {
|
|
11
|
+
const party = await deps.parties.find(fleetId, name);
|
|
12
|
+
if (party?.kind !== 'mcpServer') {
|
|
13
|
+
return refuse('NO_SUCH_PARTY', `There is no outside MCP server ${name}`);
|
|
14
|
+
}
|
|
15
|
+
const listed = await deps.servers.listTools({ url: party.url, credential: party.credential });
|
|
16
|
+
if (!listed.isOk) {
|
|
17
|
+
return refuse('SERVER_UNREACHABLE', `The MCP server of ${name} could not be listed: ${listed.error.reason}`);
|
|
18
|
+
}
|
|
19
|
+
return ok({ tools: listed.value.map(({ name: tool, description }) => ({ name: tool, ...(description === undefined ? {} : { description }) })) });
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=read-party-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-party-tools.js","sourceRoot":"","sources":["../../../src/core/parties/read-party-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAMtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAkD;IACrF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,eAAe,EAAE,kCAAkC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,IAAI,yBAAyB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACnJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
3
|
+
import type { IssuedTokens } from '../oauth/ports.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { PartyStore, ProxyShipsAsActor } from './ports.js';
|
|
7
|
+
/** The scope that retires an outside party, as it retires any ship (decision 0056). */
|
|
8
|
+
export declare const RETIRING_SCOPE = "fleet:manage";
|
|
9
|
+
export type RetirePartyRefusal = DomainError<'NOT_A_MANAGER' | 'NO_SUCH_PARTY' | 'RETIRE_REFUSED' | 'FLEET_UNAVAILABLE' | 'NOT_AN_ACTOR'>;
|
|
10
|
+
export type RetireParty = (input: {
|
|
11
|
+
actor: Actor;
|
|
12
|
+
as: ActorCredential;
|
|
13
|
+
name: string;
|
|
14
|
+
}) => Promise<Result<undefined, RetirePartyRefusal>>;
|
|
15
|
+
/**
|
|
16
|
+
* Use case: an actor holding fleet:manage retires an outside party (decision
|
|
17
|
+
* 0056). Its proxy ship is retired in the fleet as the actor, so the fleet
|
|
18
|
+
* checks its manage reach, and only then does the gateway forget the party
|
|
19
|
+
* and revoke its client's tokens; its worker ends as the fleet ends the
|
|
20
|
+
* proxy ship's crew. A proxy ship retired already is retired. A party whose
|
|
21
|
+
* ship the gateway never learned asks the fleet nothing. Adding it again is
|
|
22
|
+
* a new request.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createRetireParty(deps: {
|
|
25
|
+
parties: PartyStore;
|
|
26
|
+
fleet: ProxyShipsAsActor;
|
|
27
|
+
tokens: Pick<IssuedTokens, 'revokeParty'>;
|
|
28
|
+
credentialOf: CredentialOf;
|
|
29
|
+
}): RetireParty;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/** The scope that retires an outside party, as it retires any ship (decision 0056). */
|
|
4
|
+
export const RETIRING_SCOPE = 'fleet:manage';
|
|
5
|
+
/** The fleet's code for a ship retired already: the only conflict a retire answers. */
|
|
6
|
+
const RETIRED_ALREADY = 'CONFLICT';
|
|
7
|
+
/**
|
|
8
|
+
* Use case: an actor holding fleet:manage retires an outside party (decision
|
|
9
|
+
* 0056). Its proxy ship is retired in the fleet as the actor, so the fleet
|
|
10
|
+
* checks its manage reach, and only then does the gateway forget the party
|
|
11
|
+
* and revoke its client's tokens; its worker ends as the fleet ends the
|
|
12
|
+
* proxy ship's crew. A proxy ship retired already is retired. A party whose
|
|
13
|
+
* ship the gateway never learned asks the fleet nothing. Adding it again is
|
|
14
|
+
* a new request.
|
|
15
|
+
*/
|
|
16
|
+
export function createRetireParty(deps) {
|
|
17
|
+
return async ({ actor, as, name }) => {
|
|
18
|
+
if (!actor.scopes.includes(RETIRING_SCOPE)) {
|
|
19
|
+
return refuse('NOT_A_MANAGER', `Retiring an outside party needs ${RETIRING_SCOPE}`);
|
|
20
|
+
}
|
|
21
|
+
const party = await deps.parties.find(actor.fleetId, name);
|
|
22
|
+
if (party === undefined) {
|
|
23
|
+
return refuse('NO_SUCH_PARTY', `There is no outside party ${name}`);
|
|
24
|
+
}
|
|
25
|
+
if (party.proxyShipId !== null) {
|
|
26
|
+
const credential = await deps.credentialOf(actor, as);
|
|
27
|
+
if (!credential.isOk) {
|
|
28
|
+
return credential;
|
|
29
|
+
}
|
|
30
|
+
const retired = await deps.fleet.retire(credential.value, { shipId: party.proxyShipId });
|
|
31
|
+
if (!retired.isOk && retired.error.code === 'UNAVAILABLE') {
|
|
32
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not retire ${name}'s proxy ship: ${retired.error.message}`);
|
|
33
|
+
}
|
|
34
|
+
if (!retired.isOk && retired.error.code !== RETIRED_ALREADY) {
|
|
35
|
+
return refuse('RETIRE_REFUSED', retired.error.message);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
await deps.parties.remove(actor.fleetId, name);
|
|
39
|
+
await deps.tokens.revokeParty(actor.fleetId, name);
|
|
40
|
+
return ok(undefined);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=retire-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retire-party.js","sourceRoot":"","sources":["../../../src/core/parties/retire-party.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,uFAAuF;AACvF,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,uFAAuF;AACvF,MAAM,eAAe,GAAG,UAAU,CAAC;AAMnC;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA8H;IAC9J,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,eAAe,EAAE,mCAAmC,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBACrB,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBAC1D,OAAO,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,IAAI,kBAAkB,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChH,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC5D,OAAO,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { McpServerCredential } from '../vault/credential.js';
|
|
3
|
+
import type { Party, PartyState } from './party.js';
|
|
4
|
+
interface ShownPartyBase {
|
|
5
|
+
name: string;
|
|
6
|
+
state: PartyState;
|
|
7
|
+
proxyShipId: ShipId | null;
|
|
8
|
+
}
|
|
9
|
+
/** A party as the gateway keeps it, for any actor to read: never its credential, secret or crew token. */
|
|
10
|
+
export type ShownParty = (ShownPartyBase & {
|
|
11
|
+
kind: 'mcpServer';
|
|
12
|
+
url: string;
|
|
13
|
+
credentialKind: McpServerCredential['kind'];
|
|
14
|
+
concurrencyLimit: number;
|
|
15
|
+
}) | (ShownPartyBase & {
|
|
16
|
+
kind: 'mcpClient';
|
|
17
|
+
clientId: string;
|
|
18
|
+
});
|
|
19
|
+
/** What the fleet holds for a party's proxy ship (decision 0056): none while it has no proxy ship, or the fleet does not answer. */
|
|
20
|
+
export interface FromFleet {
|
|
21
|
+
ownerShipId: ShipId | null;
|
|
22
|
+
scopes: string[] | null;
|
|
23
|
+
}
|
|
24
|
+
/** A party with its proxy ship's owner and scopes, read from the fleet. */
|
|
25
|
+
export type ListedParty = ShownParty & FromFleet;
|
|
26
|
+
export declare function shownPartyOf(party: Party): ShownParty;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function shownPartyOf(party) {
|
|
2
|
+
const { name, state, proxyShipId } = party;
|
|
3
|
+
switch (party.kind) {
|
|
4
|
+
case 'mcpServer':
|
|
5
|
+
return { name, kind: party.kind, url: party.url, credentialKind: party.credential.kind, concurrencyLimit: party.concurrencyLimit, state, proxyShipId };
|
|
6
|
+
case 'mcpClient':
|
|
7
|
+
return { name, kind: party.kind, clientId: party.clientId, state, proxyShipId };
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=shown-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shown-party.js","sourceRoot":"","sources":["../../../src/core/parties/shown-party.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC3C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACzJ,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACpF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type DomainError } from '../shared/errors.js';
|
|
2
|
+
import type { Result } from '../shared/result.js';
|
|
3
|
+
import type { CrewPersonShip } from './crew-person-ship.js';
|
|
4
|
+
import { type Dealt, type DealtError } from './opened-of.js';
|
|
5
|
+
import { type PersonCaller } from './person-crew.js';
|
|
6
|
+
import type { OpenedDeliveries, PersonCrews, PersonShipDoor } from './ports.js';
|
|
7
|
+
export type AnswerDelivery = (input: {
|
|
8
|
+
caller: PersonCaller;
|
|
9
|
+
deliveryId: string;
|
|
10
|
+
contentType: string;
|
|
11
|
+
payload: string;
|
|
12
|
+
}) => Promise<Result<Dealt, DealtError | DomainError<'SEND_REFUSED'>>>;
|
|
13
|
+
/**
|
|
14
|
+
* Use case: a person answers a delivery they opened (Q20): a reply to its
|
|
15
|
+
* sender, in reply to its message, then it is handled. The reply's key is
|
|
16
|
+
* the delivery's, so an answer tried again after the fleet did not take
|
|
17
|
+
* handled is sent once.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createAnswerDelivery(deps: {
|
|
20
|
+
crewPersonShip: CrewPersonShip;
|
|
21
|
+
crews: PersonCrews;
|
|
22
|
+
door: PersonShipDoor;
|
|
23
|
+
opened: OpenedDeliveries;
|
|
24
|
+
}): AnswerDelivery;
|