@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.
Files changed (179) hide show
  1. package/README.md +11 -10
  2. package/dist/adapters/crypto/page-sessions.d.ts +15 -0
  3. package/dist/adapters/crypto/page-sessions.js +40 -0
  4. package/dist/adapters/crypto/page-sessions.js.map +1 -0
  5. package/dist/adapters/crypto/request-ids.d.ts +1 -1
  6. package/dist/adapters/crypto/request-ids.js +2 -9
  7. package/dist/adapters/crypto/request-ids.js.map +1 -1
  8. package/dist/adapters/crypto/sign-in-seals.d.ts +1 -1
  9. package/dist/adapters/crypto/sign-in-seals.js +7 -9
  10. package/dist/adapters/crypto/sign-in-seals.js.map +1 -1
  11. package/dist/adapters/fleet/actor-door.d.ts +20 -0
  12. package/dist/adapters/fleet/actor-door.js +75 -0
  13. package/dist/adapters/fleet/actor-door.js.map +1 -0
  14. package/dist/adapters/fleet/core-version.d.ts +8 -8
  15. package/dist/adapters/fleet/core-version.js +6 -47
  16. package/dist/adapters/fleet/core-version.js.map +1 -1
  17. package/dist/adapters/fleet/fleet-network.js +7 -17
  18. package/dist/adapters/fleet/fleet-network.js.map +1 -1
  19. package/dist/adapters/fleet/logged-verified-facts.d.ts +13 -0
  20. package/dist/adapters/fleet/logged-verified-facts.js +18 -0
  21. package/dist/adapters/fleet/logged-verified-facts.js.map +1 -0
  22. package/dist/adapters/fleet/proxy-ship-reads.d.ts +7 -0
  23. package/dist/adapters/fleet/proxy-ship-reads.js +24 -0
  24. package/dist/adapters/fleet/proxy-ship-reads.js.map +1 -0
  25. package/dist/adapters/fleet/proxy-ships-as-actor.d.ts +3 -0
  26. package/dist/adapters/fleet/proxy-ships-as-actor.js +25 -0
  27. package/dist/adapters/fleet/proxy-ships-as-actor.js.map +1 -0
  28. package/dist/adapters/fleet/rest-fleet-door.d.ts +2 -2
  29. package/dist/adapters/fleet/rest-fleet-door.js +23 -7
  30. package/dist/adapters/fleet/rest-fleet-door.js.map +1 -1
  31. package/dist/adapters/http/add-server-page.d.ts +7 -0
  32. package/dist/adapters/http/add-server-page.js +175 -0
  33. package/dist/adapters/http/add-server-page.js.map +1 -0
  34. package/dist/adapters/http/delivery-page.d.ts +24 -0
  35. package/dist/adapters/http/delivery-page.js +115 -0
  36. package/dist/adapters/http/delivery-page.js.map +1 -0
  37. package/dist/adapters/http/front-door.d.ts +8 -0
  38. package/dist/adapters/http/front-door.js +19 -0
  39. package/dist/adapters/http/front-door.js.map +1 -0
  40. package/dist/adapters/http/oauth-routes.d.ts +15 -3
  41. package/dist/adapters/http/oauth-routes.js +33 -1
  42. package/dist/adapters/http/oauth-routes.js.map +1 -1
  43. package/dist/adapters/http/outside-parties-page.d.ts +29 -2
  44. package/dist/adapters/http/outside-parties-page.js +15 -11
  45. package/dist/adapters/http/outside-parties-page.js.map +1 -1
  46. package/dist/adapters/http/outside-party-page.d.ts +7 -0
  47. package/dist/adapters/http/outside-party-page.js +212 -0
  48. package/dist/adapters/http/outside-party-page.js.map +1 -0
  49. package/dist/adapters/http/overview-page.d.ts +2 -1
  50. package/dist/adapters/http/overview-page.js +79 -36
  51. package/dist/adapters/http/overview-page.js.map +1 -1
  52. package/dist/adapters/http/parties-page.d.ts +2 -1
  53. package/dist/adapters/http/parties-page.js +8 -10
  54. package/dist/adapters/http/parties-page.js.map +1 -1
  55. package/dist/adapters/http/scope-rows.d.ts +10 -0
  56. package/dist/adapters/http/scope-rows.js +30 -0
  57. package/dist/adapters/http/scope-rows.js.map +1 -0
  58. package/dist/adapters/http/signal.d.ts +10 -1
  59. package/dist/adapters/http/signal.js +50 -7
  60. package/dist/adapters/http/signal.js.map +1 -1
  61. package/dist/adapters/pagasae/pagasae-client.js +7 -9
  62. package/dist/adapters/pagasae/pagasae-client.js.map +1 -1
  63. package/dist/adapters/prisma/account-grants.js +2 -2
  64. package/dist/adapters/prisma/account-grants.js.map +1 -1
  65. package/dist/adapters/prisma/client-calls.js +9 -0
  66. package/dist/adapters/prisma/client-calls.js.map +1 -1
  67. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  68. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  69. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +1 -1
  70. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +1 -1
  71. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  72. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -1
  73. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +1 -1
  74. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  75. package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +33 -1
  76. package/dist/adapters/prisma/generated/models/ClientCall.d.ts +14 -14
  77. package/dist/adapters/prisma/generated/models/Party.d.ts +1 -29
  78. package/dist/adapters/prisma/oauth-stores.js +3 -0
  79. package/dist/adapters/prisma/oauth-stores.js.map +1 -1
  80. package/dist/adapters/prisma/party-store.js +0 -2
  81. package/dist/adapters/prisma/party-store.js.map +1 -1
  82. package/dist/adapters/prisma/pending-requests.js +7 -1
  83. package/dist/adapters/prisma/pending-requests.js.map +1 -1
  84. package/dist/adapters/trpc/router.d.ts +210 -12
  85. package/dist/adapters/trpc/router.js +159 -7
  86. package/dist/adapters/trpc/router.js.map +1 -1
  87. package/dist/app.js +67 -19
  88. package/dist/app.js.map +1 -1
  89. package/dist/core/actors/authenticate-actor.d.ts +21 -5
  90. package/dist/core/actors/authenticate-actor.js +14 -2
  91. package/dist/core/actors/authenticate-actor.js.map +1 -1
  92. package/dist/core/actors/credential-of.d.ts +27 -0
  93. package/dist/core/actors/credential-of.js +25 -0
  94. package/dist/core/actors/credential-of.js.map +1 -0
  95. package/dist/core/connection/connect.js +5 -4
  96. package/dist/core/connection/connect.js.map +1 -1
  97. package/dist/core/connection/ports.d.ts +6 -1
  98. package/dist/core/mcp-in/call-tool.d.ts +6 -6
  99. package/dist/core/mcp-in/call-tool.js +3 -3
  100. package/dist/core/mcp-in/call-tool.js.map +1 -1
  101. package/dist/core/mcp-in/client-call.d.ts +2 -2
  102. package/dist/core/mcp-in/client-call.js +2 -2
  103. package/dist/core/mcp-in/client-call.js.map +1 -1
  104. package/dist/core/mcp-in/collect-replies.d.ts +4 -11
  105. package/dist/core/mcp-in/collect-replies.js +52 -30
  106. package/dist/core/mcp-in/collect-replies.js.map +1 -1
  107. package/dist/core/mcp-in/list-tools.d.ts +4 -0
  108. package/dist/core/mcp-in/list-tools.js +1 -1
  109. package/dist/core/mcp-in/list-tools.js.map +1 -1
  110. package/dist/core/mcp-in/ports.d.ts +24 -1
  111. package/dist/core/mcp-out/hand-call.d.ts +2 -0
  112. package/dist/core/mcp-out/hand-call.js +4 -2
  113. package/dist/core/mcp-out/hand-call.js.map +1 -1
  114. package/dist/core/mcp-out/state-party.d.ts +2 -1
  115. package/dist/core/mcp-out/state-party.js +1 -1
  116. package/dist/core/mcp-out/state-party.js.map +1 -1
  117. package/dist/core/mcp-out/statement.d.ts +10 -0
  118. package/dist/core/mcp-out/statement.js +7 -5
  119. package/dist/core/mcp-out/statement.js.map +1 -1
  120. package/dist/core/oauth/ports.d.ts +2 -0
  121. package/dist/core/oauth/read-authorization.js +2 -2
  122. package/dist/core/oauth/read-authorization.js.map +1 -1
  123. package/dist/core/oauth/redirect-uri.d.ts +7 -0
  124. package/dist/core/oauth/redirect-uri.js +23 -0
  125. package/dist/core/oauth/redirect-uri.js.map +1 -1
  126. package/dist/core/outside-parties/ports.d.ts +1 -5
  127. package/dist/core/outside-parties/set-outside-parties.d.ts +5 -3
  128. package/dist/core/outside-parties/set-outside-parties.js +6 -2
  129. package/dist/core/outside-parties/set-outside-parties.js.map +1 -1
  130. package/dist/core/parties/approve-party.js +24 -8
  131. package/dist/core/parties/approve-party.js.map +1 -1
  132. package/dist/core/parties/change-party.d.ts +42 -0
  133. package/dist/core/parties/change-party.js +49 -0
  134. package/dist/core/parties/change-party.js.map +1 -0
  135. package/dist/core/parties/check-server.d.ts +24 -0
  136. package/dist/core/parties/check-server.js +21 -0
  137. package/dist/core/parties/check-server.js.map +1 -0
  138. package/dist/core/parties/list-parties.d.ts +28 -7
  139. package/dist/core/parties/list-parties.js +35 -4
  140. package/dist/core/parties/list-parties.js.map +1 -1
  141. package/dist/core/parties/party.d.ts +12 -6
  142. package/dist/core/parties/party.js +23 -1
  143. package/dist/core/parties/party.js.map +1 -1
  144. package/dist/core/parties/ports.d.ts +36 -1
  145. package/dist/core/parties/read-party-tools.d.ts +22 -0
  146. package/dist/core/parties/read-party-tools.js +22 -0
  147. package/dist/core/parties/read-party-tools.js.map +1 -0
  148. package/dist/core/parties/retire-party.d.ts +29 -0
  149. package/dist/core/parties/retire-party.js +43 -0
  150. package/dist/core/parties/retire-party.js.map +1 -0
  151. package/dist/core/parties/shown-party.d.ts +8 -2
  152. package/dist/core/parties/shown-party.js +3 -3
  153. package/dist/core/parties/shown-party.js.map +1 -1
  154. package/dist/core/requests/decide-request.js +9 -1
  155. package/dist/core/requests/decide-request.js.map +1 -1
  156. package/dist/core/requests/list-mine.d.ts +16 -0
  157. package/dist/core/requests/list-mine.js +20 -0
  158. package/dist/core/requests/list-mine.js.map +1 -0
  159. package/dist/core/requests/ports.d.ts +5 -0
  160. package/dist/core/shared/errors.d.ts +1 -1
  161. package/dist/core/shared/errors.js.map +1 -1
  162. package/dist/core/sign-in/account-token.d.ts +8 -4
  163. package/dist/core/sign-in/account-token.js +4 -4
  164. package/dist/core/sign-in/account-token.js.map +1 -1
  165. package/dist/core/sign-in/complete-sign-in.d.ts +15 -4
  166. package/dist/core/sign-in/complete-sign-in.js +27 -4
  167. package/dist/core/sign-in/complete-sign-in.js.map +1 -1
  168. package/dist/core/sign-in/ports.d.ts +37 -7
  169. package/dist/core/sign-in/sign-out.d.ts +10 -0
  170. package/dist/core/sign-in/sign-out.js +9 -0
  171. package/dist/core/sign-in/sign-out.js.map +1 -0
  172. package/dist/core/sign-in/start-page-sign-in.d.ts +25 -0
  173. package/dist/core/sign-in/start-page-sign-in.js +30 -0
  174. package/dist/core/sign-in/start-page-sign-in.js.map +1 -0
  175. package/package.json +3 -3
  176. package/src/adapters/prisma/migrations/20261020200000_account_grant_scopes/migration.sql +2 -0
  177. package/src/adapters/prisma/migrations/20261020210000_party_owner_from_fleet/migration.sql +2 -0
  178. package/src/adapters/prisma/migrations/20261020220000_client_call_deadline_optional/migration.sql +2 -0
  179. package/src/adapters/prisma/schema.prisma +3 -2
