@aeolus-fleet/gateway 0.0.0 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) 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/oauth-routes.d.ts +15 -3
  38. package/dist/adapters/http/oauth-routes.js +33 -1
  39. package/dist/adapters/http/oauth-routes.js.map +1 -1
  40. package/dist/adapters/http/outside-parties-page.d.ts +29 -2
  41. package/dist/adapters/http/outside-parties-page.js +15 -11
  42. package/dist/adapters/http/outside-parties-page.js.map +1 -1
  43. package/dist/adapters/http/outside-party-page.d.ts +7 -0
  44. package/dist/adapters/http/outside-party-page.js +212 -0
  45. package/dist/adapters/http/outside-party-page.js.map +1 -0
  46. package/dist/adapters/http/overview-page.d.ts +2 -1
  47. package/dist/adapters/http/overview-page.js +79 -36
  48. package/dist/adapters/http/overview-page.js.map +1 -1
  49. package/dist/adapters/http/parties-page.d.ts +2 -1
  50. package/dist/adapters/http/parties-page.js +8 -10
  51. package/dist/adapters/http/parties-page.js.map +1 -1
  52. package/dist/adapters/http/scope-rows.d.ts +10 -0
  53. package/dist/adapters/http/scope-rows.js +30 -0
  54. package/dist/adapters/http/scope-rows.js.map +1 -0
  55. package/dist/adapters/http/signal.d.ts +10 -1
  56. package/dist/adapters/http/signal.js +50 -7
  57. package/dist/adapters/http/signal.js.map +1 -1
  58. package/dist/adapters/pagasae/pagasae-client.js +7 -9
  59. package/dist/adapters/pagasae/pagasae-client.js.map +1 -1
  60. package/dist/adapters/prisma/account-grants.js +2 -2
  61. package/dist/adapters/prisma/account-grants.js.map +1 -1
  62. package/dist/adapters/prisma/client-calls.js +9 -0
  63. package/dist/adapters/prisma/client-calls.js.map +1 -1
  64. package/dist/adapters/prisma/generated/internal/class.js +4 -4
  65. package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
  66. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +1 -1
  67. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +1 -1
  68. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
  69. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -1
  70. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +1 -1
  71. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  72. package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +33 -1
  73. package/dist/adapters/prisma/generated/models/ClientCall.d.ts +14 -14
  74. package/dist/adapters/prisma/generated/models/Party.d.ts +1 -29
  75. package/dist/adapters/prisma/oauth-stores.js +3 -0
  76. package/dist/adapters/prisma/oauth-stores.js.map +1 -1
  77. package/dist/adapters/prisma/party-store.js +0 -2
  78. package/dist/adapters/prisma/party-store.js.map +1 -1
  79. package/dist/adapters/prisma/pending-requests.js +7 -1
  80. package/dist/adapters/prisma/pending-requests.js.map +1 -1
  81. package/dist/adapters/trpc/router.d.ts +210 -12
  82. package/dist/adapters/trpc/router.js +159 -7
  83. package/dist/adapters/trpc/router.js.map +1 -1
  84. package/dist/app.js +65 -19
  85. package/dist/app.js.map +1 -1
  86. package/dist/core/actors/authenticate-actor.d.ts +21 -5
  87. package/dist/core/actors/authenticate-actor.js +14 -2
  88. package/dist/core/actors/authenticate-actor.js.map +1 -1
  89. package/dist/core/actors/credential-of.d.ts +27 -0
  90. package/dist/core/actors/credential-of.js +25 -0
  91. package/dist/core/actors/credential-of.js.map +1 -0
  92. package/dist/core/connection/connect.js +5 -4
  93. package/dist/core/connection/connect.js.map +1 -1
  94. package/dist/core/connection/ports.d.ts +6 -1
  95. package/dist/core/mcp-in/call-tool.d.ts +6 -6
  96. package/dist/core/mcp-in/call-tool.js +3 -3
  97. package/dist/core/mcp-in/call-tool.js.map +1 -1
  98. package/dist/core/mcp-in/client-call.d.ts +2 -2
  99. package/dist/core/mcp-in/client-call.js +2 -2
  100. package/dist/core/mcp-in/client-call.js.map +1 -1
  101. package/dist/core/mcp-in/collect-replies.d.ts +4 -11
  102. package/dist/core/mcp-in/collect-replies.js +52 -30
  103. package/dist/core/mcp-in/collect-replies.js.map +1 -1
  104. package/dist/core/mcp-in/list-tools.d.ts +4 -0
  105. package/dist/core/mcp-in/list-tools.js +1 -1
  106. package/dist/core/mcp-in/list-tools.js.map +1 -1
  107. package/dist/core/mcp-in/ports.d.ts +24 -1
  108. package/dist/core/mcp-out/hand-call.d.ts +2 -0
  109. package/dist/core/mcp-out/hand-call.js +4 -2
  110. package/dist/core/mcp-out/hand-call.js.map +1 -1
  111. package/dist/core/mcp-out/state-party.d.ts +2 -1
  112. package/dist/core/mcp-out/state-party.js +1 -1
  113. package/dist/core/mcp-out/state-party.js.map +1 -1
  114. package/dist/core/mcp-out/statement.d.ts +10 -0
  115. package/dist/core/mcp-out/statement.js +7 -5
  116. package/dist/core/mcp-out/statement.js.map +1 -1
  117. package/dist/core/oauth/ports.d.ts +2 -0
  118. package/dist/core/outside-parties/ports.d.ts +1 -5
  119. package/dist/core/outside-parties/set-outside-parties.d.ts +5 -3
  120. package/dist/core/outside-parties/set-outside-parties.js +6 -2
  121. package/dist/core/outside-parties/set-outside-parties.js.map +1 -1
  122. package/dist/core/parties/approve-party.js +24 -8
  123. package/dist/core/parties/approve-party.js.map +1 -1
  124. package/dist/core/parties/change-party.d.ts +42 -0
  125. package/dist/core/parties/change-party.js +49 -0
  126. package/dist/core/parties/change-party.js.map +1 -0
  127. package/dist/core/parties/check-server.d.ts +24 -0
  128. package/dist/core/parties/check-server.js +21 -0
  129. package/dist/core/parties/check-server.js.map +1 -0
  130. package/dist/core/parties/list-parties.d.ts +28 -7
  131. package/dist/core/parties/list-parties.js +35 -4
  132. package/dist/core/parties/list-parties.js.map +1 -1
  133. package/dist/core/parties/party.d.ts +12 -6
  134. package/dist/core/parties/party.js +23 -1
  135. package/dist/core/parties/party.js.map +1 -1
  136. package/dist/core/parties/ports.d.ts +36 -1
  137. package/dist/core/parties/read-party-tools.d.ts +22 -0
  138. package/dist/core/parties/read-party-tools.js +22 -0
  139. package/dist/core/parties/read-party-tools.js.map +1 -0
  140. package/dist/core/parties/retire-party.d.ts +29 -0
  141. package/dist/core/parties/retire-party.js +43 -0
  142. package/dist/core/parties/retire-party.js.map +1 -0
  143. package/dist/core/parties/shown-party.d.ts +8 -2
  144. package/dist/core/parties/shown-party.js +3 -3
  145. package/dist/core/parties/shown-party.js.map +1 -1
  146. package/dist/core/requests/decide-request.js +9 -1
  147. package/dist/core/requests/decide-request.js.map +1 -1
  148. package/dist/core/requests/list-mine.d.ts +16 -0
  149. package/dist/core/requests/list-mine.js +20 -0
  150. package/dist/core/requests/list-mine.js.map +1 -0
  151. package/dist/core/requests/ports.d.ts +5 -0
  152. package/dist/core/shared/errors.d.ts +1 -1
  153. package/dist/core/shared/errors.js.map +1 -1
  154. package/dist/core/sign-in/account-token.d.ts +8 -4
  155. package/dist/core/sign-in/account-token.js +4 -4
  156. package/dist/core/sign-in/account-token.js.map +1 -1
  157. package/dist/core/sign-in/complete-sign-in.d.ts +15 -4
  158. package/dist/core/sign-in/complete-sign-in.js +27 -4
  159. package/dist/core/sign-in/complete-sign-in.js.map +1 -1
  160. package/dist/core/sign-in/ports.d.ts +37 -7
  161. package/dist/core/sign-in/sign-out.d.ts +10 -0
  162. package/dist/core/sign-in/sign-out.js +9 -0
  163. package/dist/core/sign-in/sign-out.js.map +1 -0
  164. package/dist/core/sign-in/start-page-sign-in.d.ts +25 -0
  165. package/dist/core/sign-in/start-page-sign-in.js +30 -0
  166. package/dist/core/sign-in/start-page-sign-in.js.map +1 -0
  167. package/package.json +3 -3
  168. package/src/adapters/prisma/migrations/20261020200000_account_grant_scopes/migration.sql +2 -0
  169. package/src/adapters/prisma/migrations/20261020210000_party_owner_from_fleet/migration.sql +2 -0
  170. package/src/adapters/prisma/migrations/20261020220000_client_call_deadline_optional/migration.sql +2 -0
  171. package/src/adapters/prisma/schema.prisma +3 -2
