@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,108 @@
|
|
|
1
|
+
import type { DeliveryId, FleetId, MessageId, ShipId, ShipKind } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetRefusal } from '../connection/ports.js';
|
|
3
|
+
import type { Result } from '../shared/result.js';
|
|
4
|
+
import type { CallReply, ClientCall } from './client-call.js';
|
|
5
|
+
/** One thing a ship offers, as its statement says it (decision 0047): MCP's tool fields and A2A's modes. */
|
|
6
|
+
export interface Capability {
|
|
7
|
+
name: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
inputSchema?: Record<string, unknown>;
|
|
11
|
+
outputSchema?: Record<string, unknown>;
|
|
12
|
+
/** The media types to send it, the first the one to use. */
|
|
13
|
+
inputModes?: string[];
|
|
14
|
+
/** The media types that come back, the first the one to expect. */
|
|
15
|
+
outputModes?: string[];
|
|
16
|
+
/** How long a call waits for its answer before the caller is answered a handle or task; none is no wait (interop 5.3). */
|
|
17
|
+
waitMs?: number;
|
|
18
|
+
/** How long a call may take before it fails; none is no deadline (interop 3.4). */
|
|
19
|
+
deadlineMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/** A ship's statement as discovery shows it: its crew's, the note it was commissioned with, or none. */
|
|
22
|
+
export type DiscoveredStatement = {
|
|
23
|
+
by: 'crew';
|
|
24
|
+
summary: string;
|
|
25
|
+
capabilities: Capability[];
|
|
26
|
+
} | {
|
|
27
|
+
by: 'commission';
|
|
28
|
+
} | null;
|
|
29
|
+
/** A ship the caller may send to now, as discover answers it. */
|
|
30
|
+
export interface DiscoveredShip {
|
|
31
|
+
shipId: ShipId;
|
|
32
|
+
kind: ShipKind;
|
|
33
|
+
statement: DiscoveredStatement;
|
|
34
|
+
}
|
|
35
|
+
/** Outbound port: the fleet's discover, as a proxy ship's crew calls it. */
|
|
36
|
+
export interface Discovery {
|
|
37
|
+
discover(crewToken: string): Promise<Result<DiscoveredShip[], FleetRefusal>>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Outbound port: the name an outside client knows a ship by. Derived, never
|
|
41
|
+
* stored, the same for the same ship, and telling nothing of the ship's name
|
|
42
|
+
* or id: the gateway translates both ways, as NAT does.
|
|
43
|
+
*/
|
|
44
|
+
export interface ShipAliases {
|
|
45
|
+
aliasOf(fleetId: FleetId, shipId: ShipId): string;
|
|
46
|
+
}
|
|
47
|
+
/** Outbound port: the fleet's send, as a proxy ship's crew calls it. The same idempotency key answers the same message. */
|
|
48
|
+
export interface CallSender {
|
|
49
|
+
send(crewToken: string, message: {
|
|
50
|
+
to: ShipId;
|
|
51
|
+
contentType: string;
|
|
52
|
+
payload: string;
|
|
53
|
+
idempotencyKey: string;
|
|
54
|
+
}): Promise<Result<{
|
|
55
|
+
messageId: MessageId;
|
|
56
|
+
}, FleetRefusal>>;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Outbound port: the keys of an outside client's call, derived under the
|
|
60
|
+
* gateway's own key. The outside sees only opaque ids, never a `msg_` id.
|
|
61
|
+
*/
|
|
62
|
+
export interface CallKeys {
|
|
63
|
+
/** The send's key for a client's own idempotency key: the same for the same party and key. */
|
|
64
|
+
idempotencyKeyOf(given: {
|
|
65
|
+
fleetId: FleetId;
|
|
66
|
+
party: string;
|
|
67
|
+
key: string;
|
|
68
|
+
}): string;
|
|
69
|
+
/** A new send key, for a call the client gave none. */
|
|
70
|
+
newIdempotencyKey(): string;
|
|
71
|
+
/** The handle the client reads its call by. */
|
|
72
|
+
handleOf(fleetId: FleetId, messageId: MessageId): string;
|
|
73
|
+
}
|
|
74
|
+
/** Outbound port: outside clients' calls, one per message, each with the replies naming it. */
|
|
75
|
+
export interface ClientCalls {
|
|
76
|
+
/** Keeps a call with no replies; a call kept for its message already stays as it was. */
|
|
77
|
+
save(call: Omit<ClientCall, 'replies'>): Promise<void>;
|
|
78
|
+
/** Keeps a reply on the call its message names, once per delivery. */
|
|
79
|
+
addReply(call: {
|
|
80
|
+
fleetId: FleetId;
|
|
81
|
+
messageId: MessageId;
|
|
82
|
+
}, reply: CallReply): Promise<void>;
|
|
83
|
+
findByMessage(fleetId: FleetId, messageId: MessageId): Promise<ClientCall | undefined>;
|
|
84
|
+
/** The party's calls whose deadline has not passed by now, or that have none: those whose answer may still come. */
|
|
85
|
+
waitedOn(caller: {
|
|
86
|
+
fleetId: FleetId;
|
|
87
|
+
party: string;
|
|
88
|
+
}, now: Date): Promise<ClientCall[]>;
|
|
89
|
+
/** The party's call by its handle; none of another party's. */
|
|
90
|
+
findByHandle(caller: {
|
|
91
|
+
fleetId: FleetId;
|
|
92
|
+
party: string;
|
|
93
|
+
}, handle: string): Promise<ClientCall | undefined>;
|
|
94
|
+
}
|
|
95
|
+
/** A reply the fleet hands a proxy ship's crew: its delivery and its message. */
|
|
96
|
+
export interface ReceivedReply {
|
|
97
|
+
deliveryId: DeliveryId;
|
|
98
|
+
messageId: MessageId;
|
|
99
|
+
contentType: string;
|
|
100
|
+
payload: string;
|
|
101
|
+
}
|
|
102
|
+
/** Outbound port: the fleet's receiveReply, as a proxy ship's crew calls it: the reply to one message, if one came within the fleet's wait. */
|
|
103
|
+
export interface ReplyReceiver {
|
|
104
|
+
receiveReply(crewToken: string, wait: {
|
|
105
|
+
messageId: MessageId;
|
|
106
|
+
signal: AbortSignal;
|
|
107
|
+
}): Promise<Result<ReceivedReply | undefined, FleetRefusal>>;
|
|
108
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/mcp-in/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
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 CallState, type ClientCall } from './client-call.js';
|
|
6
|
+
import type { ClientCalls } from './ports.js';
|
|
7
|
+
/** A call as its client reads it (interop 3.4): its handle, when it was sent, its state and since when, with its answer once completed. */
|
|
8
|
+
export type ReadCall = {
|
|
9
|
+
handle: string;
|
|
10
|
+
createdAt: Date;
|
|
11
|
+
updatedAt: Date;
|
|
12
|
+
} & CallState;
|
|
13
|
+
/** The call as its client reads it now. */
|
|
14
|
+
export declare function readCallOf(call: ClientCall, now: Date): ReadCall;
|
|
15
|
+
export type ReadClientCall = (caller: {
|
|
16
|
+
fleetId: FleetId;
|
|
17
|
+
party: string;
|
|
18
|
+
}, handle: string) => Promise<Result<ReadCall, DomainError<'NO_SUCH_CALL'>>>;
|
|
19
|
+
/** Use case: an outside client reads its own call by the handle it was answered; no other party's. */
|
|
20
|
+
export declare function createReadClientCall(deps: {
|
|
21
|
+
calls: ClientCalls;
|
|
22
|
+
clock: Clock;
|
|
23
|
+
}): ReadClientCall;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { stateOf, stateSince } from './client-call.js';
|
|
4
|
+
/** The call as its client reads it now. */
|
|
5
|
+
export function readCallOf(call, now) {
|
|
6
|
+
return { handle: call.handle, createdAt: call.sentAt, updatedAt: stateSince(call, now), ...stateOf(call, now) };
|
|
7
|
+
}
|
|
8
|
+
/** Use case: an outside client reads its own call by the handle it was answered; no other party's. */
|
|
9
|
+
export function createReadClientCall(deps) {
|
|
10
|
+
return async ({ fleetId, party }, handle) => {
|
|
11
|
+
const call = await deps.calls.findByHandle({ fleetId, party }, handle);
|
|
12
|
+
return call ? ok(readCallOf(call, deps.clock.now())) : refuse('NO_SUCH_CALL', 'This party made no call with that handle');
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=read-client-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-client-call.js","sourceRoot":"","sources":["../../../src/core/mcp-in/read-client-call.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAmC,MAAM,kBAAkB,CAAC;AAMxF,2CAA2C;AAC3C,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,GAAS;IACpD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;AAClH,CAAC;AAID,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAAC,IAA0C;IAC7E,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC;IAC5H,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The content types that carry an outside tool's call and its result over
|
|
3
|
+
* the fleet (orchestrator-1 on aeolus-fleet#876, Q7): the input type names
|
|
4
|
+
* the tool, and its payload is the tool's arguments as a JSON object; the
|
|
5
|
+
* result type names the tool too, and its payload is the tool's result.
|
|
6
|
+
*/
|
|
7
|
+
export declare function toolInputType(tool: string): string;
|
|
8
|
+
export declare function toolResultType(tool: string): string;
|
|
9
|
+
/** The tool a message of this content type calls; none for another type, or the input type without a name. */
|
|
10
|
+
export declare function toolCalledBy(contentType: string): string | undefined;
|
|
11
|
+
/** Whether a message of this content type carries a tool's result. */
|
|
12
|
+
export declare function isToolResultType(contentType: string): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The content types that carry an outside tool's call and its result over
|
|
3
|
+
* the fleet (orchestrator-1 on aeolus-fleet#876, Q7): the input type names
|
|
4
|
+
* the tool, and its payload is the tool's arguments as a JSON object; the
|
|
5
|
+
* result type names the tool too, and its payload is the tool's result.
|
|
6
|
+
*/
|
|
7
|
+
const TOOL_INPUT = 'application/vnd.aeolus.mcp-tool+json';
|
|
8
|
+
const TOOL_RESULT = 'application/vnd.aeolus.mcp-result+json';
|
|
9
|
+
export function toolInputType(tool) {
|
|
10
|
+
return `${TOOL_INPUT}; name=${tool}`;
|
|
11
|
+
}
|
|
12
|
+
export function toolResultType(tool) {
|
|
13
|
+
return `${TOOL_RESULT}; name=${tool}`;
|
|
14
|
+
}
|
|
15
|
+
/** The tool a message of this content type calls; none for another type, or the input type without a name. */
|
|
16
|
+
export function toolCalledBy(contentType) {
|
|
17
|
+
const [type, ...parameters] = contentType.split(';').map((part) => part.trim());
|
|
18
|
+
if (type?.toLowerCase() !== TOOL_INPUT) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const name = parameters.find((parameter) => parameter.toLowerCase().startsWith('name='))?.slice('name='.length);
|
|
22
|
+
return name === undefined || name === '' ? undefined : name;
|
|
23
|
+
}
|
|
24
|
+
/** Whether a message of this content type carries a tool's result. */
|
|
25
|
+
export function isToolResultType(contentType) {
|
|
26
|
+
return contentType.split(';')[0]?.trim().toLowerCase() === TOOL_RESULT;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=content-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../src/core/mcp-out/content-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,GAAG,sCAAsC,CAAC;AAC1D,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAE7D,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,UAAU,UAAU,IAAI,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,GAAG,WAAW,UAAU,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAChH,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type DeliveryId, type FleetId, type MessageId, type ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { FleetRefusal } from '../connection/ports.js';
|
|
3
|
+
import type { McpServerParty } from '../parties/party.js';
|
|
4
|
+
import type { Result } from '../shared/result.js';
|
|
5
|
+
import type { McpServers } from './ports.js';
|
|
6
|
+
import type { ToolMarks } from './state-party.js';
|
|
7
|
+
/** A delivery to a proxy ship, as its pushReceive hands it: received, or handed before under this lease with its last number. */
|
|
8
|
+
export interface PushedDelivery {
|
|
9
|
+
readonly deliveryId: DeliveryId;
|
|
10
|
+
readonly messageId: MessageId;
|
|
11
|
+
readonly senderShipId: ShipId;
|
|
12
|
+
readonly contentType: string;
|
|
13
|
+
readonly payload: string;
|
|
14
|
+
readonly state: 'received' | 'handed';
|
|
15
|
+
readonly handOverNumber: number | null;
|
|
16
|
+
/** The message this one replies to, if any. */
|
|
17
|
+
readonly inReplyTo: MessageId | null;
|
|
18
|
+
}
|
|
19
|
+
/** A reply naming the request, sent as the proxy ship. */
|
|
20
|
+
export interface Reply {
|
|
21
|
+
readonly to: ShipId;
|
|
22
|
+
readonly inReplyTo: MessageId;
|
|
23
|
+
readonly contentType: string;
|
|
24
|
+
readonly payload: string;
|
|
25
|
+
readonly idempotencyKey: string;
|
|
26
|
+
}
|
|
27
|
+
/** Outbound port: the fleet's calls a proxy ship's crew makes (decision 0040), each with its crew token. */
|
|
28
|
+
export interface ProxyShipCrew {
|
|
29
|
+
/** Its deliveries, up to max: its own in flight first, then pending ones, each received; it waits a while for one, or less once the signal aborts. */
|
|
30
|
+
pushReceive(crewToken: string, take: {
|
|
31
|
+
max: number;
|
|
32
|
+
signal: AbortSignal;
|
|
33
|
+
}): Promise<Result<PushedDelivery[], FleetRefusal>>;
|
|
34
|
+
/** Hands the delivery over with its number, naming the channel it went through (interop 5.1). */
|
|
35
|
+
handed(crewToken: string, handOver: {
|
|
36
|
+
deliveryId: DeliveryId;
|
|
37
|
+
handOverNumber: number;
|
|
38
|
+
channel: string;
|
|
39
|
+
}): Promise<Result<'handed' | 'acknowledged' | 'undeliverable', FleetRefusal>>;
|
|
40
|
+
reply(crewToken: string, reply: Reply): Promise<Result<void, FleetRefusal>>;
|
|
41
|
+
ack(crewToken: string, deliveryId: DeliveryId): Promise<Result<void, FleetRefusal>>;
|
|
42
|
+
handled(crewToken: string, deliveryId: DeliveryId): Promise<Result<void, FleetRefusal>>;
|
|
43
|
+
notHandled(crewToken: string, report: {
|
|
44
|
+
deliveryId: DeliveryId;
|
|
45
|
+
reason: string;
|
|
46
|
+
}): Promise<Result<void, FleetRefusal>>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* What the gateway keeps of a call, so a restart never calls again what may have run:
|
|
50
|
+
* - calling: handed, and its `tools/call` sent or about to be;
|
|
51
|
+
* - notSent: the server was not reached, so nothing ran;
|
|
52
|
+
* - answered: the server answered, and its reply is kept until it is sent;
|
|
53
|
+
* - mayHaveRun: sent with no answer, and its tool is not marked repeatable;
|
|
54
|
+
* - done: replied, acknowledged and handled.
|
|
55
|
+
*/
|
|
56
|
+
export interface Call {
|
|
57
|
+
readonly deliveryId: DeliveryId;
|
|
58
|
+
readonly fleetId: FleetId;
|
|
59
|
+
readonly party: string;
|
|
60
|
+
readonly state: 'calling' | 'notSent' | 'answered' | 'mayHaveRun' | 'done';
|
|
61
|
+
readonly reply: Reply | null;
|
|
62
|
+
}
|
|
63
|
+
/** Outbound port: the gateway's calls, by delivery. */
|
|
64
|
+
export interface CallStore {
|
|
65
|
+
find(deliveryId: DeliveryId): Promise<Call | undefined>;
|
|
66
|
+
save(call: Call): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* How handing one delivery ended:
|
|
70
|
+
* - handled: replied, acknowledged and handled;
|
|
71
|
+
* - again: nothing ran, or running it again is safe: the delivery comes again in flight, to be handed with the next number;
|
|
72
|
+
* - notHandled: the call may have run and its answer was lost, so a human decides (5.2, option a);
|
|
73
|
+
* - undeliverable: the fifth attempt; nothing is handed.
|
|
74
|
+
*/
|
|
75
|
+
export type HandOutcome = {
|
|
76
|
+
readonly kind: 'handled';
|
|
77
|
+
} | {
|
|
78
|
+
readonly kind: 'again';
|
|
79
|
+
} | {
|
|
80
|
+
readonly kind: 'notHandled';
|
|
81
|
+
} | {
|
|
82
|
+
readonly kind: 'undeliverable';
|
|
83
|
+
};
|
|
84
|
+
export type HandCall = (input: {
|
|
85
|
+
party: McpServerParty;
|
|
86
|
+
delivery: PushedDelivery;
|
|
87
|
+
}) => Promise<HandOutcome>;
|
|
88
|
+
/** The reason a call that may have run is not handled, as Needs attention shows it. */
|
|
89
|
+
export declare const MAY_HAVE_RUN = "The call may have run; its answer was lost. Check the outside system, then resend or dismiss.";
|
|
90
|
+
/**
|
|
91
|
+
* Use case: the gateway hands one delivery of a party's proxy ship to its
|
|
92
|
+
* outside MCP server, as 0040 hands one to an agent (interop 5.2): handed
|
|
93
|
+
* with the next number, then `tools/call`; the server's answer confirms it,
|
|
94
|
+
* so it is replied, acknowledged and handled at once. The answer is kept
|
|
95
|
+
* before the reply, so a restart replies again under the same key and calls
|
|
96
|
+
* nothing. A call that died unanswered is handed again only where argo
|
|
97
|
+
* marked its tool repeatable; otherwise it is reported not handled.
|
|
98
|
+
*/
|
|
99
|
+
export declare function createHandCall(deps: {
|
|
100
|
+
crew: ProxyShipCrew;
|
|
101
|
+
servers: McpServers;
|
|
102
|
+
calls: CallStore;
|
|
103
|
+
marks: ToolMarks;
|
|
104
|
+
timeoutMs: number;
|
|
105
|
+
}): HandCall;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { PAYLOAD_MAX_BYTES, payloadBytes } from '@aeolus-fleet/common';
|
|
2
|
+
import { toolCalledBy, toolInputType, toolResultType } from './content-types.js';
|
|
3
|
+
/** The channel the gateway hands a proxy ship's delivery through: its outside MCP server (interop 5.1). */
|
|
4
|
+
const MCP_CHANNEL = 'mcp';
|
|
5
|
+
/** The reason a call that may have run is not handled, as Needs attention shows it. */
|
|
6
|
+
export const MAY_HAVE_RUN = 'The call may have run; its answer was lost. Check the outside system, then resend or dismiss.';
|
|
7
|
+
const AGAIN = { kind: 'again' };
|
|
8
|
+
function isArguments(value) {
|
|
9
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function argumentsOf(payload) {
|
|
12
|
+
try {
|
|
13
|
+
const parsed = JSON.parse(payload);
|
|
14
|
+
return isArguments(parsed) ? parsed : undefined;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function errorResult(text) {
|
|
21
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
22
|
+
}
|
|
23
|
+
/** The reply carrying a tool's result; one too large for a message is replaced by an error result that says so. */
|
|
24
|
+
function resultReply(delivery, call) {
|
|
25
|
+
const payload = JSON.stringify(call.result);
|
|
26
|
+
const bytes = payloadBytes(payload);
|
|
27
|
+
return {
|
|
28
|
+
to: delivery.senderShipId,
|
|
29
|
+
inReplyTo: delivery.messageId,
|
|
30
|
+
contentType: toolResultType(call.tool),
|
|
31
|
+
payload: bytes > PAYLOAD_MAX_BYTES ? JSON.stringify(errorResult(`The tool result is ${String(bytes)} bytes as JSON, over the ${String(PAYLOAD_MAX_BYTES)} a message holds.`)) : payload,
|
|
32
|
+
idempotencyKey: `mcp-result:${delivery.messageId}`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function notACallReply(party, delivery) {
|
|
36
|
+
return {
|
|
37
|
+
to: delivery.senderShipId,
|
|
38
|
+
inReplyTo: delivery.messageId,
|
|
39
|
+
contentType: 'text/plain',
|
|
40
|
+
payload: `${party.name} takes only tool calls: send a capability's input type, ${toolInputType('<tool>')}, with the tool arguments as a JSON object.`,
|
|
41
|
+
idempotencyKey: `mcp-result:${delivery.messageId}`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Use case: the gateway hands one delivery of a party's proxy ship to its
|
|
46
|
+
* outside MCP server, as 0040 hands one to an agent (interop 5.2): handed
|
|
47
|
+
* with the next number, then `tools/call`; the server's answer confirms it,
|
|
48
|
+
* so it is replied, acknowledged and handled at once. The answer is kept
|
|
49
|
+
* before the reply, so a restart replies again under the same key and calls
|
|
50
|
+
* nothing. A call that died unanswered is handed again only where argo
|
|
51
|
+
* marked its tool repeatable; otherwise it is reported not handled.
|
|
52
|
+
*/
|
|
53
|
+
export function createHandCall(deps) {
|
|
54
|
+
return async ({ party, delivery }) => {
|
|
55
|
+
const crewToken = party.crewToken;
|
|
56
|
+
if (crewToken === null) {
|
|
57
|
+
return AGAIN;
|
|
58
|
+
}
|
|
59
|
+
const kept = { deliveryId: delivery.deliveryId, fleetId: party.fleetId, party: party.name };
|
|
60
|
+
const finish = async (reply) => {
|
|
61
|
+
for (const step of [() => deps.crew.reply(crewToken, reply), () => deps.crew.ack(crewToken, delivery.deliveryId), () => deps.crew.handled(crewToken, delivery.deliveryId)]) {
|
|
62
|
+
if (!(await step()).isOk) {
|
|
63
|
+
return AGAIN;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
await deps.calls.save({ ...kept, state: 'done', reply });
|
|
67
|
+
return { kind: 'handled' };
|
|
68
|
+
};
|
|
69
|
+
const mayHaveRun = async () => {
|
|
70
|
+
await deps.calls.save({ ...kept, state: 'mayHaveRun', reply: null });
|
|
71
|
+
// A refused report leaves the call judged: it is reported again each time it comes, and never called again.
|
|
72
|
+
await deps.crew.notHandled(crewToken, { deliveryId: delivery.deliveryId, reason: MAY_HAVE_RUN });
|
|
73
|
+
return { kind: 'notHandled' };
|
|
74
|
+
};
|
|
75
|
+
const call = await deps.calls.find(delivery.deliveryId);
|
|
76
|
+
if (call?.state === 'mayHaveRun') {
|
|
77
|
+
return mayHaveRun();
|
|
78
|
+
}
|
|
79
|
+
if (call?.reply) {
|
|
80
|
+
return finish(call.reply);
|
|
81
|
+
}
|
|
82
|
+
const tool = toolCalledBy(delivery.contentType);
|
|
83
|
+
if (tool === undefined) {
|
|
84
|
+
return finish(notACallReply(party, delivery));
|
|
85
|
+
}
|
|
86
|
+
const args = argumentsOf(delivery.payload);
|
|
87
|
+
if (args === undefined) {
|
|
88
|
+
return finish(resultReply(delivery, { tool, result: errorResult('The tool arguments must be a JSON object.') }));
|
|
89
|
+
}
|
|
90
|
+
const isRepeatable = (await deps.marks.repeatable(party.fleetId, party.name)).has(tool);
|
|
91
|
+
// Handed before with no answer kept and not judged unsent: the gateway stopped mid call, so it may have run.
|
|
92
|
+
if (delivery.state === 'handed' && call?.state !== 'notSent' && !isRepeatable) {
|
|
93
|
+
return mayHaveRun();
|
|
94
|
+
}
|
|
95
|
+
const handed = await deps.crew.handed(crewToken, { deliveryId: delivery.deliveryId, handOverNumber: (delivery.handOverNumber ?? 0) + 1, channel: MCP_CHANNEL });
|
|
96
|
+
if (!handed.isOk) {
|
|
97
|
+
return AGAIN;
|
|
98
|
+
}
|
|
99
|
+
if (handed.value === 'undeliverable') {
|
|
100
|
+
return { kind: 'undeliverable' };
|
|
101
|
+
}
|
|
102
|
+
await deps.calls.save({ ...kept, state: 'calling', reply: null });
|
|
103
|
+
const outcome = await deps.servers.callTool({ url: party.url, credential: party.credential }, { name: tool, arguments: args, timeoutMs: deps.timeoutMs });
|
|
104
|
+
switch (outcome.kind) {
|
|
105
|
+
case 'answered': {
|
|
106
|
+
const reply = resultReply(delivery, { tool, result: outcome.result });
|
|
107
|
+
await deps.calls.save({ ...kept, state: 'answered', reply });
|
|
108
|
+
return finish(reply);
|
|
109
|
+
}
|
|
110
|
+
case 'notSent':
|
|
111
|
+
await deps.calls.save({ ...kept, state: 'notSent', reply: null });
|
|
112
|
+
return AGAIN;
|
|
113
|
+
case 'unanswered':
|
|
114
|
+
return isRepeatable ? AGAIN : mayHaveRun();
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=hand-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hand-call.js","sourceRoot":"","sources":["../../../src/core/mcp-out/hand-call.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { PartyStore } from '../parties/ports.js';
|
|
3
|
+
import type { StateParty, ToolMarks } from './state-party.js';
|
|
4
|
+
export type MarkTool = (input: {
|
|
5
|
+
fleetId: FleetId;
|
|
6
|
+
name: string;
|
|
7
|
+
tool: string;
|
|
8
|
+
isRepeatable: boolean;
|
|
9
|
+
}) => ReturnType<StateParty>;
|
|
10
|
+
/**
|
|
11
|
+
* Use case: argo marks a party's tool repeatable, or takes the mark off
|
|
12
|
+
* (interop 5.2): a call to it that died unanswered may then be handed
|
|
13
|
+
* again. The mark is kept first and stated at once; while the statement
|
|
14
|
+
* cannot be made, the mark waits for the next.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createMarkTool(deps: {
|
|
17
|
+
parties: PartyStore;
|
|
18
|
+
marks: ToolMarks;
|
|
19
|
+
stateParty: StateParty;
|
|
20
|
+
}): MarkTool;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Use case: argo marks a party's tool repeatable, or takes the mark off
|
|
4
|
+
* (interop 5.2): a call to it that died unanswered may then be handed
|
|
5
|
+
* again. The mark is kept first and stated at once; while the statement
|
|
6
|
+
* cannot be made, the mark waits for the next.
|
|
7
|
+
*/
|
|
8
|
+
export function createMarkTool(deps) {
|
|
9
|
+
return async ({ fleetId, name, tool, isRepeatable }) => {
|
|
10
|
+
if (!(await deps.parties.find(fleetId, name))) {
|
|
11
|
+
return refuse('NO_SUCH_PARTY', `No party named ${name}`);
|
|
12
|
+
}
|
|
13
|
+
await deps.marks.mark(fleetId, { party: name, tool, isRepeatable });
|
|
14
|
+
return deps.stateParty({ fleetId, name });
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=mark-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-tool.js","sourceRoot":"","sources":["../../../src/core/mcp-out/mark-tool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAK7C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAuE;IACpG,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QACrD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,MAAM,CAAC,eAAe,EAAE,kBAAkB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The outside MCP server behind an app proxy ship, as MCP out sees it
|
|
3
|
+
* (interop 3.3, 5.2): its tools, and one call at a time.
|
|
4
|
+
*/
|
|
5
|
+
import type { Result } from '../shared/result.js';
|
|
6
|
+
import type { McpServerCredential } from '../vault/credential.js';
|
|
7
|
+
/** Where an outside MCP server is, and how the gateway signs in to it. */
|
|
8
|
+
export interface McpServerConnection {
|
|
9
|
+
/** Its Streamable HTTP endpoint. */
|
|
10
|
+
readonly url: string;
|
|
11
|
+
readonly credential: McpServerCredential;
|
|
12
|
+
}
|
|
13
|
+
/** MCP's tool annotations (2026-07-28), as the server states them: hints, never trusted on their own. */
|
|
14
|
+
export interface ToolAnnotations {
|
|
15
|
+
readonly title?: string;
|
|
16
|
+
readonly readOnlyHint?: boolean;
|
|
17
|
+
readonly destructiveHint?: boolean;
|
|
18
|
+
readonly idempotentHint?: boolean;
|
|
19
|
+
readonly openWorldHint?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** One tool of an outside MCP server, as its `tools/list` answers it. */
|
|
22
|
+
export interface OutsideTool {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly title?: string;
|
|
25
|
+
readonly description?: string;
|
|
26
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
27
|
+
readonly outputSchema?: Readonly<Record<string, unknown>>;
|
|
28
|
+
readonly annotations?: ToolAnnotations;
|
|
29
|
+
}
|
|
30
|
+
/** A tool's answer: its result, an error result included (`isError`). */
|
|
31
|
+
export interface ToolResult {
|
|
32
|
+
readonly content: readonly unknown[];
|
|
33
|
+
readonly structuredContent?: Readonly<Record<string, unknown>>;
|
|
34
|
+
readonly isError: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* How one `tools/call` ended (5.2):
|
|
38
|
+
* - answered: the server's answer, which confirms the hand-over;
|
|
39
|
+
* - notSent: the gateway never sent it (the server was unreachable, or refused the gateway's credential), so it did not run;
|
|
40
|
+
* - unanswered: sent, and no answer came (a broken stream, a timeout): whether the server ran it is unknown.
|
|
41
|
+
*/
|
|
42
|
+
export type ToolCallOutcome = {
|
|
43
|
+
readonly kind: 'answered';
|
|
44
|
+
readonly result: ToolResult;
|
|
45
|
+
} | {
|
|
46
|
+
readonly kind: 'notSent';
|
|
47
|
+
readonly reason: string;
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: 'unanswered';
|
|
50
|
+
readonly reason: string;
|
|
51
|
+
};
|
|
52
|
+
export interface ToolCall {
|
|
53
|
+
readonly name: string;
|
|
54
|
+
readonly arguments: Readonly<Record<string, unknown>>;
|
|
55
|
+
/** How long the gateway waits for the answer before it counts the call as unanswered. */
|
|
56
|
+
readonly timeoutMs: number;
|
|
57
|
+
}
|
|
58
|
+
/** The outside MCP servers the gateway calls. */
|
|
59
|
+
export interface McpServers {
|
|
60
|
+
/** The server's tools, every page of them; unreachable when it cannot be listed. */
|
|
61
|
+
listTools(connection: McpServerConnection): Promise<Result<readonly OutsideTool[], {
|
|
62
|
+
readonly kind: 'unreachable';
|
|
63
|
+
readonly reason: string;
|
|
64
|
+
}>>;
|
|
65
|
+
callTool(connection: McpServerConnection, call: ToolCall): Promise<ToolCallOutcome>;
|
|
66
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/mcp-out/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { McpServerParty } from '../parties/party.js';
|
|
2
|
+
import type { HandCall, ProxyShipCrew } from './hand-call.js';
|
|
3
|
+
/** Outbound port: waits the given time, or less once the signal aborts. */
|
|
4
|
+
export type Sleep = (ms: number, signal: AbortSignal) => Promise<void>;
|
|
5
|
+
export type RunParty = (input: {
|
|
6
|
+
party: McpServerParty;
|
|
7
|
+
signal: AbortSignal;
|
|
8
|
+
}) => Promise<{
|
|
9
|
+
ended: 'stopped' | 'crewRefused';
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* Use case: the gateway takes the calls of a party's proxy ship, as its
|
|
13
|
+
* crew, until it is stopped (interop 5.2). Each delivery pushReceive takes
|
|
14
|
+
* is handed to the server once while in flight, with no more calls at once
|
|
15
|
+
* than the party takes. A delivery answered again waits, longer each time,
|
|
16
|
+
* before it is handed with the next number; the fleet counts each an
|
|
17
|
+
* attempt and stops at the fifth. While the fleet answers only what the
|
|
18
|
+
* gateway already holds, or does not answer, it looks again after a while.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createRunParty(deps: {
|
|
21
|
+
crew: ProxyShipCrew;
|
|
22
|
+
handCall: HandCall;
|
|
23
|
+
sleep: Sleep;
|
|
24
|
+
pollMs: number;
|
|
25
|
+
againWaitsMs: readonly number[];
|
|
26
|
+
}): RunParty;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** The fleet's codes for a crew token it no longer takes: the gateway does not crew the proxy ship any more. */
|
|
2
|
+
const CREW_REFUSED = new Set(['UNAUTHORIZED', 'LEASE_ENDED']);
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the gateway takes the calls of a party's proxy ship, as its
|
|
5
|
+
* crew, until it is stopped (interop 5.2). Each delivery pushReceive takes
|
|
6
|
+
* is handed to the server once while in flight, with no more calls at once
|
|
7
|
+
* than the party takes. A delivery answered again waits, longer each time,
|
|
8
|
+
* before it is handed with the next number; the fleet counts each an
|
|
9
|
+
* attempt and stops at the fifth. While the fleet answers only what the
|
|
10
|
+
* gateway already holds, or does not answer, it looks again after a while.
|
|
11
|
+
*/
|
|
12
|
+
export function createRunParty(deps) {
|
|
13
|
+
return async ({ party, signal }) => {
|
|
14
|
+
const crewToken = party.crewToken;
|
|
15
|
+
if (crewToken === null) {
|
|
16
|
+
return { ended: 'crewRefused' };
|
|
17
|
+
}
|
|
18
|
+
const max = party.concurrencyLimit;
|
|
19
|
+
const inFlight = new Map();
|
|
20
|
+
const agains = new Map();
|
|
21
|
+
const hand = async (delivery) => {
|
|
22
|
+
let outcome;
|
|
23
|
+
try {
|
|
24
|
+
outcome = await deps.handCall({ party, delivery });
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// A failure of the gateway's own (its database): nothing was decided, so the delivery comes again.
|
|
28
|
+
outcome = { kind: 'again' };
|
|
29
|
+
}
|
|
30
|
+
if (outcome.kind === 'again') {
|
|
31
|
+
const count = (agains.get(delivery.deliveryId) ?? 0) + 1;
|
|
32
|
+
agains.set(delivery.deliveryId, count);
|
|
33
|
+
await deps.sleep(deps.againWaitsMs[Math.min(count, deps.againWaitsMs.length) - 1] ?? deps.pollMs, signal);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
agains.delete(delivery.deliveryId);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const start = (delivery) => {
|
|
40
|
+
inFlight.set(delivery.deliveryId, hand(delivery).finally(() => inFlight.delete(delivery.deliveryId)));
|
|
41
|
+
};
|
|
42
|
+
while (!signal.aborted) {
|
|
43
|
+
if (inFlight.size >= max) {
|
|
44
|
+
await Promise.race(inFlight.values());
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const received = await deps.crew.pushReceive(crewToken, { max, signal });
|
|
48
|
+
if (!received.isOk && CREW_REFUSED.has(received.error.code)) {
|
|
49
|
+
await Promise.all(inFlight.values());
|
|
50
|
+
return { ended: 'crewRefused' };
|
|
51
|
+
}
|
|
52
|
+
const fresh = received.isOk ? received.value.filter((delivery) => !inFlight.has(delivery.deliveryId)).slice(0, max - inFlight.size) : [];
|
|
53
|
+
fresh.forEach(start);
|
|
54
|
+
if (fresh.length === 0) {
|
|
55
|
+
await Promise.race([deps.sleep(deps.pollMs, signal), ...inFlight.values()]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
await Promise.all(inFlight.values());
|
|
59
|
+
return { ended: 'stopped' };
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=run-party.js.map
|