@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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway's page of parties: one small server-rendered page where argo,
|
|
3
|
+
* signed in to the console, approves outside MCP servers, hands over a
|
|
4
|
+
* secret, states a party and marks its tools. Each form calls the gateway's
|
|
5
|
+
* own API as argo, with the forwarded console session, so the page checks
|
|
6
|
+
* nothing the API does not; it only refuses a form sent from another origin.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
import { idSchema } from '@aeolus-fleet/common';
|
|
10
|
+
import { TRPCError } from '@trpc/server';
|
|
11
|
+
import { getHTTPStatusCodeFromError } from '@trpc/server/http';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { gatewayRouter } from '../trpc/router.js';
|
|
14
|
+
import { acceptForms, escaped, isSameOrigin, layout, refusalMessage } from './html.js';
|
|
15
|
+
const HTTP_FORBIDDEN = 403;
|
|
16
|
+
const HTTP_SEE_OTHER = 303;
|
|
17
|
+
const HTTP_INTERNAL_ERROR = 500;
|
|
18
|
+
const PAGE = '/parties';
|
|
19
|
+
const formSchema = z.record(z.string(), z.string());
|
|
20
|
+
function field(form, name) {
|
|
21
|
+
return form[name] ?? '';
|
|
22
|
+
}
|
|
23
|
+
function partyRow(party, canManage) {
|
|
24
|
+
const name = escaped(party.name);
|
|
25
|
+
const forms = canManage
|
|
26
|
+
? [
|
|
27
|
+
party.state === 'awaitingCrew'
|
|
28
|
+
? `<form class="inline" method="post" action="${PAGE}/crew"><input type="hidden" name="name" value="${name}"><input name="secret" placeholder="secret from a new starting prompt" required><button>Crew</button></form>`
|
|
29
|
+
: '',
|
|
30
|
+
party.kind === 'mcpServer' && party.state === 'crewed'
|
|
31
|
+
? `<form class="inline" method="post" action="${PAGE}/state"><input type="hidden" name="name" value="${name}"><button>State its tools</button></form>` +
|
|
32
|
+
`<form class="inline" method="post" action="${PAGE}/mark"><input type="hidden" name="name" value="${name}"><input name="tool" placeholder="tool" required maxlength="128"><label><span><input type="checkbox" name="isRepeatable"> repeatable</span></label><button>Mark</button></form>`
|
|
33
|
+
: '',
|
|
34
|
+
].join('')
|
|
35
|
+
: '';
|
|
36
|
+
// A server shows where it is and how the gateway signs in; a client, its OAuth client id.
|
|
37
|
+
const outside = party.kind === 'mcpServer' ? `${escaped(party.url)}</td><td>${escaped(party.credentialKind)}` : `${escaped(party.clientId)}</td><td>MCP client`;
|
|
38
|
+
return `<tr><td>${name}</td><td>${outside}</td><td>${escaped(party.state)}</td><td>${escaped(party.proxyShipId ?? '')}</td><td>${forms}</td></tr>`;
|
|
39
|
+
}
|
|
40
|
+
const APPROVE_FORM = (requestId) => `<h2>Approve an MCP server</h2>
|
|
41
|
+
<form method="post" action="${PAGE}/approve">
|
|
42
|
+
<input type="hidden" name="requestId" value="${requestId}">
|
|
43
|
+
<label>Name, the proxy ship's<input name="name" required></label>
|
|
44
|
+
<label>Streamable HTTP URL<input name="url" type="url" required></label>
|
|
45
|
+
<label>Credential<select name="credentialKind"><option value="bearer">Bearer token</option><option value="clientCredentials">OAuth client credentials</option></select></label>
|
|
46
|
+
<label>Bearer token<input name="token" type="password"></label>
|
|
47
|
+
<label>Client id<input name="clientId"></label>
|
|
48
|
+
<label>Client secret<input name="clientSecret" type="password"></label>
|
|
49
|
+
<label>Issuer<input name="issuer" type="url"></label>
|
|
50
|
+
<label>Scope<input name="scope"></label>
|
|
51
|
+
<label>Owner's ship id (a person's ship, or argo)<input name="ownerShipId" required></label>
|
|
52
|
+
<label>Calls at once<input name="concurrencyLimit" type="number" min="1" max="10" value="4"></label>
|
|
53
|
+
<button>Approve</button>
|
|
54
|
+
</form>`;
|
|
55
|
+
async function renderPage(reply, page) {
|
|
56
|
+
const { context, failure } = page;
|
|
57
|
+
const caller = gatewayRouter.createCaller(context);
|
|
58
|
+
const actor = await context.authenticateActor({ cookie: context.cookie });
|
|
59
|
+
const parties = await caller.parties.list();
|
|
60
|
+
const canManage = actor.isOk && actor.value.scopes.includes('fleet:manage');
|
|
61
|
+
const body = [
|
|
62
|
+
'<h1>Parties</h1>',
|
|
63
|
+
'<p class="muted">Outside MCP servers argo approved for this fleet, each behind its proxy ship.</p>',
|
|
64
|
+
failure ? `<p class="error">${escaped(failure.message)}</p>` : '',
|
|
65
|
+
parties.length === 0
|
|
66
|
+
? '<p class="muted">No party yet.</p>'
|
|
67
|
+
: `<table><thead><tr><th>Name</th><th>URL</th><th>Credential</th><th>State</th><th>Proxy ship</th><th></th></tr></thead><tbody>${parties.map((party) => partyRow(party, canManage)).join('')}</tbody></table>`,
|
|
68
|
+
canManage ? APPROVE_FORM(randomUUID()) : '',
|
|
69
|
+
].join('');
|
|
70
|
+
return reply.code(failure?.status ?? 200).type('text/html; charset=utf-8').send(layout('Gateway parties', body));
|
|
71
|
+
}
|
|
72
|
+
function signInPage(reply, refusal) {
|
|
73
|
+
const { fleetUrl, error } = refusal;
|
|
74
|
+
return reply
|
|
75
|
+
.code(getHTTPStatusCodeFromError(error))
|
|
76
|
+
.type('text/html; charset=utf-8')
|
|
77
|
+
.send(layout('Gateway parties', `<h1>Parties</h1><p class="error">${escaped(refusalMessage(error))}</p><p><a href="${escaped(fleetUrl)}">Sign in to the console of your fleet</a>, then come back.</p>`));
|
|
78
|
+
}
|
|
79
|
+
/** The calls each form makes, as argo, from its fields. */
|
|
80
|
+
const ACTIONS = {
|
|
81
|
+
approve: (caller, form) => {
|
|
82
|
+
const ownerShipId = idSchema('ship').safeParse(field(form, 'ownerShipId'));
|
|
83
|
+
if (!ownerShipId.success) {
|
|
84
|
+
return Promise.reject(new TRPCError({ code: 'BAD_REQUEST', message: "The owner's ship id is not a ship id (shp_...)" }));
|
|
85
|
+
}
|
|
86
|
+
const scope = field(form, 'scope');
|
|
87
|
+
return caller.parties.approve({
|
|
88
|
+
requestId: field(form, 'requestId'),
|
|
89
|
+
name: field(form, 'name'),
|
|
90
|
+
url: field(form, 'url'),
|
|
91
|
+
credential: field(form, 'credentialKind') === 'clientCredentials'
|
|
92
|
+
? { kind: 'clientCredentials', clientId: field(form, 'clientId'), clientSecret: field(form, 'clientSecret'), issuer: field(form, 'issuer'), ...(scope === '' ? {} : { scope }) }
|
|
93
|
+
: { kind: 'bearer', token: field(form, 'token') },
|
|
94
|
+
ownerShipId: ownerShipId.data,
|
|
95
|
+
concurrencyLimit: Number(field(form, 'concurrencyLimit')),
|
|
96
|
+
});
|
|
97
|
+
},
|
|
98
|
+
crew: (caller, form) => caller.parties.crew({ name: field(form, 'name'), secret: field(form, 'secret') }),
|
|
99
|
+
state: (caller, form) => caller.parties.state({ name: field(form, 'name') }),
|
|
100
|
+
mark: (caller, form) => caller.parties.markTool({ name: field(form, 'name'), tool: field(form, 'tool'), isRepeatable: form.isRepeatable === 'on' }),
|
|
101
|
+
};
|
|
102
|
+
export function registerPartiesPage(server, deps) {
|
|
103
|
+
acceptForms(server);
|
|
104
|
+
const answer = async (exchange, act) => {
|
|
105
|
+
const { request, reply } = exchange;
|
|
106
|
+
const context = deps.contextFor(request.headers.cookie);
|
|
107
|
+
try {
|
|
108
|
+
if (act) {
|
|
109
|
+
await act(gatewayRouter.createCaller(context));
|
|
110
|
+
return await reply.code(HTTP_SEE_OTHER).header('location', PAGE).send();
|
|
111
|
+
}
|
|
112
|
+
return await renderPage(reply, { context });
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (!(error instanceof TRPCError)) {
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
if (error.code === 'UNAUTHORIZED') {
|
|
119
|
+
return signInPage(reply, { fleetUrl: deps.fleetUrl, error });
|
|
120
|
+
}
|
|
121
|
+
const failure = { status: error.code === 'INTERNAL_SERVER_ERROR' ? HTTP_INTERNAL_ERROR : getHTTPStatusCodeFromError(error), message: refusalMessage(error) };
|
|
122
|
+
try {
|
|
123
|
+
return await renderPage(reply, { context, failure });
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return reply.code(failure.status).type('text/html; charset=utf-8').send(layout('Gateway parties', `<h1>Parties</h1><p class="error">${escaped(failure.message)}</p>`));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
server.get(PAGE, (request, reply) => answer({ request, reply }));
|
|
131
|
+
for (const [action, call] of Object.entries(ACTIONS)) {
|
|
132
|
+
server.post(`${PAGE}/${action}`, (request, reply) => {
|
|
133
|
+
if (!isSameOrigin(request)) {
|
|
134
|
+
return reply.code(HTTP_FORBIDDEN).type('text/plain; charset=utf-8').send('A form for this page is sent only from this page.');
|
|
135
|
+
}
|
|
136
|
+
const form = formSchema.safeParse(request.body);
|
|
137
|
+
return answer({ request, reply }, (caller) => call(caller, form.success ? form.data : {}));
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=parties-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parties-page.js","sourceRoot":"","sources":["../../../src/adapters/http/parties-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tools a signed-in person's MCP client is served (Q20, decision 0057):
|
|
3
|
+
* their person ship's calls, which the gateway makes as the ship's crew, so
|
|
4
|
+
* the chat holds no crew token; and asking for an outside MCP server as
|
|
5
|
+
* their account (decision 0056).
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
8
|
+
import type { AnswerDelivery } from '../../core/people/answer-delivery.js';
|
|
9
|
+
import type { DoneDelivery } from '../../core/people/done-delivery.js';
|
|
10
|
+
import type { OpenDelivery } from '../../core/people/open-delivery.js';
|
|
11
|
+
import type { PersonCaller } from '../../core/people/person-crew.js';
|
|
12
|
+
import type { ReadInbox } from '../../core/people/read-inbox.js';
|
|
13
|
+
import type { AskForServer } from '../../core/requests/ask-for-server.js';
|
|
14
|
+
export interface PersonToolsDeps {
|
|
15
|
+
readInbox: ReadInbox;
|
|
16
|
+
openDelivery: OpenDelivery;
|
|
17
|
+
answerDelivery: AnswerDelivery;
|
|
18
|
+
doneDelivery: DoneDelivery;
|
|
19
|
+
askForServer: AskForServer;
|
|
20
|
+
}
|
|
21
|
+
/** The MCP server one request of a person's client is served by. */
|
|
22
|
+
export declare function personServerFor(caller: PersonCaller, deps: PersonToolsDeps): McpServer;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tools a signed-in person's MCP client is served (Q20, decision 0057):
|
|
3
|
+
* their person ship's calls, which the gateway makes as the ship's crew, so
|
|
4
|
+
* the chat holds no crew token; and asking for an outside MCP server as
|
|
5
|
+
* their account (decision 0056).
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/server';
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { runningVersion } from './version.js';
|
|
10
|
+
const INBOX_TOOL = {
|
|
11
|
+
name: 'aeolus_inbox',
|
|
12
|
+
title: 'Read your inbox',
|
|
13
|
+
description: 'What waits for you in your person ship: who sent each delivery, when, and its title, without its content. Lists at most 10, with how many wait in all.',
|
|
14
|
+
inputSchema: { type: 'object', properties: {} },
|
|
15
|
+
};
|
|
16
|
+
const OPEN_TOOL = {
|
|
17
|
+
name: 'aeolus_open',
|
|
18
|
+
title: 'Open a delivery',
|
|
19
|
+
description: 'Opens one delivery your inbox lists, by its deliveryId: who sent it, when, its title, content type and content. Opening it confirms you got it, so it waits no more.',
|
|
20
|
+
inputSchema: { type: 'object', properties: { deliveryId: { type: 'string' } }, required: ['deliveryId'] },
|
|
21
|
+
};
|
|
22
|
+
const ANSWER_TOOL = {
|
|
23
|
+
name: 'aeolus_answer',
|
|
24
|
+
title: 'Answer a delivery',
|
|
25
|
+
description: [
|
|
26
|
+
'Answers a delivery you opened, by its deliveryId: your answer goes to its sender, in reply to it, and the delivery is dealt with.',
|
|
27
|
+
'Give the payload and its content type, such as text/plain. A question (application/vnd.aeolus.question+json) is answered with',
|
|
28
|
+
'application/vnd.aeolus.answer+json and the payload {"questionId":"<its id>","option":<a key>,"note":"..."}, or a note alone. At most 64 KB.',
|
|
29
|
+
].join(' '),
|
|
30
|
+
inputSchema: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
properties: { deliveryId: { type: 'string' }, contentType: { type: 'string' }, payload: { type: 'string' } },
|
|
33
|
+
required: ['deliveryId', 'contentType', 'payload'],
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const DONE_TOOL = {
|
|
37
|
+
name: 'aeolus_done',
|
|
38
|
+
title: 'Be done with a delivery',
|
|
39
|
+
description: 'Says you dealt with a delivery you opened, by its deliveryId, with no answer.',
|
|
40
|
+
inputSchema: { type: 'object', properties: { deliveryId: { type: 'string' } }, required: ['deliveryId'] },
|
|
41
|
+
};
|
|
42
|
+
const ASK_FOR_SERVER_TOOL = {
|
|
43
|
+
name: 'aeolus_ask_for_server',
|
|
44
|
+
title: 'Ask for an outside MCP server',
|
|
45
|
+
description: 'Asks an approver of your fleet to add an outside MCP server, by its https address, so its tools reach the fleet. The approver gives its credential. A request waits 7 days for a decision; another person asking for the same server joins it.',
|
|
46
|
+
inputSchema: { type: 'object', properties: { url: { type: 'string' } }, required: ['url'] },
|
|
47
|
+
};
|
|
48
|
+
const PERSON_TOOLS = [INBOX_TOOL, OPEN_TOOL, ANSWER_TOOL, DONE_TOOL, ASK_FOR_SERVER_TOOL];
|
|
49
|
+
const deliveryArgumentsSchema = z.object({ deliveryId: z.string() });
|
|
50
|
+
const askForServerArgumentsSchema = z.object({ url: z.string() });
|
|
51
|
+
const answerArgumentsSchema = z.object({ deliveryId: z.string(), contentType: z.string(), payload: z.string() });
|
|
52
|
+
/** A tool's answer as one text block of JSON. */
|
|
53
|
+
const answered = (value) => ({ content: [{ type: 'text', text: JSON.stringify(value) }] });
|
|
54
|
+
/** A tool error the person's model reads. */
|
|
55
|
+
const toolError = (message) => ({ content: [{ type: 'text', text: message }], isError: true });
|
|
56
|
+
/** The MCP server one request of a person's client is served by. */
|
|
57
|
+
export function personServerFor(caller, deps) {
|
|
58
|
+
const mcp = new McpServer({ name: 'aeolus-gateway', version: runningVersion() }, { capabilities: { tools: {} } });
|
|
59
|
+
mcp.server.setRequestHandler('tools/list', () => ({ tools: PERSON_TOOLS }));
|
|
60
|
+
mcp.server.setRequestHandler('tools/call', async ({ params }) => {
|
|
61
|
+
switch (params.name) {
|
|
62
|
+
case INBOX_TOOL.name: {
|
|
63
|
+
const read = await deps.readInbox(caller);
|
|
64
|
+
return read.isOk ? answered(read.value) : toolError(read.error.message);
|
|
65
|
+
}
|
|
66
|
+
case OPEN_TOOL.name:
|
|
67
|
+
case DONE_TOOL.name: {
|
|
68
|
+
const sent = deliveryArgumentsSchema.safeParse(params.arguments);
|
|
69
|
+
if (!sent.success) {
|
|
70
|
+
return toolError(`${params.name} takes the deliveryId your inbox lists`);
|
|
71
|
+
}
|
|
72
|
+
const asked = { caller, deliveryId: sent.data.deliveryId };
|
|
73
|
+
const dealt = params.name === OPEN_TOOL.name ? await deps.openDelivery(asked) : await deps.doneDelivery(asked);
|
|
74
|
+
return dealt.isOk ? answered(dealt.value) : toolError(dealt.error.message);
|
|
75
|
+
}
|
|
76
|
+
case ANSWER_TOOL.name: {
|
|
77
|
+
const sent = answerArgumentsSchema.safeParse(params.arguments);
|
|
78
|
+
if (!sent.success) {
|
|
79
|
+
return toolError(`${ANSWER_TOOL.name} takes the deliveryId, a contentType and a payload`);
|
|
80
|
+
}
|
|
81
|
+
const dealt = await deps.answerDelivery({ caller, ...sent.data });
|
|
82
|
+
return dealt.isOk ? answered(dealt.value) : toolError(dealt.error.message);
|
|
83
|
+
}
|
|
84
|
+
case ASK_FOR_SERVER_TOOL.name: {
|
|
85
|
+
const sent = askForServerArgumentsSchema.safeParse(params.arguments);
|
|
86
|
+
if (!sent.success) {
|
|
87
|
+
return toolError(`${ASK_FOR_SERVER_TOOL.name} takes the server's url`);
|
|
88
|
+
}
|
|
89
|
+
const asked = await deps.askForServer({ caller, url: sent.data.url });
|
|
90
|
+
return asked.isOk ? answered({ ...asked.value, expiresAt: asked.value.expiresAt.toISOString() }) : toolError(asked.error.message);
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
return toolError(`No tool ${params.name}: your person ship has ${PERSON_TOOLS.map(({ name }) => name).join(', ')}`);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return mcp;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=person-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-tools.js","sourceRoot":"","sources":["../../../src/adapters/http/person-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/** A tone family of the console: every state shows in exactly one. */
|
|
2
|
+
export type Tone = 'waiting' | 'active' | 'ok' | 'attention' | 'ended';
|
|
3
|
+
/** An icon the pages draw, from the console's icon set (Lucide), as inline SVG paths. */
|
|
4
|
+
export type Icon = 'plug' | 'power' | 'powerOff' | 'alert' | 'signIn' | 'house' | 'hourglass' | 'check' | 'x' | 'ban' | 'lock' | 'server' | 'laptop' | 'arrowLeftRight' | 'users' | 'shieldX' | 'timerOff';
|
|
5
|
+
export declare function icon(name: Icon, size?: number): string;
|
|
6
|
+
/** A status as the console shows it: its tone, an icon and a label, never colour alone. */
|
|
7
|
+
export declare function statusBadge(status: {
|
|
8
|
+
tone: Tone;
|
|
9
|
+
icon: Icon;
|
|
10
|
+
label: string;
|
|
11
|
+
}): string;
|
|
12
|
+
/** The large shape that leads a page: a full ring in a tone, dashed for a state that ended, around an icon or a number. */
|
|
13
|
+
export declare function ring(shown: {
|
|
14
|
+
tone: Tone;
|
|
15
|
+
center: {
|
|
16
|
+
icon: Icon;
|
|
17
|
+
} | {
|
|
18
|
+
count: number;
|
|
19
|
+
} | {
|
|
20
|
+
text: string;
|
|
21
|
+
icon: Icon;
|
|
22
|
+
};
|
|
23
|
+
label: string;
|
|
24
|
+
isDashed?: boolean;
|
|
25
|
+
size?: number;
|
|
26
|
+
}): string;
|
|
27
|
+
/** An outside party's mark: the first two letters of its name on a tile, as the console's Avatar draws a ship. */
|
|
28
|
+
export declare function partyMark(name: string): string;
|
|
29
|
+
/** Who meets whom: the outside party's mark and the fleet's, side by side. */
|
|
30
|
+
export declare function handshake(party: {
|
|
31
|
+
name: string;
|
|
32
|
+
fleet?: string;
|
|
33
|
+
}): string;
|
|
34
|
+
/** A tab of the pages' top bar. */
|
|
35
|
+
export type Tab = 'overview' | 'outsideParties';
|
|
36
|
+
/**
|
|
37
|
+
* A page a person meets on their way in, from an outside MCP client: the
|
|
38
|
+
* mark and its name above one centred column, no tabs. Its own script, if
|
|
39
|
+
* any, comes with its body.
|
|
40
|
+
*/
|
|
41
|
+
export declare function signInPage(page: {
|
|
42
|
+
title: string;
|
|
43
|
+
body: string;
|
|
44
|
+
}): string;
|
|
45
|
+
/** A whole Signal page: the top bar with its tabs, then the page's own body; a live page names itself to the live channel. */
|
|
46
|
+
export declare function signalPage(page: {
|
|
47
|
+
title: string;
|
|
48
|
+
tab?: Tab;
|
|
49
|
+
body: string;
|
|
50
|
+
isWide?: boolean;
|
|
51
|
+
live?: string;
|
|
52
|
+
}): string;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway's pages in direction B, Signal (design/gateway-pages), drawn
|
|
3
|
+
* with the operator console's tokens: one large shape leads each page, a
|
|
4
|
+
* ring for a state or a count. The tokens are the console's own
|
|
5
|
+
* (aeolus-fleet packages/console/app/tokens.css), light by default and dark
|
|
6
|
+
* where the browser asks for it, as the pages have no theme switch.
|
|
7
|
+
*/
|
|
8
|
+
import { escaped } from './html.js';
|
|
9
|
+
const LIGHT_TOKENS = `--background:oklch(0.99 0.002 247);--card:oklch(1 0 0);--muted:oklch(0.967 0.005 247);--secondary:oklch(0.955 0.007 247);--accent:oklch(0.95 0.009 247);
|
|
10
|
+
--foreground:oklch(0.22 0.02 257);--muted-foreground:oklch(0.5 0.02 257);--border:oklch(0.912 0.008 247);--input:oklch(0.885 0.01 247);--ring:oklch(0.56 0.12 257);
|
|
11
|
+
--primary:oklch(0.34 0.08 257);--primary-hover:oklch(0.29 0.075 257);--primary-foreground:oklch(0.985 0.003 247);--destructive:oklch(0.53 0.2 27);--destructive-foreground:oklch(0.99 0 0);
|
|
12
|
+
--tone-waiting-bg:oklch(0.965 0.045 85);--tone-waiting-fg:oklch(0.47 0.1 62);--tone-waiting-border:oklch(0.87 0.08 80);
|
|
13
|
+
--tone-active-bg:oklch(0.955 0.03 250);--tone-active-fg:oklch(0.45 0.14 257);--tone-active-border:oklch(0.86 0.06 252);
|
|
14
|
+
--tone-ok-bg:oklch(0.96 0.04 155);--tone-ok-fg:oklch(0.44 0.1 155);--tone-ok-border:oklch(0.86 0.07 155);
|
|
15
|
+
--tone-attention-bg:oklch(0.957 0.028 25);--tone-attention-fg:oklch(0.5 0.19 27);--tone-attention-border:oklch(0.86 0.07 25);
|
|
16
|
+
--tone-ended-bg:oklch(0.957 0.005 247);--tone-ended-fg:oklch(0.47 0.015 257);--tone-ended-border:oklch(0.87 0.01 247);
|
|
17
|
+
--shadow-sm:0 1px 2px oklch(0.2 0.02 257 / 0.06);`;
|
|
18
|
+
const DARK_TOKENS = `color-scheme:dark;--background:oklch(0.172 0.012 257);--card:oklch(0.2 0.013 257);--muted:oklch(0.228 0.012 257);--secondary:oklch(0.255 0.013 257);--accent:oklch(0.26 0.014 257);
|
|
19
|
+
--foreground:oklch(0.955 0.005 247);--muted-foreground:oklch(0.72 0.016 257);--border:oklch(0.29 0.014 257);--input:oklch(0.34 0.015 257);--ring:oklch(0.7 0.1 252);
|
|
20
|
+
--primary:oklch(0.86 0.055 250);--primary-hover:oklch(0.92 0.035 250);--primary-foreground:oklch(0.21 0.035 257);--destructive:oklch(0.56 0.19 25);--destructive-foreground:oklch(0.99 0 0);
|
|
21
|
+
--tone-waiting-bg:oklch(0.29 0.055 72);--tone-waiting-fg:oklch(0.87 0.11 82);--tone-waiting-border:oklch(0.41 0.075 72);
|
|
22
|
+
--tone-active-bg:oklch(0.29 0.06 257);--tone-active-fg:oklch(0.85 0.08 252);--tone-active-border:oklch(0.42 0.09 257);
|
|
23
|
+
--tone-ok-bg:oklch(0.29 0.05 155);--tone-ok-fg:oklch(0.86 0.1 155);--tone-ok-border:oklch(0.41 0.07 155);
|
|
24
|
+
--tone-attention-bg:oklch(0.3 0.07 25);--tone-attention-fg:oklch(0.84 0.09 25);--tone-attention-border:oklch(0.45 0.11 25);
|
|
25
|
+
--tone-ended-bg:oklch(0.255 0.01 257);--tone-ended-fg:oklch(0.78 0.015 257);--tone-ended-border:oklch(0.36 0.012 257);
|
|
26
|
+
--shadow-sm:0 1px 2px oklch(0 0 0 / 0.3);`;
|
|
27
|
+
const STYLE = `
|
|
28
|
+
:root { color-scheme: light; ${LIGHT_TOKENS} --font-sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; --font-mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 10px; }
|
|
29
|
+
@media (prefers-color-scheme: dark) { :root { ${DARK_TOKENS} } }
|
|
30
|
+
* { box-sizing: border-box; }
|
|
31
|
+
body { margin: 0; font: 14px/20px var(--font-sans); color: var(--foreground); background: var(--background); }
|
|
32
|
+
a { color: inherit; }
|
|
33
|
+
.top { display: flex; align-items: center; gap: 16px; height: 56px; padding: 0 16px; border-bottom: 1px solid var(--border); }
|
|
34
|
+
.mark { display: flex; align-items: center; gap: 8px; font-weight: 600; text-decoration: none; }
|
|
35
|
+
.tabs { display: flex; gap: 4px; }
|
|
36
|
+
.tab { display: flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border-radius: var(--radius-sm); color: var(--muted-foreground); text-decoration: none; }
|
|
37
|
+
.tab[aria-current="page"] { color: var(--foreground); background: var(--secondary); }
|
|
38
|
+
main { max-width: 720px; margin: 0 auto; padding: 32px 16px; display: grid; gap: 24px; }
|
|
39
|
+
.lead { display: flex; align-items: center; gap: 20px; }
|
|
40
|
+
.lead h1 { margin: 0; font-size: 22px; line-height: 28px; font-weight: 600; }
|
|
41
|
+
.ring { flex: none; }
|
|
42
|
+
.card { display: grid; gap: 12px; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); box-shadow: var(--shadow-sm); }
|
|
43
|
+
.card h2 { margin: 0; font-size: 15px; line-height: 20px; font-weight: 600; }
|
|
44
|
+
.card p { margin: 0; }
|
|
45
|
+
.muted { color: var(--muted-foreground); }
|
|
46
|
+
.badge { display: inline-flex; align-items: center; gap: 4px; padding: 0 6px; height: 20px; border: 1px solid; border-radius: var(--radius-sm); font-size: 12px; font-weight: 500; }
|
|
47
|
+
.tone-waiting { color: var(--tone-waiting-fg); background: var(--tone-waiting-bg); border-color: var(--tone-waiting-border); }
|
|
48
|
+
.tone-active { color: var(--tone-active-fg); background: var(--tone-active-bg); border-color: var(--tone-active-border); }
|
|
49
|
+
.tone-ok { color: var(--tone-ok-fg); background: var(--tone-ok-bg); border-color: var(--tone-ok-border); }
|
|
50
|
+
.tone-attention { color: var(--tone-attention-fg); background: var(--tone-attention-bg); border-color: var(--tone-attention-border); }
|
|
51
|
+
.tone-ended { color: var(--tone-ended-fg); background: var(--tone-ended-bg); border-color: var(--tone-ended-border); }
|
|
52
|
+
.actions { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
53
|
+
form { margin: 0; }
|
|
54
|
+
button, .button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 36px; padding: 0 14px; border: 1px solid var(--input); border-radius: var(--radius-md); font: inherit; font-weight: 500; color: var(--foreground); background: var(--card); text-decoration: none; cursor: pointer; }
|
|
55
|
+
button.primary { color: var(--primary-foreground); background: var(--primary); border-color: var(--primary); }
|
|
56
|
+
button.primary:hover { background: var(--primary-hover); }
|
|
57
|
+
button.destructive { color: var(--destructive-foreground); background: var(--destructive); border-color: var(--destructive); }
|
|
58
|
+
button:focus-visible, .button:focus-visible, .tab:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
|
|
59
|
+
.alert { border-width: 1px; border-style: solid; }
|
|
60
|
+
.party-mark { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 40px; height: 40px; border-radius: var(--radius-md); background: var(--secondary); border: 1px solid var(--border); font: 600 13px/1 var(--font-mono); }
|
|
61
|
+
.handshake { display: flex; align-items: center; justify-content: center; gap: 12px; }
|
|
62
|
+
.handshake figure { margin: 0; display: grid; justify-items: center; gap: 4px; font-size: 12px; }
|
|
63
|
+
.fleet-mark { display: inline-flex; }
|
|
64
|
+
.split { display: grid; gap: 24px; grid-template-columns: minmax(0, 1fr); }
|
|
65
|
+
@media (min-width: 900px) { main.wide { max-width: 1040px; } .split { grid-template-columns: minmax(0, 1fr) 280px; } }
|
|
66
|
+
.queue { display: grid; gap: 8px; align-content: start; }
|
|
67
|
+
.queue h2 { margin: 0; font-size: 12px; font-weight: 500; color: var(--muted-foreground); }
|
|
68
|
+
.item { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); text-decoration: none; }
|
|
69
|
+
.item[aria-current="true"] { border-color: var(--primary); }
|
|
70
|
+
.item .text { display: grid; min-width: 0; flex: 1; } .item .text span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
71
|
+
.tag { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--muted-foreground); }
|
|
72
|
+
.mono { font-family: var(--font-mono); font-size: 12px; }
|
|
73
|
+
.field { display: grid; gap: 4px; } .field > span { font-size: 13px; font-weight: 500; }
|
|
74
|
+
input[type="text"], input[type="password"], input[type="number"], input[type="url"], select { height: 36px; padding: 0 10px; border: 1px solid var(--input); border-radius: var(--radius-md); background: var(--background); color: var(--foreground); font: inherit; }
|
|
75
|
+
.scope { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius-md); }
|
|
76
|
+
.scope .label { flex: 1; }
|
|
77
|
+
.scopes { display: grid; gap: 6px; }
|
|
78
|
+
fieldset { border: 0; margin: 0; padding: 0; display: grid; gap: 8px; }
|
|
79
|
+
legend { font-size: 13px; font-weight: 500; padding: 0; margin-bottom: 4px; }
|
|
80
|
+
main.centred { max-width: 440px; min-height: 100vh; align-content: center; justify-items: center; text-align: center; }
|
|
81
|
+
main.centred > * { width: 100%; } main.centred p, main.centred h1 { margin: 0; } main.centred { gap: 16px; }
|
|
82
|
+
main.centred > .mark, main.centred > .ring, main.centred > .badge { width: auto; }
|
|
83
|
+
.tiles { display: grid; gap: 12px; grid-template-columns: 1fr 1fr; }
|
|
84
|
+
@media (max-width: 480px) { .tiles { grid-template-columns: 1fr; } }
|
|
85
|
+
.tile { display: grid; gap: 4px; justify-items: center; align-content: center; height: auto; min-height: 112px; padding: 16px; border-radius: var(--radius-lg); text-align: center; }
|
|
86
|
+
.tile:hover { border-color: var(--primary); }
|
|
87
|
+
.going-on { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted-foreground); }
|
|
88
|
+
.going-on::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--tone-ok-fg); }
|
|
89
|
+
.live-status { position: fixed; right: 16px; bottom: 16px; margin: 0; }
|
|
90
|
+
.party-cards { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
|
|
91
|
+
.party-card { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px 12px; padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); }
|
|
92
|
+
.party-card .text { display: grid; min-width: 0; } .party-card .text > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
93
|
+
.party-card .facts { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
94
|
+
.tag.protocol { padding: 0 4px; border: 1px solid var(--border); border-radius: var(--radius-sm); font: 600 10px/16px var(--font-mono); color: var(--foreground); }
|
|
95
|
+
.counts { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; margin: 4px 0 0; }
|
|
96
|
+
@media (max-width: 640px) { .actions > * { flex: 1; } button, .button { height: 44px; width: 100%; } }
|
|
97
|
+
`;
|
|
98
|
+
const ICON_PATHS = {
|
|
99
|
+
plug: '<path d="M12 22v-5"/><path d="M9 8V2"/><path d="M15 8V2"/><path d="M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z"/>',
|
|
100
|
+
power: '<path d="M12 2v10"/><path d="M18.4 6.6a9 9 0 1 1-12.77.04"/>',
|
|
101
|
+
powerOff: '<path d="M18.36 6.64A9 9 0 0 1 20.77 15"/><path d="M6.16 6.16a9 9 0 1 0 12.68 12.68"/><path d="M12 2v4"/><path d="m2 2 20 20"/>',
|
|
102
|
+
alert: '<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/>',
|
|
103
|
+
signIn: '<path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><path d="m10 17 5-5-5-5"/><path d="M15 12H3"/>',
|
|
104
|
+
house: '<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>',
|
|
105
|
+
hourglass: '<path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/>',
|
|
106
|
+
check: '<path d="M20 6 9 17l-5-5"/>',
|
|
107
|
+
x: '<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',
|
|
108
|
+
ban: '<circle cx="12" cy="12" r="10"/><path d="m4.9 4.9 14.2 14.2"/>',
|
|
109
|
+
lock: '<rect width="18" height="11" x="3" y="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>',
|
|
110
|
+
server: '<rect width="20" height="8" x="2" y="2" rx="2" ry="2"/><rect width="20" height="8" x="2" y="14" rx="2" ry="2"/><path d="M6 6h.01"/><path d="M6 18h.01"/>',
|
|
111
|
+
laptop: '<path d="M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z"/><path d="M20.054 15.987H3.946"/>',
|
|
112
|
+
arrowLeftRight: '<path d="M8 3 4 7l4 4"/><path d="M4 7h16"/><path d="m16 21 4-4-4-4"/><path d="M20 17H4"/>',
|
|
113
|
+
shieldX: '<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/><path d="m14.5 9.5-5 5"/><path d="m9.5 9.5 5 5"/>',
|
|
114
|
+
timerOff: '<path d="M10 2h4"/><path d="M4.6 11a8 8 0 0 0 1.7 8.7 8 8 0 0 0 8.7 1.7"/><path d="M7.4 7.4a8 8 0 0 1 10.3 1 8 8 0 0 1 .9 10.2"/><path d="m2 2 20 20"/><path d="M12 12v-2"/>',
|
|
115
|
+
users: '<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/>',
|
|
116
|
+
};
|
|
117
|
+
export function icon(name, size = 16) {
|
|
118
|
+
return `<svg width="${size}" height="${size}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${ICON_PATHS[name]}</svg>`;
|
|
119
|
+
}
|
|
120
|
+
/** A status as the console shows it: its tone, an icon and a label, never colour alone. */
|
|
121
|
+
export function statusBadge(status) {
|
|
122
|
+
return `<span class="badge tone-${status.tone}">${icon(status.icon, 12)}${escaped(status.label)}</span>`;
|
|
123
|
+
}
|
|
124
|
+
/** The app mark from aeolus-fleet brand/aeolus-mark.svg: the Ship glyph on a tile in --primary, its stroke in --primary-foreground. */
|
|
125
|
+
const MARK = `<svg width="24" height="24" viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" rx="7" fill="var(--primary)"/><g fill="none" stroke="var(--primary-foreground)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" transform="translate(6 6) scale(0.8333)"><path d="M12 2v2"/><path d="M12 9.189V13"/><path d="M19 12V6a2 2 0 00-2-2H7a2 2 0 00-2 2v6"/><path d="M19.38 19A11.6 11.6 0 0021 13l-8.188-3.639a2 2 0 00-1.624 0L3 13.001a11.6 11.6 0 002.81 7.76"/><path d="M2 20c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/></g></svg>`;
|
|
126
|
+
const MARK_LARGE = MARK.replace('width="24" height="24"', 'width="40" height="40"');
|
|
127
|
+
const RING_SIZE = 96;
|
|
128
|
+
const RING_STROKE = 6;
|
|
129
|
+
/** The large shape that leads a page: a full ring in a tone, dashed for a state that ended, around an icon or a number. */
|
|
130
|
+
export function ring(shown) {
|
|
131
|
+
const size = shown.size ?? RING_SIZE;
|
|
132
|
+
const radius = (size - RING_STROKE) / 2;
|
|
133
|
+
const middle = size / 2;
|
|
134
|
+
const dash = shown.isDashed === true ? ' stroke-dasharray="4 6"' : '';
|
|
135
|
+
const iconSize = Math.round(size * 0.3);
|
|
136
|
+
let center;
|
|
137
|
+
if ('count' in shown.center) {
|
|
138
|
+
center = `<text x="${middle}" y="${middle}" text-anchor="middle" dominant-baseline="central" font-size="28" font-weight="600" fill="currentColor">${shown.center.count}</text>`;
|
|
139
|
+
}
|
|
140
|
+
else if ('text' in shown.center) {
|
|
141
|
+
// An icon above a short text, such as the time left; the page may update the text.
|
|
142
|
+
center = `<foreignObject x="${middle - 14}" y="${middle - 34}" width="28" height="28"><div xmlns="http://www.w3.org/1999/xhtml" style="color:var(--tone-${shown.tone}-fg)">${icon(shown.center.icon, 24)}</div></foreignObject><text x="${middle}" y="${middle + 10}" text-anchor="middle" dominant-baseline="central" font-size="22" font-weight="600" fill="currentColor" data-time-left>${escaped(shown.center.text)}</text><text x="${middle}" y="${middle + 34}" text-anchor="middle" font-size="12" fill="var(--muted-foreground)">left</text>`;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
center = `<foreignObject x="${middle - iconSize / 2}" y="${middle - iconSize / 2}" width="${iconSize}" height="${iconSize}"><div xmlns="http://www.w3.org/1999/xhtml" style="color:var(--tone-${shown.tone}-fg)">${icon(shown.center.icon, iconSize)}</div></foreignObject>`;
|
|
146
|
+
}
|
|
147
|
+
return `<svg class="ring" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" role="img" aria-label="${escaped(shown.label)}"><circle cx="${middle}" cy="${middle}" r="${radius}" fill="none" stroke="var(--tone-${shown.tone}-fg)" stroke-width="${RING_STROKE}"${dash}/>${center}</svg>`;
|
|
148
|
+
}
|
|
149
|
+
/** An outside party's mark: the first two letters of its name on a tile, as the console's Avatar draws a ship. */
|
|
150
|
+
export function partyMark(name) {
|
|
151
|
+
return `<span class="party-mark" aria-hidden="true">${escaped(name.replaceAll(/[^\p{L}\p{N}]/gu, '').slice(0, 2).toUpperCase())}</span>`;
|
|
152
|
+
}
|
|
153
|
+
/** Who meets whom: the outside party's mark and the fleet's, side by side. */
|
|
154
|
+
export function handshake(party) {
|
|
155
|
+
return `<div class="handshake"><figure>${partyMark(party.name)}<figcaption>${escaped(party.name)}</figcaption></figure><span class="muted">${icon('arrowLeftRight', 16)}</span><figure><span class="fleet-mark">${MARK_LARGE}</span><figcaption>${escaped(party.fleet ?? 'Fleet')}</figcaption></figure></div>`;
|
|
156
|
+
}
|
|
157
|
+
const TABS = {
|
|
158
|
+
overview: { label: 'Overview', icon: 'house', href: '/overview' },
|
|
159
|
+
outsideParties: { label: 'Outside parties', icon: 'plug', href: '/outside-parties' },
|
|
160
|
+
};
|
|
161
|
+
function topBar(current) {
|
|
162
|
+
const tabs = Object.entries(TABS)
|
|
163
|
+
.map(([tab, shown]) => `<a class="tab" href="${shown.href}"${tab === current ? ' aria-current="page"' : ''}>${icon(shown.icon, 14)}${escaped(shown.label)}</a>`)
|
|
164
|
+
.join('');
|
|
165
|
+
return `<header class="top"><a class="mark" href="/overview">${MARK}Aeolus</a><nav class="tabs">${tabs}</nav></header>`;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* What a live page runs: it opens /live for itself and swaps in each section
|
|
169
|
+
* it is sent; when the socket drops it shows Reconnecting and opens again
|
|
170
|
+
* with backoff, never for a refusal (4401 to 4404). Every minute it counts
|
|
171
|
+
* each days left down from its expiry, with no call to the gateway.
|
|
172
|
+
*/
|
|
173
|
+
const LIVE_SCRIPT = `(function (query) {
|
|
174
|
+
var DAY = 86400000, wait = 500, status = document.querySelector('[data-live-status]');
|
|
175
|
+
function countDown() {
|
|
176
|
+
document.querySelectorAll('[data-expires-at]').forEach(function (holder) {
|
|
177
|
+
var badge = holder.querySelector('.badge'), label = badge && badge.lastChild;
|
|
178
|
+
if (!label) return;
|
|
179
|
+
var days = Math.ceil((Date.parse(holder.getAttribute('data-expires-at')) - Date.now()) / DAY);
|
|
180
|
+
badge.className = 'badge ' + (days <= 0 ? 'tone-ended' : days <= 1 ? 'tone-attention' : 'tone-waiting');
|
|
181
|
+
label.textContent = days <= 0 ? 'Expired' : days <= 1 ? 'Last day' : days + ' d left';
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function open() {
|
|
185
|
+
var socket = new WebSocket((location.protocol === 'https:' ? 'wss://' : 'ws://') + location.host + '/live?' + query);
|
|
186
|
+
socket.onopen = function () { wait = 500; status.hidden = true; };
|
|
187
|
+
socket.onmessage = function (event) {
|
|
188
|
+
var sections = JSON.parse(event.data).sections;
|
|
189
|
+
Object.keys(sections).forEach(function (name) {
|
|
190
|
+
var section = document.querySelector('[data-live="' + name + '"]');
|
|
191
|
+
if (section) section.innerHTML = sections[name];
|
|
192
|
+
});
|
|
193
|
+
countDown();
|
|
194
|
+
};
|
|
195
|
+
socket.onclose = function (event) {
|
|
196
|
+
if (event.code >= 4401 && event.code <= 4404) return;
|
|
197
|
+
status.hidden = false;
|
|
198
|
+
setTimeout(open, wait);
|
|
199
|
+
wait = Math.min(wait * 2, 10000);
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
open();
|
|
203
|
+
setInterval(countDown, 60000);
|
|
204
|
+
})(document.currentScript.getAttribute('data-live-query'));`;
|
|
205
|
+
/**
|
|
206
|
+
* A page a person meets on their way in, from an outside MCP client: the
|
|
207
|
+
* mark and its name above one centred column, no tabs. Its own script, if
|
|
208
|
+
* any, comes with its body.
|
|
209
|
+
*/
|
|
210
|
+
export function signInPage(page) {
|
|
211
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escaped(page.title)}</title><style>${STYLE}</style></head><body><main class="centred"><div class="mark">${MARK}Aeolus</div>${page.body}</main></body></html>`;
|
|
212
|
+
}
|
|
213
|
+
/** A whole Signal page: the top bar with its tabs, then the page's own body; a live page names itself to the live channel. */
|
|
214
|
+
export function signalPage(page) {
|
|
215
|
+
const live = page.live === undefined
|
|
216
|
+
? ''
|
|
217
|
+
: `<p data-live-status hidden class="live-status">${statusBadge({ tone: 'waiting', icon: 'hourglass', label: 'Reconnecting' })}</p><script data-live-query="${escaped(page.live)}">${LIVE_SCRIPT}</script>`;
|
|
218
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escaped(page.title)}</title><style>${STYLE}</style></head><body>${topBar(page.tab)}<main${page.isWide === true ? ' class="wide"' : ''}>${page.body}</main>${live}</body></html>`;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=signal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/adapters/http/signal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The version this gateway process runs, read from its package.json: what
|
|
3
|
+
* runs, not what a deploy meant to ship. This file sits at src/adapters/http
|
|
4
|
+
* or dist/adapters/http: the package root is three levels up.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runningVersion(): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const packageJson = z.object({ version: z.string() });
|
|
4
|
+
/**
|
|
5
|
+
* The version this gateway process runs, read from its package.json: what
|
|
6
|
+
* runs, not what a deploy meant to ship. This file sits at src/adapters/http
|
|
7
|
+
* or dist/adapters/http: the package root is three levels up.
|
|
8
|
+
*/
|
|
9
|
+
export function runningVersion() {
|
|
10
|
+
return packageJson.parse(JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8'))).version;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/adapters/http/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACxH,CAAC"}
|