@aeolus-fleet/gateway 0.0.0-stage → 0.0.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 +104 -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/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 +14 -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 +27 -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/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 +59 -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 +44 -0
- package/dist/adapters/fleet/fleet-network.js.map +1 -0
- package/dist/adapters/fleet/rest-fleet-door.d.ts +14 -0
- package/dist/adapters/fleet/rest-fleet-door.js +189 -0
- package/dist/adapters/fleet/rest-fleet-door.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 +35 -0
- package/dist/adapters/http/oauth-routes.js +305 -0
- package/dist/adapters/http/oauth-routes.js.map +1 -0
- package/dist/adapters/http/outside-parties-page.d.ts +6 -0
- package/dist/adapters/http/outside-parties-page.js +149 -0
- package/dist/adapters/http/outside-parties-page.js.map +1 -0
- package/dist/adapters/http/overview-page.d.ts +16 -0
- package/dist/adapters/http/overview-page.js +255 -0
- package/dist/adapters/http/overview-page.js.map +1 -0
- package/dist/adapters/http/parties-page.d.ts +6 -0
- package/dist/adapters/http/parties-page.js +141 -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/signal.d.ts +52 -0
- package/dist/adapters/http/signal.js +220 -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 +90 -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 +50 -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 +1056 -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 +1338 -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 +82 -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 +73 -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 +122 -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 +408 -0
- package/dist/adapters/trpc/router.js +367 -0
- package/dist/adapters/trpc/router.js.map +1 -0
- package/dist/app.d.ts +43 -0
- package/dist/app.js +400 -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 +38 -0
- package/dist/core/actors/authenticate-actor.js +30 -0
- package/dist/core/actors/authenticate-actor.js.map +1 -0
- package/dist/core/connection/connect.d.ts +26 -0
- package/dist/core/connection/connect.js +57 -0
- package/dist/core/connection/connect.js.map +1 -0
- package/dist/core/connection/ports.d.ts +87 -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 +29 -0
- package/dist/core/mcp-in/collect-replies.js +44 -0
- package/dist/core/mcp-in/collect-replies.js.map +1 -0
- package/dist/core/mcp-in/list-tools.d.ts +44 -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 +85 -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 +103 -0
- package/dist/core/mcp-out/hand-call.js +116 -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 +38 -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 +26 -0
- package/dist/core/mcp-out/statement.js +32 -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 +103 -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 +21 -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 +34 -0
- package/dist/core/outside-parties/set-outside-parties.js +34 -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 +111 -0
- package/dist/core/parties/approve-party.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 +8 -0
- package/dist/core/parties/list-parties.js +8 -0
- package/dist/core/parties/list-parties.js.map +1 -0
- package/dist/core/parties/party.d.ts +46 -0
- package/dist/core/parties/party.js +2 -0
- package/dist/core/parties/party.js.map +1 -0
- package/dist/core/parties/ports.d.ts +39 -0
- package/dist/core/parties/ports.js +2 -0
- package/dist/core/parties/ports.js.map +1 -0
- package/dist/core/parties/shown-party.d.ts +21 -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 +75 -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-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 +186 -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 +38 -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 +55 -0
- package/dist/core/sign-in/complete-sign-in.js +50 -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 +85 -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/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/migration_lock.toml +3 -0
- package/src/adapters/prisma/schema.prisma +311 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { ActorCredential, FleetNetwork, OutsidePartySwitches } from './ports.js';
|
|
6
|
+
/** The scope that switches a fleet's outside parties, as it changes the fleet's network. */
|
|
7
|
+
export declare const SWITCHING_SCOPE = "fleet:network";
|
|
8
|
+
export type ReadOutsideParties = (actor: Actor) => Promise<{
|
|
9
|
+
isOn: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
export type SetOutsideParties = (input: {
|
|
12
|
+
actor: Actor;
|
|
13
|
+
as: ActorCredential;
|
|
14
|
+
isOn: boolean;
|
|
15
|
+
isOpenNetworkConfirmed: boolean;
|
|
16
|
+
}) => Promise<Result<{
|
|
17
|
+
isOn: boolean;
|
|
18
|
+
}, DomainError<'NOT_A_NETWORKER' | 'OPEN_NETWORK' | 'FLEET_UNAVAILABLE'>>>;
|
|
19
|
+
/** Use case: whether the actor's fleet's outside parties are on. */
|
|
20
|
+
export declare function createReadOutsideParties(deps: {
|
|
21
|
+
switches: OutsidePartySwitches;
|
|
22
|
+
}): ReadOutsideParties;
|
|
23
|
+
/**
|
|
24
|
+
* Use case: an actor holding fleet:network turns the fleet's outside parties
|
|
25
|
+
* on or off (interop I-3). The gateway sets no policy but warns: turning
|
|
26
|
+
* them on while the fleet applies no network rules needs the warning
|
|
27
|
+
* confirmed. The rules are read as the actor, so the fleet answers what that
|
|
28
|
+
* actor may see. Turning off reads nothing.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSetOutsideParties(deps: {
|
|
31
|
+
switches: OutsidePartySwitches;
|
|
32
|
+
network: FleetNetwork;
|
|
33
|
+
clock: Clock;
|
|
34
|
+
}): SetOutsideParties;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/** The scope that switches a fleet's outside parties, as it changes the fleet's network. */
|
|
4
|
+
export const SWITCHING_SCOPE = 'fleet:network';
|
|
5
|
+
/** Use case: whether the actor's fleet's outside parties are on. */
|
|
6
|
+
export function createReadOutsideParties(deps) {
|
|
7
|
+
return async (actor) => ({ isOn: await deps.switches.isOn(actor.fleetId) });
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Use case: an actor holding fleet:network turns the fleet's outside parties
|
|
11
|
+
* on or off (interop I-3). The gateway sets no policy but warns: turning
|
|
12
|
+
* them on while the fleet applies no network rules needs the warning
|
|
13
|
+
* confirmed. The rules are read as the actor, so the fleet answers what that
|
|
14
|
+
* actor may see. Turning off reads nothing.
|
|
15
|
+
*/
|
|
16
|
+
export function createSetOutsideParties(deps) {
|
|
17
|
+
return async ({ actor, as, isOn, isOpenNetworkConfirmed }) => {
|
|
18
|
+
if (!actor.scopes.includes(SWITCHING_SCOPE)) {
|
|
19
|
+
return refuse('NOT_A_NETWORKER', `Switching outside parties needs ${SWITCHING_SCOPE}`);
|
|
20
|
+
}
|
|
21
|
+
if (isOn && !isOpenNetworkConfirmed) {
|
|
22
|
+
const isOpen = await deps.network.isOpen(as);
|
|
23
|
+
if (!isOpen.isOk) {
|
|
24
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not say its network rules: ${isOpen.error.message}`);
|
|
25
|
+
}
|
|
26
|
+
if (isOpen.value) {
|
|
27
|
+
return refuse('OPEN_NETWORK', 'This fleet applies no network rules, so every outside party would reach every ship. Confirm to turn outside parties on anyway.');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
await deps.switches.set(actor.fleetId, { isOn, at: deps.clock.now() });
|
|
31
|
+
return ok({ isOn });
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=set-outside-parties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-outside-parties.js","sourceRoot":"","sources":["../../../src/core/outside-parties/set-outside-parties.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAW/C,oEAAoE;AACpE,MAAM,UAAU,wBAAwB,CAAC,IAAwC;IAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAA6E;IACnH,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,eAAe,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzG,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,cAAc,EAAE,gIAAgI,CAAC,CAAC;YAClK,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ConnectionStore } from '../connection/ports.js';
|
|
3
|
+
import type { RequestHasher } from '../installation/ports.js';
|
|
4
|
+
import type { Clock } from '../shared/clock.js';
|
|
5
|
+
import { type DomainError } from '../shared/errors.js';
|
|
6
|
+
import { type Result } from '../shared/result.js';
|
|
7
|
+
import type { McpServerCredential } from '../vault/credential.js';
|
|
8
|
+
import type { PartyStore, ProxyShipDoor } from './ports.js';
|
|
9
|
+
import { type ShownParty } from './shown-party.js';
|
|
10
|
+
/** The type of every outside MCP server's proxy ship. */
|
|
11
|
+
export declare const MCP_SERVER_SHIP_TYPE = "mcp-server";
|
|
12
|
+
/** The type of every outside MCP client's proxy ship. */
|
|
13
|
+
export declare const MCP_CLIENT_SHIP_TYPE = "mcp-client";
|
|
14
|
+
export type ApprovePartyRefusal = DomainError<'OUTSIDE_PARTIES_OFF' | 'NOT_CONNECTED' | 'PARTY_EXISTS' | 'COMMISSION_REFUSED' | 'FLEET_UNAVAILABLE'>;
|
|
15
|
+
export type ApproveParty = (input: {
|
|
16
|
+
operatorFleetId: FleetId;
|
|
17
|
+
requestId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
url: string;
|
|
20
|
+
credential: McpServerCredential;
|
|
21
|
+
ownerShipId: ShipId;
|
|
22
|
+
/** The scopes granted its proxy ship beside the ones every app ship gets (decision 0046). */
|
|
23
|
+
scopes: readonly string[];
|
|
24
|
+
concurrencyLimit: number;
|
|
25
|
+
}) => Promise<Result<ShownParty, ApprovePartyRefusal>>;
|
|
26
|
+
export type ApproveClientParty = (input: {
|
|
27
|
+
operatorFleetId: FleetId;
|
|
28
|
+
requestId: string;
|
|
29
|
+
name: string;
|
|
30
|
+
clientId: string;
|
|
31
|
+
ownerShipId: ShipId;
|
|
32
|
+
scopes: readonly string[];
|
|
33
|
+
}) => Promise<Result<ShownParty, ApprovePartyRefusal | DomainError<'CLIENT_HAS_PARTY'>>>;
|
|
34
|
+
interface ApprovalDeps {
|
|
35
|
+
connections: ConnectionStore;
|
|
36
|
+
parties: PartyStore;
|
|
37
|
+
door: ProxyShipDoor;
|
|
38
|
+
hasher: RequestHasher;
|
|
39
|
+
/** Whether the fleet's outside parties are on (interop I-3). */
|
|
40
|
+
servesOutsideParties: (fleetId: FleetId) => Promise<boolean>;
|
|
41
|
+
clock: Clock;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Use case: argo approves an outside MCP server as a party of its fleet: the
|
|
45
|
+
* gateway commissions and crews its proxy ship, and keeps the server's
|
|
46
|
+
* credential in its vault.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createApproveParty(deps: ApprovalDeps): ApproveParty;
|
|
49
|
+
/**
|
|
50
|
+
* Use case: argo approves an outside MCP client as a party, at its first
|
|
51
|
+
* authorization: the gateway commissions and crews its proxy ship, which
|
|
52
|
+
* the client then calls the fleet as. One party per client in a fleet.
|
|
53
|
+
*/
|
|
54
|
+
export declare function createApproveClientParty(deps: ApprovalDeps): ApproveClientParty;
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { shownPartyOf } from './shown-party.js';
|
|
4
|
+
/** The type of every outside MCP server's proxy ship. */
|
|
5
|
+
export const MCP_SERVER_SHIP_TYPE = 'mcp-server';
|
|
6
|
+
/** The type of every outside MCP client's proxy ship. */
|
|
7
|
+
export const MCP_CLIENT_SHIP_TYPE = 'mcp-client';
|
|
8
|
+
/**
|
|
9
|
+
* The approval flow every party shares (interop I-5). The gateway, as its
|
|
10
|
+
* own ship, commissions the party's app proxy ship owned by the owner argo
|
|
11
|
+
* picked (decisions 0044, 0045), under argo's request id as the idempotency
|
|
12
|
+
* key, then crews it with its secret and keeps the crew token. Each step is
|
|
13
|
+
* kept before the next, so the same approval again picks up where a crash or
|
|
14
|
+
* a fleet that did not answer left it, and commissions no second ship. A
|
|
15
|
+
* commission the fleet stored but whose answer was lost leaves the ship
|
|
16
|
+
* awaiting crew: its secret was shown once. A refused commission keeps
|
|
17
|
+
* nothing, so argo may approve again. While the fleet's outside parties are
|
|
18
|
+
* off, nothing is approved (interop I-3).
|
|
19
|
+
*/
|
|
20
|
+
async function approved(deps, approval) {
|
|
21
|
+
const crewed = async (party) => {
|
|
22
|
+
const registered = await deps.door.register({ shipId: party.proxyShipId, secret: party.secret });
|
|
23
|
+
if (!registered.isOk) {
|
|
24
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not let the gateway crew the proxy ship: ${registered.error.message}`);
|
|
25
|
+
}
|
|
26
|
+
const done = { ...party, state: 'crewed', secret: null, crewToken: registered.value.crewToken };
|
|
27
|
+
await deps.parties.save(done);
|
|
28
|
+
return ok(shownPartyOf(done));
|
|
29
|
+
};
|
|
30
|
+
const { fleetId } = approval;
|
|
31
|
+
if (!(await deps.servesOutsideParties(fleetId))) {
|
|
32
|
+
return refuse('OUTSIDE_PARTIES_OFF', "This fleet's outside parties are off: turn them on first");
|
|
33
|
+
}
|
|
34
|
+
const gateway = await deps.connections.find(fleetId);
|
|
35
|
+
if (!gateway) {
|
|
36
|
+
return refuse('NOT_CONNECTED', 'The gateway is not connected to this fleet: connect it in the console');
|
|
37
|
+
}
|
|
38
|
+
const fresh = approval.party({ approvedAt: deps.clock.now() });
|
|
39
|
+
const earlier = await deps.parties.find(fleetId, fresh.name);
|
|
40
|
+
if (earlier && (!approval.isOwn(earlier) || earlier.requestHash !== approval.requestHash)) {
|
|
41
|
+
return refuse('PARTY_EXISTS', `A party named ${fresh.name} was approved already`);
|
|
42
|
+
}
|
|
43
|
+
const party = earlier ?? fresh;
|
|
44
|
+
if (party.state === 'crewed') {
|
|
45
|
+
return ok(shownPartyOf(party));
|
|
46
|
+
}
|
|
47
|
+
if (party.proxyShipId !== null && party.secret !== null) {
|
|
48
|
+
return crewed({ ...party, proxyShipId: party.proxyShipId, secret: party.secret });
|
|
49
|
+
}
|
|
50
|
+
if (party.proxyShipId !== null) {
|
|
51
|
+
return ok(shownPartyOf(party));
|
|
52
|
+
}
|
|
53
|
+
await deps.parties.save(party);
|
|
54
|
+
const commissioned = await deps.door.commissionAppShip(gateway.crewToken, { name: party.name, type: approval.type, owner: party.ownerShipId, idempotencyKey: party.requestId, scopes: approval.scopes });
|
|
55
|
+
if (!commissioned.isOk) {
|
|
56
|
+
if (commissioned.error.code === 'UNAVAILABLE') {
|
|
57
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not answer the commission: ${commissioned.error.message}`);
|
|
58
|
+
}
|
|
59
|
+
await deps.parties.remove(fleetId, party.name);
|
|
60
|
+
return refuse('COMMISSION_REFUSED', `The fleet refused the proxy ship: ${commissioned.error.message}`);
|
|
61
|
+
}
|
|
62
|
+
const { shipId, secret } = commissioned.value;
|
|
63
|
+
const awaiting = { ...party, state: 'awaitingCrew', proxyShipId: shipId, secret };
|
|
64
|
+
await deps.parties.save(awaiting);
|
|
65
|
+
return secret === null ? ok(shownPartyOf(awaiting)) : crewed({ ...awaiting, proxyShipId: shipId, secret });
|
|
66
|
+
}
|
|
67
|
+
/** What a party is before its proxy ship is commissioned. */
|
|
68
|
+
const UNCOMMISSIONED = { state: 'commissioning', proxyShipId: null, secret: null, crewToken: null };
|
|
69
|
+
/**
|
|
70
|
+
* Use case: argo approves an outside MCP server as a party of its fleet: the
|
|
71
|
+
* gateway commissions and crews its proxy ship, and keeps the server's
|
|
72
|
+
* credential in its vault.
|
|
73
|
+
*/
|
|
74
|
+
export function createApproveParty(deps) {
|
|
75
|
+
return (input) => {
|
|
76
|
+
const { operatorFleetId: fleetId, requestId, name, url, credential, ownerShipId, scopes, concurrencyLimit } = input;
|
|
77
|
+
const requestHash = deps.hasher.hash(JSON.stringify([requestId, name, url, credential, ownerShipId, scopes, concurrencyLimit]));
|
|
78
|
+
return approved(deps, {
|
|
79
|
+
fleetId,
|
|
80
|
+
type: MCP_SERVER_SHIP_TYPE,
|
|
81
|
+
scopes,
|
|
82
|
+
requestHash,
|
|
83
|
+
party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpServer', url, credential, ownerShipId, concurrencyLimit, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
|
|
84
|
+
isOwn: (earlier) => earlier.kind === 'mcpServer',
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Use case: argo approves an outside MCP client as a party, at its first
|
|
90
|
+
* authorization: the gateway commissions and crews its proxy ship, which
|
|
91
|
+
* the client then calls the fleet as. One party per client in a fleet.
|
|
92
|
+
*/
|
|
93
|
+
export function createApproveClientParty(deps) {
|
|
94
|
+
return async (input) => {
|
|
95
|
+
const { operatorFleetId: fleetId, requestId, name, clientId, ownerShipId, scopes } = input;
|
|
96
|
+
const held = await deps.parties.findByClient(fleetId, clientId);
|
|
97
|
+
if (held && held.name !== name) {
|
|
98
|
+
return refuse('CLIENT_HAS_PARTY', `This client is the party ${held.name} already`);
|
|
99
|
+
}
|
|
100
|
+
const requestHash = deps.hasher.hash(JSON.stringify([requestId, name, clientId, ownerShipId, scopes]));
|
|
101
|
+
return approved(deps, {
|
|
102
|
+
fleetId,
|
|
103
|
+
type: MCP_CLIENT_SHIP_TYPE,
|
|
104
|
+
scopes,
|
|
105
|
+
requestHash,
|
|
106
|
+
party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpClient', clientId, ownerShipId, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
|
|
107
|
+
isOwn: (earlier) => earlier.kind === 'mcpClient',
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=approve-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve-party.js","sourceRoot":"","sources":["../../../src/core/parties/approve-party.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,8 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type ShownParty } from './shown-party.js';
|
|
3
|
+
import type { PartyStore } from './ports.js';
|
|
4
|
+
export type ListParties = (fleetId: FleetId) => Promise<ShownParty[]>;
|
|
5
|
+
/** Use case: the parties argo approved for its fleet, by name, as argo reads them: never a credential or a crew token. */
|
|
6
|
+
export declare function createListParties(deps: {
|
|
7
|
+
parties: PartyStore;
|
|
8
|
+
}): ListParties;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { shownPartyOf } from './shown-party.js';
|
|
2
|
+
/** Use case: the parties argo approved for its fleet, by name, as argo reads them: never a credential or a crew token. */
|
|
3
|
+
export function createListParties(deps) {
|
|
4
|
+
return async (fleetId) => (await deps.parties.list(fleetId))
|
|
5
|
+
.map(shownPartyOf)
|
|
6
|
+
.sort((left, right) => left.name.localeCompare(right.name));
|
|
7
|
+
}
|
|
8
|
+
//# 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,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAKjE,0HAA0H;AAC1H,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CACvB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC/B,GAAG,CAAC,YAAY,CAAC;SACjB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FleetId, ShipId } 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), owned by the
|
|
12
|
+
* person inside who answers for it (0045), crewed by the gateway. Known by
|
|
13
|
+
* its ship's name, unique in the fleet.
|
|
14
|
+
*/
|
|
15
|
+
interface PartyBase {
|
|
16
|
+
readonly fleetId: FleetId;
|
|
17
|
+
readonly name: string;
|
|
18
|
+
/** The owner argo picked: a person's ship, or argo. */
|
|
19
|
+
readonly ownerShipId: ShipId;
|
|
20
|
+
readonly state: PartyState;
|
|
21
|
+
readonly proxyShipId: ShipId | null;
|
|
22
|
+
/** The proxy ship's secret, kept only from its commission until the gateway crews it, so a crash between them loses nothing. */
|
|
23
|
+
readonly secret: string | null;
|
|
24
|
+
readonly crewToken: string | null;
|
|
25
|
+
/** argo's request id for the approval: the commission's idempotency key, and how a repeat is told from another approval. */
|
|
26
|
+
readonly requestId: string;
|
|
27
|
+
readonly requestHash: string;
|
|
28
|
+
readonly approvedAt: Date;
|
|
29
|
+
}
|
|
30
|
+
/** An outside MCP server argo approved for its fleet: fleet ships call its tools through its proxy ship (MCP out). */
|
|
31
|
+
export interface McpServerParty extends PartyBase {
|
|
32
|
+
readonly kind: 'mcpServer';
|
|
33
|
+
/** The server's Streamable HTTP endpoint. */
|
|
34
|
+
readonly url: string;
|
|
35
|
+
readonly credential: McpServerCredential;
|
|
36
|
+
/** The most calls the gateway has in flight to the server at once. */
|
|
37
|
+
readonly concurrencyLimit: number;
|
|
38
|
+
}
|
|
39
|
+
/** An outside MCP client argo approved at /authorize: it calls fleet ships as its proxy ship (MCP in). */
|
|
40
|
+
export interface McpClientParty extends PartyBase {
|
|
41
|
+
readonly kind: 'mcpClient';
|
|
42
|
+
/** Its OAuth client id: pre-registered, or its metadata document's URL. */
|
|
43
|
+
readonly clientId: string;
|
|
44
|
+
}
|
|
45
|
+
export type Party = McpServerParty | McpClientParty;
|
|
46
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"party.js","sourceRoot":"","sources":["../../../src/core/parties/party.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetRefusal } from '../connection/ports.js';
|
|
3
|
+
import type { Result } from '../shared/result.js';
|
|
4
|
+
import type { Party } from './party.js';
|
|
5
|
+
/** Outbound port: the parties argo approved, one per proxy ship name in a fleet. */
|
|
6
|
+
export interface PartyStore {
|
|
7
|
+
find(fleetId: FleetId, name: string): Promise<Party | undefined>;
|
|
8
|
+
list(fleetId: FleetId): Promise<Party[]>;
|
|
9
|
+
/** The party an MCP client is in the fleet, if argo approved it. */
|
|
10
|
+
findByClient(fleetId: FleetId, clientId: string): Promise<Party | undefined>;
|
|
11
|
+
save(party: Party): Promise<void>;
|
|
12
|
+
remove(fleetId: FleetId, name: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/** Outbound port: the fleet's calls the gateway makes for a party's proxy ship. */
|
|
15
|
+
export interface ProxyShipDoor {
|
|
16
|
+
/**
|
|
17
|
+
* Commissions an app ship as the gateway's ship (fleet:commission and
|
|
18
|
+
* fleet:on-behalf, decision 0044), owned by the owner argo picked (0045),
|
|
19
|
+
* with the scopes granted, only ones the gateway's ship holds (0053),
|
|
20
|
+
* under the gateway's idempotency key: its id, and on the first commission
|
|
21
|
+
* its secret. A repeat under the same key answers the same ship without one.
|
|
22
|
+
*/
|
|
23
|
+
commissionAppShip(crewToken: string, ship: {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
owner: ShipId;
|
|
27
|
+
idempotencyKey: string;
|
|
28
|
+
scopes: readonly string[];
|
|
29
|
+
}): Promise<Result<{
|
|
30
|
+
shipId: ShipId;
|
|
31
|
+
secret: string | null;
|
|
32
|
+
}, FleetRefusal>>;
|
|
33
|
+
register(claim: {
|
|
34
|
+
shipId: ShipId;
|
|
35
|
+
secret: string;
|
|
36
|
+
}): Promise<Result<{
|
|
37
|
+
crewToken: string;
|
|
38
|
+
}, FleetRefusal>>;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/parties/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
ownerShipId: ShipId;
|
|
7
|
+
state: PartyState;
|
|
8
|
+
proxyShipId: ShipId | null;
|
|
9
|
+
}
|
|
10
|
+
/** A party as argo reads it: never its credential, secret or crew token. */
|
|
11
|
+
export type ShownParty = (ShownPartyBase & {
|
|
12
|
+
kind: 'mcpServer';
|
|
13
|
+
url: string;
|
|
14
|
+
credentialKind: McpServerCredential['kind'];
|
|
15
|
+
concurrencyLimit: number;
|
|
16
|
+
}) | (ShownPartyBase & {
|
|
17
|
+
kind: 'mcpClient';
|
|
18
|
+
clientId: string;
|
|
19
|
+
});
|
|
20
|
+
export declare function shownPartyOf(party: Party): ShownParty;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function shownPartyOf(party) {
|
|
2
|
+
const { name, ownerShipId, state, proxyShipId } = party;
|
|
3
|
+
switch (party.kind) {
|
|
4
|
+
case 'mcpServer':
|
|
5
|
+
return { name, kind: party.kind, url: party.url, credentialKind: party.credential.kind, ownerShipId, concurrencyLimit: party.concurrencyLimit, state, proxyShipId };
|
|
6
|
+
case 'mcpClient':
|
|
7
|
+
return { name, kind: party.kind, clientId: party.clientId, ownerShipId, 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":"AAiBA,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IACxD,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,WAAW,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;QACtK,KAAK,WAAW;YACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACjG,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;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { handledOf, openedOf } from './opened-of.js';
|
|
3
|
+
import { asPersonCrew, withOwnRefusal } from './person-crew.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: a person answers a delivery they opened (Q20): a reply to its
|
|
6
|
+
* sender, in reply to its message, then it is handled. The reply's key is
|
|
7
|
+
* the delivery's, so an answer tried again after the fleet did not take
|
|
8
|
+
* handled is sent once.
|
|
9
|
+
*/
|
|
10
|
+
export function createAnswerDelivery(deps) {
|
|
11
|
+
return async ({ caller, deliveryId, contentType, payload }) => {
|
|
12
|
+
const opened = await openedOf(deps, { caller, deliveryId });
|
|
13
|
+
if (!opened.isOk) {
|
|
14
|
+
return opened;
|
|
15
|
+
}
|
|
16
|
+
const delivery = opened.value;
|
|
17
|
+
const reply = { to: delivery.senderShipId, inReplyTo: delivery.messageId, contentType, payload, idempotencyKey: `answer-${delivery.deliveryId}` };
|
|
18
|
+
const sent = await asPersonCrew(deps, { caller, run: (crew) => withOwnRefusal(deps.door.reply(crew.crewToken, reply)) });
|
|
19
|
+
if (!sent.isOk) {
|
|
20
|
+
return sent;
|
|
21
|
+
}
|
|
22
|
+
if (!sent.value.value.isOk) {
|
|
23
|
+
return refuse('SEND_REFUSED', `The fleet did not take your answer: ${sent.value.value.error.message}`);
|
|
24
|
+
}
|
|
25
|
+
return handledOf(deps, { caller, delivery });
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=answer-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-delivery.js","sourceRoot":"","sources":["../../../src/core/people/answer-delivery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAA+B,MAAM,gBAAgB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAqB,MAAM,kBAAkB,CAAC;AAKnF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAA4G;IAC/I,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC;QAClJ,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACzH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,cAAc,EAAE,uCAAuC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ConnectionStore, FleetDoor } from '../connection/ports.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { AccountTokenOf, AccountTokenRefusal } from '../sign-in/account-token.js';
|
|
6
|
+
import type { AccountDoor, PersonCrews } from './ports.js';
|
|
7
|
+
/**
|
|
8
|
+
* Why the gateway has no crew for the person's ship, beside why it has no account token:
|
|
9
|
+
* - noPersonShip: the account has none in the fleet, as it may not message there (decision 0052);
|
|
10
|
+
* - notConnected: the gateway holds no crew token for its own ship in the fleet;
|
|
11
|
+
* - fleetRefused: the fleet refused a call, for the reason given.
|
|
12
|
+
*/
|
|
13
|
+
export type CrewPersonShipRefusal = AccountTokenRefusal | {
|
|
14
|
+
readonly kind: 'noPersonShip';
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'notConnected';
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: 'fleetRefused';
|
|
19
|
+
readonly message: string;
|
|
20
|
+
};
|
|
21
|
+
export type CrewPersonShip = (grant: {
|
|
22
|
+
fleetId: FleetId;
|
|
23
|
+
grantId: string;
|
|
24
|
+
}) => Promise<Result<{
|
|
25
|
+
shipId: ShipId;
|
|
26
|
+
crewToken: string;
|
|
27
|
+
}, CrewPersonShipRefusal>>;
|
|
28
|
+
/**
|
|
29
|
+
* Use case: the crew of a signed-in person's person ship (decisions 0054,
|
|
30
|
+
* 0057). The gateway crews it once and every client of the person shares
|
|
31
|
+
* that crew, as a ship has one crew at a time (decision 0010). To crew it,
|
|
32
|
+
* the gateway acts as the account, with its token beside the gateway's crew
|
|
33
|
+
* token: it gets the ship's starting prompt, releasing the ship first when a
|
|
34
|
+
* crew the gateway does not hold has it, and registers with its secret.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createCrewPersonShip(deps: {
|
|
37
|
+
accountTokenOf: AccountTokenOf;
|
|
38
|
+
connections: ConnectionStore;
|
|
39
|
+
door: AccountDoor & Pick<FleetDoor, 'register'>;
|
|
40
|
+
crews: PersonCrews;
|
|
41
|
+
clock: Clock;
|
|
42
|
+
}): CrewPersonShip;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { err, ok } from '../shared/result.js';
|
|
2
|
+
/** The fleet's code for a ship that is crewed already: a starting prompt waits for its release. */
|
|
3
|
+
const SHIP_CREWED = 'CONFLICT';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: the crew of a signed-in person's person ship (decisions 0054,
|
|
6
|
+
* 0057). The gateway crews it once and every client of the person shares
|
|
7
|
+
* that crew, as a ship has one crew at a time (decision 0010). To crew it,
|
|
8
|
+
* the gateway acts as the account, with its token beside the gateway's crew
|
|
9
|
+
* token: it gets the ship's starting prompt, releasing the ship first when a
|
|
10
|
+
* crew the gateway does not hold has it, and registers with its secret.
|
|
11
|
+
*/
|
|
12
|
+
export function createCrewPersonShip(deps) {
|
|
13
|
+
const crewing = new Map();
|
|
14
|
+
const crew = async (call) => {
|
|
15
|
+
const { fleetId, shipId, accountToken } = call;
|
|
16
|
+
const gateway = await deps.connections.find(fleetId);
|
|
17
|
+
if (gateway === undefined) {
|
|
18
|
+
return err({ kind: 'notConnected' });
|
|
19
|
+
}
|
|
20
|
+
const asAccount = { crewToken: gateway.crewToken, accountToken, shipId };
|
|
21
|
+
let prompt = await deps.door.startingPrompt(asAccount);
|
|
22
|
+
if (!prompt.isOk && prompt.error.code === SHIP_CREWED) {
|
|
23
|
+
const released = await deps.door.release(asAccount);
|
|
24
|
+
if (!released.isOk) {
|
|
25
|
+
return err({ kind: 'fleetRefused', message: released.error.message });
|
|
26
|
+
}
|
|
27
|
+
prompt = await deps.door.startingPrompt(asAccount);
|
|
28
|
+
}
|
|
29
|
+
if (!prompt.isOk) {
|
|
30
|
+
return err({ kind: 'fleetRefused', message: prompt.error.message });
|
|
31
|
+
}
|
|
32
|
+
const registered = await deps.door.register({ shipId, secret: prompt.value.secret });
|
|
33
|
+
if (!registered.isOk) {
|
|
34
|
+
return err({ kind: 'fleetRefused', message: registered.error.message });
|
|
35
|
+
}
|
|
36
|
+
await deps.crews.save({ fleetId, shipId, crewToken: registered.value.crewToken, crewedAt: deps.clock.now() });
|
|
37
|
+
return ok({ crewToken: registered.value.crewToken });
|
|
38
|
+
};
|
|
39
|
+
return async (grant) => {
|
|
40
|
+
const token = await deps.accountTokenOf(grant);
|
|
41
|
+
if (!token.isOk) {
|
|
42
|
+
return token;
|
|
43
|
+
}
|
|
44
|
+
const { accountToken, personShipId: shipId } = token.value;
|
|
45
|
+
if (shipId === null) {
|
|
46
|
+
return err({ kind: 'noPersonShip' });
|
|
47
|
+
}
|
|
48
|
+
const held = await deps.crews.find(grant.fleetId, shipId);
|
|
49
|
+
if (held !== undefined) {
|
|
50
|
+
return ok({ shipId, crewToken: held.crewToken });
|
|
51
|
+
}
|
|
52
|
+
const key = `${grant.fleetId}/${shipId}`;
|
|
53
|
+
const answer = crewing.get(key) ?? crew({ fleetId: grant.fleetId, shipId, accountToken }).finally(() => crewing.delete(key));
|
|
54
|
+
crewing.set(key, answer);
|
|
55
|
+
const crewed = await answer;
|
|
56
|
+
return crewed.isOk ? ok({ shipId, crewToken: crewed.value.crewToken }) : crewed;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=crew-person-ship.js.map
|