@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,38 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ConnectionStore, FleetDoor } from '../connection/ports.js';
|
|
3
|
+
import type { AuthenticateOperator } from '../operator/authenticate-operator.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
/**
|
|
7
|
+
* Who calls the gateway's API (decision 0057): argo or a viewer by the
|
|
8
|
+
* console session, or a ship by its own crew token. Its scopes are the
|
|
9
|
+
* fleet's answer, never the request's, plugin scopes such as
|
|
10
|
+
* gateway:approve among them.
|
|
11
|
+
*/
|
|
12
|
+
export type Actor = {
|
|
13
|
+
readonly fleetId: FleetId;
|
|
14
|
+
readonly kind: 'operator' | 'viewer';
|
|
15
|
+
readonly scopes: readonly string[];
|
|
16
|
+
} | {
|
|
17
|
+
readonly fleetId: FleetId;
|
|
18
|
+
readonly kind: 'ship';
|
|
19
|
+
readonly shipId: ShipId;
|
|
20
|
+
readonly scopes: readonly string[];
|
|
21
|
+
};
|
|
22
|
+
export type AuthenticateActor = (sent: {
|
|
23
|
+
cookie?: string | undefined;
|
|
24
|
+
crewToken?: string | undefined;
|
|
25
|
+
}) => Promise<Result<Actor, DomainError<'NOT_AN_ACTOR'>>>;
|
|
26
|
+
/**
|
|
27
|
+
* Use case: whom a call of the gateway's API is for. A crew token, sent
|
|
28
|
+
* deliberately, names its ship: the fleet says which ship it crews, and the
|
|
29
|
+
* gateway, as its own ship in that fleet, reads the ship's scopes. Else the
|
|
30
|
+
* console session cookie names argo or a viewer, as before. A ship of a
|
|
31
|
+
* fleet the gateway is not connected to is no actor here. The crew token is
|
|
32
|
+
* never kept.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createAuthenticateActor(deps: {
|
|
35
|
+
authenticateOperator: AuthenticateOperator;
|
|
36
|
+
door: Pick<FleetDoor, 'whoami' | 'getShip'>;
|
|
37
|
+
connections: Pick<ConnectionStore, 'find'>;
|
|
38
|
+
}): AuthenticateActor;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: whom a call of the gateway's API is for. A crew token, sent
|
|
5
|
+
* deliberately, names its ship: the fleet says which ship it crews, and the
|
|
6
|
+
* gateway, as its own ship in that fleet, reads the ship's scopes. Else the
|
|
7
|
+
* console session cookie names argo or a viewer, as before. A ship of a
|
|
8
|
+
* fleet the gateway is not connected to is no actor here. The crew token is
|
|
9
|
+
* never kept.
|
|
10
|
+
*/
|
|
11
|
+
export function createAuthenticateActor(deps) {
|
|
12
|
+
const refusal = refuse('NOT_AN_ACTOR', 'Sign in to the console of your fleet, or call with your ship\'s crew token');
|
|
13
|
+
return async ({ cookie, crewToken }) => {
|
|
14
|
+
if (crewToken !== undefined) {
|
|
15
|
+
const who = await deps.door.whoami(crewToken);
|
|
16
|
+
if (!who.isOk) {
|
|
17
|
+
return refusal;
|
|
18
|
+
}
|
|
19
|
+
const gateway = await deps.connections.find(who.value.fleetId);
|
|
20
|
+
if (gateway === undefined) {
|
|
21
|
+
return refusal;
|
|
22
|
+
}
|
|
23
|
+
const ship = await deps.door.getShip(gateway.crewToken, { shipId: who.value.shipId });
|
|
24
|
+
return ship.isOk ? ok({ fleetId: who.value.fleetId, kind: 'ship', shipId: who.value.shipId, scopes: ship.value.scopes }) : refusal;
|
|
25
|
+
}
|
|
26
|
+
const operator = await deps.authenticateOperator(cookie);
|
|
27
|
+
return operator.isOk ? ok(operator.value) : refusal;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=authenticate-actor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticate-actor.js","sourceRoot":"","sources":["../../../src/core/actors/authenticate-actor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AActD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAIvC;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,4EAA4E,CAAC,CAAC;IACrH,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;QACrC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
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 { ConnectionStatus, ConnectionStore, FleetDoor } from './ports.js';
|
|
6
|
+
export type ConnectRefusal = DomainError<'ALREADY_CONNECTED' | 'SECRET_REFUSED' | 'OTHER_FLEET' | 'MISSING_SCOPES' | 'SCOPE_REFUSED' | 'FLEET_UNAVAILABLE'>;
|
|
7
|
+
export type Connect = (input: {
|
|
8
|
+
operatorFleetId: FleetId;
|
|
9
|
+
shipId: ShipId;
|
|
10
|
+
secret: string;
|
|
11
|
+
}) => Promise<Result<ConnectionStatus, ConnectRefusal>>;
|
|
12
|
+
/**
|
|
13
|
+
* Use case: argo connects the gateway, as the other plugins are connected.
|
|
14
|
+
* The console's server hands it its ship's secret, server to server; the
|
|
15
|
+
* gateway registers with it as a server and keeps only the crew token. The
|
|
16
|
+
* ship must be of argo's fleet and hold the gateway's scopes, and the fleet
|
|
17
|
+
* must take the gateway's declared scope, or the gateway lets
|
|
18
|
+
* the ship go again and keeps nothing. Each fleet has its own connection:
|
|
19
|
+
* connect works only while the gateway is not connected to argo's fleet,
|
|
20
|
+
* whatever other fleets it serves. The secret is never kept or logged.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createConnect(deps: {
|
|
23
|
+
door: FleetDoor;
|
|
24
|
+
store: ConnectionStore;
|
|
25
|
+
clock: Clock;
|
|
26
|
+
}): Connect;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* What the gateway's ship does (decisions 0044 to 0046): read the fleet,
|
|
5
|
+
* commission an app proxy ship for each approved outside party, naming its
|
|
6
|
+
* owner, and declare the gateway's own scope.
|
|
7
|
+
*/
|
|
8
|
+
const GATEWAY_SCOPES = ['fleet:read', 'fleet:commission', 'fleet:on-behalf', 'scopes:declare'];
|
|
9
|
+
/** The gateway's own scopes, under its namespace: approving is a scope any actor may hold (decision 0056). */
|
|
10
|
+
const GATEWAY_NAMESPACE = {
|
|
11
|
+
namespace: 'gateway',
|
|
12
|
+
scopes: [{ scope: 'gateway:approve', description: 'Approve outside parties: outside MCP clients and servers, each acting in the fleet as its proxy ship' }],
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Use case: argo connects the gateway, as the other plugins are connected.
|
|
16
|
+
* The console's server hands it its ship's secret, server to server; the
|
|
17
|
+
* gateway registers with it as a server and keeps only the crew token. The
|
|
18
|
+
* ship must be of argo's fleet and hold the gateway's scopes, and the fleet
|
|
19
|
+
* must take the gateway's declared scope, or the gateway lets
|
|
20
|
+
* the ship go again and keeps nothing. Each fleet has its own connection:
|
|
21
|
+
* connect works only while the gateway is not connected to argo's fleet,
|
|
22
|
+
* whatever other fleets it serves. The secret is never kept or logged.
|
|
23
|
+
*/
|
|
24
|
+
export function createConnect(deps) {
|
|
25
|
+
return async ({ operatorFleetId, shipId, secret }) => {
|
|
26
|
+
if (await deps.store.find(operatorFleetId)) {
|
|
27
|
+
return refuse('ALREADY_CONNECTED', 'The gateway is connected to this fleet already');
|
|
28
|
+
}
|
|
29
|
+
const registered = await deps.door.register({ shipId, secret });
|
|
30
|
+
if (!registered.isOk) {
|
|
31
|
+
return refuse('SECRET_REFUSED', `The fleet refused its ship's secret: ${registered.error.message}`);
|
|
32
|
+
}
|
|
33
|
+
const { crewToken } = registered.value;
|
|
34
|
+
const letGo = async (kind, message) => {
|
|
35
|
+
await deps.door.deregister(crewToken);
|
|
36
|
+
return refuse(kind, message);
|
|
37
|
+
};
|
|
38
|
+
const who = await deps.door.whoami(crewToken);
|
|
39
|
+
if (!who.isOk) {
|
|
40
|
+
return letGo('SECRET_REFUSED', `The fleet refused the new crew token: ${who.error.message}`);
|
|
41
|
+
}
|
|
42
|
+
if (who.value.fleetId !== operatorFleetId) {
|
|
43
|
+
return letGo('OTHER_FLEET', "The ship belongs to another fleet than the operator's");
|
|
44
|
+
}
|
|
45
|
+
const ship = await deps.door.getShip(crewToken, { shipId });
|
|
46
|
+
if (!ship.isOk || !GATEWAY_SCOPES.every((scope) => ship.value.scopes.includes(scope))) {
|
|
47
|
+
return letGo('MISSING_SCOPES', `The ship needs ${GATEWAY_SCOPES.join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
const declared = await deps.door.declareScopes(crewToken, GATEWAY_NAMESPACE);
|
|
50
|
+
if (!declared.isOk) {
|
|
51
|
+
return letGo('SCOPE_REFUSED', `The fleet did not take the gateway's scope gateway:approve: ${declared.error.message}`);
|
|
52
|
+
}
|
|
53
|
+
await deps.store.save({ fleetId: who.value.fleetId, shipId, name: who.value.name, crewToken, crewedAt: deps.clock.now() });
|
|
54
|
+
return ok({ state: 'connected', ship: { shipId, name: who.value.name }, lastShipId: shipId });
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/core/connection/connect.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAOtD;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE/F,8GAA8G;AAC9G,MAAM,iBAAiB,GAAG;IACxB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,sGAAsG,EAAE,CAAC;CAC5J,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAA+D;IAC3F,OAAO,KAAK,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACnD,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,mBAAmB,EAAE,gDAAgD,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,gBAAgB,EAAE,wCAAwC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,EAAoC,IAAO,EAAE,OAAe,EAAE,EAAE;YACjF,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,KAAK,CAAC,gBAAgB,EAAE,yCAAyC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC,aAAa,EAAE,uDAAuD,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,gBAAgB,EAAE,kBAAkB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC,eAAe,EAAE,+DAA+D,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzH,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3H,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Result } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Why the fleet refused a ship call: its code (CONFLICT, UNAUTHORIZED,
|
|
5
|
+
* LEASE_ENDED, ...) and its message. UNAVAILABLE: no answer came, so the call
|
|
6
|
+
* may or may not have been carried out.
|
|
7
|
+
*/
|
|
8
|
+
export interface FleetRefusal {
|
|
9
|
+
code: string;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
/** A ship as `fleet.ship` shows it: what the gateway reads of it. */
|
|
13
|
+
export interface FleetShip {
|
|
14
|
+
status: 'awaitingCrew' | 'crewed' | 'retired';
|
|
15
|
+
scopes: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Outbound port: the fleet's public ship calls, as the gateway makes them for
|
|
19
|
+
* its own ship. The gateway is a ship like any other.
|
|
20
|
+
*/
|
|
21
|
+
export interface FleetDoor {
|
|
22
|
+
register(claim: {
|
|
23
|
+
shipId: ShipId;
|
|
24
|
+
secret: string;
|
|
25
|
+
}): Promise<Result<{
|
|
26
|
+
crewToken: string;
|
|
27
|
+
}, FleetRefusal>>;
|
|
28
|
+
whoami(crewToken: string): Promise<Result<{
|
|
29
|
+
shipId: ShipId;
|
|
30
|
+
fleetId: FleetId;
|
|
31
|
+
name: string;
|
|
32
|
+
type: string;
|
|
33
|
+
}, FleetRefusal>>;
|
|
34
|
+
/** A ship of the fleet, retired ones included; needs fleet:read. */
|
|
35
|
+
getShip(crewToken: string, ship: {
|
|
36
|
+
shipId: ShipId;
|
|
37
|
+
}): Promise<Result<FleetShip, FleetRefusal>>;
|
|
38
|
+
/** Ends this session's crew of its ship: the lease and the secret it claimed with. */
|
|
39
|
+
deregister(crewToken: string): Promise<Result<undefined, FleetRefusal>>;
|
|
40
|
+
/** Declares the ship's own namespace and its whole list of scopes; the fleet stores them, the gateway enforces them (decision 0046). */
|
|
41
|
+
declareScopes(crewToken: string, declaration: {
|
|
42
|
+
namespace: string;
|
|
43
|
+
scopes: {
|
|
44
|
+
scope: string;
|
|
45
|
+
description: string;
|
|
46
|
+
}[];
|
|
47
|
+
}): Promise<Result<undefined, FleetRefusal>>;
|
|
48
|
+
}
|
|
49
|
+
/** The crew token the gateway holds for its ship in a fleet, and when it got it. */
|
|
50
|
+
export interface GatewayCrew {
|
|
51
|
+
/** The fleet the ship belongs to: the fleet the gateway serves. */
|
|
52
|
+
fleetId: FleetId;
|
|
53
|
+
shipId: ShipId;
|
|
54
|
+
/** The ship's name when the gateway connected, shown while the fleet does not answer. */
|
|
55
|
+
name: string;
|
|
56
|
+
crewToken: string;
|
|
57
|
+
crewedAt: Date;
|
|
58
|
+
}
|
|
59
|
+
/** The fleet and ship the gateway was last connected as; kept when its crew token is dropped. */
|
|
60
|
+
export interface GatewayBinding {
|
|
61
|
+
fleetId: FleetId;
|
|
62
|
+
shipId: ShipId;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Outbound port: where the gateway keeps each fleet's crew token across
|
|
66
|
+
* restarts. One install serves many fleets, one connection each.
|
|
67
|
+
*/
|
|
68
|
+
export interface ConnectionStore {
|
|
69
|
+
/** The fleet's crew, while the gateway holds a crew token for it: while it is connected to that fleet. */
|
|
70
|
+
find(fleetId: FleetId): Promise<GatewayCrew | undefined>;
|
|
71
|
+
/** The fleet's last connection, with or without a crew token; none before its first. */
|
|
72
|
+
binding(fleetId: FleetId): Promise<GatewayBinding | undefined>;
|
|
73
|
+
/** Every fleet's crew the gateway holds a crew token for: the fleets it is connected to. */
|
|
74
|
+
connected(): Promise<GatewayCrew[]>;
|
|
75
|
+
save(crew: GatewayCrew): Promise<void>;
|
|
76
|
+
/** Forgets the fleet's crew token, keeping its binding: the gateway is not connected to that fleet. */
|
|
77
|
+
drop(fleetId: FleetId): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
/** Whether the gateway holds a working crew token for its ship, as which ship, and the ship it was last connected as. */
|
|
80
|
+
export interface ConnectionStatus {
|
|
81
|
+
state: 'not-connected' | 'connected';
|
|
82
|
+
ship: {
|
|
83
|
+
shipId: ShipId;
|
|
84
|
+
name: string;
|
|
85
|
+
} | null;
|
|
86
|
+
lastShipId: ShipId | null;
|
|
87
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/connection/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ConnectionStatus, ConnectionStore, FleetDoor } from './ports.js';
|
|
3
|
+
export type ReadConnection = (fleetId: FleetId) => Promise<ConnectionStatus>;
|
|
4
|
+
/**
|
|
5
|
+
* Use case: whether the gateway is connected to a fleet. The fleet's kept
|
|
6
|
+
* crew token is asked who it is: a token the fleet no longer takes (the ship
|
|
7
|
+
* was released, its session ended) is dropped, and the gateway is not
|
|
8
|
+
* connected to that fleet until argo connects it again. When the fleet does
|
|
9
|
+
* not answer, the token is kept.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createReadConnection(deps: {
|
|
12
|
+
door: FleetDoor;
|
|
13
|
+
store: ConnectionStore;
|
|
14
|
+
}): ReadConnection;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** The codes with which the fleet says a crew token no longer crews its ship. */
|
|
2
|
+
const GONE = new Set(['LEASE_ENDED', 'UNAUTHORIZED']);
|
|
3
|
+
/**
|
|
4
|
+
* Use case: whether the gateway is connected to a fleet. The fleet's kept
|
|
5
|
+
* crew token is asked who it is: a token the fleet no longer takes (the ship
|
|
6
|
+
* was released, its session ended) is dropped, and the gateway is not
|
|
7
|
+
* connected to that fleet until argo connects it again. When the fleet does
|
|
8
|
+
* not answer, the token is kept.
|
|
9
|
+
*/
|
|
10
|
+
export function createReadConnection(deps) {
|
|
11
|
+
return async (fleetId) => {
|
|
12
|
+
const crew = await deps.store.find(fleetId);
|
|
13
|
+
if (crew) {
|
|
14
|
+
const who = await deps.door.whoami(crew.crewToken);
|
|
15
|
+
if (who.isOk || !GONE.has(who.error.code)) {
|
|
16
|
+
return { state: 'connected', ship: { shipId: crew.shipId, name: who.isOk ? who.value.name : crew.name }, lastShipId: crew.shipId };
|
|
17
|
+
}
|
|
18
|
+
await deps.store.drop(fleetId);
|
|
19
|
+
}
|
|
20
|
+
const binding = await deps.store.binding(fleetId);
|
|
21
|
+
return { state: 'not-connected', ship: null, lastShipId: binding?.shipId ?? null };
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=read-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-connection.js","sourceRoot":"","sources":["../../../src/core/connection/read-connection.ts"],"names":[],"mappings":"AAMA,iFAAiF;AACjF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAiD;IACpF,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACrI,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;IACrF,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
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 { FleetForgetter, InstallationRequests, RequestHasher } from './ports.js';
|
|
6
|
+
export type DeleteFleet = (input: {
|
|
7
|
+
requestId: string;
|
|
8
|
+
fleetId: FleetId;
|
|
9
|
+
}) => Promise<Result<Record<string, never>, DomainError<'REQUEST_ID_USED'>>>;
|
|
10
|
+
/**
|
|
11
|
+
* Use case: the hosting service deletes a fleet from the gateway (decision
|
|
12
|
+
* 0021): the gateway forgets everything it holds of the fleet and tells the
|
|
13
|
+
* fleet nothing; its ships stay there. The request is kept as its hash only,
|
|
14
|
+
* so nothing of the fleet stays; a replay answers the first answer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDeleteFleet(deps: {
|
|
17
|
+
forgetter: FleetForgetter;
|
|
18
|
+
requests: InstallationRequests;
|
|
19
|
+
hasher: RequestHasher;
|
|
20
|
+
clock: Clock;
|
|
21
|
+
}): DeleteFleet;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { earlierAnswer } from './request-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the hosting service deletes a fleet from the gateway (decision
|
|
5
|
+
* 0021): the gateway forgets everything it holds of the fleet and tells the
|
|
6
|
+
* fleet nothing; its ships stay there. The request is kept as its hash only,
|
|
7
|
+
* so nothing of the fleet stays; a replay answers the first answer.
|
|
8
|
+
*/
|
|
9
|
+
export function createDeleteFleet(deps) {
|
|
10
|
+
return async ({ requestId, fleetId }) => {
|
|
11
|
+
const requestHash = deps.hasher.hash(`deleteFleet ${fleetId}`);
|
|
12
|
+
const earlier = await earlierAnswer(deps.requests, { requestId, requestHash });
|
|
13
|
+
if (earlier !== undefined) {
|
|
14
|
+
return 'isOk' in earlier ? earlier : ok({});
|
|
15
|
+
}
|
|
16
|
+
await deps.forgetter.forget(fleetId);
|
|
17
|
+
await deps.requests.record({ requestId, kind: 'deleteFleet', requestHash, fleetId: null, isEnabled: null, at: deps.clock.now() });
|
|
18
|
+
return ok({});
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=delete-fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-fleet.js","sourceRoot":"","sources":["../../../src/core/installation/delete-fleet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwG;IACxI,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClI,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* Whether the installation has an installation token (decision 0021): open
|
|
4
|
+
* without one, as a self-hosted gateway runs, and every fleet is served;
|
|
5
|
+
* enabled with one, and a fleet is served only once the hosting service
|
|
6
|
+
* switched it on.
|
|
7
|
+
*/
|
|
8
|
+
export type InstallationMode = 'open' | 'enabled';
|
|
9
|
+
/** Outbound port: each fleet's switch, as the hosting service set it. */
|
|
10
|
+
export interface FleetSwitches {
|
|
11
|
+
/** Whether the fleet was switched on; undefined when it never was switched. */
|
|
12
|
+
find(fleetId: FleetId): Promise<boolean | undefined>;
|
|
13
|
+
set(fleetId: FleetId, change: {
|
|
14
|
+
isEnabled: boolean;
|
|
15
|
+
at: Date;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A request the installation answered, by the caller's request id. A switch
|
|
20
|
+
* names its fleet and what it set, and goes with its fleet; a delete names
|
|
21
|
+
* nothing of the fleet, only the request's hash.
|
|
22
|
+
*/
|
|
23
|
+
export interface InstallationRequest {
|
|
24
|
+
requestId: string;
|
|
25
|
+
kind: 'setEnabled' | 'deleteFleet';
|
|
26
|
+
requestHash: string;
|
|
27
|
+
fleetId: FleetId | null;
|
|
28
|
+
isEnabled: boolean | null;
|
|
29
|
+
at: Date;
|
|
30
|
+
}
|
|
31
|
+
/** Outbound port: the installation's requests, so a replay answers what the first call answered. */
|
|
32
|
+
export interface InstallationRequests {
|
|
33
|
+
find(requestId: string): Promise<InstallationRequest | undefined>;
|
|
34
|
+
record(request: InstallationRequest): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/** Outbound port: forgets everything the gateway holds of a fleet, in one go: its connection, its switch, its parties with their vault, and the requests that name it. */
|
|
37
|
+
export interface FleetForgetter {
|
|
38
|
+
forget(fleetId: FleetId): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** Outbound port: a one-way hash of a request's text, kept instead of the request. */
|
|
41
|
+
export interface RequestHasher {
|
|
42
|
+
hash(text: string): string;
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/installation/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ConnectionStore } from '../connection/ports.js';
|
|
3
|
+
import type { IsServed } from './served.js';
|
|
4
|
+
export type ReadFleet = (input: {
|
|
5
|
+
fleetId: FleetId;
|
|
6
|
+
}) => Promise<{
|
|
7
|
+
isEnabled: boolean;
|
|
8
|
+
isConnected: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Use case: a fleet as the hosting service reads it: whether the gateway
|
|
12
|
+
* serves it, and whether the gateway holds a crew token for it. Off and
|
|
13
|
+
* connected is a fleet whose connection waits for it to be on again.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createReadFleet(deps: {
|
|
16
|
+
isServed: IsServed;
|
|
17
|
+
connections: ConnectionStore;
|
|
18
|
+
}): ReadFleet;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: a fleet as the hosting service reads it: whether the gateway
|
|
3
|
+
* serves it, and whether the gateway holds a crew token for it. Off and
|
|
4
|
+
* connected is a fleet whose connection waits for it to be on again.
|
|
5
|
+
*/
|
|
6
|
+
export function createReadFleet(deps) {
|
|
7
|
+
return async ({ fleetId }) => ({ isEnabled: await deps.isServed(fleetId), isConnected: (await deps.connections.find(fleetId)) !== undefined });
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=read-fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-fleet.js","sourceRoot":"","sources":["../../../src/core/installation/read-fleet.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAA0D;IACxF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;AACjJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DomainError } from '../shared/errors.js';
|
|
2
|
+
import type { Err } from '../shared/result.js';
|
|
3
|
+
import type { InstallationRequest, InstallationRequests } from './ports.js';
|
|
4
|
+
/** What a request id already answered: the earlier request when it is the same one, a refusal when it was another. */
|
|
5
|
+
export declare function earlierAnswer(requests: InstallationRequests, request: {
|
|
6
|
+
requestId: string;
|
|
7
|
+
requestHash: string;
|
|
8
|
+
}): Promise<InstallationRequest | Err<DomainError<'REQUEST_ID_USED'>> | undefined>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
/** What a request id already answered: the earlier request when it is the same one, a refusal when it was another. */
|
|
3
|
+
export async function earlierAnswer(requests, request) {
|
|
4
|
+
const earlier = await requests.find(request.requestId);
|
|
5
|
+
if (!earlier) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
return earlier.requestHash === request.requestHash ? earlier : refuse('REQUEST_ID_USED', `The request id ${request.requestId} was used for another request`);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=request-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-id.js","sourceRoot":"","sources":["../../../src/core/installation/request-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAI/D,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA8B,EAC9B,OAAmD;IAEnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,OAAO,CAAC,SAAS,+BAA+B,CAAC,CAAC;AAC/J,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetSwitches, InstallationMode } from './ports.js';
|
|
3
|
+
/** Whether the gateway serves the fleet now: off, it does nothing for that fleet. */
|
|
4
|
+
export type IsServed = (fleetId: FleetId) => Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Policy: the gateway serves every fleet of an open installation, and a fleet
|
|
7
|
+
* of an enabled one only once the hosting service switched it on (decision 0021).
|
|
8
|
+
*/
|
|
9
|
+
export declare function createIsServed(deps: {
|
|
10
|
+
installation: InstallationMode;
|
|
11
|
+
switches: FleetSwitches;
|
|
12
|
+
}): IsServed;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy: the gateway serves every fleet of an open installation, and a fleet
|
|
3
|
+
* of an enabled one only once the hosting service switched it on (decision 0021).
|
|
4
|
+
*/
|
|
5
|
+
export function createIsServed(deps) {
|
|
6
|
+
return async (fleetId) => deps.installation === 'open' || (await deps.switches.find(fleetId)) === true;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=served.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served.js","sourceRoot":"","sources":["../../../src/core/installation/served.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiE;IAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
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 { FleetSwitches, InstallationRequests, RequestHasher } from './ports.js';
|
|
6
|
+
export type SetFleetEnabled = (input: {
|
|
7
|
+
requestId: string;
|
|
8
|
+
fleetId: FleetId;
|
|
9
|
+
isEnabled: boolean;
|
|
10
|
+
}) => Promise<Result<{
|
|
11
|
+
fleetId: FleetId;
|
|
12
|
+
isEnabled: boolean;
|
|
13
|
+
}, DomainError<'REQUEST_ID_USED'>>>;
|
|
14
|
+
/**
|
|
15
|
+
* Use case: the hosting service switches the gateway on or off for a fleet
|
|
16
|
+
* (decision 0021). Off keeps everything of the fleet, so on again resumes,
|
|
17
|
+
* whatever network the fleet has (interop I-3). A replayed request id
|
|
18
|
+
* answers what it answered first and changes nothing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSetFleetEnabled(deps: {
|
|
21
|
+
switches: FleetSwitches;
|
|
22
|
+
requests: InstallationRequests;
|
|
23
|
+
hasher: RequestHasher;
|
|
24
|
+
clock: Clock;
|
|
25
|
+
}): SetFleetEnabled;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { earlierAnswer } from './request-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the hosting service switches the gateway on or off for a fleet
|
|
5
|
+
* (decision 0021). Off keeps everything of the fleet, so on again resumes,
|
|
6
|
+
* whatever network the fleet has (interop I-3). A replayed request id
|
|
7
|
+
* answers what it answered first and changes nothing.
|
|
8
|
+
*/
|
|
9
|
+
export function createSetFleetEnabled(deps) {
|
|
10
|
+
return async ({ requestId, fleetId, isEnabled }) => {
|
|
11
|
+
const requestHash = deps.hasher.hash(`setEnabled ${fleetId} ${String(isEnabled)}`);
|
|
12
|
+
const earlier = await earlierAnswer(deps.requests, { requestId, requestHash });
|
|
13
|
+
if (earlier !== undefined) {
|
|
14
|
+
return 'isOk' in earlier ? earlier : ok({ fleetId, isEnabled: earlier.isEnabled === true });
|
|
15
|
+
}
|
|
16
|
+
const at = deps.clock.now();
|
|
17
|
+
await deps.switches.set(fleetId, { isEnabled, at });
|
|
18
|
+
await deps.requests.record({ requestId, kind: 'setEnabled', requestHash, fleetId, isEnabled, at });
|
|
19
|
+
return ok({ fleetId, isEnabled });
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=set-fleet-enabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-fleet-enabled.js","sourceRoot":"","sources":["../../../src/core/installation/set-fleet-enabled.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAKrC;IACC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACnG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: an outside MCP client calls a tool (interop 3.3). The call is a
|
|
3
|
+
* message the party's proxy ship sends to the tool's ship, and the client is
|
|
4
|
+
* answered a handle only once the fleet's send answered OK: the message is
|
|
5
|
+
* stored before any answer, and the gateway never answers OK itself. It
|
|
6
|
+
* then waits a bounded time for the answer (interop 3.3): answered within
|
|
7
|
+
* it, the client gets the answer itself; else its handle and the state.
|
|
8
|
+
*/
|
|
9
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
10
|
+
import type { Sleep } from '../mcp-out/run-party.js';
|
|
11
|
+
import type { PartyStore } from '../parties/ports.js';
|
|
12
|
+
import type { Clock } from '../shared/clock.js';
|
|
13
|
+
import { type DomainError } from '../shared/errors.js';
|
|
14
|
+
import { type Result } from '../shared/result.js';
|
|
15
|
+
import { type ListTools } from './list-tools.js';
|
|
16
|
+
import type { CallKeys, CallSender, ClientCalls } from './ports.js';
|
|
17
|
+
import { type ReadCall } from './read-client-call.js';
|
|
18
|
+
export type CallToolRefusal = DomainError<'PARTY_NOT_CREWED' | 'FLEET_UNAVAILABLE' | 'NO_SUCH_TOOL' | 'INVALID_ARGUMENTS' | 'NOT_REACHABLE' | 'SEND_REFUSED'>;
|
|
19
|
+
export type CallTool = (caller: {
|
|
20
|
+
fleetId: FleetId;
|
|
21
|
+
party: string;
|
|
22
|
+
}, call: {
|
|
23
|
+
name: string;
|
|
24
|
+
arguments: Record<string, unknown>;
|
|
25
|
+
}) => Promise<Result<ReadCall, CallToolRefusal>>;
|
|
26
|
+
interface CallToolDeps {
|
|
27
|
+
parties: PartyStore;
|
|
28
|
+
listTools: ListTools;
|
|
29
|
+
sender: CallSender;
|
|
30
|
+
calls: ClientCalls;
|
|
31
|
+
keys: CallKeys;
|
|
32
|
+
clock: Clock;
|
|
33
|
+
/** How long a call waits for its answer before it fails: the gateway default, while statements state none. */
|
|
34
|
+
deadlineMs: number;
|
|
35
|
+
sleep: Sleep;
|
|
36
|
+
/** How long a call waits for its answer before it is answered its handle. */
|
|
37
|
+
waitMs: number;
|
|
38
|
+
/** How often it reads the call while it waits. */
|
|
39
|
+
waitPollMs: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function createCallTool(deps: CallToolDeps): CallTool;
|
|
42
|
+
export {};
|