@aeolus-fleet/gateway 0.0.0-stage → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +105 -2
  3. package/dist/adapters/crypto/call-keys.d.ts +7 -0
  4. package/dist/adapters/crypto/call-keys.js +18 -0
  5. package/dist/adapters/crypto/call-keys.js.map +1 -0
  6. package/dist/adapters/crypto/oauth-secrets.d.ts +3 -0
  7. package/dist/adapters/crypto/oauth-secrets.js +10 -0
  8. package/dist/adapters/crypto/oauth-secrets.js.map +1 -0
  9. package/dist/adapters/crypto/page-sessions.d.ts +15 -0
  10. package/dist/adapters/crypto/page-sessions.js +40 -0
  11. package/dist/adapters/crypto/page-sessions.js.map +1 -0
  12. package/dist/adapters/crypto/request-hasher.d.ts +3 -0
  13. package/dist/adapters/crypto/request-hasher.js +4 -0
  14. package/dist/adapters/crypto/request-hasher.js.map +1 -0
  15. package/dist/adapters/crypto/request-ids.d.ts +4 -0
  16. package/dist/adapters/crypto/request-ids.js +7 -0
  17. package/dist/adapters/crypto/request-ids.js.map +1 -0
  18. package/dist/adapters/crypto/sealer.d.ts +14 -0
  19. package/dist/adapters/crypto/sealer.js +41 -0
  20. package/dist/adapters/crypto/sealer.js.map +1 -0
  21. package/dist/adapters/crypto/ship-aliases.d.ts +7 -0
  22. package/dist/adapters/crypto/ship-aliases.js +19 -0
  23. package/dist/adapters/crypto/ship-aliases.js.map +1 -0
  24. package/dist/adapters/crypto/sign-in-seals.d.ts +7 -0
  25. package/dist/adapters/crypto/sign-in-seals.js +25 -0
  26. package/dist/adapters/crypto/sign-in-seals.js.map +1 -0
  27. package/dist/adapters/crypto/waiting-seals.d.ts +3 -0
  28. package/dist/adapters/crypto/waiting-seals.js +24 -0
  29. package/dist/adapters/crypto/waiting-seals.js.map +1 -0
  30. package/dist/adapters/fleet/actor-door.d.ts +20 -0
  31. package/dist/adapters/fleet/actor-door.js +75 -0
  32. package/dist/adapters/fleet/actor-door.js.map +1 -0
  33. package/dist/adapters/fleet/console-sessions.d.ts +2 -0
  34. package/dist/adapters/fleet/console-sessions.js +23 -0
  35. package/dist/adapters/fleet/console-sessions.js.map +1 -0
  36. package/dist/adapters/fleet/core-version.d.ts +11 -0
  37. package/dist/adapters/fleet/core-version.js +18 -0
  38. package/dist/adapters/fleet/core-version.js.map +1 -0
  39. package/dist/adapters/fleet/fleet-network.d.ts +2 -0
  40. package/dist/adapters/fleet/fleet-network.js +34 -0
  41. package/dist/adapters/fleet/fleet-network.js.map +1 -0
  42. package/dist/adapters/fleet/logged-verified-facts.d.ts +13 -0
  43. package/dist/adapters/fleet/logged-verified-facts.js +18 -0
  44. package/dist/adapters/fleet/logged-verified-facts.js.map +1 -0
  45. package/dist/adapters/fleet/proxy-ship-reads.d.ts +7 -0
  46. package/dist/adapters/fleet/proxy-ship-reads.js +24 -0
  47. package/dist/adapters/fleet/proxy-ship-reads.js.map +1 -0
  48. package/dist/adapters/fleet/proxy-ships-as-actor.d.ts +3 -0
  49. package/dist/adapters/fleet/proxy-ships-as-actor.js +25 -0
  50. package/dist/adapters/fleet/proxy-ships-as-actor.js.map +1 -0
  51. package/dist/adapters/fleet/rest-fleet-door.d.ts +14 -0
  52. package/dist/adapters/fleet/rest-fleet-door.js +205 -0
  53. package/dist/adapters/fleet/rest-fleet-door.js.map +1 -0
  54. package/dist/adapters/http/add-server-page.d.ts +7 -0
  55. package/dist/adapters/http/add-server-page.js +175 -0
  56. package/dist/adapters/http/add-server-page.js.map +1 -0
  57. package/dist/adapters/http/delivery-page.d.ts +24 -0
  58. package/dist/adapters/http/delivery-page.js +115 -0
  59. package/dist/adapters/http/delivery-page.js.map +1 -0
  60. package/dist/adapters/http/html.d.ts +15 -0
  61. package/dist/adapters/http/html.js +53 -0
  62. package/dist/adapters/http/html.js.map +1 -0
  63. package/dist/adapters/http/live.d.ts +29 -0
  64. package/dist/adapters/http/live.js +100 -0
  65. package/dist/adapters/http/live.js.map +1 -0
  66. package/dist/adapters/http/mcp-endpoint.d.ts +20 -0
  67. package/dist/adapters/http/mcp-endpoint.js +164 -0
  68. package/dist/adapters/http/mcp-endpoint.js.map +1 -0
  69. package/dist/adapters/http/mcp-task.d.ts +45 -0
  70. package/dist/adapters/http/mcp-task.js +35 -0
  71. package/dist/adapters/http/mcp-task.js.map +1 -0
  72. package/dist/adapters/http/oauth-routes.d.ts +47 -0
  73. package/dist/adapters/http/oauth-routes.js +337 -0
  74. package/dist/adapters/http/oauth-routes.js.map +1 -0
  75. package/dist/adapters/http/outside-parties-page.d.ts +33 -0
  76. package/dist/adapters/http/outside-parties-page.js +153 -0
  77. package/dist/adapters/http/outside-parties-page.js.map +1 -0
  78. package/dist/adapters/http/outside-party-page.d.ts +7 -0
  79. package/dist/adapters/http/outside-party-page.js +212 -0
  80. package/dist/adapters/http/outside-party-page.js.map +1 -0
  81. package/dist/adapters/http/overview-page.d.ts +17 -0
  82. package/dist/adapters/http/overview-page.js +298 -0
  83. package/dist/adapters/http/overview-page.js.map +1 -0
  84. package/dist/adapters/http/parties-page.d.ts +7 -0
  85. package/dist/adapters/http/parties-page.js +139 -0
  86. package/dist/adapters/http/parties-page.js.map +1 -0
  87. package/dist/adapters/http/person-tools.d.ts +22 -0
  88. package/dist/adapters/http/person-tools.js +98 -0
  89. package/dist/adapters/http/person-tools.js.map +1 -0
  90. package/dist/adapters/http/scope-rows.d.ts +10 -0
  91. package/dist/adapters/http/scope-rows.js +30 -0
  92. package/dist/adapters/http/scope-rows.js.map +1 -0
  93. package/dist/adapters/http/signal.d.ts +61 -0
  94. package/dist/adapters/http/signal.js +263 -0
  95. package/dist/adapters/http/signal.js.map +1 -0
  96. package/dist/adapters/http/version.d.ts +6 -0
  97. package/dist/adapters/http/version.js +12 -0
  98. package/dist/adapters/http/version.js.map +1 -0
  99. package/dist/adapters/mcp/mcp-servers.d.ts +2 -0
  100. package/dist/adapters/mcp/mcp-servers.js +154 -0
  101. package/dist/adapters/mcp/mcp-servers.js.map +1 -0
  102. package/dist/adapters/oauth/client-metadata-documents.d.ts +9 -0
  103. package/dist/adapters/oauth/client-metadata-documents.js +25 -0
  104. package/dist/adapters/oauth/client-metadata-documents.js.map +1 -0
  105. package/dist/adapters/pagasae/pagasae-client.d.ts +8 -0
  106. package/dist/adapters/pagasae/pagasae-client.js +88 -0
  107. package/dist/adapters/pagasae/pagasae-client.js.map +1 -0
  108. package/dist/adapters/prisma/account-grants.d.ts +4 -0
  109. package/dist/adapters/prisma/account-grants.js +27 -0
  110. package/dist/adapters/prisma/account-grants.js.map +1 -0
  111. package/dist/adapters/prisma/calls.d.ts +4 -0
  112. package/dist/adapters/prisma/calls.js +35 -0
  113. package/dist/adapters/prisma/calls.js.map +1 -0
  114. package/dist/adapters/prisma/changes.d.ts +21 -0
  115. package/dist/adapters/prisma/changes.js +86 -0
  116. package/dist/adapters/prisma/changes.js.map +1 -0
  117. package/dist/adapters/prisma/client-calls.d.ts +4 -0
  118. package/dist/adapters/prisma/client-calls.js +59 -0
  119. package/dist/adapters/prisma/client-calls.js.map +1 -0
  120. package/dist/adapters/prisma/client.d.ts +8 -0
  121. package/dist/adapters/prisma/client.js +11 -0
  122. package/dist/adapters/prisma/client.js.map +1 -0
  123. package/dist/adapters/prisma/connection-store.d.ts +4 -0
  124. package/dist/adapters/prisma/connection-store.js +28 -0
  125. package/dist/adapters/prisma/connection-store.js.map +1 -0
  126. package/dist/adapters/prisma/fleet-forgetter.d.ts +4 -0
  127. package/dist/adapters/prisma/fleet-forgetter.js +10 -0
  128. package/dist/adapters/prisma/fleet-forgetter.js.map +1 -0
  129. package/dist/adapters/prisma/fleet-switches.d.ts +4 -0
  130. package/dist/adapters/prisma/fleet-switches.js +10 -0
  131. package/dist/adapters/prisma/fleet-switches.js.map +1 -0
  132. package/dist/adapters/prisma/generated/browser.d.ts +108 -0
  133. package/dist/adapters/prisma/generated/browser.js +18 -0
  134. package/dist/adapters/prisma/generated/browser.js.map +1 -0
  135. package/dist/adapters/prisma/generated/client.d.ts +127 -0
  136. package/dist/adapters/prisma/generated/client.js +38 -0
  137. package/dist/adapters/prisma/generated/client.js.map +1 -0
  138. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +490 -0
  139. package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
  140. package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
  141. package/dist/adapters/prisma/generated/enums.d.ts +1 -0
  142. package/dist/adapters/prisma/generated/enums.js +12 -0
  143. package/dist/adapters/prisma/generated/enums.js.map +1 -0
  144. package/dist/adapters/prisma/generated/internal/class.d.ts +319 -0
  145. package/dist/adapters/prisma/generated/internal/class.js +50 -0
  146. package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
  147. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2102 -0
  148. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +294 -0
  149. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
  150. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
  151. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +264 -0
  152. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  153. package/dist/adapters/prisma/generated/models/AccountGrant.d.ts +1088 -0
  154. package/dist/adapters/prisma/generated/models/AccountGrant.js +2 -0
  155. package/dist/adapters/prisma/generated/models/AccountGrant.js.map +1 -0
  156. package/dist/adapters/prisma/generated/models/AuthorizationCode.d.ts +1171 -0
  157. package/dist/adapters/prisma/generated/models/AuthorizationCode.js +2 -0
  158. package/dist/adapters/prisma/generated/models/AuthorizationCode.js.map +1 -0
  159. package/dist/adapters/prisma/generated/models/Call.d.ts +994 -0
  160. package/dist/adapters/prisma/generated/models/Call.js +2 -0
  161. package/dist/adapters/prisma/generated/models/Call.js.map +1 -0
  162. package/dist/adapters/prisma/generated/models/ClientCall.d.ts +1119 -0
  163. package/dist/adapters/prisma/generated/models/ClientCall.js +2 -0
  164. package/dist/adapters/prisma/generated/models/ClientCall.js.map +1 -0
  165. package/dist/adapters/prisma/generated/models/ClientCallReply.d.ts +1129 -0
  166. package/dist/adapters/prisma/generated/models/ClientCallReply.js +2 -0
  167. package/dist/adapters/prisma/generated/models/ClientCallReply.js.map +1 -0
  168. package/dist/adapters/prisma/generated/models/Connection.d.ts +1011 -0
  169. package/dist/adapters/prisma/generated/models/Connection.js +2 -0
  170. package/dist/adapters/prisma/generated/models/Connection.js.map +1 -0
  171. package/dist/adapters/prisma/generated/models/FleetSwitch.d.ts +945 -0
  172. package/dist/adapters/prisma/generated/models/FleetSwitch.js +2 -0
  173. package/dist/adapters/prisma/generated/models/FleetSwitch.js.map +1 -0
  174. package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1030 -0
  175. package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
  176. package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
  177. package/dist/adapters/prisma/generated/models/IssuedToken.d.ts +1224 -0
  178. package/dist/adapters/prisma/generated/models/IssuedToken.js +2 -0
  179. package/dist/adapters/prisma/generated/models/IssuedToken.js.map +1 -0
  180. package/dist/adapters/prisma/generated/models/OAuthClient.d.ts +1005 -0
  181. package/dist/adapters/prisma/generated/models/OAuthClient.js +2 -0
  182. package/dist/adapters/prisma/generated/models/OAuthClient.js.map +1 -0
  183. package/dist/adapters/prisma/generated/models/OpenedDelivery.d.ts +1087 -0
  184. package/dist/adapters/prisma/generated/models/OpenedDelivery.js +2 -0
  185. package/dist/adapters/prisma/generated/models/OpenedDelivery.js.map +1 -0
  186. package/dist/adapters/prisma/generated/models/OutsidePartySwitch.d.ts +942 -0
  187. package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js +2 -0
  188. package/dist/adapters/prisma/generated/models/OutsidePartySwitch.js.map +1 -0
  189. package/dist/adapters/prisma/generated/models/OwnerQuestion.d.ts +1035 -0
  190. package/dist/adapters/prisma/generated/models/OwnerQuestion.js +2 -0
  191. package/dist/adapters/prisma/generated/models/OwnerQuestion.js.map +1 -0
  192. package/dist/adapters/prisma/generated/models/Party.d.ts +1310 -0
  193. package/dist/adapters/prisma/generated/models/Party.js +2 -0
  194. package/dist/adapters/prisma/generated/models/Party.js.map +1 -0
  195. package/dist/adapters/prisma/generated/models/PendingRequest.d.ts +1252 -0
  196. package/dist/adapters/prisma/generated/models/PendingRequest.js +2 -0
  197. package/dist/adapters/prisma/generated/models/PendingRequest.js.map +1 -0
  198. package/dist/adapters/prisma/generated/models/PersonCrew.d.ts +974 -0
  199. package/dist/adapters/prisma/generated/models/PersonCrew.js +2 -0
  200. package/dist/adapters/prisma/generated/models/PersonCrew.js.map +1 -0
  201. package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.d.ts +1120 -0
  202. package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js +2 -0
  203. package/dist/adapters/prisma/generated/models/RequestOutcomeNotice.js.map +1 -0
  204. package/dist/adapters/prisma/generated/models/ToolMark.d.ts +947 -0
  205. package/dist/adapters/prisma/generated/models/ToolMark.js +2 -0
  206. package/dist/adapters/prisma/generated/models/ToolMark.js.map +1 -0
  207. package/dist/adapters/prisma/generated/models.d.ts +19 -0
  208. package/dist/adapters/prisma/generated/models.js +2 -0
  209. package/dist/adapters/prisma/generated/models.js.map +1 -0
  210. package/dist/adapters/prisma/installation-requests.d.ts +4 -0
  211. package/dist/adapters/prisma/installation-requests.js +25 -0
  212. package/dist/adapters/prisma/installation-requests.js.map +1 -0
  213. package/dist/adapters/prisma/migrate.d.ts +5 -0
  214. package/dist/adapters/prisma/migrate.js +53 -0
  215. package/dist/adapters/prisma/migrate.js.map +1 -0
  216. package/dist/adapters/prisma/oauth-stores.d.ts +5 -0
  217. package/dist/adapters/prisma/oauth-stores.js +85 -0
  218. package/dist/adapters/prisma/oauth-stores.js.map +1 -0
  219. package/dist/adapters/prisma/opened-deliveries.d.ts +4 -0
  220. package/dist/adapters/prisma/opened-deliveries.js +29 -0
  221. package/dist/adapters/prisma/opened-deliveries.js.map +1 -0
  222. package/dist/adapters/prisma/outcome-notices.d.ts +4 -0
  223. package/dist/adapters/prisma/outcome-notices.js +24 -0
  224. package/dist/adapters/prisma/outcome-notices.js.map +1 -0
  225. package/dist/adapters/prisma/outside-party-switches.d.ts +4 -0
  226. package/dist/adapters/prisma/outside-party-switches.js +10 -0
  227. package/dist/adapters/prisma/outside-party-switches.js.map +1 -0
  228. package/dist/adapters/prisma/owner-questions.d.ts +8 -0
  229. package/dist/adapters/prisma/owner-questions.js +54 -0
  230. package/dist/adapters/prisma/owner-questions.js.map +1 -0
  231. package/dist/adapters/prisma/party-store.d.ts +7 -0
  232. package/dist/adapters/prisma/party-store.js +71 -0
  233. package/dist/adapters/prisma/party-store.js.map +1 -0
  234. package/dist/adapters/prisma/pending-requests.d.ts +11 -0
  235. package/dist/adapters/prisma/pending-requests.js +128 -0
  236. package/dist/adapters/prisma/pending-requests.js.map +1 -0
  237. package/dist/adapters/prisma/person-crews.d.ts +4 -0
  238. package/dist/adapters/prisma/person-crews.js +18 -0
  239. package/dist/adapters/prisma/person-crews.js.map +1 -0
  240. package/dist/adapters/prisma/tool-marks.d.ts +4 -0
  241. package/dist/adapters/prisma/tool-marks.js +15 -0
  242. package/dist/adapters/prisma/tool-marks.js.map +1 -0
  243. package/dist/adapters/timers/sleep.d.ts +3 -0
  244. package/dist/adapters/timers/sleep.js +11 -0
  245. package/dist/adapters/timers/sleep.js.map +1 -0
  246. package/dist/adapters/trpc/router.d.ts +606 -0
  247. package/dist/adapters/trpc/router.js +519 -0
  248. package/dist/adapters/trpc/router.js.map +1 -0
  249. package/dist/app.d.ts +43 -0
  250. package/dist/app.js +446 -0
  251. package/dist/app.js.map +1 -0
  252. package/dist/bin/aeolus-gateway.d.ts +2 -0
  253. package/dist/bin/aeolus-gateway.js +65 -0
  254. package/dist/bin/aeolus-gateway.js.map +1 -0
  255. package/dist/config.d.ts +41 -0
  256. package/dist/config.js +65 -0
  257. package/dist/config.js.map +1 -0
  258. package/dist/core/actors/authenticate-actor.d.ts +54 -0
  259. package/dist/core/actors/authenticate-actor.js +42 -0
  260. package/dist/core/actors/authenticate-actor.js.map +1 -0
  261. package/dist/core/actors/credential-of.d.ts +27 -0
  262. package/dist/core/actors/credential-of.js +25 -0
  263. package/dist/core/actors/credential-of.js.map +1 -0
  264. package/dist/core/connection/connect.d.ts +26 -0
  265. package/dist/core/connection/connect.js +58 -0
  266. package/dist/core/connection/connect.js.map +1 -0
  267. package/dist/core/connection/ports.d.ts +92 -0
  268. package/dist/core/connection/ports.js +2 -0
  269. package/dist/core/connection/ports.js.map +1 -0
  270. package/dist/core/connection/read-connection.d.ts +14 -0
  271. package/dist/core/connection/read-connection.js +24 -0
  272. package/dist/core/connection/read-connection.js.map +1 -0
  273. package/dist/core/installation/delete-fleet.d.ts +21 -0
  274. package/dist/core/installation/delete-fleet.js +21 -0
  275. package/dist/core/installation/delete-fleet.js.map +1 -0
  276. package/dist/core/installation/ports.d.ts +43 -0
  277. package/dist/core/installation/ports.js +2 -0
  278. package/dist/core/installation/ports.js.map +1 -0
  279. package/dist/core/installation/read-fleet.d.ts +18 -0
  280. package/dist/core/installation/read-fleet.js +9 -0
  281. package/dist/core/installation/read-fleet.js.map +1 -0
  282. package/dist/core/installation/request-id.d.ts +8 -0
  283. package/dist/core/installation/request-id.js +10 -0
  284. package/dist/core/installation/request-id.js.map +1 -0
  285. package/dist/core/installation/served.d.ts +12 -0
  286. package/dist/core/installation/served.js +8 -0
  287. package/dist/core/installation/served.js.map +1 -0
  288. package/dist/core/installation/set-fleet-enabled.d.ts +25 -0
  289. package/dist/core/installation/set-fleet-enabled.js +22 -0
  290. package/dist/core/installation/set-fleet-enabled.js.map +1 -0
  291. package/dist/core/mcp-in/call-tool.d.ts +42 -0
  292. package/dist/core/mcp-in/call-tool.js +82 -0
  293. package/dist/core/mcp-in/call-tool.js.map +1 -0
  294. package/dist/core/mcp-in/client-call.d.ts +51 -0
  295. package/dist/core/mcp-in/client-call.js +39 -0
  296. package/dist/core/mcp-in/client-call.js.map +1 -0
  297. package/dist/core/mcp-in/collect-replies.d.ts +22 -0
  298. package/dist/core/mcp-in/collect-replies.js +66 -0
  299. package/dist/core/mcp-in/collect-replies.js.map +1 -0
  300. package/dist/core/mcp-in/list-tools.d.ts +48 -0
  301. package/dist/core/mcp-in/list-tools.js +70 -0
  302. package/dist/core/mcp-in/list-tools.js.map +1 -0
  303. package/dist/core/mcp-in/ports.d.ts +108 -0
  304. package/dist/core/mcp-in/ports.js +2 -0
  305. package/dist/core/mcp-in/ports.js.map +1 -0
  306. package/dist/core/mcp-in/read-client-call.d.ts +23 -0
  307. package/dist/core/mcp-in/read-client-call.js +15 -0
  308. package/dist/core/mcp-in/read-client-call.js.map +1 -0
  309. package/dist/core/mcp-out/content-types.d.ts +12 -0
  310. package/dist/core/mcp-out/content-types.js +28 -0
  311. package/dist/core/mcp-out/content-types.js.map +1 -0
  312. package/dist/core/mcp-out/hand-call.d.ts +105 -0
  313. package/dist/core/mcp-out/hand-call.js +118 -0
  314. package/dist/core/mcp-out/hand-call.js.map +1 -0
  315. package/dist/core/mcp-out/mark-tool.d.ts +20 -0
  316. package/dist/core/mcp-out/mark-tool.js +17 -0
  317. package/dist/core/mcp-out/mark-tool.js.map +1 -0
  318. package/dist/core/mcp-out/ports.d.ts +66 -0
  319. package/dist/core/mcp-out/ports.js +2 -0
  320. package/dist/core/mcp-out/ports.js.map +1 -0
  321. package/dist/core/mcp-out/run-party.d.ts +26 -0
  322. package/dist/core/mcp-out/run-party.js +62 -0
  323. package/dist/core/mcp-out/run-party.js.map +1 -0
  324. package/dist/core/mcp-out/state-party.d.ts +39 -0
  325. package/dist/core/mcp-out/state-party.js +30 -0
  326. package/dist/core/mcp-out/state-party.js.map +1 -0
  327. package/dist/core/mcp-out/statement.d.ts +36 -0
  328. package/dist/core/mcp-out/statement.js +34 -0
  329. package/dist/core/mcp-out/statement.js.map +1 -0
  330. package/dist/core/oauth/authenticate-access-token.d.ts +25 -0
  331. package/dist/core/oauth/authenticate-access-token.js +19 -0
  332. package/dist/core/oauth/authenticate-access-token.js.map +1 -0
  333. package/dist/core/oauth/exchange-token.d.ts +32 -0
  334. package/dist/core/oauth/exchange-token.js +98 -0
  335. package/dist/core/oauth/exchange-token.js.map +1 -0
  336. package/dist/core/oauth/issue-code.d.ts +23 -0
  337. package/dist/core/oauth/issue-code.js +34 -0
  338. package/dist/core/oauth/issue-code.js.map +1 -0
  339. package/dist/core/oauth/ports.d.ts +105 -0
  340. package/dist/core/oauth/ports.js +2 -0
  341. package/dist/core/oauth/ports.js.map +1 -0
  342. package/dist/core/oauth/read-authorization.d.ts +43 -0
  343. package/dist/core/oauth/read-authorization.js +74 -0
  344. package/dist/core/oauth/read-authorization.js.map +1 -0
  345. package/dist/core/oauth/redirect-uri.d.ts +6 -0
  346. package/dist/core/oauth/redirect-uri.js +20 -0
  347. package/dist/core/oauth/redirect-uri.js.map +1 -0
  348. package/dist/core/oauth/register-client.d.ts +22 -0
  349. package/dist/core/oauth/register-client.js +20 -0
  350. package/dist/core/oauth/register-client.js.map +1 -0
  351. package/dist/core/operator/authenticate-operator.d.ts +22 -0
  352. package/dist/core/operator/authenticate-operator.js +26 -0
  353. package/dist/core/operator/authenticate-operator.js.map +1 -0
  354. package/dist/core/operator/ports.d.ts +15 -0
  355. package/dist/core/operator/ports.js +2 -0
  356. package/dist/core/operator/ports.js.map +1 -0
  357. package/dist/core/outside-parties/ports.d.ts +17 -0
  358. package/dist/core/outside-parties/ports.js +2 -0
  359. package/dist/core/outside-parties/ports.js.map +1 -0
  360. package/dist/core/outside-parties/set-outside-parties.d.ts +36 -0
  361. package/dist/core/outside-parties/set-outside-parties.js +38 -0
  362. package/dist/core/outside-parties/set-outside-parties.js.map +1 -0
  363. package/dist/core/parties/approve-party.d.ts +55 -0
  364. package/dist/core/parties/approve-party.js +127 -0
  365. package/dist/core/parties/approve-party.js.map +1 -0
  366. package/dist/core/parties/change-party.d.ts +42 -0
  367. package/dist/core/parties/change-party.js +49 -0
  368. package/dist/core/parties/change-party.js.map +1 -0
  369. package/dist/core/parties/check-server.d.ts +24 -0
  370. package/dist/core/parties/check-server.js +21 -0
  371. package/dist/core/parties/check-server.js.map +1 -0
  372. package/dist/core/parties/crew-party.d.ts +21 -0
  373. package/dist/core/parties/crew-party.js +29 -0
  374. package/dist/core/parties/crew-party.js.map +1 -0
  375. package/dist/core/parties/list-parties.d.ts +29 -0
  376. package/dist/core/parties/list-parties.js +39 -0
  377. package/dist/core/parties/list-parties.js.map +1 -0
  378. package/dist/core/parties/party.d.ts +52 -0
  379. package/dist/core/parties/party.js +24 -0
  380. package/dist/core/parties/party.js.map +1 -0
  381. package/dist/core/parties/ports.d.ts +74 -0
  382. package/dist/core/parties/ports.js +2 -0
  383. package/dist/core/parties/ports.js.map +1 -0
  384. package/dist/core/parties/read-party-tools.d.ts +22 -0
  385. package/dist/core/parties/read-party-tools.js +22 -0
  386. package/dist/core/parties/read-party-tools.js.map +1 -0
  387. package/dist/core/parties/retire-party.d.ts +29 -0
  388. package/dist/core/parties/retire-party.js +43 -0
  389. package/dist/core/parties/retire-party.js.map +1 -0
  390. package/dist/core/parties/shown-party.d.ts +27 -0
  391. package/dist/core/parties/shown-party.js +10 -0
  392. package/dist/core/parties/shown-party.js.map +1 -0
  393. package/dist/core/people/answer-delivery.d.ts +24 -0
  394. package/dist/core/people/answer-delivery.js +28 -0
  395. package/dist/core/people/answer-delivery.js.map +1 -0
  396. package/dist/core/people/crew-person-ship.d.ts +42 -0
  397. package/dist/core/people/crew-person-ship.js +59 -0
  398. package/dist/core/people/crew-person-ship.js.map +1 -0
  399. package/dist/core/people/done-delivery.d.ts +16 -0
  400. package/dist/core/people/done-delivery.js +9 -0
  401. package/dist/core/people/done-delivery.js.map +1 -0
  402. package/dist/core/people/inbox-entry.d.ts +14 -0
  403. package/dist/core/people/inbox-entry.js +11 -0
  404. package/dist/core/people/inbox-entry.js.map +1 -0
  405. package/dist/core/people/open-delivery.d.ts +30 -0
  406. package/dist/core/people/open-delivery.js +40 -0
  407. package/dist/core/people/open-delivery.js.map +1 -0
  408. package/dist/core/people/opened-of.d.ts +29 -0
  409. package/dist/core/people/opened-of.js +30 -0
  410. package/dist/core/people/opened-of.js.map +1 -0
  411. package/dist/core/people/person-crew.d.ts +39 -0
  412. package/dist/core/people/person-crew.js +61 -0
  413. package/dist/core/people/person-crew.js.map +1 -0
  414. package/dist/core/people/ports.d.ts +102 -0
  415. package/dist/core/people/ports.js +2 -0
  416. package/dist/core/people/ports.js.map +1 -0
  417. package/dist/core/people/read-inbox.d.ts +37 -0
  418. package/dist/core/people/read-inbox.js +36 -0
  419. package/dist/core/people/read-inbox.js.map +1 -0
  420. package/dist/core/requests/ask-for-client.d.ts +45 -0
  421. package/dist/core/requests/ask-for-client.js +33 -0
  422. package/dist/core/requests/ask-for-client.js.map +1 -0
  423. package/dist/core/requests/ask-for-server.d.ts +32 -0
  424. package/dist/core/requests/ask-for-server.js +42 -0
  425. package/dist/core/requests/ask-for-server.js.map +1 -0
  426. package/dist/core/requests/ask-owners.d.ts +28 -0
  427. package/dist/core/requests/ask-owners.js +85 -0
  428. package/dist/core/requests/ask-owners.js.map +1 -0
  429. package/dist/core/requests/decide-request.d.ts +53 -0
  430. package/dist/core/requests/decide-request.js +83 -0
  431. package/dist/core/requests/decide-request.js.map +1 -0
  432. package/dist/core/requests/expire-requests.d.ts +14 -0
  433. package/dist/core/requests/expire-requests.js +21 -0
  434. package/dist/core/requests/expire-requests.js.map +1 -0
  435. package/dist/core/requests/list-mine.d.ts +16 -0
  436. package/dist/core/requests/list-mine.js +20 -0
  437. package/dist/core/requests/list-mine.js.map +1 -0
  438. package/dist/core/requests/list-to-decide.d.ts +11 -0
  439. package/dist/core/requests/list-to-decide.js +13 -0
  440. package/dist/core/requests/list-to-decide.js.map +1 -0
  441. package/dist/core/requests/open-request.d.ts +21 -0
  442. package/dist/core/requests/open-request.js +26 -0
  443. package/dist/core/requests/open-request.js.map +1 -0
  444. package/dist/core/requests/outcome-notice.d.ts +13 -0
  445. package/dist/core/requests/outcome-notice.js +26 -0
  446. package/dist/core/requests/outcome-notice.js.map +1 -0
  447. package/dist/core/requests/ports.d.ts +191 -0
  448. package/dist/core/requests/ports.js +2 -0
  449. package/dist/core/requests/ports.js.map +1 -0
  450. package/dist/core/requests/read-waiting.d.ts +46 -0
  451. package/dist/core/requests/read-waiting.js +41 -0
  452. package/dist/core/requests/read-waiting.js.map +1 -0
  453. package/dist/core/requests/request-state.d.ts +5 -0
  454. package/dist/core/requests/request-state.js +10 -0
  455. package/dist/core/requests/request-state.js.map +1 -0
  456. package/dist/core/requests/tell-outcomes.d.ts +24 -0
  457. package/dist/core/requests/tell-outcomes.js +39 -0
  458. package/dist/core/requests/tell-outcomes.js.map +1 -0
  459. package/dist/core/requests/watch-waiting.d.ts +32 -0
  460. package/dist/core/requests/watch-waiting.js +31 -0
  461. package/dist/core/requests/watch-waiting.js.map +1 -0
  462. package/dist/core/shared/clock.d.ts +4 -0
  463. package/dist/core/shared/clock.js +2 -0
  464. package/dist/core/shared/clock.js.map +1 -0
  465. package/dist/core/shared/errors.d.ts +10 -0
  466. package/dist/core/shared/errors.js +6 -0
  467. package/dist/core/shared/errors.js.map +1 -0
  468. package/dist/core/shared/result.d.ts +16 -0
  469. package/dist/core/shared/result.js +7 -0
  470. package/dist/core/shared/result.js.map +1 -0
  471. package/dist/core/sign-in/account-token.d.ts +42 -0
  472. package/dist/core/sign-in/account-token.js +46 -0
  473. package/dist/core/sign-in/account-token.js.map +1 -0
  474. package/dist/core/sign-in/complete-sign-in.d.ts +66 -0
  475. package/dist/core/sign-in/complete-sign-in.js +73 -0
  476. package/dist/core/sign-in/complete-sign-in.js.map +1 -0
  477. package/dist/core/sign-in/end-sign-ins.d.ts +19 -0
  478. package/dist/core/sign-in/end-sign-ins.js +17 -0
  479. package/dist/core/sign-in/end-sign-ins.js.map +1 -0
  480. package/dist/core/sign-in/ports.d.ts +115 -0
  481. package/dist/core/sign-in/ports.js +2 -0
  482. package/dist/core/sign-in/ports.js.map +1 -0
  483. package/dist/core/sign-in/sign-out.d.ts +10 -0
  484. package/dist/core/sign-in/sign-out.js +9 -0
  485. package/dist/core/sign-in/sign-out.js.map +1 -0
  486. package/dist/core/sign-in/start-page-sign-in.d.ts +25 -0
  487. package/dist/core/sign-in/start-page-sign-in.js +30 -0
  488. package/dist/core/sign-in/start-page-sign-in.js.map +1 -0
  489. package/dist/core/sign-in/start-sign-in.d.ts +30 -0
  490. package/dist/core/sign-in/start-sign-in.js +25 -0
  491. package/dist/core/sign-in/start-sign-in.js.map +1 -0
  492. package/dist/core/vault/credential.d.ts +18 -0
  493. package/dist/core/vault/credential.js +2 -0
  494. package/dist/core/vault/credential.js.map +1 -0
  495. package/dist/outcome-worker.d.ts +29 -0
  496. package/dist/outcome-worker.js +60 -0
  497. package/dist/outcome-worker.js.map +1 -0
  498. package/dist/party-workers.d.ts +32 -0
  499. package/dist/party-workers.js +57 -0
  500. package/dist/party-workers.js.map +1 -0
  501. package/package.json +70 -4
  502. package/prisma.config.ts +18 -0
  503. package/src/adapters/prisma/migrations/20261018200000_init/migration.sql +35 -0
  504. package/src/adapters/prisma/migrations/20261018210000_parties/migration.sql +19 -0
  505. package/src/adapters/prisma/migrations/20261018220000_tool_marks/migration.sql +8 -0
  506. package/src/adapters/prisma/migrations/20261018230000_calls/migration.sql +13 -0
  507. package/src/adapters/prisma/migrations/20261019090000_oauth/migration.sql +60 -0
  508. package/src/adapters/prisma/migrations/20261019100000_client_parties/migration.sql +8 -0
  509. package/src/adapters/prisma/migrations/20261019110000_oauth_parties/migration.sql +5 -0
  510. package/src/adapters/prisma/migrations/20261019120000_client_calls/migration.sql +15 -0
  511. package/src/adapters/prisma/migrations/20261019130000_client_call_replies/migration.sql +20 -0
  512. package/src/adapters/prisma/migrations/20261019140000_identity_providers/migration.sql +10 -0
  513. package/src/adapters/prisma/migrations/20261020090000_no_identity_providers/migration.sql +2 -0
  514. package/src/adapters/prisma/migrations/20261020100000_account_grants_in_tokens/migration.sql +5 -0
  515. package/src/adapters/prisma/migrations/20261020110000_account_grants/migration.sql +15 -0
  516. package/src/adapters/prisma/migrations/20261020120000_person_crews/migration.sql +9 -0
  517. package/src/adapters/prisma/migrations/20261020130000_opened_deliveries/migration.sql +13 -0
  518. package/src/adapters/prisma/migrations/20261020140000_pending_requests/migration.sql +26 -0
  519. package/src/adapters/prisma/migrations/20261020150000_outside_party_switches/migration.sql +8 -0
  520. package/src/adapters/prisma/migrations/20261020160000_pending_requests_told/migration.sql +2 -0
  521. package/src/adapters/prisma/migrations/20261020170000_request_outcome_notices/migration.sql +17 -0
  522. package/src/adapters/prisma/migrations/20261020180000_owner_questions/migration.sql +11 -0
  523. package/src/adapters/prisma/migrations/20261020190000_request_changes/migration.sql +12 -0
  524. package/src/adapters/prisma/migrations/20261020200000_account_grant_scopes/migration.sql +2 -0
  525. package/src/adapters/prisma/migrations/20261020210000_party_owner_from_fleet/migration.sql +2 -0
  526. package/src/adapters/prisma/migrations/20261020220000_client_call_deadline_optional/migration.sql +2 -0
  527. package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
  528. package/src/adapters/prisma/schema.prisma +312 -0
