@aeolus-fleet/gateway 0.0.0 → 0.28.1
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/README.md +11 -10
- 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-ids.d.ts +1 -1
- package/dist/adapters/crypto/request-ids.js +2 -9
- package/dist/adapters/crypto/request-ids.js.map +1 -1
- package/dist/adapters/crypto/sign-in-seals.d.ts +1 -1
- package/dist/adapters/crypto/sign-in-seals.js +7 -9
- package/dist/adapters/crypto/sign-in-seals.js.map +1 -1
- 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/core-version.d.ts +8 -8
- package/dist/adapters/fleet/core-version.js +6 -47
- package/dist/adapters/fleet/core-version.js.map +1 -1
- package/dist/adapters/fleet/fleet-network.js +7 -17
- package/dist/adapters/fleet/fleet-network.js.map +1 -1
- 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 +2 -2
- package/dist/adapters/fleet/rest-fleet-door.js +23 -7
- package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
- 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/front-door.d.ts +8 -0
- package/dist/adapters/http/front-door.js +19 -0
- package/dist/adapters/http/front-door.js.map +1 -0
- package/dist/adapters/http/oauth-routes.d.ts +15 -3
- package/dist/adapters/http/oauth-routes.js +33 -1
- package/dist/adapters/http/oauth-routes.js.map +1 -1
- package/dist/adapters/http/outside-parties-page.d.ts +29 -2
- package/dist/adapters/http/outside-parties-page.js +15 -11
- package/dist/adapters/http/outside-parties-page.js.map +1 -1
- 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 +2 -1
- package/dist/adapters/http/overview-page.js +79 -36
- package/dist/adapters/http/overview-page.js.map +1 -1
- package/dist/adapters/http/parties-page.d.ts +2 -1
- package/dist/adapters/http/parties-page.js +8 -10
- package/dist/adapters/http/parties-page.js.map +1 -1
- 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 +10 -1
- package/dist/adapters/http/signal.js +50 -7
- package/dist/adapters/http/signal.js.map +1 -1
- package/dist/adapters/pagasae/pagasae-client.js +7 -9
- package/dist/adapters/pagasae/pagasae-client.js.map +1 -1
- package/dist/adapters/prisma/account-grants.js +2 -2
- package/dist/adapters/prisma/account-grants.js.map +1 -1
- package/dist/adapters/prisma/client-calls.js +9 -0
- package/dist/adapters/prisma/client-calls.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +33 -1
- package/dist/adapters/prisma/generated/models/ClientCall.d.ts +14 -14
- package/dist/adapters/prisma/generated/models/Party.d.ts +1 -29
- package/dist/adapters/prisma/oauth-stores.js +3 -0
- package/dist/adapters/prisma/oauth-stores.js.map +1 -1
- package/dist/adapters/prisma/party-store.js +0 -2
- package/dist/adapters/prisma/party-store.js.map +1 -1
- package/dist/adapters/prisma/pending-requests.js +7 -1
- package/dist/adapters/prisma/pending-requests.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +210 -12
- package/dist/adapters/trpc/router.js +159 -7
- package/dist/adapters/trpc/router.js.map +1 -1
- package/dist/app.js +67 -19
- package/dist/app.js.map +1 -1
- package/dist/core/actors/authenticate-actor.d.ts +21 -5
- package/dist/core/actors/authenticate-actor.js +14 -2
- package/dist/core/actors/authenticate-actor.js.map +1 -1
- 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.js +5 -4
- package/dist/core/connection/connect.js.map +1 -1
- package/dist/core/connection/ports.d.ts +6 -1
- package/dist/core/mcp-in/call-tool.d.ts +6 -6
- package/dist/core/mcp-in/call-tool.js +3 -3
- package/dist/core/mcp-in/call-tool.js.map +1 -1
- package/dist/core/mcp-in/client-call.d.ts +2 -2
- package/dist/core/mcp-in/client-call.js +2 -2
- package/dist/core/mcp-in/client-call.js.map +1 -1
- package/dist/core/mcp-in/collect-replies.d.ts +4 -11
- package/dist/core/mcp-in/collect-replies.js +52 -30
- package/dist/core/mcp-in/collect-replies.js.map +1 -1
- package/dist/core/mcp-in/list-tools.d.ts +4 -0
- package/dist/core/mcp-in/list-tools.js +1 -1
- package/dist/core/mcp-in/list-tools.js.map +1 -1
- package/dist/core/mcp-in/ports.d.ts +24 -1
- package/dist/core/mcp-out/hand-call.d.ts +2 -0
- package/dist/core/mcp-out/hand-call.js +4 -2
- package/dist/core/mcp-out/hand-call.js.map +1 -1
- package/dist/core/mcp-out/state-party.d.ts +2 -1
- package/dist/core/mcp-out/state-party.js +1 -1
- package/dist/core/mcp-out/state-party.js.map +1 -1
- package/dist/core/mcp-out/statement.d.ts +10 -0
- package/dist/core/mcp-out/statement.js +7 -5
- package/dist/core/mcp-out/statement.js.map +1 -1
- package/dist/core/oauth/ports.d.ts +2 -0
- package/dist/core/oauth/read-authorization.js +2 -2
- package/dist/core/oauth/read-authorization.js.map +1 -1
- package/dist/core/oauth/redirect-uri.d.ts +7 -0
- package/dist/core/oauth/redirect-uri.js +23 -0
- package/dist/core/oauth/redirect-uri.js.map +1 -1
- package/dist/core/outside-parties/ports.d.ts +1 -5
- package/dist/core/outside-parties/set-outside-parties.d.ts +5 -3
- package/dist/core/outside-parties/set-outside-parties.js +6 -2
- package/dist/core/outside-parties/set-outside-parties.js.map +1 -1
- package/dist/core/parties/approve-party.js +24 -8
- package/dist/core/parties/approve-party.js.map +1 -1
- 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/list-parties.d.ts +28 -7
- package/dist/core/parties/list-parties.js +35 -4
- package/dist/core/parties/list-parties.js.map +1 -1
- package/dist/core/parties/party.d.ts +12 -6
- package/dist/core/parties/party.js +23 -1
- package/dist/core/parties/party.js.map +1 -1
- package/dist/core/parties/ports.d.ts +36 -1
- 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 +8 -2
- package/dist/core/parties/shown-party.js +3 -3
- package/dist/core/parties/shown-party.js.map +1 -1
- package/dist/core/requests/decide-request.js +9 -1
- package/dist/core/requests/decide-request.js.map +1 -1
- 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/ports.d.ts +5 -0
- package/dist/core/shared/errors.d.ts +1 -1
- package/dist/core/shared/errors.js.map +1 -1
- package/dist/core/sign-in/account-token.d.ts +8 -4
- package/dist/core/sign-in/account-token.js +4 -4
- package/dist/core/sign-in/account-token.js.map +1 -1
- package/dist/core/sign-in/complete-sign-in.d.ts +15 -4
- package/dist/core/sign-in/complete-sign-in.js +27 -4
- package/dist/core/sign-in/complete-sign-in.js.map +1 -1
- package/dist/core/sign-in/ports.d.ts +37 -7
- 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/package.json +3 -3
- 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/schema.prisma +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-authorization.js","sourceRoot":"","sources":["../../../src/core/oauth/read-authorization.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"read-authorization.js","sourceRoot":"","sources":["../../../src/core/oauth/read-authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,3 +4,10 @@ export declare const REDIRECT_URIS_MAX = 10;
|
|
|
4
4
|
export declare function isLoopback(url: URL): boolean;
|
|
5
5
|
/** A redirect URI a client may register: an absolute https URL, or http on loopback, with no fragment. */
|
|
6
6
|
export declare function isRedirectUri(text: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Whether a redirect URI a request names is one the client registered: the
|
|
9
|
+
* same text, or, for a loopback URI registered without a port, the same URI
|
|
10
|
+
* on any port. A native client listens on a port the system picks at run
|
|
11
|
+
* time, so the authorization server must allow any port there (RFC 8252, 7.3).
|
|
12
|
+
*/
|
|
13
|
+
export declare function isRegisteredRedirectUri(registered: string, requested: string): boolean;
|
|
@@ -17,4 +17,27 @@ export function isRedirectUri(text) {
|
|
|
17
17
|
const isSecure = url.protocol === 'https:' || (url.protocol === 'http:' && isLoopback(url));
|
|
18
18
|
return isSecure && url.hash === '' && !text.includes('#');
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Whether a redirect URI a request names is one the client registered: the
|
|
22
|
+
* same text, or, for a loopback URI registered without a port, the same URI
|
|
23
|
+
* on any port. A native client listens on a port the system picks at run
|
|
24
|
+
* time, so the authorization server must allow any port there (RFC 8252, 7.3).
|
|
25
|
+
*/
|
|
26
|
+
export function isRegisteredRedirectUri(registered, requested) {
|
|
27
|
+
if (registered === requested) {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
let registeredUrl;
|
|
31
|
+
let requestedUrl;
|
|
32
|
+
try {
|
|
33
|
+
registeredUrl = new URL(registered);
|
|
34
|
+
requestedUrl = new URL(requested);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const isPortFree = registeredUrl.protocol === 'http:' && isLoopback(registeredUrl) && registeredUrl.port === '';
|
|
40
|
+
requestedUrl.port = '';
|
|
41
|
+
return isPortFree && requestedUrl.href === registeredUrl.href;
|
|
42
|
+
}
|
|
20
43
|
//# sourceMappingURL=redirect-uri.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-uri.js","sourceRoot":"","sources":["../../../src/core/oauth/redirect-uri.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE,oGAAoG;AACpG,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,OAAO,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC"}
|
|
1
|
+
{"version":3,"file":"redirect-uri.js","sourceRoot":"","sources":["../../../src/core/oauth/redirect-uri.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE,oGAAoG;AACpG,MAAM,UAAU,UAAU,CAAC,GAAQ;IACjC,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,OAAO,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAE,SAAiB;IAC3E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,aAAkB,CAAC;IACvB,IAAI,YAAiB,CAAC;IACtB,IAAI,CAAC;QACH,aAAa,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACpC,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC;IAChH,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC;IACvB,OAAO,UAAU,IAAI,YAAY,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC;AAChE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { ActorCredential } from '../actors/credential-of.js';
|
|
2
3
|
import type { FleetRefusal } from '../connection/ports.js';
|
|
3
4
|
import type { Result } from '../shared/result.js';
|
|
4
5
|
/** Whether a fleet's outside parties are on, and when it was last set; off for a fleet never set (interop I-3). */
|
|
@@ -9,11 +10,6 @@ export interface OutsidePartySwitches {
|
|
|
9
10
|
at: Date;
|
|
10
11
|
}): Promise<void>;
|
|
11
12
|
}
|
|
12
|
-
/** The credential an actor called the gateway with, passed on so the fleet answers as that actor. */
|
|
13
|
-
export interface ActorCredential {
|
|
14
|
-
cookie?: string;
|
|
15
|
-
crewToken?: string;
|
|
16
|
-
}
|
|
17
13
|
/** Outbound port: the fleet's network, as the actor reads it. */
|
|
18
14
|
export interface FleetNetwork {
|
|
19
15
|
/** Whether the fleet applies no network rules, so every ship reaches every ship. */
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
2
3
|
import type { Clock } from '../shared/clock.js';
|
|
3
4
|
import { type DomainError } from '../shared/errors.js';
|
|
4
5
|
import { type Result } from '../shared/result.js';
|
|
5
|
-
import type {
|
|
6
|
+
import type { FleetNetwork, OutsidePartySwitches } from './ports.js';
|
|
6
7
|
/** The scope that switches a fleet's outside parties, as it changes the fleet's network. */
|
|
7
8
|
export declare const SWITCHING_SCOPE = "fleet:network";
|
|
8
9
|
export type ReadOutsideParties = (actor: Actor) => Promise<{
|
|
@@ -15,7 +16,7 @@ export type SetOutsideParties = (input: {
|
|
|
15
16
|
isOpenNetworkConfirmed: boolean;
|
|
16
17
|
}) => Promise<Result<{
|
|
17
18
|
isOn: boolean;
|
|
18
|
-
}, DomainError<'NOT_A_NETWORKER' | 'OPEN_NETWORK' | 'FLEET_UNAVAILABLE'>>>;
|
|
19
|
+
}, DomainError<'NOT_A_NETWORKER' | 'OPEN_NETWORK' | 'FLEET_UNAVAILABLE' | 'NOT_AN_ACTOR'>>>;
|
|
19
20
|
/** Use case: whether the actor's fleet's outside parties are on. */
|
|
20
21
|
export declare function createReadOutsideParties(deps: {
|
|
21
22
|
switches: OutsidePartySwitches;
|
|
@@ -25,10 +26,11 @@ export declare function createReadOutsideParties(deps: {
|
|
|
25
26
|
* on or off (interop I-3). The gateway sets no policy but warns: turning
|
|
26
27
|
* them on while the fleet applies no network rules needs the warning
|
|
27
28
|
* confirmed. The rules are read as the actor, so the fleet answers what that
|
|
28
|
-
* actor may see. Turning off reads nothing.
|
|
29
|
+
* actor may see, an account by its account token. Turning off reads nothing.
|
|
29
30
|
*/
|
|
30
31
|
export declare function createSetOutsideParties(deps: {
|
|
31
32
|
switches: OutsidePartySwitches;
|
|
32
33
|
network: FleetNetwork;
|
|
33
34
|
clock: Clock;
|
|
35
|
+
credentialOf: CredentialOf;
|
|
34
36
|
}): SetOutsideParties;
|
|
@@ -11,7 +11,7 @@ export function createReadOutsideParties(deps) {
|
|
|
11
11
|
* on or off (interop I-3). The gateway sets no policy but warns: turning
|
|
12
12
|
* them on while the fleet applies no network rules needs the warning
|
|
13
13
|
* confirmed. The rules are read as the actor, so the fleet answers what that
|
|
14
|
-
* actor may see. Turning off reads nothing.
|
|
14
|
+
* actor may see, an account by its account token. Turning off reads nothing.
|
|
15
15
|
*/
|
|
16
16
|
export function createSetOutsideParties(deps) {
|
|
17
17
|
return async ({ actor, as, isOn, isOpenNetworkConfirmed }) => {
|
|
@@ -19,7 +19,11 @@ export function createSetOutsideParties(deps) {
|
|
|
19
19
|
return refuse('NOT_A_NETWORKER', `Switching outside parties needs ${SWITCHING_SCOPE}`);
|
|
20
20
|
}
|
|
21
21
|
if (isOn && !isOpenNetworkConfirmed) {
|
|
22
|
-
const
|
|
22
|
+
const credential = await deps.credentialOf(actor, as);
|
|
23
|
+
if (!credential.isOk) {
|
|
24
|
+
return credential;
|
|
25
|
+
}
|
|
26
|
+
const isOpen = await deps.network.isOpen(credential.value);
|
|
23
27
|
if (!isOpen.isOk) {
|
|
24
28
|
return refuse('FLEET_UNAVAILABLE', `The fleet did not say its network rules: ${isOpen.error.message}`);
|
|
25
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-outside-parties.js","sourceRoot":"","sources":["../../../src/core/outside-parties/set-outside-parties.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-outside-parties.js","sourceRoot":"","sources":["../../../src/core/outside-parties/set-outside-parties.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,4FAA4F;AAC5F,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAW/C,oEAAoE;AACpE,MAAM,UAAU,wBAAwB,CAAC,IAAwC;IAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAyG;IAC/I,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,eAAe,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBACrB,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzG,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC,cAAc,EAAE,gIAAgI,CAAC,CAAC;YAClK,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { refuse } from '../shared/errors.js';
|
|
2
2
|
import { ok } from '../shared/result.js';
|
|
3
|
+
import { verifiedFactsOf } from './party.js';
|
|
3
4
|
import { shownPartyOf } from './shown-party.js';
|
|
4
5
|
/** The type of every outside MCP server's proxy ship. */
|
|
5
6
|
export const MCP_SERVER_SHIP_TYPE = 'mcp-server';
|
|
@@ -18,14 +19,27 @@ export const MCP_CLIENT_SHIP_TYPE = 'mcp-client';
|
|
|
18
19
|
* off, nothing is approved (interop I-3).
|
|
19
20
|
*/
|
|
20
21
|
async function approved(deps, approval) {
|
|
21
|
-
|
|
22
|
+
/**
|
|
23
|
+
* The crewed party, once the gateway wrote what it checked about it
|
|
24
|
+
* (decision 0059). A fact the fleet refuses takes nothing from the
|
|
25
|
+
* approval: the facts are a claim beside it, written again when the same
|
|
26
|
+
* approval comes again.
|
|
27
|
+
*/
|
|
28
|
+
const verified = async (party, gatewayCrewToken) => {
|
|
29
|
+
const facts = verifiedFactsOf(party);
|
|
30
|
+
if (party.proxyShipId !== null && facts.length > 0) {
|
|
31
|
+
await deps.door.setVerifiedFacts(gatewayCrewToken, { shipId: party.proxyShipId, facts });
|
|
32
|
+
}
|
|
33
|
+
return ok(shownPartyOf(party));
|
|
34
|
+
};
|
|
35
|
+
const crewed = async (party, gatewayCrewToken) => {
|
|
22
36
|
const registered = await deps.door.register({ shipId: party.proxyShipId, secret: party.secret });
|
|
23
37
|
if (!registered.isOk) {
|
|
24
38
|
return refuse('FLEET_UNAVAILABLE', `The fleet did not let the gateway crew the proxy ship: ${registered.error.message}`);
|
|
25
39
|
}
|
|
26
40
|
const done = { ...party, state: 'crewed', secret: null, crewToken: registered.value.crewToken };
|
|
27
41
|
await deps.parties.save(done);
|
|
28
|
-
return
|
|
42
|
+
return verified(done, gatewayCrewToken);
|
|
29
43
|
};
|
|
30
44
|
const { fleetId } = approval;
|
|
31
45
|
if (!(await deps.servesOutsideParties(fleetId))) {
|
|
@@ -42,16 +56,16 @@ async function approved(deps, approval) {
|
|
|
42
56
|
}
|
|
43
57
|
const party = earlier ?? fresh;
|
|
44
58
|
if (party.state === 'crewed') {
|
|
45
|
-
return
|
|
59
|
+
return verified(party, gateway.crewToken);
|
|
46
60
|
}
|
|
47
61
|
if (party.proxyShipId !== null && party.secret !== null) {
|
|
48
|
-
return crewed({ ...party, proxyShipId: party.proxyShipId, secret: party.secret });
|
|
62
|
+
return crewed({ ...party, proxyShipId: party.proxyShipId, secret: party.secret }, gateway.crewToken);
|
|
49
63
|
}
|
|
50
64
|
if (party.proxyShipId !== null) {
|
|
51
65
|
return ok(shownPartyOf(party));
|
|
52
66
|
}
|
|
53
67
|
await deps.parties.save(party);
|
|
54
|
-
const commissioned = await deps.door.commissionAppShip(gateway.crewToken, { name: party.name, type: approval.type, owner:
|
|
68
|
+
const commissioned = await deps.door.commissionAppShip(gateway.crewToken, { name: party.name, type: approval.type, owner: approval.owner, idempotencyKey: party.requestId, scopes: approval.scopes });
|
|
55
69
|
if (!commissioned.isOk) {
|
|
56
70
|
if (commissioned.error.code === 'UNAVAILABLE') {
|
|
57
71
|
return refuse('FLEET_UNAVAILABLE', `The fleet did not answer the commission: ${commissioned.error.message}`);
|
|
@@ -62,7 +76,7 @@ async function approved(deps, approval) {
|
|
|
62
76
|
const { shipId, secret } = commissioned.value;
|
|
63
77
|
const awaiting = { ...party, state: 'awaitingCrew', proxyShipId: shipId, secret };
|
|
64
78
|
await deps.parties.save(awaiting);
|
|
65
|
-
return secret === null ? ok(shownPartyOf(awaiting)) : crewed({ ...awaiting, proxyShipId: shipId, secret });
|
|
79
|
+
return secret === null ? ok(shownPartyOf(awaiting)) : crewed({ ...awaiting, proxyShipId: shipId, secret }, gateway.crewToken);
|
|
66
80
|
}
|
|
67
81
|
/** What a party is before its proxy ship is commissioned. */
|
|
68
82
|
const UNCOMMISSIONED = { state: 'commissioning', proxyShipId: null, secret: null, crewToken: null };
|
|
@@ -80,7 +94,8 @@ export function createApproveParty(deps) {
|
|
|
80
94
|
type: MCP_SERVER_SHIP_TYPE,
|
|
81
95
|
scopes,
|
|
82
96
|
requestHash,
|
|
83
|
-
|
|
97
|
+
owner: ownerShipId,
|
|
98
|
+
party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpServer', url, credential, concurrencyLimit, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
|
|
84
99
|
isOwn: (earlier) => earlier.kind === 'mcpServer',
|
|
85
100
|
});
|
|
86
101
|
};
|
|
@@ -103,7 +118,8 @@ export function createApproveClientParty(deps) {
|
|
|
103
118
|
type: MCP_CLIENT_SHIP_TYPE,
|
|
104
119
|
scopes,
|
|
105
120
|
requestHash,
|
|
106
|
-
|
|
121
|
+
owner: ownerShipId,
|
|
122
|
+
party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpClient', clientId, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
|
|
107
123
|
isOwn: (earlier) => earlier.kind === 'mcpClient',
|
|
108
124
|
});
|
|
109
125
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve-party.js","sourceRoot":"","sources":["../../../src/core/parties/approve-party.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"approve-party.js","sourceRoot":"","sources":["../../../src/core/parties/approve-party.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Changing an outside party (decision 0056): the usual scopes on its proxy
|
|
3
|
+
* ship, within manage reach. fleet:owner changes its owner, scopes:grant its
|
|
4
|
+
* scopes, only scopes the actor holds. The gateway checks the actor holds
|
|
5
|
+
* the call's scope, then asks the fleet as the actor, which checks the rest;
|
|
6
|
+
* the gateway keeps nothing of either, as the fleet's are the answer.
|
|
7
|
+
*/
|
|
8
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
9
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
10
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
11
|
+
import { type DomainError } from '../shared/errors.js';
|
|
12
|
+
import { type Result } from '../shared/result.js';
|
|
13
|
+
import type { PartyStore, ProxyShipsAsActor } from './ports.js';
|
|
14
|
+
/** The scope that changes an outside party's owner (0053). */
|
|
15
|
+
export declare const OWNING_SCOPE = "fleet:owner";
|
|
16
|
+
/** The scope that grants and revokes an outside party's scopes (0046). */
|
|
17
|
+
export declare const GRANTING_SCOPE = "scopes:grant";
|
|
18
|
+
export type ChangePartyRefusal = DomainError<'SCOPE_NOT_HELD' | 'NO_SUCH_PARTY' | 'PARTY_NOT_COMMISSIONED' | 'CHANGE_REFUSED' | 'FLEET_UNAVAILABLE' | 'NOT_AN_ACTOR'>;
|
|
19
|
+
interface ChangeDeps {
|
|
20
|
+
parties: PartyStore;
|
|
21
|
+
fleet: ProxyShipsAsActor;
|
|
22
|
+
credentialOf: CredentialOf;
|
|
23
|
+
}
|
|
24
|
+
interface ChangeCall {
|
|
25
|
+
actor: Actor;
|
|
26
|
+
as: ActorCredential;
|
|
27
|
+
name: string;
|
|
28
|
+
}
|
|
29
|
+
export type ChangePartyOwner = (input: ChangeCall & {
|
|
30
|
+
ownerShipId: ShipId;
|
|
31
|
+
}) => Promise<Result<undefined, ChangePartyRefusal>>;
|
|
32
|
+
export type ChangePartyScopes = (input: ChangeCall & {
|
|
33
|
+
grant: readonly string[];
|
|
34
|
+
revoke: readonly string[];
|
|
35
|
+
}) => Promise<Result<{
|
|
36
|
+
scopes: string[];
|
|
37
|
+
}, ChangePartyRefusal>>;
|
|
38
|
+
/** Use case: an actor holding fleet:owner sets the owner of an outside party's proxy ship, as itself. */
|
|
39
|
+
export declare function createChangePartyOwner(deps: ChangeDeps): ChangePartyOwner;
|
|
40
|
+
/** Use case: an actor holding scopes:grant grants and revokes scopes on an outside party's proxy ship, as itself: every scope it holds now. */
|
|
41
|
+
export declare function createChangePartyScopes(deps: ChangeDeps): ChangePartyScopes;
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { err, ok } from '../shared/result.js';
|
|
3
|
+
/** The scope that changes an outside party's owner (0053). */
|
|
4
|
+
export const OWNING_SCOPE = 'fleet:owner';
|
|
5
|
+
/** The scope that grants and revokes an outside party's scopes (0046). */
|
|
6
|
+
export const GRANTING_SCOPE = 'scopes:grant';
|
|
7
|
+
/** The party's proxy ship and the credential to call the fleet on it with as the actor, who holds the call's scope. */
|
|
8
|
+
async function proxyShipFor(deps, call) {
|
|
9
|
+
const { actor, as, name, scope } = call;
|
|
10
|
+
if (!actor.scopes.includes(scope)) {
|
|
11
|
+
return refuse('SCOPE_NOT_HELD', `Changing an outside party this way needs ${scope}`);
|
|
12
|
+
}
|
|
13
|
+
const party = await deps.parties.find(actor.fleetId, name);
|
|
14
|
+
if (party === undefined) {
|
|
15
|
+
return refuse('NO_SUCH_PARTY', `There is no outside party ${name}`);
|
|
16
|
+
}
|
|
17
|
+
if (party.proxyShipId === null) {
|
|
18
|
+
return refuse('PARTY_NOT_COMMISSIONED', `${name}'s proxy ship is not commissioned yet`);
|
|
19
|
+
}
|
|
20
|
+
const credential = await deps.credentialOf(actor, as);
|
|
21
|
+
return credential.isOk ? ok({ shipId: party.proxyShipId, credential: credential.value }) : credential;
|
|
22
|
+
}
|
|
23
|
+
/** The fleet's refusal of a change, as the gateway states it. */
|
|
24
|
+
function refusalOf(refusal) {
|
|
25
|
+
return refusal.code === 'UNAVAILABLE' ? { kind: 'FLEET_UNAVAILABLE', message: `The fleet did not answer: ${refusal.message}` } : { kind: 'CHANGE_REFUSED', message: refusal.message };
|
|
26
|
+
}
|
|
27
|
+
/** Use case: an actor holding fleet:owner sets the owner of an outside party's proxy ship, as itself. */
|
|
28
|
+
export function createChangePartyOwner(deps) {
|
|
29
|
+
return async ({ ownerShipId, ...call }) => {
|
|
30
|
+
const target = await proxyShipFor(deps, { ...call, scope: OWNING_SCOPE });
|
|
31
|
+
if (!target.isOk) {
|
|
32
|
+
return target;
|
|
33
|
+
}
|
|
34
|
+
const set = await deps.fleet.setOwner(target.value.credential, { shipId: target.value.shipId, ownerShipId });
|
|
35
|
+
return set.isOk ? ok(undefined) : err(refusalOf(set.error));
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Use case: an actor holding scopes:grant grants and revokes scopes on an outside party's proxy ship, as itself: every scope it holds now. */
|
|
39
|
+
export function createChangePartyScopes(deps) {
|
|
40
|
+
return async ({ grant, revoke, ...call }) => {
|
|
41
|
+
const target = await proxyShipFor(deps, { ...call, scope: GRANTING_SCOPE });
|
|
42
|
+
if (!target.isOk) {
|
|
43
|
+
return target;
|
|
44
|
+
}
|
|
45
|
+
const changed = await deps.fleet.grantScopes(target.value.credential, { shipId: target.value.shipId, grant, revoke });
|
|
46
|
+
return changed.isOk ? ok(changed.value) : err(refusalOf(changed.error));
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=change-party.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-party.js","sourceRoot":"","sources":["../../../src/core/parties/change-party.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { McpServerConnection, McpServers } from '../mcp-out/ports.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
/** A tool as the check shows it: its name, and its short description when the server gives one. */
|
|
6
|
+
export interface CheckedTool {
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
}
|
|
10
|
+
export type CheckServer = (input: {
|
|
11
|
+
fleetId: FleetId;
|
|
12
|
+
} & McpServerConnection) => Promise<Result<{
|
|
13
|
+
tools: CheckedTool[];
|
|
14
|
+
}, DomainError<'OUTSIDE_PARTIES_OFF' | 'SERVER_UNREACHABLE'>>>;
|
|
15
|
+
/**
|
|
16
|
+
* Use case: the gateway checks an outside MCP server before it is added
|
|
17
|
+
* (flow F10): the tools its server lists, with the credential the approver
|
|
18
|
+
* typed. It keeps nothing and commissions nothing; approving does that.
|
|
19
|
+
* Only while the fleet's outside parties are on, as approving.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createCheckServer(deps: {
|
|
22
|
+
servers: McpServers;
|
|
23
|
+
servesOutsideParties: (fleetId: FleetId) => Promise<boolean>;
|
|
24
|
+
}): CheckServer;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the gateway checks an outside MCP server before it is added
|
|
5
|
+
* (flow F10): the tools its server lists, with the credential the approver
|
|
6
|
+
* typed. It keeps nothing and commissions nothing; approving does that.
|
|
7
|
+
* Only while the fleet's outside parties are on, as approving.
|
|
8
|
+
*/
|
|
9
|
+
export function createCheckServer(deps) {
|
|
10
|
+
return async ({ fleetId, url, credential }) => {
|
|
11
|
+
if (!(await deps.servesOutsideParties(fleetId))) {
|
|
12
|
+
return refuse('OUTSIDE_PARTIES_OFF', "This fleet's outside parties are off: turn them on first");
|
|
13
|
+
}
|
|
14
|
+
const listed = await deps.servers.listTools({ url, credential });
|
|
15
|
+
if (!listed.isOk) {
|
|
16
|
+
return refuse('SERVER_UNREACHABLE', `The MCP server could not be listed: ${listed.error.reason}`);
|
|
17
|
+
}
|
|
18
|
+
return ok({ tools: listed.value.map(({ name, description }) => ({ name, ...(description === undefined ? {} : { description }) })) });
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=check-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-server.js","sourceRoot":"","sources":["../../../src/core/parties/check-server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAUtD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA2F;IAC3H,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;QAC5C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,qBAAqB,EAAE,0DAA0D,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,oBAAoB,EAAE,uCAAuC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACvI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import {
|
|
3
|
-
import type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type { Actor } from '../actors/authenticate-actor.js';
|
|
2
|
+
import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import { type ListedParty } from './shown-party.js';
|
|
6
|
+
import type { PartyStore, ProxyShipReads } from './ports.js';
|
|
7
|
+
interface ReadCall {
|
|
8
|
+
actor: Actor;
|
|
9
|
+
as: ActorCredential;
|
|
10
|
+
}
|
|
11
|
+
export type ListParties = (call: ReadCall) => Promise<ListedParty[]>;
|
|
12
|
+
export type ReadParty = (call: ReadCall & {
|
|
13
|
+
name: string;
|
|
14
|
+
}) => Promise<Result<ListedParty, DomainError<'NO_SUCH_PARTY'>>>;
|
|
15
|
+
interface ReadDeps {
|
|
7
16
|
parties: PartyStore;
|
|
8
|
-
|
|
17
|
+
fleet: ProxyShipReads;
|
|
18
|
+
credentialOf: CredentialOf;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Use case: the actor's fleet's outside parties, by name: never a credential
|
|
22
|
+
* or a crew token. Each proxy ship's owner and scopes are the fleet's alone
|
|
23
|
+
* (decision 0056), read as the actor, so the fleet answers within its read
|
|
24
|
+
* reach.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createListParties(deps: ReadDeps): ListParties;
|
|
27
|
+
/** Use case: one outside party by name, as the list shows it. */
|
|
28
|
+
export declare function createReadParty(deps: ReadDeps): ReadParty;
|
|
29
|
+
export {};
|
|
@@ -1,8 +1,39 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
1
3
|
import { shownPartyOf } from './shown-party.js';
|
|
2
|
-
|
|
4
|
+
const UNKNOWN = { ownerShipId: null, scopes: null };
|
|
5
|
+
/** The parties with what the fleet holds for each proxy ship, read as the actor; unknown outside its read reach, or while it cannot be read. */
|
|
6
|
+
async function listed(deps, call) {
|
|
7
|
+
const credential = await deps.credentialOf(call.actor, call.as);
|
|
8
|
+
return Promise.all(call.parties.map(async (party) => {
|
|
9
|
+
if (party.proxyShipId === null || !credential.isOk) {
|
|
10
|
+
return { ...shownPartyOf(party), ...UNKNOWN };
|
|
11
|
+
}
|
|
12
|
+
const read = await deps.fleet.read(credential.value, { shipId: party.proxyShipId });
|
|
13
|
+
return { ...shownPartyOf(party), ...(read.isOk ? read.value : UNKNOWN) };
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Use case: the actor's fleet's outside parties, by name: never a credential
|
|
18
|
+
* or a crew token. Each proxy ship's owner and scopes are the fleet's alone
|
|
19
|
+
* (decision 0056), read as the actor, so the fleet answers within its read
|
|
20
|
+
* reach.
|
|
21
|
+
*/
|
|
3
22
|
export function createListParties(deps) {
|
|
4
|
-
return async (
|
|
5
|
-
.
|
|
6
|
-
|
|
23
|
+
return async ({ actor, as }) => {
|
|
24
|
+
const parties = (await deps.parties.list(actor.fleetId)).sort((left, right) => left.name.localeCompare(right.name));
|
|
25
|
+
return listed(deps, { actor, as, parties });
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Use case: one outside party by name, as the list shows it. */
|
|
29
|
+
export function createReadParty(deps) {
|
|
30
|
+
return async ({ actor, as, name }) => {
|
|
31
|
+
const party = await deps.parties.find(actor.fleetId, name);
|
|
32
|
+
if (party === undefined) {
|
|
33
|
+
return refuse('NO_SUCH_PARTY', `There is no outside party ${name}`);
|
|
34
|
+
}
|
|
35
|
+
const [shown] = await listed(deps, { actor, as, parties: [party] });
|
|
36
|
+
return shown === undefined ? refuse('NO_SUCH_PARTY', `There is no outside party ${name}`) : ok(shown);
|
|
37
|
+
};
|
|
7
38
|
}
|
|
8
39
|
//# sourceMappingURL=list-parties.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-parties.js","sourceRoot":"","sources":["../../../src/core/parties/list-parties.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"list-parties.js","sourceRoot":"","sources":["../../../src/core/parties/list-parties.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAoC,MAAM,kBAAkB,CAAC;AAkBlF,MAAM,OAAO,GAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAE/D,gJAAgJ;AAChJ,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,IAAqC;IACzE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACpF,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAc;IAC9C,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACpH,OAAO,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;AACJ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACxG,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FleetId, ShipId } from '@aeolus-fleet/common';
|
|
1
|
+
import type { FleetId, ShipId, VerifiedFact } from '@aeolus-fleet/common';
|
|
2
2
|
import type { McpServerCredential } from '../vault/credential.js';
|
|
3
3
|
/**
|
|
4
4
|
* Where an approved party's proxy ship stands (interop I-5):
|
|
@@ -8,15 +8,14 @@ import type { McpServerCredential } from '../vault/credential.js';
|
|
|
8
8
|
*/
|
|
9
9
|
export type PartyState = 'commissioning' | 'awaitingCrew' | 'crewed';
|
|
10
10
|
/**
|
|
11
|
-
* What every party has: one app proxy ship (decision 0044),
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* What every party has: one app proxy ship (decision 0044), crewed by the
|
|
12
|
+
* gateway. Known by its ship's name, unique in the fleet. Its owner, the
|
|
13
|
+
* person inside who answers for it (0045), is the fleet's alone: the gateway
|
|
14
|
+
* names it at the commission and reads it after (decision 0056).
|
|
14
15
|
*/
|
|
15
16
|
interface PartyBase {
|
|
16
17
|
readonly fleetId: FleetId;
|
|
17
18
|
readonly name: string;
|
|
18
|
-
/** The owner argo picked: a person's ship, or argo. */
|
|
19
|
-
readonly ownerShipId: ShipId;
|
|
20
19
|
readonly state: PartyState;
|
|
21
20
|
readonly proxyShipId: ShipId | null;
|
|
22
21
|
/** The proxy ship's secret, kept only from its commission until the gateway crews it, so a crash between them loses nothing. */
|
|
@@ -43,4 +42,11 @@ export interface McpClientParty extends PartyBase {
|
|
|
43
42
|
readonly clientId: string;
|
|
44
43
|
}
|
|
45
44
|
export type Party = McpServerParty | McpClientParty;
|
|
45
|
+
/**
|
|
46
|
+
* What the gateway checked about the party behind a proxy ship (decision
|
|
47
|
+
* 0059): the host it reached an MCP server at over TLS, and the domain of the
|
|
48
|
+
* metadata document it read an MCP client's id from over TLS. A client argo
|
|
49
|
+
* registered has no document, and an address without TLS proves no host.
|
|
50
|
+
*/
|
|
51
|
+
export declare function verifiedFactsOf(party: Party): VerifiedFact[];
|
|
46
52
|
export {};
|
|
@@ -1,2 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
/** The host of an https address, or none: only an address reached over TLS shows who answers it. */
|
|
2
|
+
function tlsHostOf(address) {
|
|
3
|
+
try {
|
|
4
|
+
const url = new URL(address);
|
|
5
|
+
return url.protocol === 'https:' ? url.hostname : undefined;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* What the gateway checked about the party behind a proxy ship (decision
|
|
13
|
+
* 0059): the host it reached an MCP server at over TLS, and the domain of the
|
|
14
|
+
* metadata document it read an MCP client's id from over TLS. A client argo
|
|
15
|
+
* registered has no document, and an address without TLS proves no host.
|
|
16
|
+
*/
|
|
17
|
+
export function verifiedFactsOf(party) {
|
|
18
|
+
const host = tlsHostOf(party.kind === 'mcpServer' ? party.url : party.clientId);
|
|
19
|
+
if (host === undefined) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
return [party.kind === 'mcpServer' ? { checked: 'tlsHost', value: host } : { checked: 'clientIdDocumentDomain', value: host }];
|
|
23
|
+
}
|
|
2
24
|
//# sourceMappingURL=party.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"party.js","sourceRoot":"","sources":["../../../src/core/parties/party.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"party.js","sourceRoot":"","sources":["../../../src/core/parties/party.ts"],"names":[],"mappings":"AAmDA,oGAAoG;AACpG,SAAS,SAAS,CAAC,OAAe;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjI,CAAC"}
|