@@ -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 isOpen = await deps.network.isOpen(as);
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":"AAEA,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,IAA6E;IACnH,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,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7C,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
+ {"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
- const crewed = async (party) => {
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 ok(shownPartyOf(done));
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 ok(shownPartyOf(party));
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: party.ownerShipId, idempotencyKey: party.requestId, scopes: approval.scopes });
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
- party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpServer', url, credential, ownerShipId, concurrencyLimit, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
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
- party: ({ approvedAt }) => ({ fleetId, name, kind: 'mcpClient', clientId, ownerShipId, ...UNCOMMISSIONED, requestId, requestHash, approvedAt }),
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":"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"}
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 { FleetId } from '@aeolus-fleet/common';
2
- import { type ShownParty } from './shown-party.js';
3
- import type { PartyStore } from './ports.js';
4
- export type ListParties = (fleetId: FleetId) => Promise<ShownParty[]>;
5
- /** Use case: the parties argo approved for its fleet, by name, as argo reads them: never a credential or a crew token. */
6
- export declare function createListParties(deps: {
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
- }): ListParties;
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
- /** Use case: the parties argo approved for its fleet, by name, as argo reads them: never a credential or a crew token. */
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 (fleetId) => (await deps.parties.list(fleetId))
5
- .map(shownPartyOf)
6
- .sort((left, right) => left.name.localeCompare(right.name));
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,EAAmB,MAAM,kBAAkB,CAAC;AAKjE,0HAA0H;AAC1H,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CACvB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC/B,GAAG,CAAC,YAAY,CAAC;SACjB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,CAAC"}
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), owned by the
12
- * person inside who answers for it (0045), crewed by the gateway. Known by
13
- * its ship's name, unique in the fleet.
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
- export {};
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"}
@@ -1,4 +1,5 @@
1
- import type { FleetId, ShipId } from '@aeolus-fleet/common';
1
+ import type { FleetId, ShipId, VerifiedFact } 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
  import type { Party } from './party.js';
