@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 @@
|
|
|
1
|
+
{"version":3,"file":"request-id.js","sourceRoot":"","sources":["../../../src/core/installation/request-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAI/D,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA8B,EAC9B,OAAmD;IAEnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,OAAO,CAAC,SAAS,+BAA+B,CAAC,CAAC;AAC/J,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetSwitches, InstallationMode } from './ports.js';
|
|
3
|
+
/** Whether the gateway serves the fleet now: off, it does nothing for that fleet. */
|
|
4
|
+
export type IsServed = (fleetId: FleetId) => Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Policy: the gateway serves every fleet of an open installation, and a fleet
|
|
7
|
+
* of an enabled one only once the hosting service switched it on (decision 0021).
|
|
8
|
+
*/
|
|
9
|
+
export declare function createIsServed(deps: {
|
|
10
|
+
installation: InstallationMode;
|
|
11
|
+
switches: FleetSwitches;
|
|
12
|
+
}): IsServed;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy: the gateway serves every fleet of an open installation, and a fleet
|
|
3
|
+
* of an enabled one only once the hosting service switched it on (decision 0021).
|
|
4
|
+
*/
|
|
5
|
+
export function createIsServed(deps) {
|
|
6
|
+
return async (fleetId) => deps.installation === 'open' || (await deps.switches.find(fleetId)) === true;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=served.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"served.js","sourceRoot":"","sources":["../../../src/core/installation/served.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiE;IAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;AACzG,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import type { DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { FleetSwitches, InstallationRequests, RequestHasher } from './ports.js';
|
|
6
|
+
export type SetFleetEnabled = (input: {
|
|
7
|
+
requestId: string;
|
|
8
|
+
fleetId: FleetId;
|
|
9
|
+
isEnabled: boolean;
|
|
10
|
+
}) => Promise<Result<{
|
|
11
|
+
fleetId: FleetId;
|
|
12
|
+
isEnabled: boolean;
|
|
13
|
+
}, DomainError<'REQUEST_ID_USED'>>>;
|
|
14
|
+
/**
|
|
15
|
+
* Use case: the hosting service switches the gateway on or off for a fleet
|
|
16
|
+
* (decision 0021). Off keeps everything of the fleet, so on again resumes,
|
|
17
|
+
* whatever network the fleet has (interop I-3). A replayed request id
|
|
18
|
+
* answers what it answered first and changes nothing.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createSetFleetEnabled(deps: {
|
|
21
|
+
switches: FleetSwitches;
|
|
22
|
+
requests: InstallationRequests;
|
|
23
|
+
hasher: RequestHasher;
|
|
24
|
+
clock: Clock;
|
|
25
|
+
}): SetFleetEnabled;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ok } from '../shared/result.js';
|
|
2
|
+
import { earlierAnswer } from './request-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the hosting service switches the gateway on or off for a fleet
|
|
5
|
+
* (decision 0021). Off keeps everything of the fleet, so on again resumes,
|
|
6
|
+
* whatever network the fleet has (interop I-3). A replayed request id
|
|
7
|
+
* answers what it answered first and changes nothing.
|
|
8
|
+
*/
|
|
9
|
+
export function createSetFleetEnabled(deps) {
|
|
10
|
+
return async ({ requestId, fleetId, isEnabled }) => {
|
|
11
|
+
const requestHash = deps.hasher.hash(`setEnabled ${fleetId} ${String(isEnabled)}`);
|
|
12
|
+
const earlier = await earlierAnswer(deps.requests, { requestId, requestHash });
|
|
13
|
+
if (earlier !== undefined) {
|
|
14
|
+
return 'isOk' in earlier ? earlier : ok({ fleetId, isEnabled: earlier.isEnabled === true });
|
|
15
|
+
}
|
|
16
|
+
const at = deps.clock.now();
|
|
17
|
+
await deps.switches.set(fleetId, { isEnabled, at });
|
|
18
|
+
await deps.requests.record({ requestId, kind: 'setEnabled', requestHash, fleetId, isEnabled, at });
|
|
19
|
+
return ok({ fleetId, isEnabled });
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=set-fleet-enabled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-fleet-enabled.js","sourceRoot":"","sources":["../../../src/core/installation/set-fleet-enabled.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAKrC;IACC,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QACnG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: an outside MCP client calls a tool (interop 3.3). The call is a
|
|
3
|
+
* message the party's proxy ship sends to the tool's ship, and the client is
|
|
4
|
+
* answered a handle only once the fleet's send answered OK: the message is
|
|
5
|
+
* stored before any answer, and the gateway never answers OK itself. It
|
|
6
|
+
* then waits for the answer as long as the capability states, at most the
|
|
7
|
+
* gateway's own most (interop 3.3, 5.3): answered within it, the client gets
|
|
8
|
+
* the answer itself; else its handle and the state. The call fails at the
|
|
9
|
+
* capability's deadline, and never by time when it states none (3.4).
|
|
10
|
+
*/
|
|
11
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
12
|
+
import type { Sleep } from '../mcp-out/run-party.js';
|
|
13
|
+
import type { PartyStore } from '../parties/ports.js';
|
|
14
|
+
import type { Clock } from '../shared/clock.js';
|
|
15
|
+
import { type DomainError } from '../shared/errors.js';
|
|
16
|
+
import { type Result } from '../shared/result.js';
|
|
17
|
+
import { type ListTools } from './list-tools.js';
|
|
18
|
+
import type { CallKeys, CallSender, ClientCalls } from './ports.js';
|
|
19
|
+
import { type ReadCall } from './read-client-call.js';
|
|
20
|
+
export type CallToolRefusal = DomainError<'PARTY_NOT_CREWED' | 'FLEET_UNAVAILABLE' | 'NO_SUCH_TOOL' | 'INVALID_ARGUMENTS' | 'NOT_REACHABLE' | 'SEND_REFUSED'>;
|
|
21
|
+
export type CallTool = (caller: {
|
|
22
|
+
fleetId: FleetId;
|
|
23
|
+
party: string;
|
|
24
|
+
}, call: {
|
|
25
|
+
name: string;
|
|
26
|
+
arguments: Record<string, unknown>;
|
|
27
|
+
}) => Promise<Result<ReadCall, CallToolRefusal>>;
|
|
28
|
+
interface CallToolDeps {
|
|
29
|
+
parties: PartyStore;
|
|
30
|
+
listTools: ListTools;
|
|
31
|
+
sender: CallSender;
|
|
32
|
+
calls: ClientCalls;
|
|
33
|
+
keys: CallKeys;
|
|
34
|
+
clock: Clock;
|
|
35
|
+
sleep: Sleep;
|
|
36
|
+
/** The most a call waits for its answer before it is answered its handle, whatever its capability states. */
|
|
37
|
+
waitMaxMs: number;
|
|
38
|
+
/** How often it reads the call while it waits. */
|
|
39
|
+
waitPollMs: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function createCallTool(deps: CallToolDeps): CallTool;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { IDEMPOTENCY_ARGUMENT } from './list-tools.js';
|
|
4
|
+
import { readCallOf } from './read-client-call.js';
|
|
5
|
+
/** The message's payload: the arguments as JSON, or a text tool's one text; none for arguments that do not fit the tool. */
|
|
6
|
+
function payloadOf(tool, values) {
|
|
7
|
+
if (tool.target.isText) {
|
|
8
|
+
return typeof values.text === 'string' ? values.text : undefined;
|
|
9
|
+
}
|
|
10
|
+
return JSON.stringify(values);
|
|
11
|
+
}
|
|
12
|
+
function refusalOf(refused) {
|
|
13
|
+
switch (refused.code) {
|
|
14
|
+
// No reason why: the fleet's network rules are not the outside's to read.
|
|
15
|
+
case 'NOT_REACHABLE':
|
|
16
|
+
return refuse('NOT_REACHABLE', 'This party may not call that tool now');
|
|
17
|
+
case 'UNAVAILABLE':
|
|
18
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not answer, so the call may have been sent: call again with the same ${IDEMPOTENCY_ARGUMENT} to send it at most once`);
|
|
19
|
+
default:
|
|
20
|
+
return refuse('SEND_REFUSED', `The fleet refused the call: ${refused.message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** No signal ends a wait early: it is bounded by its own time. */
|
|
24
|
+
const UNENDING = new AbortController().signal;
|
|
25
|
+
/** The call as it stands once its answer came or the wait passed, read after each poll; it never sleeps past the wait's end. */
|
|
26
|
+
async function answerWithin(deps, sent) {
|
|
27
|
+
const waitEnd = sent.since.getTime() + Math.min(sent.waitMs, deps.waitMaxMs);
|
|
28
|
+
for (;;) {
|
|
29
|
+
const call = await deps.calls.findByMessage(sent.fleetId, sent.messageId);
|
|
30
|
+
const read = call ? readCallOf(call, deps.clock.now()) : { handle: sent.handle, createdAt: sent.since, updatedAt: sent.since, state: 'submitted' };
|
|
31
|
+
const left = waitEnd - deps.clock.now().getTime();
|
|
32
|
+
if (read.state === 'completed' || read.state === 'failed' || left <= 0) {
|
|
33
|
+
return read;
|
|
34
|
+
}
|
|
35
|
+
await deps.sleep(Math.min(deps.waitPollMs, left), UNENDING);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function createCallTool(deps) {
|
|
39
|
+
return async (caller, call) => {
|
|
40
|
+
const listed = await deps.listTools(caller);
|
|
41
|
+
if (!listed.isOk) {
|
|
42
|
+
return listed;
|
|
43
|
+
}
|
|
44
|
+
const tool = listed.value.find((each) => each.name === call.name);
|
|
45
|
+
if (!tool) {
|
|
46
|
+
return refuse('NO_SUCH_TOOL', `No tool ${call.name} is offered to this party now`);
|
|
47
|
+
}
|
|
48
|
+
const { [IDEMPOTENCY_ARGUMENT]: key, ...values } = call.arguments;
|
|
49
|
+
if (key !== undefined && (typeof key !== 'string' || key.length === 0)) {
|
|
50
|
+
return refuse('INVALID_ARGUMENTS', `${IDEMPOTENCY_ARGUMENT} is a string of at least one character`);
|
|
51
|
+
}
|
|
52
|
+
const payload = payloadOf(tool, values);
|
|
53
|
+
if (payload === undefined) {
|
|
54
|
+
return refuse('INVALID_ARGUMENTS', 'This tool takes one text argument, a string');
|
|
55
|
+
}
|
|
56
|
+
const party = await deps.parties.find(caller.fleetId, caller.party);
|
|
57
|
+
if (party?.crewToken == null) {
|
|
58
|
+
return refuse('PARTY_NOT_CREWED', `The party ${caller.party} is not crewed: argo crews it on the parties page`);
|
|
59
|
+
}
|
|
60
|
+
const idempotencyKey = key === undefined ? deps.keys.newIdempotencyKey() : deps.keys.idempotencyKeyOf({ ...caller, key });
|
|
61
|
+
const sent = await deps.sender.send(party.crewToken, { to: tool.target.shipId, contentType: tool.target.contentType, payload, idempotencyKey });
|
|
62
|
+
if (!sent.isOk) {
|
|
63
|
+
return refusalOf(sent.error);
|
|
64
|
+
}
|
|
65
|
+
const { messageId } = sent.value;
|
|
66
|
+
const handle = deps.keys.handleOf(caller.fleetId, messageId);
|
|
67
|
+
const sentAt = deps.clock.now();
|
|
68
|
+
await deps.calls.save({
|
|
69
|
+
fleetId: caller.fleetId,
|
|
70
|
+
party: caller.party,
|
|
71
|
+
messageId,
|
|
72
|
+
handle,
|
|
73
|
+
shipId: tool.target.shipId,
|
|
74
|
+
capability: tool.target.capability,
|
|
75
|
+
outputContentType: tool.target.outputContentType,
|
|
76
|
+
sentAt,
|
|
77
|
+
deadlineAt: tool.target.deadlineMs === null ? null : new Date(sentAt.getTime() + tool.target.deadlineMs),
|
|
78
|
+
});
|
|
79
|
+
return ok(await answerWithin(deps, { fleetId: caller.fleetId, messageId, handle, since: sentAt, waitMs: tool.target.waitMs }));
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=call-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-tool.js","sourceRoot":"","sources":["../../../src/core/mcp-in/call-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An outside client's call (interop 3.4): the message its proxy ship sent,
|
|
3
|
+
* the replies naming it, and the one rule for its state. Core keeps no state
|
|
4
|
+
* of a call: submitted, working, completed and failed are the gateway's,
|
|
5
|
+
* derived from what it kept and the time.
|
|
6
|
+
*/
|
|
7
|
+
import type { DeliveryId, FleetId, MessageId, ShipId } from '@aeolus-fleet/common';
|
|
8
|
+
/** A reply naming the call's message, as the gateway kept it before acknowledging its delivery. */
|
|
9
|
+
export interface CallReply {
|
|
10
|
+
deliveryId: DeliveryId;
|
|
11
|
+
messageId: MessageId;
|
|
12
|
+
contentType: string;
|
|
13
|
+
payload: string;
|
|
14
|
+
receivedAt: Date;
|
|
15
|
+
}
|
|
16
|
+
export interface ClientCall {
|
|
17
|
+
fleetId: FleetId;
|
|
18
|
+
party: string;
|
|
19
|
+
messageId: MessageId;
|
|
20
|
+
handle: string;
|
|
21
|
+
shipId: ShipId;
|
|
22
|
+
capability: string;
|
|
23
|
+
/** The capability's stated output type, its first output mode; none when it states none. */
|
|
24
|
+
outputContentType: string | null;
|
|
25
|
+
sentAt: Date;
|
|
26
|
+
/** When the call fails without its answer, from its capability's deadline; none never fails by time. */
|
|
27
|
+
deadlineAt: Date | null;
|
|
28
|
+
/** In the order the gateway kept them. */
|
|
29
|
+
replies: CallReply[];
|
|
30
|
+
}
|
|
31
|
+
export type CallState = {
|
|
32
|
+
state: 'submitted';
|
|
33
|
+
} | {
|
|
34
|
+
state: 'working';
|
|
35
|
+
} | {
|
|
36
|
+
state: 'completed';
|
|
37
|
+
answer: {
|
|
38
|
+
contentType: string;
|
|
39
|
+
payload: string;
|
|
40
|
+
};
|
|
41
|
+
} | {
|
|
42
|
+
state: 'failed';
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Completed by the first reply of the stated output type, kept before the
|
|
46
|
+
* deadline; failed at the deadline without one, and a later reply changes
|
|
47
|
+
* nothing; working once any other reply came; submitted before that.
|
|
48
|
+
*/
|
|
49
|
+
export declare function stateOf(call: ClientCall, now: Date): CallState;
|
|
50
|
+
/** Since when the call is in its state: its sending, its first reply, its answer, or its deadline. */
|
|
51
|
+
export declare function stateSince(call: ClientCall, now: Date): Date;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** The type a plain text answer comes in, which completes a call to a ship that stated no output type. */
|
|
2
|
+
const PLAIN_TEXT = 'text/plain';
|
|
3
|
+
/** A media type as compared: lower case, with no spaces around its parameters. */
|
|
4
|
+
const normalized = (contentType) => contentType
|
|
5
|
+
.split(';')
|
|
6
|
+
.map((part) => part.trim().toLowerCase())
|
|
7
|
+
.join(';');
|
|
8
|
+
const essenceOf = (contentType) => normalized(contentType).split(';')[0] ?? '';
|
|
9
|
+
function isAnswer(call, reply) {
|
|
10
|
+
if (call.deadlineAt !== null && reply.receivedAt.getTime() >= call.deadlineAt.getTime()) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return call.outputContentType === null ? essenceOf(reply.contentType) === PLAIN_TEXT : normalized(reply.contentType) === normalized(call.outputContentType);
|
|
14
|
+
}
|
|
15
|
+
/** The call's state with since when it holds, by the one rule below. */
|
|
16
|
+
function standing(call, now) {
|
|
17
|
+
const answer = call.replies.find((reply) => isAnswer(call, reply));
|
|
18
|
+
if (answer) {
|
|
19
|
+
return { state: { state: 'completed', answer: { contentType: answer.contentType, payload: answer.payload } }, since: answer.receivedAt };
|
|
20
|
+
}
|
|
21
|
+
if (call.deadlineAt !== null && now.getTime() >= call.deadlineAt.getTime()) {
|
|
22
|
+
return { state: { state: 'failed' }, since: call.deadlineAt };
|
|
23
|
+
}
|
|
24
|
+
const [first] = call.replies;
|
|
25
|
+
return first ? { state: { state: 'working' }, since: first.receivedAt } : { state: { state: 'submitted' }, since: call.sentAt };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Completed by the first reply of the stated output type, kept before the
|
|
29
|
+
* deadline; failed at the deadline without one, and a later reply changes
|
|
30
|
+
* nothing; working once any other reply came; submitted before that.
|
|
31
|
+
*/
|
|
32
|
+
export function stateOf(call, now) {
|
|
33
|
+
return standing(call, now).state;
|
|
34
|
+
}
|
|
35
|
+
/** Since when the call is in its state: its sending, its first reply, its answer, or its deadline. */
|
|
36
|
+
export function stateSince(call, now) {
|
|
37
|
+
return standing(call, now).since;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=client-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-call.js","sourceRoot":"","sources":["../../../src/core/mcp-in/client-call.ts"],"names":[],"mappings":"AAmCA,0GAA0G;AAC1G,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,kFAAkF;AAClF,MAAM,UAAU,GAAG,CAAC,WAAmB,EAAE,EAAE,CACzC,WAAW;KACR,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;KACxC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEf,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAEvF,SAAS,QAAQ,CAAC,IAAgB,EAAE,KAAgB;IAClD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9J,CAAC;AAED,wEAAwE;AACxE,SAAS,QAAQ,CAAC,IAAgB,EAAE,GAAS;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3I,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3E,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAChE,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAClI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAgB,EAAE,GAAS;IACjD,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;AACnC,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,GAAS;IACpD,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProxyShipCrew } from '../mcp-out/hand-call.js';
|
|
2
|
+
import type { Sleep } from '../mcp-out/run-party.js';
|
|
3
|
+
import type { McpClientParty } from '../parties/party.js';
|
|
4
|
+
import type { Clock } from '../shared/clock.js';
|
|
5
|
+
import type { ClientCalls, ReplyReceiver } from './ports.js';
|
|
6
|
+
export type CollectReplies = (input: {
|
|
7
|
+
party: McpClientParty;
|
|
8
|
+
signal: AbortSignal;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
ended: 'stopped' | 'crewRefused';
|
|
11
|
+
}>;
|
|
12
|
+
interface CollectRepliesDeps {
|
|
13
|
+
crew: Pick<ProxyShipCrew, 'ack' | 'handled'>;
|
|
14
|
+
replies: ReplyReceiver;
|
|
15
|
+
calls: ClientCalls;
|
|
16
|
+
clock: Clock;
|
|
17
|
+
sleep: Sleep;
|
|
18
|
+
/** How long it waits before it looks again for calls to wait on. */
|
|
19
|
+
pollMs: number;
|
|
20
|
+
}
|
|
21
|
+
export declare function createCollectReplies(deps: CollectRepliesDeps): CollectReplies;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { stateOf } from './client-call.js';
|
|
2
|
+
/** The fleet's codes for a crew token it no longer takes. */
|
|
3
|
+
const CREW_REFUSED = new Set(['UNAUTHORIZED', 'LEASE_ENDED']);
|
|
4
|
+
/** The most calls whose reply the gateway waits on at once, for one party. */
|
|
5
|
+
const WAITING_MAX = 10;
|
|
6
|
+
/** Whether the call still waits for its answer: neither completed nor failed at its deadline. */
|
|
7
|
+
function isWaiting(call, now) {
|
|
8
|
+
const { state } = stateOf(call, now);
|
|
9
|
+
return state === 'submitted' || state === 'working';
|
|
10
|
+
}
|
|
11
|
+
export function createCollectReplies(deps) {
|
|
12
|
+
return async ({ party, signal }) => {
|
|
13
|
+
const crewToken = party.crewToken;
|
|
14
|
+
if (crewToken === null) {
|
|
15
|
+
return { ended: 'crewRefused' };
|
|
16
|
+
}
|
|
17
|
+
const caller = { fleetId: party.fleetId, party: party.name };
|
|
18
|
+
const waiting = new Map();
|
|
19
|
+
/** When each call was last asked for, so every call waited on gets its turn. */
|
|
20
|
+
const askedAt = new Map();
|
|
21
|
+
let asks = 0;
|
|
22
|
+
/** Whether the fleet refused the crew token: set by a wait, read by the run. */
|
|
23
|
+
const run = { isCrewRefused: false };
|
|
24
|
+
/** Asks the fleet once for the call's reply, and keeps it, then confirms it. */
|
|
25
|
+
const waitOn = async (call) => {
|
|
26
|
+
asks += 1;
|
|
27
|
+
askedAt.set(call.messageId, asks);
|
|
28
|
+
const received = await deps.replies.receiveReply(crewToken, { messageId: call.messageId, signal });
|
|
29
|
+
if (!received.isOk) {
|
|
30
|
+
if (CREW_REFUSED.has(received.error.code)) {
|
|
31
|
+
run.isCrewRefused = true;
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const reply = received.value;
|
|
36
|
+
if (reply === undefined) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
await deps.calls.addReply({ fleetId: call.fleetId, messageId: call.messageId }, { ...reply, receivedAt: deps.clock.now() });
|
|
40
|
+
// Kept already: an acknowledgement the fleet did not take hands the reply again, and keeping it again changes nothing.
|
|
41
|
+
if ((await deps.crew.ack(crewToken, reply.deliveryId)).isOk) {
|
|
42
|
+
await deps.crew.handled(crewToken, reply.deliveryId);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/** A wait whose reply could not be kept: the run ends, and answers its failure. */
|
|
46
|
+
const failed = [];
|
|
47
|
+
while (!signal.aborted && !run.isCrewRefused && failed.length === 0) {
|
|
48
|
+
const now = deps.clock.now();
|
|
49
|
+
const open = (await deps.calls.waitedOn(caller, now))
|
|
50
|
+
.filter((call) => isWaiting(call, now) && !waiting.has(call.messageId))
|
|
51
|
+
.sort((left, right) => (askedAt.get(left.messageId) ?? 0) - (askedAt.get(right.messageId) ?? 0));
|
|
52
|
+
for (const call of open.slice(0, WAITING_MAX - waiting.size)) {
|
|
53
|
+
const waited = waitOn(call);
|
|
54
|
+
waiting.set(call.messageId, waited
|
|
55
|
+
.catch(() => {
|
|
56
|
+
failed.push(waited);
|
|
57
|
+
})
|
|
58
|
+
.finally(() => waiting.delete(call.messageId)));
|
|
59
|
+
}
|
|
60
|
+
await deps.sleep(deps.pollMs, signal);
|
|
61
|
+
}
|
|
62
|
+
await Promise.all([...waiting.values(), ...failed]);
|
|
63
|
+
return { ended: run.isCrewRefused ? 'crewRefused' : 'stopped' };
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=collect-replies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-replies.js","sourceRoot":"","sources":["../../../src/core/mcp-in/collect-replies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: the tools an outside MCP client sees (interop 3.3). Each is a
|
|
3
|
+
* capability of a ship its party's proxy ship may send to now, as the fleet's
|
|
4
|
+
* discover answers it: the gateway shows exactly what core answers, and adds
|
|
5
|
+
* no reach of its own.
|
|
6
|
+
*/
|
|
7
|
+
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
8
|
+
import type { PartyStore } from '../parties/ports.js';
|
|
9
|
+
import { type DomainError } from '../shared/errors.js';
|
|
10
|
+
import { type Result } from '../shared/result.js';
|
|
11
|
+
import type { Discovery, ShipAliases } from './ports.js';
|
|
12
|
+
/** The optional argument a client gives so that the same call again sends no second message. */
|
|
13
|
+
export declare const IDEMPOTENCY_ARGUMENT = "aeolus_idempotency_key";
|
|
14
|
+
/** The longest tool name MCP clients take. */
|
|
15
|
+
export declare const TOOL_NAME_MAX_LENGTH = 128;
|
|
16
|
+
/** Where a tool's call goes: the ship, its capability, and the content type of the message. */
|
|
17
|
+
export interface ToolTarget {
|
|
18
|
+
shipId: ShipId;
|
|
19
|
+
capability: string;
|
|
20
|
+
contentType: string;
|
|
21
|
+
/** Whether the message is the call's one text argument, as plain text, rather than its arguments as JSON. */
|
|
22
|
+
isText: boolean;
|
|
23
|
+
/** The type the answer comes in, the capability's first output mode; none when it states none. */
|
|
24
|
+
outputContentType: string | null;
|
|
25
|
+
/** How long a call waits for its answer, as the capability states it; 0 when it states none. */
|
|
26
|
+
waitMs: number;
|
|
27
|
+
/** How long a call may take before it fails, as the capability states it; none when it states none. */
|
|
28
|
+
deadlineMs: number | null;
|
|
29
|
+
}
|
|
30
|
+
/** A tool as an MCP client lists it, with where its call goes. */
|
|
31
|
+
export interface ListedTool {
|
|
32
|
+
name: string;
|
|
33
|
+
title?: string;
|
|
34
|
+
description: string;
|
|
35
|
+
inputSchema: Record<string, unknown>;
|
|
36
|
+
target: ToolTarget;
|
|
37
|
+
}
|
|
38
|
+
export type ListToolsRefusal = DomainError<'PARTY_NOT_CREWED' | 'FLEET_UNAVAILABLE'>;
|
|
39
|
+
/** Who lists: the fleet and the party its access token names. */
|
|
40
|
+
export type ListTools = (caller: {
|
|
41
|
+
fleetId: FleetId;
|
|
42
|
+
party: string;
|
|
43
|
+
}) => Promise<Result<ListedTool[], ListToolsRefusal>>;
|
|
44
|
+
export declare function createListTools(deps: {
|
|
45
|
+
parties: PartyStore;
|
|
46
|
+
discovery: Discovery;
|
|
47
|
+
aliases: ShipAliases;
|
|
48
|
+
}): ListTools;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/** The optional argument a client gives so that the same call again sends no second message. */
|
|
4
|
+
export const IDEMPOTENCY_ARGUMENT = 'aeolus_idempotency_key';
|
|
5
|
+
const IDEMPOTENCY_PROPERTY = {
|
|
6
|
+
type: 'string',
|
|
7
|
+
description: 'Optional. The same key again sends no second message: give one when you may call again after a lost answer.',
|
|
8
|
+
};
|
|
9
|
+
/** The longest tool name MCP clients take. */
|
|
10
|
+
export const TOOL_NAME_MAX_LENGTH = 128;
|
|
11
|
+
/** Between a ship's alias and its capability's name in a tool name. */
|
|
12
|
+
const TOOL_NAME_SEPARATOR = '__';
|
|
13
|
+
/** The media type a capability that names none takes and answers. */
|
|
14
|
+
const DEFAULT_MODE = 'application/json';
|
|
15
|
+
const TEXT_MODE = 'text/plain';
|
|
16
|
+
/** A media type without its parameters, in lower case. */
|
|
17
|
+
const essenceOf = (mode) => (mode.split(';')[0] ?? '').trim().toLowerCase();
|
|
18
|
+
const isJson = (mode) => essenceOf(mode) === DEFAULT_MODE || essenceOf(mode).endsWith('+json');
|
|
19
|
+
const isObjectSchema = (schema) => schema.type === 'object';
|
|
20
|
+
/** The arguments a capability takes, with the idempotency argument; none for a schema MCP cannot carry. */
|
|
21
|
+
function inputSchemaOf(capability, isText) {
|
|
22
|
+
if (isText) {
|
|
23
|
+
return { type: 'object', properties: { text: { type: 'string' }, [IDEMPOTENCY_ARGUMENT]: IDEMPOTENCY_PROPERTY }, required: ['text'] };
|
|
24
|
+
}
|
|
25
|
+
const schema = capability.inputSchema ?? { type: 'object' };
|
|
26
|
+
if (!isObjectSchema(schema)) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const properties = typeof schema.properties === 'object' && schema.properties !== null ? schema.properties : {};
|
|
30
|
+
return { ...schema, properties: { ...properties, [IDEMPOTENCY_ARGUMENT]: IDEMPOTENCY_PROPERTY } };
|
|
31
|
+
}
|
|
32
|
+
function toolOf({ alias, summary, shipId }, capability) {
|
|
33
|
+
const contentType = capability.inputModes?.[0] ?? DEFAULT_MODE;
|
|
34
|
+
const isText = essenceOf(contentType) === TEXT_MODE;
|
|
35
|
+
const name = `${alias}${TOOL_NAME_SEPARATOR}${capability.name}`;
|
|
36
|
+
const inputSchema = inputSchemaOf(capability, isText);
|
|
37
|
+
if ((!isText && !isJson(contentType)) || inputSchema === undefined || name.length > TOOL_NAME_MAX_LENGTH) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
// No output schema: a call may answer a handle, and MCP clients check every answer against it.
|
|
41
|
+
return {
|
|
42
|
+
name,
|
|
43
|
+
...(capability.title === undefined ? {} : { title: capability.title }),
|
|
44
|
+
description: [capability.description, `Offered by: ${summary}`].filter((part) => part !== undefined).join('\n\n'),
|
|
45
|
+
inputSchema,
|
|
46
|
+
target: { shipId, capability: capability.name, contentType, isText, outputContentType: capability.outputModes?.[0] ?? null, waitMs: capability.waitMs ?? 0, deadlineMs: capability.deadlineMs ?? null },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** argo is left out: every ship may send to argo, and argo is no tool (Q12). */
|
|
50
|
+
function toolsOf(ship, alias) {
|
|
51
|
+
const { statement } = ship;
|
|
52
|
+
if (ship.kind === 'operator' || statement?.by !== 'crew') {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
return statement.capabilities.flatMap((capability) => toolOf({ alias, summary: statement.summary, shipId: ship.shipId }, capability) ?? []);
|
|
56
|
+
}
|
|
57
|
+
export function createListTools(deps) {
|
|
58
|
+
return async ({ fleetId, party: name }) => {
|
|
59
|
+
const party = await deps.parties.find(fleetId, name);
|
|
60
|
+
if (party?.kind !== 'mcpClient' || party.state !== 'crewed' || party.crewToken === null) {
|
|
61
|
+
return refuse('PARTY_NOT_CREWED', `The party ${name} is not crewed: argo crews it on the parties page`);
|
|
62
|
+
}
|
|
63
|
+
const discovered = await deps.discovery.discover(party.crewToken);
|
|
64
|
+
if (!discovered.isOk) {
|
|
65
|
+
return refuse('FLEET_UNAVAILABLE', `The fleet did not answer which ships the party reaches: ${discovered.error.message}`);
|
|
66
|
+
}
|
|
67
|
+
return ok(discovered.value.flatMap((ship) => toolsOf(ship, deps.aliases.aliasOf(fleetId, ship.shipId))));
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=list-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-tools.js","sourceRoot":"","sources":["../../../src/core/mcp-in/list-tools.ts"],"names":[],"mappings":"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"}
|