@aeolus-fleet/gateway 0.0.0-stage → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +105 -2
- package/dist/adapters/crypto/call-keys.d.ts +7 -0
- package/dist/adapters/crypto/call-keys.js +18 -0
- package/dist/adapters/crypto/call-keys.js.map +1 -0
- package/dist/adapters/crypto/oauth-secrets.d.ts +3 -0
- package/dist/adapters/crypto/oauth-secrets.js +10 -0
- package/dist/adapters/crypto/oauth-secrets.js.map +1 -0
- package/dist/adapters/crypto/page-sessions.d.ts +15 -0
- package/dist/adapters/crypto/page-sessions.js +40 -0
- package/dist/adapters/crypto/page-sessions.js.map +1 -0
- package/dist/adapters/crypto/request-hasher.d.ts +3 -0
- package/dist/adapters/crypto/request-hasher.js +4 -0
- package/dist/adapters/crypto/request-hasher.js.map +1 -0
- package/dist/adapters/crypto/request-ids.d.ts +4 -0
- package/dist/adapters/crypto/request-ids.js +7 -0
- package/dist/adapters/crypto/request-ids.js.map +1 -0
- package/dist/adapters/crypto/sealer.d.ts +14 -0
- package/dist/adapters/crypto/sealer.js +41 -0
- package/dist/adapters/crypto/sealer.js.map +1 -0
- package/dist/adapters/crypto/ship-aliases.d.ts +7 -0
- package/dist/adapters/crypto/ship-aliases.js +19 -0
- package/dist/adapters/crypto/ship-aliases.js.map +1 -0
- package/dist/adapters/crypto/sign-in-seals.d.ts +7 -0
- package/dist/adapters/crypto/sign-in-seals.js +25 -0
- package/dist/adapters/crypto/sign-in-seals.js.map +1 -0
- package/dist/adapters/crypto/waiting-seals.d.ts +3 -0
- package/dist/adapters/crypto/waiting-seals.js +24 -0
- package/dist/adapters/crypto/waiting-seals.js.map +1 -0
- package/dist/adapters/fleet/actor-door.d.ts +20 -0
- package/dist/adapters/fleet/actor-door.js +75 -0
- package/dist/adapters/fleet/actor-door.js.map +1 -0
- package/dist/adapters/fleet/console-sessions.d.ts +2 -0
- package/dist/adapters/fleet/console-sessions.js +23 -0
- package/dist/adapters/fleet/console-sessions.js.map +1 -0
- package/dist/adapters/fleet/core-version.d.ts +11 -0
- package/dist/adapters/fleet/core-version.js +18 -0
- package/dist/adapters/fleet/core-version.js.map +1 -0
- package/dist/adapters/fleet/fleet-network.d.ts +2 -0
- package/dist/adapters/fleet/fleet-network.js +34 -0
- package/dist/adapters/fleet/fleet-network.js.map +1 -0
- package/dist/adapters/fleet/logged-verified-facts.d.ts +13 -0
- package/dist/adapters/fleet/logged-verified-facts.js +18 -0
- package/dist/adapters/fleet/logged-verified-facts.js.map +1 -0
- package/dist/adapters/fleet/proxy-ship-reads.d.ts +7 -0
- package/dist/adapters/fleet/proxy-ship-reads.js +24 -0
- package/dist/adapters/fleet/proxy-ship-reads.js.map +1 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.d.ts +3 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.js +25 -0
- package/dist/adapters/fleet/proxy-ships-as-actor.js.map +1 -0
- package/dist/adapters/fleet/rest-fleet-door.d.ts +14 -0
- package/dist/adapters/fleet/rest-fleet-door.js +205 -0
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -0
- package/dist/adapters/http/add-server-page.d.ts +7 -0
- package/dist/adapters/http/add-server-page.js +175 -0
- package/dist/adapters/http/add-server-page.js.map +1 -0
- package/dist/adapters/http/delivery-page.d.ts +24 -0
- package/dist/adapters/http/delivery-page.js +115 -0
- package/dist/adapters/http/delivery-page.js.map +1 -0
- package/dist/adapters/http/html.d.ts +15 -0
- package/dist/adapters/http/html.js +53 -0
- package/dist/adapters/http/html.js.map +1 -0
- package/dist/adapters/http/live.d.ts +29 -0
- package/dist/adapters/http/live.js +100 -0
- package/dist/adapters/http/live.js.map +1 -0
- package/dist/adapters/http/mcp-endpoint.d.ts +20 -0
- package/dist/adapters/http/mcp-endpoint.js +164 -0
- package/dist/adapters/http/mcp-endpoint.js.map +1 -0
- package/dist/adapters/http/mcp-task.d.ts +45 -0
- package/dist/adapters/http/mcp-task.js +35 -0
- package/dist/adapters/http/mcp-task.js.map +1 -0
- package/dist/adapters/http/oauth-routes.d.ts +47 -0
- package/dist/adapters/http/oauth-routes.js +337 -0
- package/dist/adapters/http/oauth-routes.js.map +1 -0
- package/dist/adapters/http/outside-parties-page.d.ts +33 -0
- package/dist/adapters/http/outside-parties-page.js +153 -0
- package/dist/adapters/http/outside-parties-page.js.map +1 -0
- package/dist/adapters/http/outside-party-page.d.ts +7 -0
- package/dist/adapters/http/outside-party-page.js +212 -0
- package/dist/adapters/http/outside-party-page.js.map +1 -0
- package/dist/adapters/http/overview-page.d.ts +17 -0
- package/dist/adapters/http/overview-page.js +298 -0
- package/dist/adapters/http/overview-page.js.map +1 -0
- package/dist/adapters/http/parties-page.d.ts +7 -0
- package/dist/adapters/http/parties-page.js +139 -0
- package/dist/adapters/http/parties-page.js.map +1 -0
- package/dist/adapters/http/person-tools.d.ts +22 -0
- package/dist/adapters/http/person-tools.js +98 -0
- package/dist/adapters/http/person-tools.js.map +1 -0
- package/dist/adapters/http/scope-rows.d.ts +10 -0
- package/dist/adapters/http/scope-rows.js +30 -0
- package/dist/adapters/http/scope-rows.js.map +1 -0
- package/dist/adapters/http/signal.d.ts +61 -0
- package/dist/adapters/http/signal.js +263 -0
- package/dist/adapters/http/signal.js.map +1 -0
- package/dist/adapters/http/version.d.ts +6 -0
- package/dist/adapters/http/version.js +12 -0
- package/dist/adapters/http/version.js.map +1 -0
- package/dist/adapters/mcp/mcp-servers.d.ts +2 -0
- package/dist/adapters/mcp/mcp-servers.js +154 -0
- package/dist/adapters/mcp/mcp-servers.js.map +1 -0
- package/dist/adapters/oauth/client-metadata-documents.d.ts +9 -0
- package/dist/adapters/oauth/client-metadata-documents.js +25 -0
- package/dist/adapters/oauth/client-metadata-documents.js.map +1 -0
- package/dist/adapters/pagasae/pagasae-client.d.ts +8 -0
- package/dist/adapters/pagasae/pagasae-client.js +88 -0
- package/dist/adapters/pagasae/pagasae-client.js.map +1 -0
- package/dist/adapters/prisma/account-grants.d.ts +4 -0
- package/dist/adapters/prisma/account-grants.js +27 -0
- package/dist/adapters/prisma/account-grants.js.map +1 -0
- package/dist/adapters/prisma/calls.d.ts +4 -0
- package/dist/adapters/prisma/calls.js +35 -0
- package/dist/adapters/prisma/calls.js.map +1 -0
- package/dist/adapters/prisma/changes.d.ts +21 -0
- package/dist/adapters/prisma/changes.js +86 -0
- package/dist/adapters/prisma/changes.js.map +1 -0
- package/dist/adapters/prisma/client-calls.d.ts +4 -0
- package/dist/adapters/prisma/client-calls.js +59 -0
- package/dist/adapters/prisma/client-calls.js.map +1 -0
- package/dist/adapters/prisma/client.d.ts +8 -0
- package/dist/adapters/prisma/client.js +11 -0
- package/dist/adapters/prisma/client.js.map +1 -0
- package/dist/adapters/prisma/connection-store.d.ts +4 -0
- package/dist/adapters/prisma/connection-store.js +28 -0
- package/dist/adapters/prisma/connection-store.js.map +1 -0
- package/dist/adapters/prisma/fleet-forgetter.d.ts +4 -0
- package/dist/adapters/prisma/fleet-forgetter.js +10 -0
- package/dist/adapters/prisma/fleet-forgetter.js.map +1 -0
- package/dist/adapters/prisma/fleet-switches.d.ts +4 -0
- package/dist/adapters/prisma/fleet-switches.js +10 -0
- package/dist/adapters/prisma/fleet-switches.js.map +1 -0
- package/dist/adapters/prisma/generated/browser.d.ts +108 -0
- package/dist/adapters/prisma/generated/browser.js +18 -0
- package/dist/adapters/prisma/generated/browser.js.map +1 -0
- package/dist/adapters/prisma/generated/client.d.ts +127 -0
- package/dist/adapters/prisma/generated/client.js +38 -0
- package/dist/adapters/prisma/generated/client.js.map +1 -0
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +490 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
- package/dist/adapters/prisma/generated/enums.d.ts +1 -0
- package/dist/adapters/prisma/generated/enums.js +12 -0
- package/dist/adapters/prisma/generated/enums.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +319 -0
- package/dist/adapters/prisma/generated/internal/class.js +50 -0
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2102 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +294 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +264 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +1088 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.js +2 -0
- package/dist/adapters/prisma/generated/models/AccountGrant.js.map +1 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.d.ts +1171 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.js +2 -0
- package/dist/adapters/prisma/generated/models/AuthorizationCode.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Call.d.ts +994 -0
- package/dist/adapters/prisma/generated/models/Call.js +2 -0
- package/dist/adapters/prisma/generated/models/Call.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ClientCall.d.ts +1119 -0
- package/dist/adapters/prisma/generated/models/ClientCall.js +2 -0
- package/dist/adapters/prisma/generated/models/ClientCall.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.d.ts +1129 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.js +2 -0
- package/dist/adapters/prisma/generated/models/ClientCallReply.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Connection.d.ts +1011 -0
- package/dist/adapters/prisma/generated/models/Connection.js +2 -0
- package/dist/adapters/prisma/generated/models/Connection.js.map +1 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.d.ts +945 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.js +2 -0
- package/dist/adapters/prisma/generated/models/FleetSwitch.js.map +1 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1030 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.d.ts +1224 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.js +2 -0
- package/dist/adapters/prisma/generated/models/IssuedToken.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.d.ts +1005 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.js +2 -0
- package/dist/adapters/prisma/generated/models/OAuthClient.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.d.ts +1087 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.js +2 -0
- package/dist/adapters/prisma/generated/models/OpenedDelivery.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.d.ts +942 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js +2 -0
- package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js.map +1 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.d.ts +1035 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.js +2 -0
- package/dist/adapters/prisma/generated/models/OwnerQuestion.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Party.d.ts +1310 -0
- package/dist/adapters/prisma/generated/models/Party.js +2 -0
- package/dist/adapters/prisma/generated/models/Party.js.map +1 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.d.ts +1252 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/PendingRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.d.ts +974 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.js +2 -0
- package/dist/adapters/prisma/generated/models/PersonCrew.js.map +1 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.d.ts +1120 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js +2 -0
- package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ToolMark.d.ts +947 -0
- package/dist/adapters/prisma/generated/models/ToolMark.js +2 -0
- package/dist/adapters/prisma/generated/models/ToolMark.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +19 -0
- package/dist/adapters/prisma/generated/models.js +2 -0
- package/dist/adapters/prisma/generated/models.js.map +1 -0
- package/dist/adapters/prisma/installation-requests.d.ts +4 -0
- package/dist/adapters/prisma/installation-requests.js +25 -0
- package/dist/adapters/prisma/installation-requests.js.map +1 -0
- package/dist/adapters/prisma/migrate.d.ts +5 -0
- package/dist/adapters/prisma/migrate.js +53 -0
- package/dist/adapters/prisma/migrate.js.map +1 -0
- package/dist/adapters/prisma/oauth-stores.d.ts +5 -0
- package/dist/adapters/prisma/oauth-stores.js +85 -0
- package/dist/adapters/prisma/oauth-stores.js.map +1 -0
- package/dist/adapters/prisma/opened-deliveries.d.ts +4 -0
- package/dist/adapters/prisma/opened-deliveries.js +29 -0
- package/dist/adapters/prisma/opened-deliveries.js.map +1 -0
- package/dist/adapters/prisma/outcome-notices.d.ts +4 -0
- package/dist/adapters/prisma/outcome-notices.js +24 -0
- package/dist/adapters/prisma/outcome-notices.js.map +1 -0
- package/dist/adapters/prisma/outside-party-switches.d.ts +4 -0
- package/dist/adapters/prisma/outside-party-switches.js +10 -0
- package/dist/adapters/prisma/outside-party-switches.js.map +1 -0
- package/dist/adapters/prisma/owner-questions.d.ts +8 -0
- package/dist/adapters/prisma/owner-questions.js +54 -0
- package/dist/adapters/prisma/owner-questions.js.map +1 -0
- package/dist/adapters/prisma/party-store.d.ts +7 -0
- package/dist/adapters/prisma/party-store.js +71 -0
- package/dist/adapters/prisma/party-store.js.map +1 -0
- package/dist/adapters/prisma/pending-requests.d.ts +11 -0
- package/dist/adapters/prisma/pending-requests.js +128 -0
- package/dist/adapters/prisma/pending-requests.js.map +1 -0
- package/dist/adapters/prisma/person-crews.d.ts +4 -0
- package/dist/adapters/prisma/person-crews.js +18 -0
- package/dist/adapters/prisma/person-crews.js.map +1 -0
- package/dist/adapters/prisma/tool-marks.d.ts +4 -0
- package/dist/adapters/prisma/tool-marks.js +15 -0
- package/dist/adapters/prisma/tool-marks.js.map +1 -0
- package/dist/adapters/timers/sleep.d.ts +3 -0
- package/dist/adapters/timers/sleep.js +11 -0
- package/dist/adapters/timers/sleep.js.map +1 -0
- package/dist/adapters/trpc/router.d.ts +606 -0
- package/dist/adapters/trpc/router.js +519 -0
- package/dist/adapters/trpc/router.js.map +1 -0
- package/dist/app.d.ts +43 -0
- package/dist/app.js +446 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/aeolus-gateway.d.ts +2 -0
- package/dist/bin/aeolus-gateway.js +65 -0
- package/dist/bin/aeolus-gateway.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.js +65 -0
- package/dist/config.js.map +1 -0
- package/dist/core/actors/authenticate-actor.d.ts +54 -0
- package/dist/core/actors/authenticate-actor.js +42 -0
- package/dist/core/actors/authenticate-actor.js.map +1 -0
- package/dist/core/actors/credential-of.d.ts +27 -0
- package/dist/core/actors/credential-of.js +25 -0
- package/dist/core/actors/credential-of.js.map +1 -0
- package/dist/core/connection/connect.d.ts +26 -0
- package/dist/core/connection/connect.js +58 -0
- package/dist/core/connection/connect.js.map +1 -0
- package/dist/core/connection/ports.d.ts +92 -0
- package/dist/core/connection/ports.js +2 -0
- package/dist/core/connection/ports.js.map +1 -0
- package/dist/core/connection/read-connection.d.ts +14 -0
- package/dist/core/connection/read-connection.js +24 -0
- package/dist/core/connection/read-connection.js.map +1 -0
- package/dist/core/installation/delete-fleet.d.ts +21 -0
- package/dist/core/installation/delete-fleet.js +21 -0
- package/dist/core/installation/delete-fleet.js.map +1 -0
- package/dist/core/installation/ports.d.ts +43 -0
- package/dist/core/installation/ports.js +2 -0
- package/dist/core/installation/ports.js.map +1 -0
- package/dist/core/installation/read-fleet.d.ts +18 -0
- package/dist/core/installation/read-fleet.js +9 -0
- package/dist/core/installation/read-fleet.js.map +1 -0
- package/dist/core/installation/request-id.d.ts +8 -0
- package/dist/core/installation/request-id.js +10 -0
- package/dist/core/installation/request-id.js.map +1 -0
- package/dist/core/installation/served.d.ts +12 -0
- package/dist/core/installation/served.js +8 -0
- package/dist/core/installation/served.js.map +1 -0
- package/dist/core/installation/set-fleet-enabled.d.ts +25 -0
- package/dist/core/installation/set-fleet-enabled.js +22 -0
- package/dist/core/installation/set-fleet-enabled.js.map +1 -0
- package/dist/core/mcp-in/call-tool.d.ts +42 -0
- package/dist/core/mcp-in/call-tool.js +82 -0
- package/dist/core/mcp-in/call-tool.js.map +1 -0
- package/dist/core/mcp-in/client-call.d.ts +51 -0
- package/dist/core/mcp-in/client-call.js +39 -0
- package/dist/core/mcp-in/client-call.js.map +1 -0
- package/dist/core/mcp-in/collect-replies.d.ts +22 -0
- package/dist/core/mcp-in/collect-replies.js +66 -0
- package/dist/core/mcp-in/collect-replies.js.map +1 -0
- package/dist/core/mcp-in/list-tools.d.ts +48 -0
- package/dist/core/mcp-in/list-tools.js +70 -0
- package/dist/core/mcp-in/list-tools.js.map +1 -0
- package/dist/core/mcp-in/ports.d.ts +108 -0
- package/dist/core/mcp-in/ports.js +2 -0
- package/dist/core/mcp-in/ports.js.map +1 -0
- package/dist/core/mcp-in/read-client-call.d.ts +23 -0
- package/dist/core/mcp-in/read-client-call.js +15 -0
- package/dist/core/mcp-in/read-client-call.js.map +1 -0
- package/dist/core/mcp-out/content-types.d.ts +12 -0
- package/dist/core/mcp-out/content-types.js +28 -0
- package/dist/core/mcp-out/content-types.js.map +1 -0
- package/dist/core/mcp-out/hand-call.d.ts +105 -0
- package/dist/core/mcp-out/hand-call.js +118 -0
- package/dist/core/mcp-out/hand-call.js.map +1 -0
- package/dist/core/mcp-out/mark-tool.d.ts +20 -0
- package/dist/core/mcp-out/mark-tool.js +17 -0
- package/dist/core/mcp-out/mark-tool.js.map +1 -0
- package/dist/core/mcp-out/ports.d.ts +66 -0
- package/dist/core/mcp-out/ports.js +2 -0
- package/dist/core/mcp-out/ports.js.map +1 -0
- package/dist/core/mcp-out/run-party.d.ts +26 -0
- package/dist/core/mcp-out/run-party.js +62 -0
- package/dist/core/mcp-out/run-party.js.map +1 -0
- package/dist/core/mcp-out/state-party.d.ts +39 -0
- package/dist/core/mcp-out/state-party.js +30 -0
- package/dist/core/mcp-out/state-party.js.map +1 -0
- package/dist/core/mcp-out/statement.d.ts +36 -0
- package/dist/core/mcp-out/statement.js +34 -0
- package/dist/core/mcp-out/statement.js.map +1 -0
- package/dist/core/oauth/authenticate-access-token.d.ts +25 -0
- package/dist/core/oauth/authenticate-access-token.js +19 -0
- package/dist/core/oauth/authenticate-access-token.js.map +1 -0
- package/dist/core/oauth/exchange-token.d.ts +32 -0
- package/dist/core/oauth/exchange-token.js +98 -0
- package/dist/core/oauth/exchange-token.js.map +1 -0
- package/dist/core/oauth/issue-code.d.ts +23 -0
- package/dist/core/oauth/issue-code.js +34 -0
- package/dist/core/oauth/issue-code.js.map +1 -0
- package/dist/core/oauth/ports.d.ts +105 -0
- package/dist/core/oauth/ports.js +2 -0
- package/dist/core/oauth/ports.js.map +1 -0
- package/dist/core/oauth/read-authorization.d.ts +43 -0
- package/dist/core/oauth/read-authorization.js +74 -0
- package/dist/core/oauth/read-authorization.js.map +1 -0
- package/dist/core/oauth/redirect-uri.d.ts +6 -0
- package/dist/core/oauth/redirect-uri.js +20 -0
- package/dist/core/oauth/redirect-uri.js.map +1 -0
- package/dist/core/oauth/register-client.d.ts +22 -0
- package/dist/core/oauth/register-client.js +20 -0
- package/dist/core/oauth/register-client.js.map +1 -0
- package/dist/core/operator/authenticate-operator.d.ts +22 -0
- package/dist/core/operator/authenticate-operator.js +26 -0
- package/dist/core/operator/authenticate-operator.js.map +1 -0
- package/dist/core/operator/ports.d.ts +15 -0
- package/dist/core/operator/ports.js +2 -0
- package/dist/core/operator/ports.js.map +1 -0
- package/dist/core/outside-parties/ports.d.ts +17 -0
- package/dist/core/outside-parties/ports.js +2 -0
- package/dist/core/outside-parties/ports.js.map +1 -0
- package/dist/core/outside-parties/set-outside-parties.d.ts +36 -0
- package/dist/core/outside-parties/set-outside-parties.js +38 -0
- package/dist/core/outside-parties/set-outside-parties.js.map +1 -0
- package/dist/core/parties/approve-party.d.ts +55 -0
- package/dist/core/parties/approve-party.js +127 -0
- package/dist/core/parties/approve-party.js.map +1 -0
- package/dist/core/parties/change-party.d.ts +42 -0
- package/dist/core/parties/change-party.js +49 -0
- package/dist/core/parties/change-party.js.map +1 -0
- package/dist/core/parties/check-server.d.ts +24 -0
- package/dist/core/parties/check-server.js +21 -0
- package/dist/core/parties/check-server.js.map +1 -0
- package/dist/core/parties/crew-party.d.ts +21 -0
- package/dist/core/parties/crew-party.js +29 -0
- package/dist/core/parties/crew-party.js.map +1 -0
- package/dist/core/parties/list-parties.d.ts +29 -0
- package/dist/core/parties/list-parties.js +39 -0
- package/dist/core/parties/list-parties.js.map +1 -0
- package/dist/core/parties/party.d.ts +52 -0
- package/dist/core/parties/party.js +24 -0
- package/dist/core/parties/party.js.map +1 -0
- package/dist/core/parties/ports.d.ts +74 -0
- package/dist/core/parties/ports.js +2 -0
- package/dist/core/parties/ports.js.map +1 -0
- package/dist/core/parties/read-party-tools.d.ts +22 -0
- package/dist/core/parties/read-party-tools.js +22 -0
- package/dist/core/parties/read-party-tools.js.map +1 -0
- package/dist/core/parties/retire-party.d.ts +29 -0
- package/dist/core/parties/retire-party.js +43 -0
- package/dist/core/parties/retire-party.js.map +1 -0
- package/dist/core/parties/shown-party.d.ts +27 -0
- package/dist/core/parties/shown-party.js +10 -0
- package/dist/core/parties/shown-party.js.map +1 -0
- package/dist/core/people/answer-delivery.d.ts +24 -0
- package/dist/core/people/answer-delivery.js +28 -0
- package/dist/core/people/answer-delivery.js.map +1 -0
- package/dist/core/people/crew-person-ship.d.ts +42 -0
- package/dist/core/people/crew-person-ship.js +59 -0
- package/dist/core/people/crew-person-ship.js.map +1 -0
- package/dist/core/people/done-delivery.d.ts +16 -0
- package/dist/core/people/done-delivery.js +9 -0
- package/dist/core/people/done-delivery.js.map +1 -0
- package/dist/core/people/inbox-entry.d.ts +14 -0
- package/dist/core/people/inbox-entry.js +11 -0
- package/dist/core/people/inbox-entry.js.map +1 -0
- package/dist/core/people/open-delivery.d.ts +30 -0
- package/dist/core/people/open-delivery.js +40 -0
- package/dist/core/people/open-delivery.js.map +1 -0
- package/dist/core/people/opened-of.d.ts +29 -0
- package/dist/core/people/opened-of.js +30 -0
- package/dist/core/people/opened-of.js.map +1 -0
- package/dist/core/people/person-crew.d.ts +39 -0
- package/dist/core/people/person-crew.js +61 -0
- package/dist/core/people/person-crew.js.map +1 -0
- package/dist/core/people/ports.d.ts +102 -0
- package/dist/core/people/ports.js +2 -0
- package/dist/core/people/ports.js.map +1 -0
- package/dist/core/people/read-inbox.d.ts +37 -0
- package/dist/core/people/read-inbox.js +36 -0
- package/dist/core/people/read-inbox.js.map +1 -0
- package/dist/core/requests/ask-for-client.d.ts +45 -0
- package/dist/core/requests/ask-for-client.js +33 -0
- package/dist/core/requests/ask-for-client.js.map +1 -0
- package/dist/core/requests/ask-for-server.d.ts +32 -0
- package/dist/core/requests/ask-for-server.js +42 -0
- package/dist/core/requests/ask-for-server.js.map +1 -0
- package/dist/core/requests/ask-owners.d.ts +28 -0
- package/dist/core/requests/ask-owners.js +85 -0
- package/dist/core/requests/ask-owners.js.map +1 -0
- package/dist/core/requests/decide-request.d.ts +53 -0
- package/dist/core/requests/decide-request.js +83 -0
- package/dist/core/requests/decide-request.js.map +1 -0
- package/dist/core/requests/expire-requests.d.ts +14 -0
- package/dist/core/requests/expire-requests.js +21 -0
- package/dist/core/requests/expire-requests.js.map +1 -0
- package/dist/core/requests/list-mine.d.ts +16 -0
- package/dist/core/requests/list-mine.js +20 -0
- package/dist/core/requests/list-mine.js.map +1 -0
- package/dist/core/requests/list-to-decide.d.ts +11 -0
- package/dist/core/requests/list-to-decide.js +13 -0
- package/dist/core/requests/list-to-decide.js.map +1 -0
- package/dist/core/requests/open-request.d.ts +21 -0
- package/dist/core/requests/open-request.js +26 -0
- package/dist/core/requests/open-request.js.map +1 -0
- package/dist/core/requests/outcome-notice.d.ts +13 -0
- package/dist/core/requests/outcome-notice.js +26 -0
- package/dist/core/requests/outcome-notice.js.map +1 -0
- package/dist/core/requests/ports.d.ts +191 -0
- package/dist/core/requests/ports.js +2 -0
- package/dist/core/requests/ports.js.map +1 -0
- package/dist/core/requests/read-waiting.d.ts +46 -0
- package/dist/core/requests/read-waiting.js +41 -0
- package/dist/core/requests/read-waiting.js.map +1 -0
- package/dist/core/requests/request-state.d.ts +5 -0
- package/dist/core/requests/request-state.js +10 -0
- package/dist/core/requests/request-state.js.map +1 -0
- package/dist/core/requests/tell-outcomes.d.ts +24 -0
- package/dist/core/requests/tell-outcomes.js +39 -0
- package/dist/core/requests/tell-outcomes.js.map +1 -0
- package/dist/core/requests/watch-waiting.d.ts +32 -0
- package/dist/core/requests/watch-waiting.js +31 -0
- package/dist/core/requests/watch-waiting.js.map +1 -0
- package/dist/core/shared/clock.d.ts +4 -0
- package/dist/core/shared/clock.js +2 -0
- package/dist/core/shared/clock.js.map +1 -0
- package/dist/core/shared/errors.d.ts +10 -0
- package/dist/core/shared/errors.js +6 -0
- package/dist/core/shared/errors.js.map +1 -0
- package/dist/core/shared/result.d.ts +16 -0
- package/dist/core/shared/result.js +7 -0
- package/dist/core/shared/result.js.map +1 -0
- package/dist/core/sign-in/account-token.d.ts +42 -0
- package/dist/core/sign-in/account-token.js +46 -0
- package/dist/core/sign-in/account-token.js.map +1 -0
- package/dist/core/sign-in/complete-sign-in.d.ts +66 -0
- package/dist/core/sign-in/complete-sign-in.js +73 -0
- package/dist/core/sign-in/complete-sign-in.js.map +1 -0
- package/dist/core/sign-in/end-sign-ins.d.ts +19 -0
- package/dist/core/sign-in/end-sign-ins.js +17 -0
- package/dist/core/sign-in/end-sign-ins.js.map +1 -0
- package/dist/core/sign-in/ports.d.ts +115 -0
- package/dist/core/sign-in/ports.js +2 -0
- package/dist/core/sign-in/ports.js.map +1 -0
- package/dist/core/sign-in/sign-out.d.ts +10 -0
- package/dist/core/sign-in/sign-out.js +9 -0
- package/dist/core/sign-in/sign-out.js.map +1 -0
- package/dist/core/sign-in/start-page-sign-in.d.ts +25 -0
- package/dist/core/sign-in/start-page-sign-in.js +30 -0
- package/dist/core/sign-in/start-page-sign-in.js.map +1 -0
- package/dist/core/sign-in/start-sign-in.d.ts +30 -0
- package/dist/core/sign-in/start-sign-in.js +25 -0
- package/dist/core/sign-in/start-sign-in.js.map +1 -0
- package/dist/core/vault/credential.d.ts +18 -0
- package/dist/core/vault/credential.js +2 -0
- package/dist/core/vault/credential.js.map +1 -0
- package/dist/outcome-worker.d.ts +29 -0
- package/dist/outcome-worker.js +60 -0
- package/dist/outcome-worker.js.map +1 -0
- package/dist/party-workers.d.ts +32 -0
- package/dist/party-workers.js +57 -0
- package/dist/party-workers.js.map +1 -0
- package/package.json +70 -4
- package/prisma.config.ts +18 -0
- package/src/adapters/prisma/migrations/20261018200000_init/migration.sql +35 -0
- package/src/adapters/prisma/migrations/20261018210000_parties/migration.sql +19 -0
- package/src/adapters/prisma/migrations/20261018220000_tool_marks/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018230000_calls/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261019090000_oauth/migration.sql +60 -0
- package/src/adapters/prisma/migrations/20261019100000_client_parties/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261019110000_oauth_parties/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261019120000_client_calls/migration.sql +15 -0
- package/src/adapters/prisma/migrations/20261019130000_client_call_replies/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261019140000_identity_providers/migration.sql +10 -0
- package/src/adapters/prisma/migrations/20261020090000_no_identity_providers/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020100000_account_grants_in_tokens/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261020110000_account_grants/migration.sql +15 -0
- package/src/adapters/prisma/migrations/20261020120000_person_crews/migration.sql +9 -0
- package/src/adapters/prisma/migrations/20261020130000_opened_deliveries/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261020140000_pending_requests/migration.sql +26 -0
- package/src/adapters/prisma/migrations/20261020150000_outside_party_switches/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261020160000_pending_requests_told/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020170000_request_outcome_notices/migration.sql +17 -0
- package/src/adapters/prisma/migrations/20261020180000_owner_questions/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261020190000_request_changes/migration.sql +12 -0
- package/src/adapters/prisma/migrations/20261020200000_account_grant_scopes/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020210000_party_owner_from_fleet/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261020220000_client_call_deadline_optional/migration.sql +2 -0
- package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
- package/src/adapters/prisma/schema.prisma +312 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { IssuedTokens } from '../oauth/ports.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { AccountGrants, Pagasae } from './ports.js';
|
|
6
|
+
/** An account token is refreshed when less than this is left of it, so a call never carries one that ends on the way. */
|
|
7
|
+
export declare const ACCOUNT_TOKEN_MARGIN_MS = 60000;
|
|
8
|
+
/**
|
|
9
|
+
* Why there is no account token to call with:
|
|
10
|
+
* - signedOut: the gateway holds no such grant, or pagasae ended it, so the person signs in again;
|
|
11
|
+
* - pagasaeUnavailable: pagasae did not answer; the grant stays.
|
|
12
|
+
*/
|
|
13
|
+
export type AccountTokenRefusal = {
|
|
14
|
+
readonly kind: 'signedOut';
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'pagasaeUnavailable';
|
|
17
|
+
};
|
|
18
|
+
/** An account token to call with, and the account, person ship and scopes it names. */
|
|
19
|
+
export interface AccountToken {
|
|
20
|
+
readonly accountToken: string;
|
|
21
|
+
readonly accountId: string;
|
|
22
|
+
readonly personShipId: ShipId | null;
|
|
23
|
+
readonly scopes: readonly string[];
|
|
24
|
+
}
|
|
25
|
+
export type AccountTokenOf = (grant: {
|
|
26
|
+
fleetId: FleetId;
|
|
27
|
+
grantId: string;
|
|
28
|
+
}) => Promise<Result<AccountToken, AccountTokenRefusal>>;
|
|
29
|
+
/**
|
|
30
|
+
* Use case: the account token a signed-in person's call carries to core
|
|
31
|
+
* (decisions 0054, 0058). It lasts 10 minutes; a minute before it ends the
|
|
32
|
+
* gateway refreshes it through pagasae, which replaces the refresh token. A
|
|
33
|
+
* grant's calls made together share one refresh, as pagasae ends a grant
|
|
34
|
+
* whose refresh token comes twice. pagasae refusing ends the grant here too,
|
|
35
|
+
* revoking its client's tokens, so the person signs in again.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createAccountTokenOf(deps: {
|
|
38
|
+
grants: AccountGrants;
|
|
39
|
+
tokens: IssuedTokens;
|
|
40
|
+
pagasae: Pagasae;
|
|
41
|
+
clock: Clock;
|
|
42
|
+
}): AccountTokenOf;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { err, ok } from '../shared/result.js';
|
|
2
|
+
/** An account token is refreshed when less than this is left of it, so a call never carries one that ends on the way. */
|
|
3
|
+
export const ACCOUNT_TOKEN_MARGIN_MS = 60_000;
|
|
4
|
+
/**
|
|
5
|
+
* Use case: the account token a signed-in person's call carries to core
|
|
6
|
+
* (decisions 0054, 0058). It lasts 10 minutes; a minute before it ends the
|
|
7
|
+
* gateway refreshes it through pagasae, which replaces the refresh token. A
|
|
8
|
+
* grant's calls made together share one refresh, as pagasae ends a grant
|
|
9
|
+
* whose refresh token comes twice. pagasae refusing ends the grant here too,
|
|
10
|
+
* revoking its client's tokens, so the person signs in again.
|
|
11
|
+
*/
|
|
12
|
+
export function createAccountTokenOf(deps) {
|
|
13
|
+
const refreshing = new Map();
|
|
14
|
+
const fresh = async ({ fleetId, grantId }) => {
|
|
15
|
+
const grant = await deps.grants.find(fleetId, grantId);
|
|
16
|
+
if (grant === undefined) {
|
|
17
|
+
return err({ kind: 'signedOut' });
|
|
18
|
+
}
|
|
19
|
+
if (grant.accountTokenExpiresAt.getTime() - ACCOUNT_TOKEN_MARGIN_MS > deps.clock.now().getTime()) {
|
|
20
|
+
return ok({ accountToken: grant.accountToken, accountId: grant.accountId, personShipId: grant.personShipId, scopes: grant.scopes });
|
|
21
|
+
}
|
|
22
|
+
const refreshed = await deps.pagasae.refresh(grant.refreshToken);
|
|
23
|
+
if (!refreshed.isOk && refreshed.error.kind === 'unavailable') {
|
|
24
|
+
return err({ kind: 'pagasaeUnavailable' });
|
|
25
|
+
}
|
|
26
|
+
if (!refreshed.isOk || refreshed.value.fleetId !== fleetId) {
|
|
27
|
+
await deps.grants.end(fleetId, grantId);
|
|
28
|
+
await deps.tokens.revokeGrant(fleetId, grantId);
|
|
29
|
+
return err({ kind: 'signedOut' });
|
|
30
|
+
}
|
|
31
|
+
const { refreshToken, accountToken, accountTokenExpiresAt, personShipId, scopes } = refreshed.value;
|
|
32
|
+
await deps.grants.renew({ fleetId, grantId }, { refreshToken, accountToken, accountTokenExpiresAt, personShipId, scopes });
|
|
33
|
+
return ok({ accountToken, accountId: grant.accountId, personShipId, scopes });
|
|
34
|
+
};
|
|
35
|
+
return (grant) => {
|
|
36
|
+
const key = `${grant.fleetId}/${grant.grantId}`;
|
|
37
|
+
const held = refreshing.get(key);
|
|
38
|
+
if (held !== undefined) {
|
|
39
|
+
return held;
|
|
40
|
+
}
|
|
41
|
+
const answer = fresh(grant).finally(() => refreshing.delete(key));
|
|
42
|
+
refreshing.set(key, answer);
|
|
43
|
+
return answer;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=account-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-token.js","sourceRoot":"","sources":["../../../src/core/sign-in/account-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { AuthorizationCodes, OAuthSecrets } from '../oauth/ports.js';
|
|
3
|
+
import type { AuthorizationRefusal, ReadAuthorization } from '../oauth/read-authorization.js';
|
|
4
|
+
import type { AskForClient, ClientAnswer } from '../requests/ask-for-client.js';
|
|
5
|
+
import type { Clock } from '../shared/clock.js';
|
|
6
|
+
import { type Result } from '../shared/result.js';
|
|
7
|
+
import type { AccountGrants, Pagasae, PageSessions, SignInSeals } from './ports.js';
|
|
8
|
+
/**
|
|
9
|
+
* Why a sign-in gave the client no code, beside the request's own refusals:
|
|
10
|
+
* - unknownSignIn: the gateway sealed no sign-in into this state, or its 10 minutes passed;
|
|
11
|
+
* - otherBrowser: the browser that came back does not hold the sign-in's secret, as when another site makes it finish its own;
|
|
12
|
+
* - pagasaeRefused: pagasae did not redeem its code, for the reason given;
|
|
13
|
+
* - fleetNotServed: the account's fleet is one this gateway does not serve;
|
|
14
|
+
* - outsidePartiesOff: the person asked for access for the client while the fleet's outside parties are off (interop I-3).
|
|
15
|
+
*/
|
|
16
|
+
export type SignInRefusal = AuthorizationRefusal | {
|
|
17
|
+
readonly kind: 'unknownSignIn';
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'otherBrowser';
|
|
20
|
+
} | {
|
|
21
|
+
readonly kind: 'pagasaeRefused';
|
|
22
|
+
readonly message: string;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: 'fleetNotServed';
|
|
25
|
+
} | {
|
|
26
|
+
readonly kind: 'outsidePartiesOff';
|
|
27
|
+
};
|
|
28
|
+
/** What a sign-in answers: the client's answer, or, for the gateway's pages, the page session to hold and the page to go back to. */
|
|
29
|
+
export type SignInAnswer = ClientAnswer | {
|
|
30
|
+
readonly kind: 'signedIn';
|
|
31
|
+
readonly session: string;
|
|
32
|
+
readonly redirectTo: string;
|
|
33
|
+
};
|
|
34
|
+
interface Back {
|
|
35
|
+
state?: string | undefined;
|
|
36
|
+
code?: string | undefined;
|
|
37
|
+
error?: string | undefined;
|
|
38
|
+
browserSecret?: string | undefined;
|
|
39
|
+
}
|
|
40
|
+
export type CompleteSignIn = (back: Back) => Promise<Result<SignInAnswer, SignInRefusal>>;
|
|
41
|
+
/**
|
|
42
|
+
* Use case: pagasae sends the person back. Their sign-in is opened from its
|
|
43
|
+
* state, the client's request read again, and pagasae's code redeemed with
|
|
44
|
+
* the gateway's verifier; pagasae takes a code once. Then, as the person
|
|
45
|
+
* picked: the account's grant is kept, and the client is sent back with the
|
|
46
|
+
* gateway's own code for it, acting in the fleet as the account with no
|
|
47
|
+
* approval (orchestrator-1, slice 7 Q1); or the account asks for access for
|
|
48
|
+
* the client, as an outside party (decision 0056). A sign-in to the
|
|
49
|
+
* gateway's pages keeps the account's grant too, and answers a page session
|
|
50
|
+
* naming it, so the pages act as the account.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createCompleteSignIn(deps: {
|
|
53
|
+
readAuthorization: ReadAuthorization;
|
|
54
|
+
seals: SignInSeals;
|
|
55
|
+
pagasae: Pagasae;
|
|
56
|
+
grants: AccountGrants;
|
|
57
|
+
codes: AuthorizationCodes;
|
|
58
|
+
secrets: OAuthSecrets;
|
|
59
|
+
clock: Clock;
|
|
60
|
+
issuer: string;
|
|
61
|
+
/** Whether the gateway serves the fleet: connected to it, and switched on where an installation switches fleets (decision 0021). */
|
|
62
|
+
servesFleet: (fleetId: FleetId) => Promise<boolean>;
|
|
63
|
+
askForClient: AskForClient;
|
|
64
|
+
sessions: PageSessions;
|
|
65
|
+
}): CompleteSignIn;
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { issueCode, redirectWith } from '../oauth/issue-code.js';
|
|
2
|
+
import { err, ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: pagasae sends the person back. Their sign-in is opened from its
|
|
5
|
+
* state, the client's request read again, and pagasae's code redeemed with
|
|
6
|
+
* the gateway's verifier; pagasae takes a code once. Then, as the person
|
|
7
|
+
* picked: the account's grant is kept, and the client is sent back with the
|
|
8
|
+
* gateway's own code for it, acting in the fleet as the account with no
|
|
9
|
+
* approval (orchestrator-1, slice 7 Q1); or the account asks for access for
|
|
10
|
+
* the client, as an outside party (decision 0056). A sign-in to the
|
|
11
|
+
* gateway's pages keeps the account's grant too, and answers a page session
|
|
12
|
+
* naming it, so the pages act as the account.
|
|
13
|
+
*/
|
|
14
|
+
export function createCompleteSignIn(deps) {
|
|
15
|
+
/** A sign-in to the pages: the grant kept, and the session naming it; no client to send back, so pagasae's error is said. */
|
|
16
|
+
const signInToPages = async (signIn, { code, error }) => {
|
|
17
|
+
if (error !== undefined || code === undefined) {
|
|
18
|
+
return err({ kind: 'pagasaeRefused', message: error ?? 'pagasae sent no code' });
|
|
19
|
+
}
|
|
20
|
+
const redeemed = await deps.pagasae.redeemCode({ code, verifier: signIn.verifier });
|
|
21
|
+
if (!redeemed.isOk) {
|
|
22
|
+
return err({ kind: 'pagasaeRefused', message: redeemed.error.reason });
|
|
23
|
+
}
|
|
24
|
+
const { fleetId, accountId, personShipId, scopes, refreshToken, accountToken, accountTokenExpiresAt } = redeemed.value;
|
|
25
|
+
if (!(await deps.servesFleet(fleetId))) {
|
|
26
|
+
return err({ kind: 'fleetNotServed' });
|
|
27
|
+
}
|
|
28
|
+
const grantId = deps.secrets.newSecret();
|
|
29
|
+
await deps.grants.save({ grantId, fleetId, accountId, personShipId, scopes, refreshToken, accountToken, accountTokenExpiresAt });
|
|
30
|
+
return ok({ kind: 'signedIn', session: deps.sessions.seal({ fleetId, grantId }), redirectTo: signIn.returnTo });
|
|
31
|
+
};
|
|
32
|
+
return async (back) => {
|
|
33
|
+
const { state, code, error, browserSecret } = back;
|
|
34
|
+
const signIn = state === undefined ? undefined : deps.seals.open(state);
|
|
35
|
+
if (signIn === undefined || signIn.expiresAt.getTime() <= deps.clock.now().getTime()) {
|
|
36
|
+
return err({ kind: 'unknownSignIn' });
|
|
37
|
+
}
|
|
38
|
+
if (browserSecret !== signIn.browserSecret) {
|
|
39
|
+
return err({ kind: 'otherBrowser' });
|
|
40
|
+
}
|
|
41
|
+
if (signIn.holder === 'page') {
|
|
42
|
+
return signInToPages(signIn, back);
|
|
43
|
+
}
|
|
44
|
+
const read = await deps.readAuthorization(signIn.request);
|
|
45
|
+
if (!read.isOk) {
|
|
46
|
+
return read;
|
|
47
|
+
}
|
|
48
|
+
const authorization = read.value;
|
|
49
|
+
if (error !== undefined || code === undefined) {
|
|
50
|
+
return ok({ kind: 'answered', redirectTo: redirectWith(authorization.redirectUri, { error: 'access_denied', state: authorization.state, iss: deps.issuer }) });
|
|
51
|
+
}
|
|
52
|
+
const redeemed = await deps.pagasae.redeemCode({ code, verifier: signIn.verifier });
|
|
53
|
+
if (!redeemed.isOk) {
|
|
54
|
+
return err({ kind: 'pagasaeRefused', message: redeemed.error.reason });
|
|
55
|
+
}
|
|
56
|
+
const tokens = redeemed.value;
|
|
57
|
+
if (!(await deps.servesFleet(tokens.fleetId))) {
|
|
58
|
+
return err({ kind: 'fleetNotServed' });
|
|
59
|
+
}
|
|
60
|
+
if (authorization.clientFleetId !== null && authorization.clientFleetId !== tokens.fleetId) {
|
|
61
|
+
return err({ kind: 'invalidClient', message: `${authorization.clientName} is registered for another fleet` });
|
|
62
|
+
}
|
|
63
|
+
const { fleetId, accountId, personShipId, scopes, refreshToken, accountToken, accountTokenExpiresAt } = tokens;
|
|
64
|
+
if (signIn.holder === 'party') {
|
|
65
|
+
const asked = await deps.askForClient({ fleetId, requester: { accountId, personShipId }, authorization, request: signIn.request, browserSecret: signIn.browserSecret });
|
|
66
|
+
return asked.isOk ? asked : err({ kind: 'outsidePartiesOff' });
|
|
67
|
+
}
|
|
68
|
+
const grantId = deps.secrets.newSecret();
|
|
69
|
+
await deps.grants.save({ grantId, fleetId, accountId, personShipId, scopes, refreshToken, accountToken, accountTokenExpiresAt });
|
|
70
|
+
return ok({ kind: 'answered', redirectTo: await issueCode(deps, { fleetId, authorization, holder: { kind: 'account', grantId } }) });
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=complete-sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complete-sign-in.js","sourceRoot":"","sources":["../../../src/core/sign-in/complete-sign-in.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { IssuedTokens } from '../oauth/ports.js';
|
|
3
|
+
import type { AccountGrants } from './ports.js';
|
|
4
|
+
export type EndSignIns = (account: {
|
|
5
|
+
fleetId: FleetId;
|
|
6
|
+
accountId: string;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Use case: pagasae disabled the account and tells the gateway, which ends
|
|
10
|
+
* its gateway tokens there (decision 0055): every sign-in of the account in
|
|
11
|
+
* the fleet ends, and its clients' tokens are revoked, so each client is
|
|
12
|
+
* refused at its next call. pagasae refuses the account a new sign-in. A
|
|
13
|
+
* grant is ended before its tokens are revoked, as when pagasae refuses a
|
|
14
|
+
* refresh: a call with a token whose grant is gone is signed out already.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createEndSignIns(deps: {
|
|
17
|
+
grants: AccountGrants;
|
|
18
|
+
tokens: IssuedTokens;
|
|
19
|
+
}): EndSignIns;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: pagasae disabled the account and tells the gateway, which ends
|
|
3
|
+
* its gateway tokens there (decision 0055): every sign-in of the account in
|
|
4
|
+
* the fleet ends, and its clients' tokens are revoked, so each client is
|
|
5
|
+
* refused at its next call. pagasae refuses the account a new sign-in. A
|
|
6
|
+
* grant is ended before its tokens are revoked, as when pagasae refuses a
|
|
7
|
+
* refresh: a call with a token whose grant is gone is signed out already.
|
|
8
|
+
*/
|
|
9
|
+
export function createEndSignIns(deps) {
|
|
10
|
+
return async ({ fleetId, accountId }) => {
|
|
11
|
+
for (const { grantId } of await deps.grants.ofAccount(fleetId, accountId)) {
|
|
12
|
+
await deps.grants.end(fleetId, grantId);
|
|
13
|
+
await deps.tokens.revokeGrant(fleetId, grantId);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=end-sign-ins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"end-sign-ins.js","sourceRoot":"","sources":["../../../src/core/sign-in/end-sign-ins.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAqD;IACpF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A person signs in to the gateway through pagasae, the one identity
|
|
3
|
+
* provider (decision 0054): the gateway is its OpenID Connect client, and
|
|
4
|
+
* the person acts in the fleet as their account, by its account token, from
|
|
5
|
+
* their MCP client or on the gateway's own pages.
|
|
6
|
+
*/
|
|
7
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
8
|
+
import type { Result } from '../shared/result.js';
|
|
9
|
+
/**
|
|
10
|
+
* A person's sign-in at pagasae under way, with the gateway's PKCE verifier:
|
|
11
|
+
* for an MCP client, its authorization request; for the gateway's pages, the
|
|
12
|
+
* page to go back to.
|
|
13
|
+
*/
|
|
14
|
+
export type PendingSignIn = ClientSignIn | PageSignIn;
|
|
15
|
+
interface SignInUnderWay {
|
|
16
|
+
readonly verifier: string;
|
|
17
|
+
/** The secret the browser that started the sign-in holds, so no other browser finishes it (login CSRF). */
|
|
18
|
+
readonly browserSecret: string;
|
|
19
|
+
readonly expiresAt: Date;
|
|
20
|
+
}
|
|
21
|
+
export interface ClientSignIn extends SignInUnderWay {
|
|
22
|
+
readonly request: Readonly<Record<string, string | undefined>>;
|
|
23
|
+
/** What the person picked the client to act as: their account, or a party they ask access for (Q1 a). */
|
|
24
|
+
readonly holder: SignInHolder;
|
|
25
|
+
}
|
|
26
|
+
export interface PageSignIn extends SignInUnderWay {
|
|
27
|
+
readonly holder: 'page';
|
|
28
|
+
/** The gateway's own path the browser goes back to once signed in. */
|
|
29
|
+
readonly returnTo: string;
|
|
30
|
+
}
|
|
31
|
+
/** What a client acts as once its person signed in: the account itself, or an outside party (decision 0056). */
|
|
32
|
+
export type SignInHolder = 'account' | 'party';
|
|
33
|
+
/**
|
|
34
|
+
* Outbound port: seals a sign-in under way into the state pagasae carries
|
|
35
|
+
* back, so the gateway stores nothing before it knows the fleet, and the
|
|
36
|
+
* verifier stays secret on the way.
|
|
37
|
+
*/
|
|
38
|
+
export interface SignInSeals {
|
|
39
|
+
seal(signIn: PendingSignIn): string;
|
|
40
|
+
/** The sign-in a state seals; none for a state the gateway did not seal. */
|
|
41
|
+
open(state: string): PendingSignIn | undefined;
|
|
42
|
+
}
|
|
43
|
+
/** What pagasae answers for a redeemed code: the account token, what it names, and the refresh token behind it. */
|
|
44
|
+
export interface PagasaeTokens {
|
|
45
|
+
readonly accountToken: string;
|
|
46
|
+
readonly accountTokenExpiresAt: Date;
|
|
47
|
+
readonly refreshToken: string;
|
|
48
|
+
/** The fleet pagasae signed the account token for: the one the person picked, or their only one. */
|
|
49
|
+
readonly fleetId: FleetId;
|
|
50
|
+
readonly accountId: string;
|
|
51
|
+
/** The account's person ship in the fleet, if it has one (decision 0052). */
|
|
52
|
+
readonly personShipId: ShipId | null;
|
|
53
|
+
/** The scopes the account token carries: what the account may do in the fleet. */
|
|
54
|
+
readonly scopes: readonly string[];
|
|
55
|
+
}
|
|
56
|
+
/** Outbound port: pagasae, where the gateway sends a person to sign in, and redeems the code they come back with. */
|
|
57
|
+
export interface Pagasae {
|
|
58
|
+
/** pagasae's authorize address for the gateway, with the state and the PKCE challenge, naming no fleet. */
|
|
59
|
+
authorizeUrl(signIn: {
|
|
60
|
+
state: string;
|
|
61
|
+
codeChallenge: string;
|
|
62
|
+
}): string;
|
|
63
|
+
redeemCode(code: {
|
|
64
|
+
code: string;
|
|
65
|
+
verifier: string;
|
|
66
|
+
}): Promise<Result<PagasaeTokens, {
|
|
67
|
+
reason: string;
|
|
68
|
+
}>>;
|
|
69
|
+
/**
|
|
70
|
+
* New tokens for a refresh token, which pagasae replaces on use: refused
|
|
71
|
+
* when pagasae ended the grant (disabled, signed out, no right left, the
|
|
72
|
+
* token used twice), unavailable when it did not answer.
|
|
73
|
+
*/
|
|
74
|
+
refresh(refreshToken: string): Promise<Result<PagasaeTokens, {
|
|
75
|
+
kind: 'refused' | 'unavailable';
|
|
76
|
+
reason: string;
|
|
77
|
+
}>>;
|
|
78
|
+
}
|
|
79
|
+
/** A person's sign-in kept for their MCP client or the gateway's pages: the account in the fleet, and pagasae's tokens to act as it. */
|
|
80
|
+
export interface AccountGrant {
|
|
81
|
+
readonly grantId: string;
|
|
82
|
+
readonly fleetId: FleetId;
|
|
83
|
+
readonly accountId: string;
|
|
84
|
+
readonly personShipId: ShipId | null;
|
|
85
|
+
/** The scopes its account token carries. */
|
|
86
|
+
readonly scopes: readonly string[];
|
|
87
|
+
readonly refreshToken: string;
|
|
88
|
+
readonly accountToken: string;
|
|
89
|
+
readonly accountTokenExpiresAt: Date;
|
|
90
|
+
}
|
|
91
|
+
export interface AccountGrants {
|
|
92
|
+
save(grant: AccountGrant): Promise<void>;
|
|
93
|
+
find(fleetId: FleetId, grantId: string): Promise<AccountGrant | undefined>;
|
|
94
|
+
/** Every grant of the account in the fleet: one per client it signed in from. */
|
|
95
|
+
ofAccount(fleetId: FleetId, accountId: string): Promise<readonly AccountGrant[]>;
|
|
96
|
+
/** Keeps pagasae's new tokens for the grant, and the person ship and scopes they name. */
|
|
97
|
+
renew(grant: {
|
|
98
|
+
fleetId: FleetId;
|
|
99
|
+
grantId: string;
|
|
100
|
+
}, tokens: Partial<Pick<AccountGrant, 'refreshToken' | 'accountToken' | 'accountTokenExpiresAt' | 'personShipId' | 'scopes'>>): Promise<void>;
|
|
101
|
+
end(fleetId: FleetId, grantId: string): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
/** A browser signed in to the gateway's pages: the account's grant it acts by. */
|
|
104
|
+
export interface PageSession {
|
|
105
|
+
readonly fleetId: FleetId;
|
|
106
|
+
readonly grantId: string;
|
|
107
|
+
}
|
|
108
|
+
/** Outbound port: the page session a browser holds in the gateway's own cookie, sealed so no one forges or reads it. */
|
|
109
|
+
export interface PageSessions {
|
|
110
|
+
/** The cookie's value for the session. */
|
|
111
|
+
seal(session: PageSession): string;
|
|
112
|
+
/** The session a Cookie header carries; none when it carries none the gateway sealed. */
|
|
113
|
+
inCookie(cookie: string): PageSession | undefined;
|
|
114
|
+
}
|
|
115
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/sign-in/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AccountGrants, PageSession } from './ports.js';
|
|
2
|
+
export type SignOut = (session: PageSession) => Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Use case: a person signs out of the gateway's pages. The session's grant
|
|
5
|
+
* ends, so a page session cookie kept after it is signed out; the account's
|
|
6
|
+
* sign-ins from its MCP clients go on.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createSignOut(deps: {
|
|
9
|
+
grants: Pick<AccountGrants, 'end'>;
|
|
10
|
+
}): SignOut;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: a person signs out of the gateway's pages. The session's grant
|
|
3
|
+
* ends, so a page session cookie kept after it is signed out; the account's
|
|
4
|
+
* sign-ins from its MCP clients go on.
|
|
5
|
+
*/
|
|
6
|
+
export function createSignOut(deps) {
|
|
7
|
+
return ({ fleetId, grantId }) => deps.grants.end(fleetId, grantId);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=sign-out.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-out.js","sourceRoot":"","sources":["../../../src/core/sign-in/sign-out.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4C;IACxE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { OAuthSecrets } from '../oauth/ports.js';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import type { Pagasae, SignInSeals } from './ports.js';
|
|
4
|
+
/** Where a person lands once signed in, when they asked for no page of the gateway's own. */
|
|
5
|
+
export declare const FIRST_PAGE = "/overview";
|
|
6
|
+
export type StartPageSignIn = (asked: {
|
|
7
|
+
returnTo?: string | undefined;
|
|
8
|
+
}) => {
|
|
9
|
+
redirectTo: string;
|
|
10
|
+
browserSecret: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Use case: a person signs in to the gateway's own pages through pagasae
|
|
14
|
+
* (decision 0054), as from an MCP client: the page to go back to is sealed
|
|
15
|
+
* with the gateway's PKCE verifier into the state, and the person is sent to
|
|
16
|
+
* pagasae naming no fleet. Only a path of the gateway's own is kept, so a
|
|
17
|
+
* sign-in never sends the browser to another site. The browser is given a
|
|
18
|
+
* secret of its own, sealed too, so only it finishes the sign-in.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createStartPageSignIn(deps: {
|
|
21
|
+
seals: SignInSeals;
|
|
22
|
+
pagasae: Pagasae;
|
|
23
|
+
secrets: OAuthSecrets;
|
|
24
|
+
clock: Clock;
|
|
25
|
+
}): StartPageSignIn;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SIGN_IN_LIFETIME_MS } from './start-sign-in.js';
|
|
2
|
+
/** Where a person lands once signed in, when they asked for no page of the gateway's own. */
|
|
3
|
+
export const FIRST_PAGE = '/overview';
|
|
4
|
+
/** Whether the path is one of the gateway's own: one slash, then no second slash or backslash a browser reads as another site. */
|
|
5
|
+
function isOwnPath(path) {
|
|
6
|
+
return path.startsWith('/') && !path.startsWith('//') && !path.startsWith('/\\');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Use case: a person signs in to the gateway's own pages through pagasae
|
|
10
|
+
* (decision 0054), as from an MCP client: the page to go back to is sealed
|
|
11
|
+
* with the gateway's PKCE verifier into the state, and the person is sent to
|
|
12
|
+
* pagasae naming no fleet. Only a path of the gateway's own is kept, so a
|
|
13
|
+
* sign-in never sends the browser to another site. The browser is given a
|
|
14
|
+
* secret of its own, sealed too, so only it finishes the sign-in.
|
|
15
|
+
*/
|
|
16
|
+
export function createStartPageSignIn(deps) {
|
|
17
|
+
return ({ returnTo }) => {
|
|
18
|
+
const verifier = deps.secrets.newSecret();
|
|
19
|
+
const browserSecret = deps.secrets.newSecret();
|
|
20
|
+
const state = deps.seals.seal({
|
|
21
|
+
holder: 'page',
|
|
22
|
+
returnTo: returnTo !== undefined && isOwnPath(returnTo) ? returnTo : FIRST_PAGE,
|
|
23
|
+
verifier,
|
|
24
|
+
browserSecret,
|
|
25
|
+
expiresAt: new Date(deps.clock.now().getTime() + SIGN_IN_LIFETIME_MS),
|
|
26
|
+
});
|
|
27
|
+
return { redirectTo: deps.pagasae.authorizeUrl({ state, codeChallenge: deps.secrets.challengeOf(verifier) }), browserSecret };
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=start-page-sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-page-sign-in.js","sourceRoot":"","sources":["../../../src/core/sign-in/start-page-sign-in.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAItC,kIAAkI;AAClI,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAmF;IACvH,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;YAC/E,QAAQ;YACR,aAAa;YACb,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,mBAAmB,CAAC;SACtE,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;IAChI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { OAuthSecrets } from '../oauth/ports.js';
|
|
2
|
+
import type { AuthorizationRefusal, ReadAuthorization } from '../oauth/read-authorization.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { Pagasae, SignInHolder, SignInSeals } from './ports.js';
|
|
6
|
+
/** How long a person has to sign in at pagasae and come back. */
|
|
7
|
+
export declare const SIGN_IN_LIFETIME_MS: number;
|
|
8
|
+
export type StartSignIn = (picked: {
|
|
9
|
+
request: Readonly<Record<string, string | undefined>>;
|
|
10
|
+
holder: SignInHolder;
|
|
11
|
+
}) => Promise<Result<{
|
|
12
|
+
redirectTo: string;
|
|
13
|
+
browserSecret: string;
|
|
14
|
+
}, AuthorizationRefusal>>;
|
|
15
|
+
/**
|
|
16
|
+
* Use case: a person comes to /authorize from their MCP client (Q25) and
|
|
17
|
+
* picks what it acts as: their account, or a party they ask access for (Q1
|
|
18
|
+
* a). The client's request is read, then sealed, with that pick, with the
|
|
19
|
+
* gateway's own PKCE verifier into the state, and the person is sent to
|
|
20
|
+
* pagasae naming no fleet, so pagasae answers their only fleet or asks
|
|
21
|
+
* which (decision 0054). The browser is given a secret of its own, sealed
|
|
22
|
+
* too, so only it finishes the sign-in.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createStartSignIn(deps: {
|
|
25
|
+
readAuthorization: ReadAuthorization;
|
|
26
|
+
seals: SignInSeals;
|
|
27
|
+
pagasae: Pagasae;
|
|
28
|
+
secrets: OAuthSecrets;
|
|
29
|
+
clock: Clock;
|
|
30
|
+
}): StartSignIn;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
/** How long a person has to sign in at pagasae and come back. */
|
|
3
|
+
export const SIGN_IN_LIFETIME_MS = 10 * 60_000;
|
|
4
|
+
/**
|
|
5
|
+
* Use case: a person comes to /authorize from their MCP client (Q25) and
|
|
6
|
+
* picks what it acts as: their account, or a party they ask access for (Q1
|
|
7
|
+
* a). The client's request is read, then sealed, with that pick, with the
|
|
8
|
+
* gateway's own PKCE verifier into the state, and the person is sent to
|
|
9
|
+
* pagasae naming no fleet, so pagasae answers their only fleet or asks
|
|
10
|
+
* which (decision 0054). The browser is given a secret of its own, sealed
|
|
11
|
+
* too, so only it finishes the sign-in.
|
|
12
|
+
*/
|
|
13
|
+
export function createStartSignIn(deps) {
|
|
14
|
+
return async ({ request, holder }) => {
|
|
15
|
+
const read = await deps.readAuthorization(request);
|
|
16
|
+
if (!read.isOk) {
|
|
17
|
+
return read;
|
|
18
|
+
}
|
|
19
|
+
const verifier = deps.secrets.newSecret();
|
|
20
|
+
const browserSecret = deps.secrets.newSecret();
|
|
21
|
+
const state = deps.seals.seal({ verifier, browserSecret, request, holder, expiresAt: new Date(deps.clock.now().getTime() + SIGN_IN_LIFETIME_MS) });
|
|
22
|
+
return ok({ redirectTo: deps.pagasae.authorizeUrl({ state, codeChallenge: deps.secrets.challengeOf(verifier) }), browserSecret });
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=start-sign-in.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-sign-in.js","sourceRoot":"","sources":["../../../src/core/sign-in/start-sign-in.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,iEAAiE;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,MAAM,CAAC;AAI/C;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAyH;IACzJ,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QACnJ,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IACpI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The credential the gateway calls an outside MCP server with, kept in the
|
|
3
|
+
* vault, the gateway's own database (as squadrons keeps crew tokens). The
|
|
4
|
+
* server sees the gateway's credential, never the asker's: no rights travel
|
|
5
|
+
* with a message.
|
|
6
|
+
*/
|
|
7
|
+
export type McpServerCredential = {
|
|
8
|
+
readonly kind: 'bearer';
|
|
9
|
+
readonly token: string;
|
|
10
|
+
} | {
|
|
11
|
+
readonly kind: 'clientCredentials';
|
|
12
|
+
readonly clientId: string;
|
|
13
|
+
readonly clientSecret: string;
|
|
14
|
+
/** The authorization server's issuer: the credential goes to no other. */
|
|
15
|
+
readonly issuer: string;
|
|
16
|
+
/** The OAuth scope to ask the authorization server for, if the server needs one. */
|
|
17
|
+
readonly scope?: string;
|
|
18
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../../src/core/vault/credential.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway's round of request outcomes (decision 0056): each round
|
|
3
|
+
* expires the requests due, tells the outcomes still to tell, and asks the
|
|
4
|
+
* gateway's owner about new requests and withdraws the questions whose
|
|
5
|
+
* request ended. Rounds
|
|
6
|
+
* run one at a time, every interval, and at once when a request is decided;
|
|
7
|
+
* a round asked for while one runs runs right after it.
|
|
8
|
+
*/
|
|
9
|
+
import type { FastifyBaseLogger } from 'fastify';
|
|
10
|
+
import type { Sleep } from './core/mcp-out/run-party.js';
|
|
11
|
+
import type { AskOwners } from './core/requests/ask-owners.js';
|
|
12
|
+
import type { ExpireRequests } from './core/requests/expire-requests.js';
|
|
13
|
+
import type { TellOutcomes } from './core/requests/tell-outcomes.js';
|
|
14
|
+
export interface OutcomeWorker {
|
|
15
|
+
/** Runs a round every interval until it stops. */
|
|
16
|
+
start(): void;
|
|
17
|
+
/** Runs a round now, as when a request was opened or decided. */
|
|
18
|
+
tellNow(): void;
|
|
19
|
+
/** Stops, once the round under way ended. */
|
|
20
|
+
stop(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export declare function createOutcomeWorker(deps: {
|
|
23
|
+
expireRequests: ExpireRequests;
|
|
24
|
+
tellOutcomes: TellOutcomes;
|
|
25
|
+
askOwners: AskOwners;
|
|
26
|
+
sleep: Sleep;
|
|
27
|
+
intervalMs: number;
|
|
28
|
+
log: FastifyBaseLogger;
|
|
29
|
+
}): OutcomeWorker;
|