@@ -36,4 +37,38 @@ export interface ProxyShipDoor {
36
37
  }): Promise<Result<{
37
38
  crewToken: string;
38
39
  }, FleetRefusal>>;
40
+ /** Sets the gateway's facts about the proxy ship whole (fleet.setVerifiedFacts, fleet:verify, decision 0059). */
41
+ setVerifiedFacts(crewToken: string, written: {
42
+ shipId: ShipId;
43
+ facts: readonly VerifiedFact[];
44
+ }): Promise<Result<undefined, FleetRefusal>>;
45
+ }
46
+ /** Outbound port: the fleet's calls on a party's proxy ship made as the actor (decision 0057), so the fleet checks its scopes and reach. */
47
+ export interface ProxyShipsAsActor {
48
+ /** Retires the proxy ship (fleet.retire); a ship retired already is refused with CONFLICT. */
49
+ retire(as: ActorCredential, ship: {
50
+ shipId: ShipId;
51
+ }): Promise<Result<undefined, FleetRefusal>>;
52
+ /** Sets the proxy ship's owner (fleet.setOwner, fleet:owner). */
53
+ setOwner(as: ActorCredential, ship: {
54
+ shipId: ShipId;
55
+ ownerShipId: ShipId;
56
+ }): Promise<Result<undefined, FleetRefusal>>;
57
+ /** Grants and revokes the proxy ship's scopes (fleet.grantScopes, scopes:grant): every scope it holds now. */
58
+ grantScopes(as: ActorCredential, change: {
59
+ shipId: ShipId;
60
+ grant: readonly string[];
61
+ revoke: readonly string[];
62
+ }): Promise<Result<{
63
+ scopes: string[];
64
+ }, FleetRefusal>>;
65
+ }
66
+ /** Outbound port: what the fleet holds for a proxy ship, read as the actor (fleet:read): its owner and scopes, neither outside the actor's read reach. */
67
+ export interface ProxyShipReads {
68
+ read(as: ActorCredential, ship: {
69
+ shipId: ShipId;
70
+ }): Promise<Result<{
71
+ ownerShipId: ShipId | null;
72
+ scopes: string[] | null;
73
+ }, FleetRefusal>>;
39
74
  }