@@ -0,0 +1,10 @@
1
+ import type { AccountGrants, PageSession } from './ports.js';
2
+ export type SignOut = (session: PageSession) => Promise<void>;
3
+ /**
4
+ * Use case: a person signs out of the gateway's pages. The session's grant
5
+ * ends, so a page session cookie kept after it is signed out; the account's
6
+ * sign-ins from its MCP clients go on.
7
+ */
8
+ export declare function createSignOut(deps: {
9
+ grants: Pick<AccountGrants, 'end'>;
10
+ }): SignOut;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Use case: a person signs out of the gateway's pages. The session's grant
3
+ * ends, so a page session cookie kept after it is signed out; the account's
4
+ * sign-ins from its MCP clients go on.
5
+ */
6
+ export function createSignOut(deps) {
7
+ return ({ fleetId, grantId }) => deps.grants.end(fleetId, grantId);
8
+ }
9
+ //# sourceMappingURL=sign-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-out.js","sourceRoot":"","sources":["../../../src/core/sign-in/sign-out.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4C;IACxE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { OAuthSecrets } from '../oauth/ports.js';
2
+ import type { Clock } from '../shared/clock.js';
3
+ import type { Pagasae, SignInSeals } from './ports.js';
4
+ /** Where a person lands once signed in, when they asked for no page of the gateway's own. */
5
+ export declare const FIRST_PAGE = "/overview";
6
+ export type StartPageSignIn = (asked: {
7
+ returnTo?: string | undefined;
8
+ }) => {
9
+ redirectTo: string;
10
+ browserSecret: string;
11
+ };
12
+ /**
13
+ * Use case: a person signs in to the gateway's own pages through pagasae
14
+ * (decision 0054), as from an MCP client: the page to go back to is sealed
15
+ * with the gateway's PKCE verifier into the state, and the person is sent to
16
+ * pagasae naming no fleet. Only a path of the gateway's own is kept, so a
17
+ * sign-in never sends the browser to another site. The browser is given a
18
+ * secret of its own, sealed too, so only it finishes the sign-in.
19
+ */
20
+ export declare function createStartPageSignIn(deps: {
21
+ seals: SignInSeals;
22
+ pagasae: Pagasae;
23
+ secrets: OAuthSecrets;
24
+ clock: Clock;
25
+ }): StartPageSignIn;
@@ -0,0 +1,30 @@
1
+ import { SIGN_IN_LIFETIME_MS } from './start-sign-in.js';
2
+ /** Where a person lands once signed in, when they asked for no page of the gateway's own. */
3
+ export const FIRST_PAGE = '/overview';
4
+ /** Whether the path is one of the gateway's own: one slash, then no second slash or backslash a browser reads as another site. */
5
+ function isOwnPath(path) {
6
+ return path.startsWith('/') && !path.startsWith('//') && !path.startsWith('/\\');
7
+ }
8
+ /**
9
+ * Use case: a person signs in to the gateway's own pages through pagasae
10
+ * (decision 0054), as from an MCP client: the page to go back to is sealed
11
+ * with the gateway's PKCE verifier into the state, and the person is sent to
12
+ * pagasae naming no fleet. Only a path of the gateway's own is kept, so a
13
+ * sign-in never sends the browser to another site. The browser is given a
14
+ * secret of its own, sealed too, so only it finishes the sign-in.
15
+ */
16
+ export function createStartPageSignIn(deps) {
17
+ return ({ returnTo }) => {
18
+ const verifier = deps.secrets.newSecret();
19
+ const browserSecret = deps.secrets.newSecret();
20
+ const state = deps.seals.seal({
21
+ holder: 'page',
22
+ returnTo: returnTo !== undefined && isOwnPath(returnTo) ? returnTo : FIRST_PAGE,
23
+ verifier,
24
+ browserSecret,
25
+ expiresAt: new Date(deps.clock.now().getTime() + SIGN_IN_LIFETIME_MS),
26
+ });
27
+ return { redirectTo: deps.pagasae.authorizeUrl({ state, codeChallenge: deps.secrets.challengeOf(verifier) }), browserSecret };
28
+ };
29
+ }
30
+ //# sourceMappingURL=start-page-sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-page-sign-in.js","sourceRoot":"","sources":["../../../src/core/sign-in/start-page-sign-in.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,6FAA6F;AAC7F,MAAM,CAAC,MAAM,UAAU,GAAG,WAAW,CAAC;AAItC,kIAAkI;AAClI,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACnF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAmF;IACvH,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU;YAC/E,QAAQ;YACR,aAAa;YACb,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,mBAAmB,CAAC;SACtE,CAAC,CAAC;QACH,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;IAChI,CAAC,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aeolus-fleet/gateway",
3
- "version": "0.0.0",
3
+ "version": "0.28.1",
4
4
  "description": "Aeolus gateway: outside MCP servers and clients join a fleet as ships, through one gateway beside core.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -40,7 +40,7 @@
