@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
@@ -0,0 +1,36 @@
1
+ import { ok } from '../shared/result.js';
2
+ import { inboxEntryOf } from './inbox-entry.js';
3
+ import { asPersonCrew } from './person-crew.js';
4
+ /** The most deliveries an inbox lists at once: as many as one receive takes. */
5
+ export const INBOX_LIST_MAX = 10;
6
+ /**
7
+ * What waits for the caller's person ship: how many, and up to the most an
8
+ * inbox lists, taken as received, the crew's own held ones again first. It
9
+ * asks how many wait first, so the person is never kept waiting while none
10
+ * does.
11
+ */
12
+ export async function waitingFor(deps, caller) {
13
+ const counted = await asPersonCrew(deps, { caller, run: (crew) => deps.door.inbox(crew.crewToken) });
14
+ if (!counted.isOk) {
15
+ return counted;
16
+ }
17
+ const { crew, value } = counted.value;
18
+ if (value.waiting === 0) {
19
+ return ok({ crew, waiting: 0, deliveries: [] });
20
+ }
21
+ const taken = await asPersonCrew(deps, { caller, run: (held) => deps.door.pushReceive(held.crewToken, { max: INBOX_LIST_MAX }) });
22
+ return taken.isOk ? ok({ crew: taken.value.crew, waiting: value.waiting, deliveries: taken.value.value }) : taken;
23
+ }
24
+ /**
25
+ * Use case: a person reads their own person ship's inbox (Q20): what waits,
26
+ * by titles only. The gateway takes the waiting deliveries as the ship's
27
+ * crew, so nothing is stored in the gateway, and a delivery listed is listed
28
+ * again until the person deals with it.
29
+ */
30
+ export function createReadInbox(deps) {
31
+ return async (caller) => {
32
+ const waiting = await waitingFor(deps, caller);
33
+ return waiting.isOk ? ok({ waiting: waiting.value.waiting, deliveries: waiting.value.deliveries.map(inboxEntryOf) }) : waiting;
34
+ };
35
+ }
36
+ //# sourceMappingURL=read-inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-inbox.js","sourceRoot":"","sources":["../../../src/core/people/read-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAiE,MAAM,kBAAkB,CAAC;AAG/G,gFAAgF;AAChF,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAIjC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAkF,EAClF,MAAoB;IAEpB,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACrG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IACtC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IAClI,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACpH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAkF;IAChH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACjI,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { AuthorizationCodes, OAuthSecrets } from '../oauth/ports.js';
3
+ import type { AuthorizationRequest } from '../oauth/read-authorization.js';
4
+ import type { PartyStore } from '../parties/ports.js';
5
+ import type { Clock } from '../shared/clock.js';
6
+ import { type DomainError } from '../shared/errors.js';
7
+ import { type Result } from '../shared/result.js';
8
+ import type { OpenRequest } from './open-request.js';
9
+ import type { PendingRequests, Requester, WaitingSeals } from './ports.js';
10
+ /** What asking answers: where the client is sent back now, or the sealed waiting the browser waits on. */
11
+ export type ClientAnswer = {
12
+ readonly kind: 'answered';
13
+ readonly redirectTo: string;
14
+ } | {
15
+ readonly kind: 'waiting';
16
+ readonly waiting: string;
17
+ };
18
+ export type AskForClient = (asked: {
19
+ fleetId: FleetId;
20
+ requester: Requester;
21
+ authorization: AuthorizationRequest;
22
+ /** The client's request as it came, read again while the browser waits. */
23
+ request: Readonly<Record<string, string | undefined>>;
24
+ browserSecret: string;
25
+ }) => Promise<Result<ClientAnswer, DomainError<'OUTSIDE_PARTIES_OFF'>>>;
26
+ /**
27
+ * Use case: an account of the fleet, signed in, asks for access for an
28
+ * outside MCP client (decision 0056, Thomas's question A). A client that is
29
+ * a party already gets its party's code at once. A deny or an expired
30
+ * request the account asked for ends its next try with access_denied, once;
31
+ * otherwise the account opens a request, or joins the one pending, and its
32
+ * browser waits for the decision. While the fleet's outside parties are off,
33
+ * nobody asks (interop I-3).
34
+ */
35
+ export declare function createAskForClient(deps: {
36
+ parties: PartyStore;
37
+ requests: PendingRequests;
38
+ openRequest: OpenRequest;
39
+ servesOutsideParties: (fleetId: FleetId) => Promise<boolean>;
40
+ waitings: WaitingSeals;
41
+ codes: AuthorizationCodes;
42
+ secrets: OAuthSecrets;
43
+ clock: Clock;
44
+ issuer: string;
45
+ }): AskForClient;
@@ -0,0 +1,33 @@
1
+ import { issueCode, redirectWith } from '../oauth/issue-code.js';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { isRefused } from './request-state.js';
5
+ /**
6
+ * Use case: an account of the fleet, signed in, asks for access for an
7
+ * outside MCP client (decision 0056, Thomas's question A). A client that is
8
+ * a party already gets its party's code at once. A deny or an expired
9
+ * request the account asked for ends its next try with access_denied, once;
10
+ * otherwise the account opens a request, or joins the one pending, and its
11
+ * browser waits for the decision. While the fleet's outside parties are off,
12
+ * nobody asks (interop I-3).
13
+ */
14
+ export function createAskForClient(deps) {
15
+ return async ({ fleetId, requester, authorization, request, browserSecret }) => {
16
+ if (!(await deps.servesOutsideParties(fleetId))) {
17
+ return refuse('OUTSIDE_PARTIES_OFF', "This fleet's outside parties are off: nobody asks for an outside MCP client");
18
+ }
19
+ const party = await deps.parties.findByClient(fleetId, authorization.clientId);
20
+ if (party?.state === 'crewed') {
21
+ return ok({ kind: 'answered', redirectTo: await issueCode(deps, { fleetId, authorization, holder: { kind: 'party', party: party.name } }) });
22
+ }
23
+ const subject = { kind: 'client', clientId: authorization.clientId, clientName: authorization.clientName };
24
+ const latest = await deps.requests.latestAskedBy(fleetId, { subject, accountId: requester.accountId });
25
+ if (latest !== undefined && !latest.isTold && isRefused(latest.request, deps.clock.now())) {
26
+ await deps.requests.markTold(fleetId, { requestId: latest.request.requestId, accountId: requester.accountId });
27
+ return ok({ kind: 'answered', redirectTo: redirectWith(authorization.redirectUri, { error: 'access_denied', state: authorization.state, iss: deps.issuer }) });
28
+ }
29
+ const opened = await deps.openRequest({ fleetId, subject, requester });
30
+ return ok({ kind: 'waiting', waiting: deps.waitings.seal({ fleetId, requestId: opened.requestId, accountId: requester.accountId, browserSecret, request }) });
31
+ };
32
+ }
33
+ //# sourceMappingURL=ask-for-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-for-client.js","sourceRoot":"","sources":["../../../src/core/requests/ask-for-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAKjE,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAc/C;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAUlC;IACC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE;QAC7E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,qBAAqB,EAAE,6EAA6E,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,KAAK,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/I,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,UAAU,EAAW,CAAC;QACpH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;QACvG,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YAC1F,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;YAC/G,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACjK,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAChK,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ import type { PartyStore } from '../parties/ports.js';
3
+ import type { PersonCaller } from '../people/person-crew.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { AccountGrants } from '../sign-in/ports.js';
7
+ import type { OpenRequest } from './open-request.js';
8
+ import type { RequestState } from './ports.js';
9
+ /** What asking answers the person: their request, by its id, and until when it waits. */
10
+ export interface AskedServer {
11
+ readonly requestId: string;
12
+ readonly url: string;
13
+ readonly state: RequestState;
14
+ readonly expiresAt: Date;
15
+ }
16
+ export type AskForServer = (asked: {
17
+ caller: PersonCaller;
18
+ url: string;
19
+ }) => Promise<Result<AskedServer, DomainError<'INVALID_SERVER_URL' | 'OUTSIDE_PARTIES_OFF' | 'SIGNED_OUT' | 'PARTY_EXISTS'>>>;
20
+ /**
21
+ * Use case: a signed-in person asks for an outside MCP server, as their
22
+ * account (decision 0056). An outside MCP server never asks itself: an
23
+ * approver adds it, giving its credential. A second person asking for the
24
+ * same server joins the request pending. While the fleet's outside parties
25
+ * are off, nobody asks (interop I-3).
26
+ */
27
+ export declare function createAskForServer(deps: {
28
+ grants: AccountGrants;
29
+ parties: PartyStore;
30
+ openRequest: OpenRequest;
31
+ servesOutsideParties: (fleetId: FleetId) => Promise<boolean>;
32
+ }): AskForServer;
@@ -0,0 +1,42 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /** The server's address as a URL reads it, so one server written two ways is one request; none for an address that is not http or https. */
4
+ function serverUrlOf(text) {
5
+ try {
6
+ const url = new URL(text);
7
+ return url.protocol === 'https:' || url.protocol === 'http:' ? url.toString() : undefined;
8
+ }
9
+ catch {
10
+ return undefined;
11
+ }
12
+ }
13
+ /**
14
+ * Use case: a signed-in person asks for an outside MCP server, as their
15
+ * account (decision 0056). An outside MCP server never asks itself: an
16
+ * approver adds it, giving its credential. A second person asking for the
17
+ * same server joins the request pending. While the fleet's outside parties
18
+ * are off, nobody asks (interop I-3).
19
+ */
20
+ export function createAskForServer(deps) {
21
+ return async ({ caller, url: written }) => {
22
+ const url = serverUrlOf(written);
23
+ if (url === undefined) {
24
+ return refuse('INVALID_SERVER_URL', `${written} is no address of an MCP server: give its https URL`);
25
+ }
26
+ const { fleetId } = caller;
27
+ if (!(await deps.servesOutsideParties(fleetId))) {
28
+ return refuse('OUTSIDE_PARTIES_OFF', "This fleet's outside parties are off: nobody asks for an outside MCP server");
29
+ }
30
+ const grant = await deps.grants.find(fleetId, caller.grantId);
31
+ if (grant === undefined) {
32
+ return refuse('SIGNED_OUT', 'Your sign-in ended: sign in again from your MCP client');
33
+ }
34
+ const party = (await deps.parties.list(fleetId)).find((each) => each.kind === 'mcpServer' && each.url === url);
35
+ if (party !== undefined) {
36
+ return refuse('PARTY_EXISTS', `${url} is the outside party ${party.name} already`);
37
+ }
38
+ const request = await deps.openRequest({ fleetId, subject: { kind: 'server', url }, requester: { accountId: grant.accountId, personShipId: grant.personShipId } });
39
+ return ok({ requestId: request.requestId, url, state: request.state, expiresAt: request.expiresAt });
40
+ };
41
+ }
42
+ //# sourceMappingURL=ask-for-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-for-server.js","sourceRoot":"","sources":["../../../src/core/requests/ask-for-server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAiBtD,4IAA4I;AAC5I,SAAS,WAAW,CAAC,IAAY;IAC/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA4I;IAC7K,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;QACxC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,MAAM,CAAC,oBAAoB,EAAE,GAAG,OAAO,qDAAqD,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChD,OAAO,MAAM,CAAC,qBAAqB,EAAE,6EAA6E,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,YAAY,EAAE,wDAAwD,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC/G,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,cAAc,EAAE,GAAG,GAAG,yBAAyB,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACnK,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACvG,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { ConnectionStore } from '../connection/ports.js';
2
+ import type { CallSender } from '../mcp-in/ports.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import type { Owners, OwnerQuestions } from './ports.js';
5
+ /** Asks the gateway's owner about the requests not asked yet, and withdraws the questions whose request ended: how it went. */
6
+ export type AskOwners = () => Promise<{
7
+ asked: number;
8
+ withdrawn: number;
9
+ kept: number;
10
+ refused: number;
11
+ }>;
12
+ /**
13
+ * Use case: the gateway's ship asks its owner, read from the fleet, about
14
+ * each request that opened (decision 0056, 0038), argo too when argo owns it
15
+ * (P6-1 a), and withdraws the question once the request is decided or
16
+ * expired. Each goes under a key of the request, so one sent again after the
17
+ * fleet did not answer is stored once; one the fleet refused is not sent
18
+ * again. A fleet the gateway is not connected to waits.
19
+ */
20
+ export declare function createAskOwners(deps: {
21
+ questions: OwnerQuestions;
22
+ connections: ConnectionStore;
23
+ owners: Owners;
24
+ sender: CallSender;
25
+ newQuestionId: () => string;
26
+ clock: Clock;
27
+ overviewUrl: string;
28
+ }): AskOwners;
@@ -0,0 +1,85 @@
1
+ import { QUESTION_CONTENT_TYPE, WITHDRAWAL_CONTENT_TYPE } from '@aeolus-fleet/common';
2
+ /** How many requests one round asks about, and how many questions it withdraws, at most. */
3
+ const QUESTIONS_PER_ROUND = 50;
4
+ const dayOf = (at) => at.toISOString().slice(0, 'yyyy-mm-dd'.length);
5
+ /** The question about one request: it points to the overview, where any approver decides (Q5 b, P6-2 b). */
6
+ function questionOf(request, ids) {
7
+ const { subject } = request;
8
+ const people = request.requesters.length === 1 ? '1 person' : `${String(request.requesters.length)} people`;
9
+ const about = subject.kind === 'client'
10
+ ? { title: `${subject.clientName} asks for access to the fleet`, what: 'An MCP client asks to act in the fleet as an outside party.' }
11
+ : { title: `Someone asks to add ${subject.url} to the fleet`, what: 'A person asks for an outside MCP server, whose tools would reach the fleet.' };
12
+ return {
13
+ id: ids.questionId,
14
+ title: about.title,
15
+ context: `${about.what} Asked by ${people} on ${dayOf(request.askedAt)}; it waits until ${dayOf(request.expiresAt)}, then expires. Any holder of gateway:approve decides on ${ids.overviewUrl}.`,
16
+ options: [{ key: 1, label: "Decide on the gateway's page", detail: ids.overviewUrl }],
17
+ pick: { option: 1, why: 'Approving names the outside party, its owner and its scopes, which the page asks for.' },
18
+ };
19
+ }
20
+ /**
21
+ * Use case: the gateway's ship asks its owner, read from the fleet, about
22
+ * each request that opened (decision 0056, 0038), argo too when argo owns it
23
+ * (P6-1 a), and withdraws the question once the request is decided or
24
+ * expired. Each goes under a key of the request, so one sent again after the
25
+ * fleet did not answer is stored once; one the fleet refused is not sent
26
+ * again. A fleet the gateway is not connected to waits.
27
+ */
28
+ export function createAskOwners(deps) {
29
+ return async () => {
30
+ const now = deps.clock.now();
31
+ const counted = { asked: 0, withdrawn: 0, kept: 0, refused: 0 };
32
+ for (const { request, questionId: held } of await deps.questions.listToAsk(now, QUESTIONS_PER_ROUND)) {
33
+ const gateway = await deps.connections.find(request.fleetId);
34
+ const owner = gateway === undefined ? undefined : await deps.owners.ownerOf(gateway.crewToken, gateway.shipId);
35
+ if (gateway === undefined || owner === undefined || (!owner.isOk && owner.error.code === 'UNAVAILABLE')) {
36
+ counted.kept += 1;
37
+ continue;
38
+ }
39
+ const questionId = await deps.questions.keep(request.fleetId, { requestId: request.requestId, questionId: held ?? deps.newQuestionId() });
40
+ const asked = owner.isOk && owner.value !== null ? owner.value : null;
41
+ const sent = asked === null
42
+ ? undefined
43
+ : await deps.sender.send(gateway.crewToken, {
44
+ to: asked,
45
+ contentType: QUESTION_CONTENT_TYPE,
46
+ payload: JSON.stringify(questionOf(request, { questionId, overviewUrl: deps.overviewUrl })),
47
+ idempotencyKey: `${request.requestId}:question`,
48
+ });
49
+ if (sent !== undefined && !sent.isOk && sent.error.code === 'UNAVAILABLE') {
50
+ counted.kept += 1;
51
+ continue;
52
+ }
53
+ const isAsked = sent?.isOk === true;
54
+ await deps.questions.markAsked(request.fleetId, { requestId: request.requestId, askedShipId: isAsked ? asked : null, at: now });
55
+ if (isAsked) {
56
+ counted.asked += 1;
57
+ }
58
+ else {
59
+ counted.refused += 1;
60
+ }
61
+ }
62
+ for (const question of await deps.questions.listToWithdraw(now, QUESTIONS_PER_ROUND)) {
63
+ const gateway = await deps.connections.find(question.fleetId);
64
+ if (gateway === undefined || question.askedShipId === null) {
65
+ counted.kept += 1;
66
+ continue;
67
+ }
68
+ const sent = await deps.sender.send(gateway.crewToken, {
69
+ to: question.askedShipId,
70
+ contentType: WITHDRAWAL_CONTENT_TYPE,
71
+ payload: JSON.stringify({ questionId: question.questionId }),
72
+ idempotencyKey: `${question.requestId}:withdrawal`,
73
+ });
74
+ if (!sent.isOk && sent.error.code === 'UNAVAILABLE') {
75
+ counted.kept += 1;
76
+ continue;
77
+ }
78
+ await deps.questions.markWithdrawn(question.fleetId, { requestId: question.requestId, at: now });
79
+ counted.withdrawn += sent.isOk ? 1 : 0;
80
+ counted.refused += sent.isOk ? 0 : 1;
81
+ }
82
+ return counted;
83
+ };
84
+ }
85
+ //# sourceMappingURL=ask-owners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-owners.js","sourceRoot":"","sources":["../../../src/core/requests/ask-owners.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { ShipId } from '@aeolus-fleet/common';
2
+ import type { Actor } from '../actors/authenticate-actor.js';
3
+ import type { ApproveClientParty, ApproveParty, ApprovePartyRefusal } from '../parties/approve-party.js';
4
+ import type { ShownParty } from '../parties/shown-party.js';
5
+ import type { Clock } from '../shared/clock.js';
6
+ import { type DomainError } from '../shared/errors.js';
7
+ import { type Result } from '../shared/result.js';
8
+ import type { McpServerCredential } from '../vault/credential.js';
9
+ import type { PendingRequests } from './ports.js';
10
+ /** The scope the gateway declares for approving outside parties (decision 0056). */
11
+ export declare const APPROVING_SCOPE = "gateway:approve";
12
+ /** An approval: the proxy ship's name, its owner (a person ship) and its scopes; for a server, its credential and how many calls it takes at once. */
13
+ export interface Approval {
14
+ readonly kind: 'approve';
15
+ readonly party: {
16
+ readonly name: string;
17
+ readonly ownerShipId: ShipId;
18
+ readonly scopes: readonly string[];
19
+ };
20
+ readonly server?: {
21
+ readonly credential: McpServerCredential;
22
+ readonly concurrencyLimit: number;
23
+ };
24
+ }
25
+ export type Decision = Approval | {
26
+ readonly kind: 'deny';
27
+ };
28
+ export type DecideRefusal = DomainError<'NOT_AN_APPROVER' | 'NO_SUCH_REQUEST' | 'ALREADY_DECIDED' | 'EXPIRED' | 'SCOPE_NOT_HELD' | 'SERVER_DETAILS_MISSING' | 'CLIENT_HAS_PARTY'> | ApprovePartyRefusal;
29
+ export type DecideRequest = (input: {
30
+ actor: Actor;
31
+ requestId: string;
32
+ decision: Decision;
33
+ }) => Promise<Result<{
34
+ state: 'approved' | 'denied';
35
+ party: ShownParty | null;
36
+ }, DecideRefusal>>;
37
+ /**
38
+ * Use case: an actor holding gateway:approve decides a pending request
39
+ * (decision 0056). The first decision counts. Approving grants only scopes
40
+ * the approver holds; the gateway, as its own ship, commissions the proxy
41
+ * ship with them, and the fleet refuses any its ship does not hold. While
42
+ * the proxy ship is commissioned the request is approving, under its id as
43
+ * the commission's key, so an approval tried again after the fleet did not
44
+ * answer commissions one ship; a refused commission gives the request back
45
+ * as pending, undecided. The decision is written with its outcomes to tell,
46
+ * so no requester's message is lost.
47
+ */
48
+ export declare function createDecideRequest(deps: {
49
+ requests: PendingRequests;
50
+ approveParty: ApproveParty;
51
+ approveClientParty: ApproveClientParty;
52
+ clock: Clock;
53
+ }): DecideRequest;
@@ -0,0 +1,83 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { noticesOf } from './outcome-notice.js';
4
+ /** The scope the gateway declares for approving outside parties (decision 0056). */
5
+ export const APPROVING_SCOPE = 'gateway:approve';
6
+ /** The scopes every app ship gets (decision 0046), so an approver need not hold them to grant them. */
7
+ const EVERY_APP_SHIP_SCOPES = new Set(['messages:send', 'messages:receive']);
8
+ function decidedByOf(actor) {
9
+ switch (actor.kind) {
10
+ case 'ship':
11
+ return { kind: 'ship', shipId: actor.shipId };
12
+ case 'account':
13
+ return { kind: 'account', accountId: actor.accountId };
14
+ case 'operator':
15
+ case 'viewer':
16
+ return { kind: actor.kind };
17
+ }
18
+ }
19
+ /**
20
+ * Use case: an actor holding gateway:approve decides a pending request
21
+ * (decision 0056). The first decision counts. Approving grants only scopes
22
+ * the approver holds; the gateway, as its own ship, commissions the proxy
23
+ * ship with them, and the fleet refuses any its ship does not hold. While
24
+ * the proxy ship is commissioned the request is approving, under its id as
25
+ * the commission's key, so an approval tried again after the fleet did not
26
+ * answer commissions one ship; a refused commission gives the request back
27
+ * as pending, undecided. The decision is written with its outcomes to tell,
28
+ * so no requester's message is lost.
29
+ */
30
+ export function createDecideRequest(deps) {
31
+ const approve = (request, approval) => {
32
+ const { name, ownerShipId, scopes } = approval.party;
33
+ const granted = scopes.filter((scope) => !EVERY_APP_SHIP_SCOPES.has(scope));
34
+ const party = { operatorFleetId: request.fleetId, requestId: request.requestId, name, ownerShipId, scopes: granted };
35
+ if (request.subject.kind === 'client') {
36
+ return deps.approveClientParty({ ...party, clientId: request.subject.clientId });
37
+ }
38
+ return approval.server === undefined
39
+ ? Promise.resolve(refuse('SERVER_DETAILS_MISSING', 'Adding an outside MCP server needs its credential and how many calls it takes at once'))
40
+ : deps.approveParty({ ...party, url: request.subject.url, ...approval.server });
41
+ };
42
+ return async ({ actor, requestId, decision }) => {
43
+ if (!actor.scopes.includes(APPROVING_SCOPE)) {
44
+ return refuse('NOT_AN_APPROVER', `Deciding requests needs ${APPROVING_SCOPE}`);
45
+ }
46
+ const request = await deps.requests.find(actor.fleetId, requestId);
47
+ if (request === undefined) {
48
+ return refuse('NO_SUCH_REQUEST', `No request ${requestId} in this fleet`);
49
+ }
50
+ const now = deps.clock.now();
51
+ if (request.state === 'approved' || request.state === 'denied') {
52
+ return refuse('ALREADY_DECIDED', `This request was ${request.state} already`);
53
+ }
54
+ if (request.state === 'expired' || (request.state === 'pending' && request.expiresAt <= now)) {
55
+ return refuse('EXPIRED', 'This request expired after 7 days: a new request asks anew');
56
+ }
57
+ const decided = { outcome: decision.kind === 'deny' ? 'denied' : 'approved', decidedBy: decidedByOf(actor), decidedAt: now };
58
+ if (decision.kind === 'deny') {
59
+ const isDenied = await deps.requests.decide(actor.fleetId, { requestId, from: ['pending'], decision: decided, notices: noticesOf(request, { outcome: 'denied', partyName: null }) });
60
+ return isDenied ? ok({ state: 'denied', party: null }) : refuse('ALREADY_DECIDED', 'This request is decided already');
61
+ }
62
+ const notHeld = decision.party.scopes.find((scope) => !EVERY_APP_SHIP_SCOPES.has(scope) && !actor.scopes.includes(scope));
63
+ if (notHeld !== undefined) {
64
+ return refuse('SCOPE_NOT_HELD', `You may grant only scopes you hold: not ${notHeld}`);
65
+ }
66
+ if (request.subject.kind === 'server' && decision.server === undefined) {
67
+ return refuse('SERVER_DETAILS_MISSING', 'Adding an outside MCP server needs its credential and how many calls it takes at once');
68
+ }
69
+ if (request.state === 'pending' && !(await deps.requests.claim(actor.fleetId, { requestId, now }))) {
70
+ return refuse('ALREADY_DECIDED', 'This request is decided already');
71
+ }
72
+ const party = await approve(request, decision);
73
+ if (!party.isOk) {
74
+ if (party.error.kind !== 'FLEET_UNAVAILABLE') {
75
+ await deps.requests.release(actor.fleetId, requestId);
76
+ }
77
+ return party;
78
+ }
79
+ await deps.requests.decide(actor.fleetId, { requestId, from: ['approving'], decision: decided, notices: noticesOf(request, { outcome: 'approved', partyName: party.value.name }) });
80
+ return ok({ state: 'approved', party: party.value });
81
+ };
82
+ }
83
+ //# sourceMappingURL=decide-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decide-request.js","sourceRoot":"","sources":["../../../src/core/requests/decide-request.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Clock } from '../shared/clock.js';
2
+ import type { PendingRequests } from './ports.js';
3
+ /** Expires the requests due by now: how many it expired. */
4
+ export type ExpireRequests = () => Promise<number>;
5
+ /**
6
+ * Use case: a request no approver decided in 7 days expires (decision 0056),
7
+ * in every fleet, with its outcomes to tell in the same step, so a person who
8
+ * asked for a server hears it as they hear a decision (P5-1 a). A request
9
+ * decided meanwhile is not expired.
10
+ */
11
+ export declare function createExpireRequests(deps: {
12
+ requests: PendingRequests;
13
+ clock: Clock;
14
+ }): ExpireRequests;
@@ -0,0 +1,21 @@
1
+ import { noticesOf } from './outcome-notice.js';
2
+ /**
3
+ * Use case: a request no approver decided in 7 days expires (decision 0056),
4
+ * in every fleet, with its outcomes to tell in the same step, so a person who
5
+ * asked for a server hears it as they hear a decision (P5-1 a). A request
6
+ * decided meanwhile is not expired.
7
+ */
8
+ export function createExpireRequests(deps) {
9
+ return async () => {
10
+ const now = deps.clock.now();
11
+ let expired = 0;
12
+ for (const request of await deps.requests.listDue(now)) {
13
+ const notices = noticesOf(request, { outcome: 'expired', partyName: null });
14
+ if (await deps.requests.expire(request.fleetId, { requestId: request.requestId, now, notices })) {
15
+ expired += 1;
16
+ }
17
+ }
18
+ return expired;
19
+ };
20
+ }
21
+ //# sourceMappingURL=expire-requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expire-requests.js","sourceRoot":"","sources":["../../../src/core/requests/expire-requests.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAMhD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAiD;IACpF,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5E,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;gBAChG,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Actor } from '../actors/authenticate-actor.js';
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 { PendingRequest, PendingRequests } from './ports.js';
6
+ export type ListMine = (actor: Actor) => Promise<Result<PendingRequest[], DomainError<'NOT_AN_ACCOUNT'>>>;
7
+ /**
8
+ * Use case: the requests an account asked, in any state, the newest first
9
+ * (decision 0056: Your requests on the overview). One still pending past its
10
+ * 7 days reads as expired, as the store marks it only when it is next
11
+ * opened. Only an account asks, so any other actor has none.
12
+ */
13
+ export declare function createListMine(deps: {
14
+ requests: PendingRequests;
15
+ clock: Clock;
16
+ }): ListMine;
@@ -0,0 +1,20 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { stateAt } from './request-state.js';
4
+ /**
5
+ * Use case: the requests an account asked, in any state, the newest first
6
+ * (decision 0056: Your requests on the overview). One still pending past its
7
+ * 7 days reads as expired, as the store marks it only when it is next
8
+ * opened. Only an account asks, so any other actor has none.
9
+ */
10
+ export function createListMine(deps) {
11
+ return async (actor) => {
12
+ if (actor.kind !== 'account') {
13
+ return refuse('NOT_AN_ACCOUNT', 'Only a person signed in to the gateway has requests of their own');
14
+ }
15
+ const now = deps.clock.now();
16
+ const mine = await deps.requests.listMine(actor.fleetId, actor.accountId);
17
+ return ok(mine.map((request) => ({ ...request, state: stateAt(request, now) })));
18
+ };
19
+ }
20
+ //# sourceMappingURL=list-mine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-mine.js","sourceRoot":"","sources":["../../../src/core/requests/list-mine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiD;IAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,gBAAgB,EAAE,kEAAkE,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1E,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Actor } from '../actors/authenticate-actor.js';
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 { PendingRequest, PendingRequests } from './ports.js';
6
+ export type ListToDecide = (actor: Actor) => Promise<Result<PendingRequest[], DomainError<'NOT_AN_APPROVER'>>>;
7
+ /** Use case: every open request of the fleet, for an actor holding gateway:approve (decision 0056: To decide on the overview). */
8
+ export declare function createListToDecide(deps: {
9
+ requests: PendingRequests;
10
+ clock: Clock;
11
+ }): ListToDecide;
@@ -0,0 +1,13 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { APPROVING_SCOPE } from './decide-request.js';
4
+ /** Use case: every open request of the fleet, for an actor holding gateway:approve (decision 0056: To decide on the overview). */
5
+ export function createListToDecide(deps) {
6
+ return async (actor) => {
7
+ if (!actor.scopes.includes(APPROVING_SCOPE)) {
8
+ return refuse('NOT_AN_APPROVER', `Deciding requests needs ${APPROVING_SCOPE}`);
9
+ }
10
+ return ok(await deps.requests.listOpen(actor.fleetId, deps.clock.now()));
11
+ };
12
+ }
13
+ //# sourceMappingURL=list-to-decide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-to-decide.js","sourceRoot":"","sources":["../../../src/core/requests/list-to-decide.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAKtD,kIAAkI;AAClI,MAAM,UAAU,kBAAkB,CAAC,IAAiD;IAClF,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,eAAe,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3E,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 { PendingRequest, PendingRequests, RequestIds, Requester, RequestSubject } from './ports.js';
4
+ /** How long a request is kept before it expires (decision 0056, Thomas). */
5
+ export declare const REQUEST_LIFETIME_MS: number;
6
+ export type OpenRequest = (asked: {
7
+ fleetId: FleetId;
8
+ subject: RequestSubject;
9
+ requester: Requester;
10
+ }) => Promise<PendingRequest>;
11
+ /**
12
+ * Use case: an account asks for an outside party (decision 0056). The one
13
+ * place a request opens, so who may ask is decided here alone (Thomas's
14
+ * question A): a signed-in account in the fleet, for now. A second request
15
+ * for the same client or server joins the one open.
16
+ */
17
+ export declare function createOpenRequest(deps: {
18
+ requests: PendingRequests;
19
+ ids: RequestIds;
20
+ clock: Clock;
21
+ }): OpenRequest;