@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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { grantScopesOutputSchema } from '@aeolus-fleet/common';
|
|
2
|
+
import { err, ok } from '../../core/shared/result.js';
|
|
3
|
+
import { mutateAs } from './actor-door.js';
|
|
4
|
+
/** A party's proxy ship, as the actor calls the fleet on it (decision 0057). */
|
|
5
|
+
export function createProxyShipsAsActor(fleetUrl) {
|
|
6
|
+
return {
|
|
7
|
+
retire: async (as, { shipId }) => {
|
|
8
|
+
const retired = await mutateAs(fleetUrl, { as, procedure: 'retire', input: { shipId } });
|
|
9
|
+
return retired.isOk ? ok(undefined) : err(retired.error);
|
|
10
|
+
},
|
|
11
|
+
setOwner: async (as, { shipId, ownerShipId }) => {
|
|
12
|
+
const set = await mutateAs(fleetUrl, { as, procedure: 'setOwner', input: { shipId, ownerShipId }, isTrpcOnly: true });
|
|
13
|
+
return set.isOk ? ok(undefined) : err(set.error);
|
|
14
|
+
},
|
|
15
|
+
grantScopes: async (as, { shipId, grant, revoke }) => {
|
|
16
|
+
const changed = await mutateAs(fleetUrl, { as, procedure: 'grantScopes', input: { shipId, grant, revoke } });
|
|
17
|
+
if (!changed.isOk) {
|
|
18
|
+
return changed;
|
|
19
|
+
}
|
|
20
|
+
const held = grantScopesOutputSchema.safeParse(changed.value);
|
|
21
|
+
return held.success ? ok({ scopes: [...held.data.scopes] }) : err({ code: 'UNAVAILABLE', message: 'The fleet answered no scopes' });
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=proxy-ships-as-actor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-ships-as-actor.js","sourceRoot":"","sources":["../../../src/adapters/fleet/proxy-ships-as-actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,gFAAgF;AAChF,MAAM,UAAU,uBAAuB,CAAC,QAAgB;IACtD,OAAO;QACL,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACzF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;YACtH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;YACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7G,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,IAAI,GAAG,uBAAuB,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;QACtI,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FleetDoor } from '../../core/connection/ports.js';
|
|
2
|
-
import type { CallSender, Discovery } from '../../core/mcp-in/ports.js';
|
|
2
|
+
import type { CallSender, Discovery, ReplyReceiver } from '../../core/mcp-in/ports.js';
|
|
3
3
|
import type { ProxyShipCrew } from '../../core/mcp-out/hand-call.js';
|
|
4
4
|
import type { StatementDoor } from '../../core/mcp-out/state-party.js';
|
|
5
5
|
import type { ProxyShipDoor } from '../../core/parties/ports.js';
|
|
@@ -9,6 +9,6 @@ export declare function createRestFleetDoor(fleetUrl: string, options?: {
|
|
|
9
9
|
busyWaitsMs?: readonly number[];
|
|
10
10
|
random?: () => number;
|
|
11
11
|
wait?: (waitMs: number) => Promise<void>;
|
|
12
|
-
}): FleetDoor & ProxyShipDoor & StatementDoor & ProxyShipCrew & Discovery & CallSender & AccountDoor & Owners & {
|
|
12
|
+
}): FleetDoor & ProxyShipDoor & StatementDoor & ProxyShipCrew & Discovery & CallSender & ReplyReceiver & AccountDoor & Owners & {
|
|
13
13
|
person: PersonShipDoor;
|
|
14
14
|
};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* same body, after each of the busy waits (each drawn by `busyWaitMs`).
|
|
7
7
|
*/
|
|
8
8
|
import { setTimeout as wait } from 'node:timers/promises';
|
|
9
|
-
import { busyWaitMs, commissionShipOutputSchema, discoverOutputSchema, FLEET_BUSY_WAITS_MS, handedOutputSchema, idSchema, inboxOutputSchema, pushReceiveOutputSchema, QUESTION_CONTENT_TYPE, questionSchema, sendOutputSchema, shipDetailOutputSchema, startingPromptOutputSchema, } from '@aeolus-fleet/common';
|
|
9
|
+
import { ACCOUNT_TOKEN_HEADER, ON_BEHALF_OF_HEADER, shipOutputSchema, setVerifiedFactsOutputSchema, busyWaitMs, commissionShipOutputSchema, discoverOutputSchema, FLEET_BUSY_WAITS_MS, handedOutputSchema, idSchema, inboxOutputSchema, pushReceiveOutputSchema, receiveOutputSchema, QUESTION_CONTENT_TYPE, questionSchema, sendOutputSchema, shipDetailOutputSchema, startingPromptOutputSchema, } from '@aeolus-fleet/common';
|
|
10
10
|
import { z } from 'zod';
|
|
11
11
|
import { err, ok } from '../../core/shared/result.js';
|
|
12
12
|
const refusalSchema = z.object({ code: z.string(), message: z.string() });
|
|
@@ -16,8 +16,6 @@ const FLEET_BUSY = 'SERVICE_UNAVAILABLE';
|
|
|
16
16
|
const LOCATION = { kind: 'SERVER' };
|
|
17
17
|
/** The harness the gateway states when it registers a ship: it is software, not a model. */
|
|
18
18
|
const HARNESS = 'aeolus-gateway';
|
|
19
|
-
/** The header an account's token travels in; common's ACCOUNT_TOKEN_HEADER replaces it once published (aeolus-fleet#991). */
|
|
20
|
-
const ACCOUNT_TOKEN_HEADER = 'aeolus-account-token';
|
|
21
19
|
async function callFleet({ fleetUrl, busyWaitsMs, random, wait: waitBusy }, request) {
|
|
22
20
|
for (const waitMs of busyWaitsMs) {
|
|
23
21
|
const answered = await callOnce(fleetUrl, request);
|
|
@@ -36,6 +34,9 @@ async function callOnce(fleetUrl, request) {
|
|
|
36
34
|
if (request.accountToken !== undefined) {
|
|
37
35
|
headers[ACCOUNT_TOKEN_HEADER] = request.accountToken;
|
|
38
36
|
}
|
|
37
|
+
if (request.onBehalfOf !== undefined) {
|
|
38
|
+
headers[ON_BEHALF_OF_HEADER] = request.onBehalfOf;
|
|
39
|
+
}
|
|
39
40
|
if (request.body !== undefined) {
|
|
40
41
|
headers['content-type'] = 'application/json';
|
|
41
42
|
}
|
|
@@ -91,15 +92,18 @@ export function createRestFleetDoor(fleetUrl, options = {}) {
|
|
|
91
92
|
const read = await call({ path: '/fleet/ship', method: 'POST', crewToken, body: { shipId }, answers: shipDetailOutputSchema });
|
|
92
93
|
return read.isOk ? ok(read.value.owner?.id ?? null) : read;
|
|
93
94
|
},
|
|
94
|
-
getShip: async (crewToken,
|
|
95
|
-
const read = await call({ path: '/fleet/ship', method: 'POST', crewToken, body:
|
|
95
|
+
getShip: async (crewToken, { shipId, onBehalfOf }) => {
|
|
96
|
+
const read = await call({ path: '/fleet/ship', method: 'POST', crewToken, onBehalfOf, body: { shipId }, answers: shipOutputSchema });
|
|
96
97
|
if (!read.isOk) {
|
|
97
98
|
return read;
|
|
98
99
|
}
|
|
100
|
+
if ('isInReadReach' in read.value) {
|
|
101
|
+
return err({ code: 'FORBIDDEN', message: `${read.value.name} is outside the read reach` });
|
|
102
|
+
}
|
|
99
103
|
const { status, scopes } = read.value;
|
|
100
104
|
return ok({ status, scopes });
|
|
101
105
|
},
|
|
102
|
-
// An app ship owned by the owner argo picked
|
|
106
|
+
// An app ship owned by the owner argo picked (decision 0045).
|
|
103
107
|
commissionAppShip: async (crewToken, { name, type, owner, idempotencyKey, scopes }) => {
|
|
104
108
|
const commissioned = await call({
|
|
105
109
|
path: '/fleet/commission',
|
|
@@ -110,16 +114,28 @@ export function createRestFleetDoor(fleetUrl, options = {}) {
|
|
|
110
114
|
});
|
|
111
115
|
return commissioned.isOk ? ok({ shipId: commissioned.value.shipId, secret: commissioned.value.secret }) : commissioned;
|
|
112
116
|
},
|
|
117
|
+
setVerifiedFacts: async (crewToken, written) => {
|
|
118
|
+
const set = await call({ path: '/fleet/setVerifiedFacts', method: 'POST', crewToken, body: written, answers: setVerifiedFactsOutputSchema });
|
|
119
|
+
return set.isOk ? ok(undefined) : set;
|
|
120
|
+
},
|
|
113
121
|
deregister: async (crewToken) => {
|
|
114
122
|
const ended = await call({ path: '/ship/deregister', method: 'POST', crewToken, body: {}, answers: z.unknown() });
|
|
115
123
|
return ended.isOk ? ok(undefined) : ended;
|
|
116
124
|
},
|
|
117
|
-
// The whole statement, as the proxy ship's crew
|
|
125
|
+
// The whole statement, as the proxy ship's crew.
|
|
118
126
|
setStatement: async (crewToken, statement) => {
|
|
119
127
|
const stated = await call({ path: '/ship/setStatement', method: 'POST', crewToken, body: statement, answers: z.object({ version: z.int() }) });
|
|
120
128
|
return stated.isOk ? ok(undefined) : stated;
|
|
121
129
|
},
|
|
122
130
|
// A proxy ship's crew calls (decision 0040), as the gateway's computer side makes them.
|
|
131
|
+
receiveReply: async (crewToken, { messageId, signal }) => {
|
|
132
|
+
const taken = await call({ path: '/ship/receiveReply', method: 'POST', crewToken, body: { messageId }, answers: receiveOutputSchema, signal });
|
|
133
|
+
if (!taken.isOk) {
|
|
134
|
+
return taken;
|
|
135
|
+
}
|
|
136
|
+
const [reply] = taken.value.deliveries;
|
|
137
|
+
return ok(reply === undefined ? undefined : { deliveryId: reply.deliveryId, messageId: reply.messageId, contentType: reply.contentType, payload: reply.payload });
|
|
138
|
+
},
|
|
123
139
|
pushReceive: async (crewToken, { max, signal }) => {
|
|
124
140
|
const taken = await call({ path: '/ship/pushReceive', method: 'POST', crewToken, body: { max }, answers: pushReceiveOutputSchema, signal });
|
|
125
141
|
return taken.isOk
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-fleet-door.js","sourceRoot":"","sources":["../../../src/adapters/fleet/rest-fleet-door.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rest-fleet-door.js","sourceRoot":"","sources":["../../../src/adapters/fleet/rest-fleet-door.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import { type Context } from '../trpc/router.js';
|
|
3
|
+
import { type SignInWay } from './signal.js';
|
|
4
|
+
export declare function registerAddServerPage(server: FastifyInstance, deps: {
|
|
5
|
+
contextFor: (cookie: string | undefined) => Context;
|
|
6
|
+
signIn: SignInWay;
|
|
7
|
+
}): void;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adding an outside MCP server (design B, Signal, screen 7; flow F10), for
|
|
3
|
+
* an actor holding fleet:manage, in three steps: its address and
|
|
4
|
+
* credential, the gateway's check of the tools it answers with, then its
|
|
5
|
+
* owner, when it is approved. The check keeps nothing, so the owner step
|
|
6
|
+
* carries the address and credential on in its form, on a page no cache
|
|
7
|
+
* keeps. Each step calls the gateway's own API as the caller, so the pages
|
|
8
|
+
* check nothing the API does not; they refuse a form sent from another
|
|
9
|
+
* origin.
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { idSchema } from '@aeolus-fleet/common';
|
|
13
|
+
import { TRPCError } from '@trpc/server';
|
|
14
|
+
import { getHTTPStatusCodeFromError } from '@trpc/server/http';
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { gatewayRouter } from '../trpc/router.js';
|
|
17
|
+
import { acceptForms, escaped, isSameOrigin } from './html.js';
|
|
18
|
+
import { icon, ring, signalPage, signInPrompt, statusBadge } from './signal.js';
|
|
19
|
+
const HTTP_FORBIDDEN = 403;
|
|
20
|
+
const HTTP_SEE_OTHER = 303;
|
|
21
|
+
const HTTP_INTERNAL_ERROR = 500;
|
|
22
|
+
const LIST = '/outside-parties';
|
|
23
|
+
const PAGE = `${LIST}/add`;
|
|
24
|
+
const TITLE = 'Add MCP server';
|
|
25
|
+
const CONCURRENCY_LIMIT_DEFAULT = 4;
|
|
26
|
+
const formSchema = z.record(z.string(), z.string());
|
|
27
|
+
/** The credential fields a form sends, in the order the address step asks for them. */
|
|
28
|
+
const CREDENTIAL_FIELDS = ['credentialKind', 'token', 'clientId', 'clientSecret', 'issuer', 'scope'];
|
|
29
|
+
/** The steps of adding a server, as the design numbers them. */
|
|
30
|
+
const STEPS = ['Address', 'Check', 'Owner'];
|
|
31
|
+
function field(form, name) {
|
|
32
|
+
return form[name] ?? '';
|
|
33
|
+
}
|
|
34
|
+
function steps(current) {
|
|
35
|
+
const at = STEPS.indexOf(current);
|
|
36
|
+
const items = STEPS.map((step, index) => `<li class="${index <= at ? 'done' : ''}"${index === at ? ' aria-current="step"' : ''}>${String(index + 1)} ${step}</li>`).join('');
|
|
37
|
+
return `<ol class="steps">${items}</ol>`;
|
|
38
|
+
}
|
|
39
|
+
function head(current) {
|
|
40
|
+
return `<a class="back" href="${LIST}">${icon('arrowLeft', 14)}Outside parties</a><div class="lead"><h1>${TITLE}</h1></div>${steps(current)}`;
|
|
41
|
+
}
|
|
42
|
+
function alert(message) {
|
|
43
|
+
return message === undefined ? '' : `<section class="card alert tone-attention" role="alert"><p>${escaped(message)}</p></section>`;
|
|
44
|
+
}
|
|
45
|
+
function credentialOf(form) {
|
|
46
|
+
if (field(form, 'credentialKind') === 'clientCredentials') {
|
|
47
|
+
const scope = field(form, 'scope');
|
|
48
|
+
return { kind: 'clientCredentials', clientId: field(form, 'clientId'), clientSecret: field(form, 'clientSecret'), issuer: field(form, 'issuer'), ...(scope === '' ? {} : { scope }) };
|
|
49
|
+
}
|
|
50
|
+
return { kind: 'bearer', token: field(form, 'token') };
|
|
51
|
+
}
|
|
52
|
+
function addressBody(form, refusal) {
|
|
53
|
+
const isClient = field(form, 'credentialKind') === 'clientCredentials';
|
|
54
|
+
return `${head('Address')}${alert(refusal)}<section class="card"><form method="post" action="${PAGE}/check" style="display:grid;gap:12px">
|
|
55
|
+
<label class="field"><span>Streamable HTTP address</span><input type="url" name="url" value="${escaped(field(form, 'url'))}" placeholder="https://mcp.example.com/mcp" required></label>
|
|
56
|
+
<fieldset><legend>The server's credential</legend>
|
|
57
|
+
<label class="field"><span>Credential</span><select name="credentialKind"><option value="bearer">Bearer token</option><option value="clientCredentials"${isClient ? ' selected' : ''}>OAuth client credentials</option></select></label>
|
|
58
|
+
<label class="field"><span>Bearer token</span><input type="password" name="token"></label>
|
|
59
|
+
<label class="field"><span>Client id</span><input type="text" name="clientId" value="${escaped(field(form, 'clientId'))}"></label>
|
|
60
|
+
<label class="field"><span>Client secret</span><input type="password" name="clientSecret"></label>
|
|
61
|
+
<label class="field"><span>Issuer</span><input type="url" name="issuer" value="${escaped(field(form, 'issuer'))}"></label>
|
|
62
|
+
<label class="field"><span>Scope</span><input type="text" name="scope" value="${escaped(field(form, 'scope'))}"></label>
|
|
63
|
+
</fieldset>
|
|
64
|
+
<div class="actions"><button class="primary">${icon('check', 14)}Check the server</button></div></form></section>`;
|
|
65
|
+
}
|
|
66
|
+
/** A proxy ship's name offered from the server's address: its host's first name that says whose it is. */
|
|
67
|
+
function suggestedName(url) {
|
|
68
|
+
try {
|
|
69
|
+
const labels = new URL(url).hostname.split('.').filter((label) => label !== 'mcp' && label !== 'www');
|
|
70
|
+
return (labels[0] ?? '').toLowerCase().replaceAll(/[^a-z0-9]+/g, '-').replaceAll(/^-+|-+$/g, '');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** The address and credential, carried on in the owner step's form. */
|
|
77
|
+
function carried(form) {
|
|
78
|
+
return ['url', ...CREDENTIAL_FIELDS].map((name) => `<input type="hidden" name="${name}" value="${escaped(field(form, name))}">`).join('');
|
|
79
|
+
}
|
|
80
|
+
function toolsCard(tools) {
|
|
81
|
+
const count = tools.length;
|
|
82
|
+
const rows = tools.map((tool) => `<li><span class="mono">${escaped(tool.name)}</span>${tool.description === undefined ? '' : `<span class="muted">${escaped(tool.description)}</span>`}</li>`).join('');
|
|
83
|
+
return `<section class="card" style="justify-items:center;text-align:center">${ring({ tone: 'ok', center: { count }, label: `${String(count)} ${count === 1 ? 'tool' : 'tools'}` })}${statusBadge({ tone: 'ok', icon: 'check', label: 'Server answers' })}<ul class="tool-rows">${rows}</ul></section>`;
|
|
84
|
+
}
|
|
85
|
+
function ownerBody(form, shown) {
|
|
86
|
+
const requestId = field(form, 'requestId') === '' ? randomUUID() : field(form, 'requestId');
|
|
87
|
+
const name = field(form, 'name') === '' ? suggestedName(field(form, 'url')) : field(form, 'name');
|
|
88
|
+
const limit = field(form, 'concurrencyLimit') === '' ? String(CONCURRENCY_LIMIT_DEFAULT) : field(form, 'concurrencyLimit');
|
|
89
|
+
return `${head(shown.tools === undefined ? 'Owner' : 'Check')}${alert(shown.refusal)}${shown.tools === undefined ? '' : toolsCard(shown.tools)}<section class="card"><h2>Its owner</h2>
|
|
90
|
+
<form method="post" action="${PAGE}" style="display:grid;gap:12px"><input type="hidden" name="requestId" value="${escaped(requestId)}">${carried(form)}
|
|
91
|
+
<p class="muted mono">${escaped(field(form, 'url'))}</p>
|
|
92
|
+
<label class="field"><span>Proxy ship's name</span><input type="text" name="name" value="${escaped(name)}" required></label>
|
|
93
|
+
<label class="field"><span>Owner</span><input type="text" name="ownerShipId" value="${escaped(field(form, 'ownerShipId'))}" placeholder="shp_..." required><span class="muted">A person ship. It answers for this server.</span></label>
|
|
94
|
+
<label class="field"><span>Calls at once</span><input type="number" name="concurrencyLimit" min="1" max="10" value="${escaped(limit)}"></label>
|
|
95
|
+
<div class="actions"><button class="primary">${icon('check', 14)}Add ${escaped(name === '' ? 'server' : name)}</button><a class="button" href="${PAGE}">Back to the address</a></div></form></section>`;
|
|
96
|
+
}
|
|
97
|
+
function html(reply, page) {
|
|
98
|
+
return reply
|
|
99
|
+
.code(page.status)
|
|
100
|
+
.type('text/html; charset=utf-8')
|
|
101
|
+
.header('cache-control', 'no-store')
|
|
102
|
+
.send(signalPage({ title: TITLE, tab: 'outsideParties', body: page.body, isSignedIn: page.isSignedIn }));
|
|
103
|
+
}
|
|
104
|
+
export function registerAddServerPage(server, deps) {
|
|
105
|
+
acceptForms(server);
|
|
106
|
+
/** Renders a step as the caller; a refusal shows the step it came from again, with why, or asks to sign in. */
|
|
107
|
+
const answer = async (exchange, step) => {
|
|
108
|
+
const { request, reply } = exchange;
|
|
109
|
+
const context = deps.contextFor(request.headers.cookie);
|
|
110
|
+
const actor = await context.authenticateActor({ cookie: context.cookie, crewToken: context.crewToken });
|
|
111
|
+
const isSignedIn = actor.isOk && actor.value.kind === 'account';
|
|
112
|
+
try {
|
|
113
|
+
if (!actor.isOk) {
|
|
114
|
+
throw new TRPCError({ code: 'UNAUTHORIZED', message: actor.error.message });
|
|
115
|
+
}
|
|
116
|
+
return await step.render(gatewayRouter.createCaller(context));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (!(error instanceof TRPCError)) {
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
if (error.code === 'UNAUTHORIZED') {
|
|
123
|
+
return reply.code(getHTTPStatusCodeFromError(error)).type('text/html; charset=utf-8').send(signalPage({ title: TITLE, body: signInPrompt({ message: error.message, way: deps.signIn, returnTo: PAGE }) }));
|
|
124
|
+
}
|
|
125
|
+
const isInternal = error.code === 'INTERNAL_SERVER_ERROR';
|
|
126
|
+
return html(reply, { status: isInternal ? HTTP_INTERNAL_ERROR : getHTTPStatusCodeFromError(error), body: step.refused(isInternal ? 'Internal error' : error.message), isSignedIn });
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
const formOf = (request) => {
|
|
130
|
+
const form = formSchema.safeParse(request.body);
|
|
131
|
+
return form.success ? form.data : {};
|
|
132
|
+
};
|
|
133
|
+
server.get(PAGE, (request, reply) => answer({ request, reply }, {
|
|
134
|
+
render: () => html(reply, { status: 200, body: addressBody({}), isSignedIn: true }),
|
|
135
|
+
refused: (message) => addressBody({}, message),
|
|
136
|
+
}));
|
|
137
|
+
server.post(`${PAGE}/check`, (request, reply) => {
|
|
138
|
+
if (!isSameOrigin(request)) {
|
|
139
|
+
return reply.code(HTTP_FORBIDDEN).type('text/plain; charset=utf-8').send('A form for this page is sent only from this page.');
|
|
140
|
+
}
|
|
141
|
+
const form = formOf(request);
|
|
142
|
+
return answer({ request, reply }, {
|
|
143
|
+
render: async (caller) => {
|
|
144
|
+
const { tools } = await caller.parties.check({ url: field(form, 'url'), credential: credentialOf(form) });
|
|
145
|
+
return html(reply, { status: 200, body: ownerBody(form, { tools }), isSignedIn: true });
|
|
146
|
+
},
|
|
147
|
+
refused: (message) => addressBody(form, message),
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
server.post(PAGE, (request, reply) => {
|
|
151
|
+
if (!isSameOrigin(request)) {
|
|
152
|
+
return reply.code(HTTP_FORBIDDEN).type('text/plain; charset=utf-8').send('A form for this page is sent only from this page.');
|
|
153
|
+
}
|
|
154
|
+
const form = formOf(request);
|
|
155
|
+
return answer({ request, reply }, {
|
|
156
|
+
render: async (caller) => {
|
|
157
|
+
const ownerShipId = idSchema('ship').safeParse(field(form, 'ownerShipId').trim());
|
|
158
|
+
if (!ownerShipId.success) {
|
|
159
|
+
throw new TRPCError({ code: 'BAD_REQUEST', message: "The owner's ship id is not a ship id (shp_...)" });
|
|
160
|
+
}
|
|
161
|
+
const approved = await caller.parties.approve({
|
|
162
|
+
requestId: field(form, 'requestId'),
|
|
163
|
+
name: field(form, 'name'),
|
|
164
|
+
url: field(form, 'url'),
|
|
165
|
+
credential: credentialOf(form),
|
|
166
|
+
ownerShipId: ownerShipId.data,
|
|
167
|
+
concurrencyLimit: Number(field(form, 'concurrencyLimit')),
|
|
168
|
+
});
|
|
169
|
+
return reply.code(HTTP_SEE_OTHER).header('location', `${LIST}/${encodeURIComponent(approved.name)}`).send();
|
|
170
|
+
},
|
|
171
|
+
refused: (message) => ownerBody(form, { refusal: message }),
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=add-server-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-server-page.js","sourceRoot":"","sources":["../../../src/adapters/http/add-server-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';
|
|
2
|
+
import { type Context } from '../trpc/router.js';
|
|
3
|
+
/** Where the person goes once a delivery is dealt with, or when it no longer waits. */
|
|
4
|
+
export declare const OVERVIEW = "/overview";
|
|
5
|
+
/** A delivery the inbox lists, as the Overview shows it: opening it is a form, as it acknowledges the delivery. */
|
|
6
|
+
export declare function waitingItem(entry: {
|
|
7
|
+
deliveryId: string;
|
|
8
|
+
from: string;
|
|
9
|
+
title: string;
|
|
10
|
+
}): string;
|
|
11
|
+
/** How the Overview answers a page of its own: it renders as the caller, and says why the API refused, or asks to sign in. */
|
|
12
|
+
export type PageAnswer = (exchange: {
|
|
13
|
+
request: FastifyRequest;
|
|
14
|
+
reply: FastifyReply;
|
|
15
|
+
render: (context: Context) => Promise<FastifyReply>;
|
|
16
|
+
onRefused?: (context: Context, refused: {
|
|
17
|
+
status: number;
|
|
18
|
+
message: string;
|
|
19
|
+
}) => FastifyReply | Promise<FastifyReply>;
|
|
20
|
+
}) => Promise<FastifyReply>;
|
|
21
|
+
/** The delivery forms, posted from the Overview, answered as the Overview answers its own pages. */
|
|
22
|
+
export declare function registerDeliveryPages(server: FastifyInstance, deps: {
|
|
23
|
+
answer: PageAnswer;
|
|
24
|
+
}): void;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A delivery that waits on a person, opened from the Overview (design B,
|
|
3
|
+
* Signal): one item in focus. Opening is the person's own act, so it is a
|
|
4
|
+
* form, never a link: the gateway acknowledges the delivery for them, and
|
|
5
|
+
* the page shows it whole once. A question is answered with one tap on a
|
|
6
|
+
* button that names the option it sends, the asker's pick on a dashed edge;
|
|
7
|
+
* any delivery may get a note as its answer, or be done with. Each form
|
|
8
|
+
* calls the gateway's own API as the person.
|
|
9
|
+
*/
|
|
10
|
+
import { ANSWER_CONTENT_TYPE, answerSchema, isQuestionContentType, questionSchema } from '@aeolus-fleet/common';
|
|
11
|
+
import { TRPCError } from '@trpc/server';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { gatewayRouter } from '../trpc/router.js';
|
|
14
|
+
import { escaped, isSameOrigin } from './html.js';
|
|
15
|
+
import { icon, signalPage } from './signal.js';
|
|
16
|
+
/** Where the person goes once a delivery is dealt with, or when it no longer waits. */
|
|
17
|
+
export const OVERVIEW = '/overview';
|
|
18
|
+
const HTTP_FORBIDDEN = 403;
|
|
19
|
+
const HTTP_SEE_OTHER = 303;
|
|
20
|
+
const TITLE = 'Overview';
|
|
21
|
+
const formSchema = z.record(z.string(), z.string());
|
|
22
|
+
function deliveryPath(deliveryId, action) {
|
|
23
|
+
return `${OVERVIEW}/deliveries/${encodeURIComponent(deliveryId)}/${action}`;
|
|
24
|
+
}
|
|
25
|
+
/** A delivery the inbox lists, as the Overview shows it: opening it is a form, as it acknowledges the delivery. */
|
|
26
|
+
export function waitingItem(entry) {
|
|
27
|
+
return `<form method="post" action="${deliveryPath(entry.deliveryId, 'open')}"><button class="item"><span class="text"><span>${escaped(entry.title)}</span><span class="tag">${icon('users', 12)}${escaped(entry.from)}</span></span></button></form>`;
|
|
28
|
+
}
|
|
29
|
+
function parsedQuestion(opened) {
|
|
30
|
+
if (!isQuestionContentType(opened.contentType)) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const question = questionSchema.safeParse(JSON.parse(opened.payload));
|
|
35
|
+
return question.success ? question.data : undefined;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const NOTE_FIELD = '<label class="field"><span>Note</span><textarea name="note" rows="2" placeholder="Optional, sent with your answer"></textarea></label>';
|
|
42
|
+
function questionCard(opened, question) {
|
|
43
|
+
const picked = question.options.find((option) => option.key === question.pick.option);
|
|
44
|
+
const buttons = question.options
|
|
45
|
+
.map((option) => {
|
|
46
|
+
const isPick = option.key === question.pick.option;
|
|
47
|
+
return `<button class="${isPick ? 'primary pick' : ''}" name="option" value="${String(option.key)}" title="${escaped(option.detail)}">${icon(isPick ? 'check' : 'x', 14)}${escaped(option.label)}</button>`;
|
|
48
|
+
})
|
|
49
|
+
.join('');
|
|
50
|
+
const pickLine = picked === undefined ? '' : `<p class="muted">${escaped(picked.label)} is the pick of ${escaped(opened.from)}: ${escaped(question.pick.why)}</p>`;
|
|
51
|
+
return `<form method="post" action="${deliveryPath(opened.deliveryId, 'answer')}" style="display:grid;gap:12px"><input type="hidden" name="questionId" value="${escaped(question.id)}">
|
|
52
|
+
<p class="payload">${escaped(question.context)}</p>
|
|
53
|
+
<div class="answers">${buttons}</div>${pickLine}${NOTE_FIELD}<div class="actions"><button name="option" value="">Send the note alone</button></div></form>`;
|
|
54
|
+
}
|
|
55
|
+
function messageCard(opened) {
|
|
56
|
+
return `<pre class="payload">${escaped(opened.payload)}</pre>
|
|
57
|
+
<form method="post" action="${deliveryPath(opened.deliveryId, 'answer')}" style="display:grid;gap:12px">${NOTE_FIELD.replace('Optional, sent with your answer', 'Your answer')}<div class="actions"><button class="primary">Answer</button></div></form>
|
|
58
|
+
<form method="post" action="${deliveryPath(opened.deliveryId, 'done')}"><div class="actions"><button>${icon('check', 14)}Done</button></div></form>`;
|
|
59
|
+
}
|
|
60
|
+
function deliveryBody(opened) {
|
|
61
|
+
const question = parsedQuestion(opened);
|
|
62
|
+
const card = question === undefined ? messageCard(opened) : questionCard(opened, question);
|
|
63
|
+
return `<section class="card"><span class="tag">${icon('users', 12)}${escaped(opened.from)} · ${escaped(new Date(opened.sentAt).toUTCString())}</span><h2>${escaped(question?.title ?? opened.title)}</h2>${card}</section>`;
|
|
64
|
+
}
|
|
65
|
+
/** The answer a form sends: an option and a note, or a note alone, for a question; a note as plain text otherwise. */
|
|
66
|
+
function answerOf(form) {
|
|
67
|
+
const note = (form.note ?? '').trim();
|
|
68
|
+
const questionId = form.questionId;
|
|
69
|
+
if (questionId === undefined) {
|
|
70
|
+
if (note === '') {
|
|
71
|
+
throw new TRPCError({ code: 'BAD_REQUEST', message: 'Write your answer first' });
|
|
72
|
+
}
|
|
73
|
+
return { contentType: 'text/plain', payload: note };
|
|
74
|
+
}
|
|
75
|
+
const option = form.option ?? '';
|
|
76
|
+
const answer = answerSchema.safeParse({ questionId, ...(option === '' ? {} : { option: Number(option) }), ...(note === '' ? {} : { note }) });
|
|
77
|
+
if (!answer.success) {
|
|
78
|
+
throw new TRPCError({ code: 'BAD_REQUEST', message: 'Tap an option, or write a note' });
|
|
79
|
+
}
|
|
80
|
+
return { contentType: ANSWER_CONTENT_TYPE, payload: JSON.stringify(answer.data) };
|
|
81
|
+
}
|
|
82
|
+
function html(reply, page) {
|
|
83
|
+
return reply.code(page.status).type('text/html; charset=utf-8').header('cache-control', 'no-store').send(signalPage({ title: TITLE, tab: 'overview', body: page.body, isSignedIn: true }));
|
|
84
|
+
}
|
|
85
|
+
const HTTP_NOT_FOUND = 404;
|
|
86
|
+
function noLongerWaits(refused) {
|
|
87
|
+
return `<section class="card"><h2>This no longer waits for you</h2><p class="muted">${escaped(refused.message)}</p><div class="actions"><a class="button" href="${OVERVIEW}">Back to the overview</a></div></section>`;
|
|
88
|
+
}
|
|
89
|
+
/** The delivery forms, posted from the Overview, answered as the Overview answers its own pages. */
|
|
90
|
+
export function registerDeliveryPages(server, deps) {
|
|
91
|
+
const act = (action, run) => {
|
|
92
|
+
server.post(`${OVERVIEW}/deliveries/:deliveryId/${action}`, (request, reply) => {
|
|
93
|
+
if (!isSameOrigin(request)) {
|
|
94
|
+
return reply.code(HTTP_FORBIDDEN).type('text/plain; charset=utf-8').send('A form for this page is sent only from this page.');
|
|
95
|
+
}
|
|
96
|
+
const form = formSchema.safeParse(request.body);
|
|
97
|
+
return deps.answer({
|
|
98
|
+
request,
|
|
99
|
+
reply,
|
|
100
|
+
render: (context) => run({ caller: gatewayRouter.createCaller(context), deliveryId: request.params.deliveryId, form: form.success ? form.data : {}, reply }),
|
|
101
|
+
onRefused: (_context, refused) => html(reply, refused.status === HTTP_NOT_FOUND ? { status: refused.status, body: noLongerWaits(refused) } : { status: refused.status, body: `<section class="card alert tone-attention" role="alert"><p>${escaped(refused.message)}</p></section>` }),
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
};
|
|
105
|
+
act('open', async ({ caller, deliveryId, reply }) => html(reply, { status: 200, body: deliveryBody(await caller.people.open({ deliveryId })) }));
|
|
106
|
+
act('answer', async ({ caller, deliveryId, form, reply }) => {
|
|
107
|
+
await caller.people.answer({ deliveryId, ...answerOf(form) });
|
|
108
|
+
return reply.code(HTTP_SEE_OTHER).header('location', OVERVIEW).send();
|
|
109
|
+
});
|
|
110
|
+
act('done', async ({ caller, deliveryId, reply }) => {
|
|
111
|
+
await caller.people.done({ deliveryId });
|
|
112
|
+
return reply.code(HTTP_SEE_OTHER).header('location', OVERVIEW).send();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=delivery-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-page.js","sourceRoot":"","sources":["../../../src/adapters/http/delivery-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAiB,MAAM,sBAAsB,CAAC;AAC/H,OAAO,EAAE,SAAS,EAA2B,MAAM,cAAc,CAAC;AAElE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAoC,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK/C,uFAAuF;AACvF,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AAEpC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,KAAK,GAAG,UAAU,CAAC;AAEzB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAEpD,SAAS,YAAY,CAAC,UAAkB,EAAE,MAAkC;IAC1E,OAAO,GAAG,QAAQ,eAAe,kBAAkB,CAAC,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;AAC9E,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,WAAW,CAAC,KAA0D;IACpF,OAAO,+BAA+B,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,mDAAmD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;AACzP,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,wIAAwI,CAAC;AAE5J,SAAS,YAAY,CAAC,MAAkB,EAAE,QAAkB;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO;SAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACd,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACnD,OAAO,kBAAkB,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,0BAA0B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IAC9M,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACnK,OAAO,+BAA+B,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,iFAAiF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;qBACjK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;uBACvB,OAAO,SAAS,QAAQ,GAAG,UAAU,+FAA+F,CAAC;AAC5J,CAAC;AAED,SAAS,WAAW,CAAC,MAAkB;IACrC,OAAO,wBAAwB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;8BAC1B,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,mCAAmC,UAAU,CAAC,OAAO,CAAC,iCAAiC,EAAE,aAAa,CAAC;8BAChJ,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,kCAAkC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,4BAA4B,CAAC;AACrJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3F,OAAO,2CAA2C,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,cAAc,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,YAAY,CAAC;AAC/N,CAAC;AAED,sHAAsH;AACtH,SAAS,QAAQ,CAAC,IAA4B;IAC5C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACtD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9I,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,IAAI,CAAC,KAAmB,EAAE,IAAsC;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC7L,CAAC;AAUD,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,SAAS,aAAa,CAAC,OAA4B;IACjD,OAAO,+EAA+E,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,oDAAoD,QAAQ,4CAA4C,CAAC;AACzN,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,qBAAqB,CAAC,MAAuB,EAAE,IAA4B;IACzF,MAAM,GAAG,GAAG,CAAC,MAAkC,EAAE,GAA0K,EAAE,EAAE;QAC7N,MAAM,CAAC,IAAI,CAAqC,GAAG,QAAQ,2BAA2B,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACjH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAChI,CAAC;YACD,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,MAAM,CAAC;gBACjB,OAAO;gBACP,KAAK;gBACL,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;gBAC5J,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC/B,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,8DAA8D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;aACvP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjJ,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC1D,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAClD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QACzC,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The gateway's address as a person opens it: the address itself sends them
|
|
3
|
+
* to the Overview, and an address with no page answers a page in the
|
|
4
|
+
* gateway's look. A client that calls an unknown address (no page asked
|
|
5
|
+
* for: not a GET that accepts HTML) gets Fastify's JSON answer as before.
|
|
6
|
+
*/
|
|
7
|
+
import type { FastifyInstance } from 'fastify';
|
|
8
|
+
export declare function registerFrontDoor(server: FastifyInstance): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { signalPage } from './signal.js';
|
|
2
|
+
const HTTP_SEE_OTHER = 303;
|
|
3
|
+
const HTTP_NOT_FOUND = 404;
|
|
4
|
+
const OVERVIEW = '/overview';
|
|
5
|
+
/** Whether a browser asks for a page: a GET (or HEAD) that accepts HTML. */
|
|
6
|
+
function isPageAsked(request) {
|
|
7
|
+
return (request.method === 'GET' || request.method === 'HEAD') && (request.headers.accept ?? '').includes('text/html');
|
|
8
|
+
}
|
|
9
|
+
export function registerFrontDoor(server) {
|
|
10
|
+
server.get('/', (_request, reply) => reply.code(HTTP_SEE_OTHER).header('location', OVERVIEW).send());
|
|
11
|
+
server.setNotFoundHandler((request, reply) => {
|
|
12
|
+
if (!isPageAsked(request)) {
|
|
13
|
+
return reply.code(HTTP_NOT_FOUND).send({ message: `Route ${request.method}:${request.url} not found`, error: 'Not Found', statusCode: HTTP_NOT_FOUND });
|
|
14
|
+
}
|
|
15
|
+
const body = `<section class="card"><h2>This page does not exist</h2><div class="actions"><a class="button" href="${OVERVIEW}">Go to the Overview</a></div></section>`;
|
|
16
|
+
return reply.code(HTTP_NOT_FOUND).type('text/html; charset=utf-8').send(signalPage({ title: 'Not found', body }));
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=front-door.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"front-door.js","sourceRoot":"","sources":["../../../src/adapters/http/front-door.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,4EAA4E;AAC5E,SAAS,WAAW,CAAC,OAAuB;IAC1C,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACzH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAErG,MAAM,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QAC3C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;QAC1J,CAAC;QACD,MAAM,IAAI,GAAG,uGAAuG,QAAQ,0CAA0C,CAAC;QACvK,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACpH,CAAC,CAAC,CAAC;AACL,CAAC"}
|