40
40
  "db:migrate": "tsx --env-file-if-exists=.env src/bin/aeolus-gateway.ts migrate"
41
41
  },
42
42
  "dependencies": {
43
- "@aeolus-fleet/common": "^0.27.0",
43
+ "@aeolus-fleet/common": "^0.28.0",
44
44
  "@fastify/websocket": "^11.3.4",
45
45
  "@modelcontextprotocol/client": "^2.3.1",
46
46
  "@modelcontextprotocol/server": "^2.3.1",
@@ -53,7 +53,7 @@
53
53
  "zod": "^4.6.5"
54
54
  },
55
55
  "devDependencies": {
56
- "@aeolus-fleet/core": "0.27.0",
56
+ "@aeolus-fleet/core": "^0.28.0",
57
57
  "@eslint/js": "^10.0.1",
58
58
  "@modelcontextprotocol/ext-tasks": "0.2.2",
59
59
  "@testcontainers/postgresql": "^12.2.0",
@@ -0,0 +1,2 @@
1
+ -- The scopes a grant's account token carries: what the account may do on the gateway's pages.
2
+ ALTER TABLE "account_grants" ADD COLUMN "scopes" TEXT[] NOT NULL DEFAULT ARRAY[]::TEXT[];
@@ -0,0 +1,2 @@
1
+ -- A party's owner is the fleet's alone (decision 0056): the gateway names it at the commission and reads it after.
2
+ ALTER TABLE "parties" DROP COLUMN "owner_ship_id";
@@ -0,0 +1,2 @@
1
+ -- A call fails at the deadline its capability states, and never by time when it states none (interop 3.4).
2
+ ALTER TABLE "client_calls" ALTER COLUMN "deadline_at" DROP NOT NULL;
@@ -80,7 +80,6 @@ model Party {
80
80
  concurrencyLimit Int? @map("concurrency_limit")
81
81
  /// An MCP client's: its OAuth client id.
82
82
  clientId String? @map("client_id")
83
- ownerShipId String @map("owner_ship_id")
84
83
  state String
85
84
  proxyShipId String? @map("proxy_ship_id")
86
85
  /// Kept only from the proxy ship's commission until the gateway crews it.
@@ -182,7 +181,7 @@ model ClientCall {
182
181
  capability String
183
182
  outputContentType String? @map("output_content_type")
184
183
  sentAt DateTime @map("sent_at")
185
- deadlineAt DateTime @map("deadline_at")
184
+ deadlineAt DateTime? @map("deadline_at")
186
185
 
187
186
  @@id([fleetId, messageId])
188
187
  @@unique([fleetId, handle])
@@ -211,6 +210,8 @@ model AccountGrant {
211
210
  fleetId String @map("fleet_id")
212
211
  accountId String @map("account_id")
213
212
  personShipId String? @map("person_ship_id")
213
+ /// The scopes its account token carries.
214
+ scopes String[] @default([])
214
215
  /// pagasae's refresh token, kept as crew tokens are.
215
216
  refreshToken String @map("refresh_token")
216
217
  accountToken String @map("account_token")