@@ -0,0 +1,22 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { McpServers } from '../mcp-out/ports.js';
3
+ import { type DomainError } from '../shared/errors.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { CheckedTool } from './check-server.js';
6
+ import type { PartyStore } from './ports.js';
7
+ export type ReadPartyTools = (party: {
8
+ fleetId: FleetId;
9
+ name: string;
10
+ }) => Promise<Result<{
11
+ tools: CheckedTool[];
12
+ }, DomainError<'NO_SUCH_PARTY' | 'SERVER_UNREACHABLE'>>>;
13
+ /**
14
+ * Use case: an outside MCP server's tools, as the server lists them now,
15
+ * asked with the credential the gateway keeps for it. It keeps nothing:
16
+ * the proxy ship's statement in the fleet is where the tools live, and
17
+ * core does not answer a statement to a reader yet, so the server is asked.
18
+ */
19
+ export declare function createReadPartyTools(deps: {
20
+ parties: PartyStore;
21
+ servers: McpServers;
22
+ }): ReadPartyTools;
@@ -0,0 +1,22 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /**
4
+ * Use case: an outside MCP server's tools, as the server lists them now,
5
+ * asked with the credential the gateway keeps for it. It keeps nothing:
6
+ * the proxy ship's statement in the fleet is where the tools live, and
7
+ * core does not answer a statement to a reader yet, so the server is asked.
8
+ */
9
+ export function createReadPartyTools(deps) {
10
+ return async ({ fleetId, name }) => {
11
+ const party = await deps.parties.find(fleetId, name);
12
+ if (party?.kind !== 'mcpServer') {
13
+ return refuse('NO_SUCH_PARTY', `There is no outside MCP server ${name}`);
14
+ }
15
+ const listed = await deps.servers.listTools({ url: party.url, credential: party.credential });
16
+ if (!listed.isOk) {
17
+ return refuse('SERVER_UNREACHABLE', `The MCP server of ${name} could not be listed: ${listed.error.reason}`);
18
+ }
19
+ return ok({ tools: listed.value.map(({ name: tool, description }) => ({ name: tool, ...(description === undefined ? {} : { description }) })) });
20
+ };
21
+ }
22
+ //# sourceMappingURL=read-party-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-party-tools.js","sourceRoot":"","sources":["../../../src/core/parties/read-party-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAMtD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAkD;IACrF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC,eAAe,EAAE,kCAAkC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,IAAI,yBAAyB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,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;IACnJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Actor } from '../actors/authenticate-actor.js';
2
+ import type { ActorCredential, CredentialOf } from '../actors/credential-of.js';
3
+ import type { IssuedTokens } from '../oauth/ports.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { PartyStore, ProxyShipsAsActor } from './ports.js';
7
+ /** The scope that retires an outside party, as it retires any ship (decision 0056). */
8
+ export declare const RETIRING_SCOPE = "fleet:manage";
9
+ export type RetirePartyRefusal = DomainError<'NOT_A_MANAGER' | 'NO_SUCH_PARTY' | 'RETIRE_REFUSED' | 'FLEET_UNAVAILABLE' | 'NOT_AN_ACTOR'>;
10
+ export type RetireParty = (input: {
11
+ actor: Actor;
12
+ as: ActorCredential;
13
+ name: string;
14
+ }) => Promise<Result<undefined, RetirePartyRefusal>>;
15
+ /**
16
+ * Use case: an actor holding fleet:manage retires an outside party (decision
17
+ * 0056). Its proxy ship is retired in the fleet as the actor, so the fleet
18
+ * checks its manage reach, and only then does the gateway forget the party
19
+ * and revoke its client's tokens; its worker ends as the fleet ends the
20
+ * proxy ship's crew. A proxy ship retired already is retired. A party whose
21
+ * ship the gateway never learned asks the fleet nothing. Adding it again is
22
+ * a new request.
23
+ */
24
+ export declare function createRetireParty(deps: {
25
+ parties: PartyStore;
26
+ fleet: ProxyShipsAsActor;
27
+ tokens: Pick<IssuedTokens, 'revokeParty'>;
28
+ credentialOf: CredentialOf;
29
+ }): RetireParty;