package/dist/config.js ADDED
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ /** The shortest installation token the gateway takes, as the server does (decision 0020). */
3
+ const INSTALLATION_TOKEN_MIN_LENGTH = 32;
4
+ /** The shortest gateway secret: 32 characters, as long as the HMAC keys it makes. */
5
+ const GATEWAY_SECRET_MIN_LENGTH = 32;
6
+ /** How long an MCP client's call waits for its answer unless set (Q13). */
7
+ const MCP_WAIT_MAX_MS_DEFAULT = 10_000;
8
+ const environmentSchema = z.object({
9
+ DATABASE_URL: z.url({ protocol: /^postgres(ql)?$/, error: 'must be a postgres:// or postgresql:// URL' }),
10
+ FLEET_URL: z.url({ protocol: /^https?$/, error: 'must be an http:// or https:// URL' }),
11
+ GATEWAY_SECRET: z.string().min(GATEWAY_SECRET_MIN_LENGTH, { error: `must hold at least ${String(GATEWAY_SECRET_MIN_LENGTH)} characters` }),
12
+ HOST: z.string().min(1).default('127.0.0.1'),
13
+ PORT: z.coerce.number().int().min(0).max(65_535).default(4200),
14
+ LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent']).default('info'),
15
+ GATEWAY_PUBLIC_URL: z.url({ protocol: /^https?$/, error: 'must be an http:// or https:// URL' }).optional(),
16
+ MCP_WAIT_MAX_MS: z.coerce.number().int().min(0).default(MCP_WAIT_MAX_MS_DEFAULT),
17
+ INSTALLATION_TOKEN: z.string().min(INSTALLATION_TOKEN_MIN_LENGTH, { error: `must hold at least ${String(INSTALLATION_TOKEN_MIN_LENGTH)} characters` }).optional(),
18
+ PAGASAE_URL: z.url({ protocol: /^https?$/, error: 'must be an http:// or https:// URL' }).optional(),
19
+ PAGASAE_CLIENT_ID: z.string().min(1).optional(),
20
+ PAGASAE_CLIENT_SECRET: z.string().min(1).optional(),
21
+ });
22
+ /** What `aeolus-gateway migrate` reads: the database alone. */
23
+ const databaseEnvironmentSchema = environmentSchema.pick({ DATABASE_URL: true });
24
+ export class ConfigError extends Error {
25
+ name = 'ConfigError';
26
+ }
27
+ function parsed(schema, environment) {
28
+ const result = schema.safeParse(environment);
29
+ if (!result.success) {
30
+ throw new ConfigError(result.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join('\n'));
31
+ }
32
+ return result.data;
33
+ }
34
+ /** The configuration from the environment; throws a ConfigError naming every variable that is wrong. */
35
+ export function loadConfig(environment) {
36
+ const variables = parsed(environmentSchema, environment);
37
+ return {
38
+ databaseUrl: variables.DATABASE_URL,
39
+ fleetUrl: variables.FLEET_URL.replace(/\/$/, ''),
40
+ host: variables.HOST,
41
+ port: variables.PORT,
42
+ logLevel: variables.LOG_LEVEL,
43
+ installationToken: variables.INSTALLATION_TOKEN,
44
+ publicUrl: (variables.GATEWAY_PUBLIC_URL ?? `http://127.0.0.1:${String(variables.PORT)}`).replace(/\/$/, ''),
45
+ gatewaySecret: variables.GATEWAY_SECRET,
46
+ mcpWaitMaxMs: variables.MCP_WAIT_MAX_MS,
47
+ pagasae: pagasaeOf(variables),
48
+ };
49
+ }
50
+ /** pagasae's three settings: all of them, or none. */
51
+ function pagasaeOf(variables) {
52
+ const { PAGASAE_URL: url, PAGASAE_CLIENT_ID: clientId, PAGASAE_CLIENT_SECRET: clientSecret } = variables;
53
+ if (url === undefined && clientId === undefined && clientSecret === undefined) {
54
+ return undefined;
55
+ }
56
+ if (url === undefined || clientId === undefined || clientSecret === undefined) {
57
+ throw new ConfigError('PAGASAE_URL, PAGASAE_CLIENT_ID and PAGASAE_CLIENT_SECRET: set all three, or none');
58
+ }
59
+ return { url: url.replace(/\/$/, ''), clientId, clientSecret };
60
+ }
61
+ /** The database URL alone, for `aeolus-gateway migrate`. */
62
+ export function loadDatabaseUrl(environment) {
63
+ return parsed(databaseEnvironmentSchema, environment).DATABASE_URL;
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { FleetId, ShipId } from '@aeolus-fleet/common';
2
+ import type { ConnectionStore, FleetDoor } from '../connection/ports.js';
3
+ import type { AuthenticateOperator } from '../operator/authenticate-operator.js';
4
+ import type { AccountTokenOf } from '../sign-in/account-token.js';
5
+ import type { PageSessions } from '../sign-in/ports.js';
6
+ import { type DomainError } from '../shared/errors.js';
7
+ import { type Result } from '../shared/result.js';
8
+ /**
9
+ * Who calls the gateway's API (decision 0057): an account by the page
10
+ * session it signed in to the gateway's pages with, argo or a viewer by the
11
+ * console session, or a ship by its own crew token. Its scopes are the
12
+ * fleet's or its account token's, never the request's, plugin scopes such
13
+ * as gateway:approve among them.
14
+ */
15
+ export type Actor = {
16
+ readonly fleetId: FleetId;
17
+ readonly kind: 'operator' | 'viewer';
18
+ readonly scopes: readonly string[];
19
+ } | {
20
+ readonly fleetId: FleetId;
21
+ readonly kind: 'ship';
22
+ readonly shipId: ShipId;
23
+ readonly scopes: readonly string[];
24
+ } | AccountActor;
25
+ /** An account on the gateway's pages, with the grant whose account token it acts by in the fleet. */
26
+ export interface AccountActor {
27
+ readonly fleetId: FleetId;
28
+ readonly kind: 'account';
29
+ readonly accountId: string;
30
+ readonly personShipId: ShipId | null;
31
+ readonly grantId: string;
32
+ readonly scopes: readonly string[];
33
+ }
34
+ export type AuthenticateActor = (sent: {
35
+ cookie?: string | undefined;
36
+ crewToken?: string | undefined;
37
+ }) => Promise<Result<Actor, DomainError<'NOT_AN_ACTOR'>>>;
38
+ /**
39
+ * Use case: whom a call of the gateway's API is for. A crew token, sent
40
+ * deliberately, names its ship: the fleet says which ship it crews, and the
41
+ * gateway, as its own ship in that fleet, reads the ship's scopes. Else the
42
+ * console session cookie names argo or a viewer, as before. A ship of a
43
+ * fleet the gateway is not connected to is no actor here. The crew token is
44
+ * never kept. Else the gateway's own page session cookie names an account,
45
+ * with the scopes its account token carries, refreshed through pagasae when
46
+ * it is about to end; a session whose sign-in ended is no actor.
47
+ */
48
+ export declare function createAuthenticateActor(deps: {
49
+ authenticateOperator: AuthenticateOperator;
50
+ door: Pick<FleetDoor, 'whoami' | 'getShip'>;
51
+ connections: Pick<ConnectionStore, 'find'>;
52
+ sessions: PageSessions;
53
+ accountTokenOf: AccountTokenOf;
54
+ }): AuthenticateActor;
@@ -0,0 +1,42 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /**
4
+ * Use case: whom a call of the gateway's API is for. A crew token, sent
5
+ * deliberately, names its ship: the fleet says which ship it crews, and the
6
+ * gateway, as its own ship in that fleet, reads the ship's scopes. Else the
7
+ * console session cookie names argo or a viewer, as before. A ship of a
8
+ * fleet the gateway is not connected to is no actor here. The crew token is
9
+ * never kept. Else the gateway's own page session cookie names an account,
10
+ * with the scopes its account token carries, refreshed through pagasae when
11
+ * it is about to end; a session whose sign-in ended is no actor.
12
+ */
13
+ export function createAuthenticateActor(deps) {
14
+ const refusal = refuse('NOT_AN_ACTOR', 'Sign in to the console of your fleet, or call with your ship\'s crew token');
15
+ return async ({ cookie, crewToken }) => {
16
+ if (crewToken !== undefined) {
17
+ const who = await deps.door.whoami(crewToken);
18
+ if (!who.isOk) {
19
+ return refusal;
20
+ }
21
+ const gateway = await deps.connections.find(who.value.fleetId);
22
+ if (gateway === undefined) {
23
+ return refusal;
24
+ }
25
+ // On the ship's own behalf: its read reach holds itself, whatever the gateway's ship reaches (decision 0034).
26
+ const ship = await deps.door.getShip(gateway.crewToken, { shipId: who.value.shipId, onBehalfOf: who.value.shipId });
27
+ return ship.isOk ? ok({ fleetId: who.value.fleetId, kind: 'ship', shipId: who.value.shipId, scopes: ship.value.scopes }) : refusal;
28
+ }
29
+ const session = cookie === undefined ? undefined : deps.sessions.inCookie(cookie);
30
+ if (session !== undefined) {
31
+ const token = await deps.accountTokenOf(session);
32
+ if (!token.isOk) {
33
+ return refusal;
34
+ }
35
+ const { accountId, personShipId, scopes } = token.value;
36
+ return ok({ fleetId: session.fleetId, kind: 'account', accountId, personShipId, grantId: session.grantId, scopes });
37
+ }
38
+ const operator = await deps.authenticateOperator(cookie);
39
+ return operator.isOk ? ok(operator.value) : refusal;
40
+ };
41
+ }
42
+ //# sourceMappingURL=authenticate-actor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authenticate-actor.js","sourceRoot":"","sources":["../../../src/core/actors/authenticate-actor.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AA0BtD;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAMvC;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,4EAA4E,CAAC,CAAC;IACrH,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE;QACrC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,8GAA8G;YAC9G,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACpH,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACrI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;YACxD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ConnectionStore } from '../connection/ports.js';
2
+ import { type DomainError } from '../shared/errors.js';
3
+ import { type Result } from '../shared/result.js';
4
+ import type { AccountTokenOf } from '../sign-in/account-token.js';
5
+ import type { Actor } from './authenticate-actor.js';
6
+ /**
7
+ * What the gateway calls the fleet with, so the fleet answers as the actor
8
+ * (decision 0057): argo's or a viewer's console session cookie, a ship's own
9
+ * crew token, or an account's token with the crew token of the gateway's
10
+ * ship presenting it.
11
+ */
12
+ export interface ActorCredential {
13
+ cookie?: string;
14
+ crewToken?: string;
15
+ accountToken?: string;
16
+ }
17
+ export type CredentialOf = (actor: Actor, sent: ActorCredential) => Promise<Result<ActorCredential, DomainError<'NOT_AN_ACTOR' | 'FLEET_UNAVAILABLE'>>>;
18
+ /**
19
+ * Use case: the credential to call the fleet with as the actor. A ship, argo
20
+ * or a viewer sent its own, which goes on as it came. An account on the
21
+ * gateway's pages sent only its page session: its grant's account token goes,
22
+ * refreshed when about to end, presented by the gateway's ship of its fleet.
23
+ */
24
+ export declare function createCredentialOf(deps: {
25
+ connections: Pick<ConnectionStore, 'find'>;
26
+ accountTokenOf: AccountTokenOf;
27
+ }): CredentialOf;
@@ -0,0 +1,25 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /**
4
+ * Use case: the credential to call the fleet with as the actor. A ship, argo
5
+ * or a viewer sent its own, which goes on as it came. An account on the
6
+ * gateway's pages sent only its page session: its grant's account token goes,
7
+ * refreshed when about to end, presented by the gateway's ship of its fleet.
8
+ */
9
+ export function createCredentialOf(deps) {
10
+ return async (actor, sent) => {
11
+ if (actor.kind !== 'account') {
12
+ return ok(sent);
13
+ }
14
+ const gateway = await deps.connections.find(actor.fleetId);
15
+ if (gateway === undefined) {
16
+ return refuse('FLEET_UNAVAILABLE', 'The gateway is not connected to your fleet');
17
+ }
18
+ const token = await deps.accountTokenOf({ fleetId: actor.fleetId, grantId: actor.grantId });
19
+ if (!token.isOk) {
20
+ return token.error.kind === 'signedOut' ? refuse('NOT_AN_ACTOR', 'Your sign-in ended: sign in again') : refuse('FLEET_UNAVAILABLE', 'pagasae did not answer, so your account token could not be renewed');
21
+ }
22
+ return ok({ crewToken: gateway.crewToken, accountToken: token.value.accountToken });
23
+ };
24
+ }
25
+ //# sourceMappingURL=credential-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-of.js","sourceRoot":"","sources":["../../../src/core/actors/credential-of.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAkBtD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAoF;IACrH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,oEAAoE,CAAC,CAAC;QAC5M,CAAC;QACD,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { FleetId, ShipId } from '@aeolus-fleet/common';
2
+ import type { Clock } from '../shared/clock.js';
3
+ import { type DomainError } from '../shared/errors.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { ConnectionStatus, ConnectionStore, FleetDoor } from './ports.js';
6
+ export type ConnectRefusal = DomainError<'ALREADY_CONNECTED' | 'SECRET_REFUSED' | 'OTHER_FLEET' | 'MISSING_SCOPES' | 'SCOPE_REFUSED' | 'FLEET_UNAVAILABLE'>;
7
+ export type Connect = (input: {
8
+ operatorFleetId: FleetId;
9
+ shipId: ShipId;
10
+ secret: string;
11
+ }) => Promise<Result<ConnectionStatus, ConnectRefusal>>;
12
+ /**
13
+ * Use case: argo connects the gateway, as the other plugins are connected.
14
+ * The console's server hands it its ship's secret, server to server; the
15
+ * gateway registers with it as a server and keeps only the crew token. The
16
+ * ship must be of argo's fleet and hold the gateway's scopes, and the fleet
17
+ * must take the gateway's declared scope, or the gateway lets
18
+ * the ship go again and keeps nothing. Each fleet has its own connection:
19
+ * connect works only while the gateway is not connected to argo's fleet,
20
+ * whatever other fleets it serves. The secret is never kept or logged.
21
+ */
22
+ export declare function createConnect(deps: {
23
+ door: FleetDoor;
24
+ store: ConnectionStore;
25
+ clock: Clock;
26
+ }): Connect;
@@ -0,0 +1,58 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /**
4
+ * What the gateway's ship does (decisions 0044 to 0046, 0059): read the
5
+ * fleet, commission an app proxy ship for each approved outside party, naming
6
+ * its owner, declare the gateway's own scope, and write what it checked about
7
+ * each proxy ship.
8
+ */
9
+ const GATEWAY_SCOPES = ['fleet:read', 'fleet:commission', 'fleet:on-behalf', 'scopes:declare', 'fleet:verify'];
10
+ /** The gateway's own scopes, under its namespace: approving is a scope any actor may hold (decision 0056). */
11
+ const GATEWAY_NAMESPACE = {
12
+ namespace: 'gateway',
13
+ scopes: [{ scope: 'gateway:approve', description: 'Approve outside parties: outside MCP clients and servers, each acting in the fleet as its proxy ship' }],
14
+ };
15
+ /**
16
+ * Use case: argo connects the gateway, as the other plugins are connected.
17
+ * The console's server hands it its ship's secret, server to server; the
18
+ * gateway registers with it as a server and keeps only the crew token. The
19
+ * ship must be of argo's fleet and hold the gateway's scopes, and the fleet
20
+ * must take the gateway's declared scope, or the gateway lets
21
+ * the ship go again and keeps nothing. Each fleet has its own connection:
22
+ * connect works only while the gateway is not connected to argo's fleet,
23
+ * whatever other fleets it serves. The secret is never kept or logged.
24
+ */
25
+ export function createConnect(deps) {
26
+ return async ({ operatorFleetId, shipId, secret }) => {
27
+ if (await deps.store.find(operatorFleetId)) {
28
+ return refuse('ALREADY_CONNECTED', 'The gateway is connected to this fleet already');
29
+ }
30
+ const registered = await deps.door.register({ shipId, secret });
31
+ if (!registered.isOk) {
32
+ return refuse('SECRET_REFUSED', `The fleet refused its ship's secret: ${registered.error.message}`);
33
+ }
34
+ const { crewToken } = registered.value;
35
+ const letGo = async (kind, message) => {
36
+ await deps.door.deregister(crewToken);
37
+ return refuse(kind, message);
38
+ };
39
+ const who = await deps.door.whoami(crewToken);
40
+ if (!who.isOk) {
41
+ return letGo('SECRET_REFUSED', `The fleet refused the new crew token: ${who.error.message}`);
42
+ }
43
+ if (who.value.fleetId !== operatorFleetId) {
44
+ return letGo('OTHER_FLEET', "The ship belongs to another fleet than the operator's");
45
+ }
46
+ const ship = await deps.door.getShip(crewToken, { shipId });
47
+ if (!ship.isOk || !GATEWAY_SCOPES.every((scope) => ship.value.scopes.includes(scope))) {
48
+ return letGo('MISSING_SCOPES', `The ship needs ${GATEWAY_SCOPES.join(', ')}`);
49
+ }
50
+ const declared = await deps.door.declareScopes(crewToken, GATEWAY_NAMESPACE);
51
+ if (!declared.isOk) {
52
+ return letGo('SCOPE_REFUSED', `The fleet did not take the gateway's scope gateway:approve: ${declared.error.message}`);
53
+ }
54
+ await deps.store.save({ fleetId: who.value.fleetId, shipId, name: who.value.name, crewToken, crewedAt: deps.clock.now() });
55
+ return ok({ state: 'connected', ship: { shipId, name: who.value.name }, lastShipId: shipId });
56
+ };
57
+ }
58
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/core/connection/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { FleetId, ShipId } from '@aeolus-fleet/common';
2
+ import type { Result } from '../shared/result.js';
3
+ /**
4
+ * Why the fleet refused a ship call: its code (CONFLICT, UNAUTHORIZED,
5
+ * LEASE_ENDED, ...) and its message. UNAVAILABLE: no answer came, so the call
6
+ * may or may not have been carried out.
7
+ */
8
+ export interface FleetRefusal {
9
+ code: string;
10
+ message: string;
11
+ }
12
+ /** A ship as `fleet.ship` shows it: what the gateway reads of it. */
13
+ export interface FleetShip {
14
+ status: 'awaitingCrew' | 'crewed' | 'retired';
15
+ scopes: string[];
16
+ }
17
+ /**
18
+ * Outbound port: the fleet's public ship calls, as the gateway makes them for
19
+ * its own ship. The gateway is a ship like any other.
20
+ */
21
+ export interface FleetDoor {
22
+ register(claim: {
23
+ shipId: ShipId;
24
+ secret: string;
25
+ }): Promise<Result<{
26
+ crewToken: string;
27
+ }, FleetRefusal>>;
28
+ whoami(crewToken: string): Promise<Result<{
29
+ shipId: ShipId;
30
+ fleetId: FleetId;
31
+ name: string;
32
+ type: string;
33
+ }, FleetRefusal>>;
34
+ /**
35
+ * A ship of the fleet, retired ones included; needs fleet:read. Read on
36
+ * behalf of a ship (fleet:on-behalf), it answers within that ship's read
37
+ * reach; outside the reader's read reach it is refused.
38
+ */
39
+ getShip(crewToken: string, ship: {
40
+ shipId: ShipId;
41
+ onBehalfOf?: ShipId;
42
+ }): Promise<Result<FleetShip, FleetRefusal>>;
43
+ /** Ends this session's crew of its ship: the lease and the secret it claimed with. */
44
+ deregister(crewToken: string): Promise<Result<undefined, FleetRefusal>>;
45
+ /** Declares the ship's own namespace and its whole list of scopes; the fleet stores them, the gateway enforces them (decision 0046). */
46
+ declareScopes(crewToken: string, declaration: {
47
+ namespace: string;
48
+ scopes: {
49
+ scope: string;
50
+ description: string;
51
+ }[];
52
+ }): Promise<Result<undefined, FleetRefusal>>;
53
+ }
54
+ /** The crew token the gateway holds for its ship in a fleet, and when it got it. */
55
+ export interface GatewayCrew {
56
+ /** The fleet the ship belongs to: the fleet the gateway serves. */
57
+ fleetId: FleetId;
58
+ shipId: ShipId;
59
+ /** The ship's name when the gateway connected, shown while the fleet does not answer. */
60
+ name: string;
61
+ crewToken: string;
62
+ crewedAt: Date;
63
+ }
64
+ /** The fleet and ship the gateway was last connected as; kept when its crew token is dropped. */
65
+ export interface GatewayBinding {
66
+ fleetId: FleetId;
67
+ shipId: ShipId;
68
+ }
69
+ /**
70
+ * Outbound port: where the gateway keeps each fleet's crew token across
71
+ * restarts. One install serves many fleets, one connection each.
72
+ */
73
+ export interface ConnectionStore {
74
+ /** The fleet's crew, while the gateway holds a crew token for it: while it is connected to that fleet. */
75
+ find(fleetId: FleetId): Promise<GatewayCrew | undefined>;
76
+ /** The fleet's last connection, with or without a crew token; none before its first. */
77
+ binding(fleetId: FleetId): Promise<GatewayBinding | undefined>;
78
+ /** Every fleet's crew the gateway holds a crew token for: the fleets it is connected to. */
79
+ connected(): Promise<GatewayCrew[]>;
80
+ save(crew: GatewayCrew): Promise<void>;
81
+ /** Forgets the fleet's crew token, keeping its binding: the gateway is not connected to that fleet. */
82
+ drop(fleetId: FleetId): Promise<void>;
83
+ }
84
+ /** Whether the gateway holds a working crew token for its ship, as which ship, and the ship it was last connected as. */
85
+ export interface ConnectionStatus {
86
+ state: 'not-connected' | 'connected';
87
+ ship: {
88
+ shipId: ShipId;
89
+ name: string;
90
+ } | null;
91
+ lastShipId: ShipId | null;
92
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/connection/ports.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { ConnectionStatus, ConnectionStore, FleetDoor } from './ports.js';
3
+ export type ReadConnection = (fleetId: FleetId) => Promise<ConnectionStatus>;
4
+ /**
5
+ * Use case: whether the gateway is connected to a fleet. The fleet's kept
6
+ * crew token is asked who it is: a token the fleet no longer takes (the ship
7
+ * was released, its session ended) is dropped, and the gateway is not
8
+ * connected to that fleet until argo connects it again. When the fleet does
9
+ * not answer, the token is kept.
10
+ */
11
+ export declare function createReadConnection(deps: {
12
+ door: FleetDoor;
13
+ store: ConnectionStore;
14
+ }): ReadConnection;
@@ -0,0 +1,24 @@
1
+ /** The codes with which the fleet says a crew token no longer crews its ship. */
2
+ const GONE = new Set(['LEASE_ENDED', 'UNAUTHORIZED']);
3
+ /**
4
+ * Use case: whether the gateway is connected to a fleet. The fleet's kept
5
+ * crew token is asked who it is: a token the fleet no longer takes (the ship
6
+ * was released, its session ended) is dropped, and the gateway is not
7
+ * connected to that fleet until argo connects it again. When the fleet does
8
+ * not answer, the token is kept.
9
+ */
10
+ export function createReadConnection(deps) {
11
+ return async (fleetId) => {
12
+ const crew = await deps.store.find(fleetId);
13
+ if (crew) {
14
+ const who = await deps.door.whoami(crew.crewToken);
15
+ if (who.isOk || !GONE.has(who.error.code)) {
16
+ return { state: 'connected', ship: { shipId: crew.shipId, name: who.isOk ? who.value.name : crew.name }, lastShipId: crew.shipId };
17
+ }
18
+ await deps.store.drop(fleetId);
19
+ }
20
+ const binding = await deps.store.binding(fleetId);
21
+ return { state: 'not-connected', ship: null, lastShipId: binding?.shipId ?? null };
22
+ };
23
+ }
24
+ //# sourceMappingURL=read-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-connection.js","sourceRoot":"","sources":["../../../src/core/connection/read-connection.ts"],"names":[],"mappings":"AAMA,iFAAiF;AACjF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAiD;IACpF,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YACrI,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;IACrF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { Clock } from '../shared/clock.js';
3
+ import type { DomainError } from '../shared/errors.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { FleetForgetter, InstallationRequests, RequestHasher } from './ports.js';
6
+ export type DeleteFleet = (input: {
7
+ requestId: string;
8
+ fleetId: FleetId;
9
+ }) => Promise<Result<Record<string, never>, DomainError<'REQUEST_ID_USED'>>>;
10
+ /**
11
+ * Use case: the hosting service deletes a fleet from the gateway (decision
12
+ * 0021): the gateway forgets everything it holds of the fleet and tells the
13
+ * fleet nothing; its ships stay there. The request is kept as its hash only,
14
+ * so nothing of the fleet stays; a replay answers the first answer.
15
+ */
16
+ export declare function createDeleteFleet(deps: {
17
+ forgetter: FleetForgetter;
18
+ requests: InstallationRequests;
19
+ hasher: RequestHasher;
20
+ clock: Clock;
21
+ }): DeleteFleet;
@@ -0,0 +1,21 @@
1
+ import { ok } from '../shared/result.js';
2
+ import { earlierAnswer } from './request-id.js';
3
+ /**
4
+ * Use case: the hosting service deletes a fleet from the gateway (decision
5
+ * 0021): the gateway forgets everything it holds of the fleet and tells the
6
+ * fleet nothing; its ships stay there. The request is kept as its hash only,
7
+ * so nothing of the fleet stays; a replay answers the first answer.
8
+ */
9
+ export function createDeleteFleet(deps) {
10
+ return async ({ requestId, fleetId }) => {
11
+ const requestHash = deps.hasher.hash(`deleteFleet ${fleetId}`);
12
+ const earlier = await earlierAnswer(deps.requests, { requestId, requestHash });
13
+ if (earlier !== undefined) {
14
+ return 'isOk' in earlier ? earlier : ok({});
15
+ }
16
+ await deps.forgetter.forget(fleetId);
17
+ await deps.requests.record({ requestId, kind: 'deleteFleet', requestHash, fleetId: null, isEnabled: null, at: deps.clock.now() });
18
+ return ok({});
19
+ };
20
+ }
21
+ //# sourceMappingURL=delete-fleet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-fleet.js","sourceRoot":"","sources":["../../../src/core/installation/delete-fleet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwG;IACxI,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClI,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ /**
3
+ * Whether the installation has an installation token (decision 0021): open
4
+ * without one, as a self-hosted gateway runs, and every fleet is served;
5
+ * enabled with one, and a fleet is served only once the hosting service
6
+ * switched it on.
7
+ */
8
+ export type InstallationMode = 'open' | 'enabled';
9
+ /** Outbound port: each fleet's switch, as the hosting service set it. */
10
+ export interface FleetSwitches {
11
+ /** Whether the fleet was switched on; undefined when it never was switched. */
12
+ find(fleetId: FleetId): Promise<boolean | undefined>;
13
+ set(fleetId: FleetId, change: {
14
+ isEnabled: boolean;
15
+ at: Date;
16
+ }): Promise<void>;
17
+ }
18
+ /**
19
+ * A request the installation answered, by the caller's request id. A switch
20
+ * names its fleet and what it set, and goes with its fleet; a delete names
21
+ * nothing of the fleet, only the request's hash.
22
+ */
23
+ export interface InstallationRequest {
24
+ requestId: string;
25
+ kind: 'setEnabled' | 'deleteFleet';
26
+ requestHash: string;
27
+ fleetId: FleetId | null;
28
+ isEnabled: boolean | null;
29
+ at: Date;
30
+ }
31
+ /** Outbound port: the installation's requests, so a replay answers what the first call answered. */
32
+ export interface InstallationRequests {
33
+ find(requestId: string): Promise<InstallationRequest | undefined>;
34
+ record(request: InstallationRequest): Promise<void>;
35
+ }
36
+ /** Outbound port: forgets everything the gateway holds of a fleet, in one go: its connection, its switch, its parties with their vault, and the requests that name it. */
37
+ export interface FleetForgetter {
38
+ forget(fleetId: FleetId): Promise<void>;
39
+ }
40
+ /** Outbound port: a one-way hash of a request's text, kept instead of the request. */
41
+ export interface RequestHasher {
42
+ hash(text: string): string;
43
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/core/installation/ports.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { ConnectionStore } from '../connection/ports.js';
3
+ import type { IsServed } from './served.js';
4
+ export type ReadFleet = (input: {
5
+ fleetId: FleetId;
6
+ }) => Promise<{
7
+ isEnabled: boolean;
8
+ isConnected: boolean;
9
+ }>;
10
+ /**
11
+ * Use case: a fleet as the hosting service reads it: whether the gateway
12
+ * serves it, and whether the gateway holds a crew token for it. Off and
13
+ * connected is a fleet whose connection waits for it to be on again.
14
+ */
15
+ export declare function createReadFleet(deps: {
16
+ isServed: IsServed;
17
+ connections: ConnectionStore;
18
+ }): ReadFleet;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Use case: a fleet as the hosting service reads it: whether the gateway
3
+ * serves it, and whether the gateway holds a crew token for it. Off and
4
+ * connected is a fleet whose connection waits for it to be on again.
5
+ */
6
+ export function createReadFleet(deps) {
7
+ return async ({ fleetId }) => ({ isEnabled: await deps.isServed(fleetId), isConnected: (await deps.connections.find(fleetId)) !== undefined });
8
+ }
9
+ //# sourceMappingURL=read-fleet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-fleet.js","sourceRoot":"","sources":["../../../src/core/installation/read-fleet.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAA0D;IACxF,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;AACjJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type DomainError } from '../shared/errors.js';
2
+ import type { Err } from '../shared/result.js';
3
+ import type { InstallationRequest, InstallationRequests } from './ports.js';
4
+ /** What a request id already answered: the earlier request when it is the same one, a refusal when it was another. */
5
+ export declare function earlierAnswer(requests: InstallationRequests, request: {
6
+ requestId: string;
7
+ requestHash: string;
8
+ }): Promise<InstallationRequest | Err<DomainError<'REQUEST_ID_USED'>> | undefined>;
@@ -0,0 +1,10 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ /** What a request id already answered: the earlier request when it is the same one, a refusal when it was another. */
3
+ export async function earlierAnswer(requests, request) {
4
+ const earlier = await requests.find(request.requestId);
5
+ if (!earlier) {
6
+ return undefined;
7
+ }
8
+ return earlier.requestHash === request.requestHash ? earlier : refuse('REQUEST_ID_USED', `The request id ${request.requestId} was used for another request`);
9
+ }
10
+ //# sourceMappingURL=request-id.js.map