@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,263 @@
1
+ /**
2
+ * The gateway's pages in direction B, Signal (design/gateway-pages), drawn
3
+ * with the operator console's tokens: one large shape leads each page, a
4
+ * ring for a state or a count. The tokens are the console's own
5
+ * (aeolus-fleet packages/console/app/tokens.css), light by default and dark
6
+ * where the browser asks for it, as the pages have no theme switch.
7
+ */
8
+ import { escaped } from './html.js';
9
+ const LIGHT_TOKENS = `--background:oklch(0.99 0.002 247);--card:oklch(1 0 0);--muted:oklch(0.967 0.005 247);--secondary:oklch(0.955 0.007 247);--accent:oklch(0.95 0.009 247);
10
+ --foreground:oklch(0.22 0.02 257);--muted-foreground:oklch(0.5 0.02 257);--border:oklch(0.912 0.008 247);--input:oklch(0.885 0.01 247);--ring:oklch(0.56 0.12 257);
11
+ --primary:oklch(0.34 0.08 257);--primary-hover:oklch(0.29 0.075 257);--primary-foreground:oklch(0.985 0.003 247);--destructive:oklch(0.53 0.2 27);--destructive-foreground:oklch(0.99 0 0);
12
+ --tone-waiting-bg:oklch(0.965 0.045 85);--tone-waiting-fg:oklch(0.47 0.1 62);--tone-waiting-border:oklch(0.87 0.08 80);
13
+ --tone-active-bg:oklch(0.955 0.03 250);--tone-active-fg:oklch(0.45 0.14 257);--tone-active-border:oklch(0.86 0.06 252);
14
+ --tone-ok-bg:oklch(0.96 0.04 155);--tone-ok-fg:oklch(0.44 0.1 155);--tone-ok-border:oklch(0.86 0.07 155);
15
+ --tone-attention-bg:oklch(0.957 0.028 25);--tone-attention-fg:oklch(0.5 0.19 27);--tone-attention-border:oklch(0.86 0.07 25);
16
+ --tone-ended-bg:oklch(0.957 0.005 247);--tone-ended-fg:oklch(0.47 0.015 257);--tone-ended-border:oklch(0.87 0.01 247);
17
+ --shadow-sm:0 1px 2px oklch(0.2 0.02 257 / 0.06);`;
18
+ const DARK_TOKENS = `color-scheme:dark;--background:oklch(0.172 0.012 257);--card:oklch(0.2 0.013 257);--muted:oklch(0.228 0.012 257);--secondary:oklch(0.255 0.013 257);--accent:oklch(0.26 0.014 257);
19
+ --foreground:oklch(0.955 0.005 247);--muted-foreground:oklch(0.72 0.016 257);--border:oklch(0.29 0.014 257);--input:oklch(0.34 0.015 257);--ring:oklch(0.7 0.1 252);
20
+ --primary:oklch(0.86 0.055 250);--primary-hover:oklch(0.92 0.035 250);--primary-foreground:oklch(0.21 0.035 257);--destructive:oklch(0.56 0.19 25);--destructive-foreground:oklch(0.99 0 0);
21
+ --tone-waiting-bg:oklch(0.29 0.055 72);--tone-waiting-fg:oklch(0.87 0.11 82);--tone-waiting-border:oklch(0.41 0.075 72);
22
+ --tone-active-bg:oklch(0.29 0.06 257);--tone-active-fg:oklch(0.85 0.08 252);--tone-active-border:oklch(0.42 0.09 257);
23
+ --tone-ok-bg:oklch(0.29 0.05 155);--tone-ok-fg:oklch(0.86 0.1 155);--tone-ok-border:oklch(0.41 0.07 155);
24
+ --tone-attention-bg:oklch(0.3 0.07 25);--tone-attention-fg:oklch(0.84 0.09 25);--tone-attention-border:oklch(0.45 0.11 25);
25
+ --tone-ended-bg:oklch(0.255 0.01 257);--tone-ended-fg:oklch(0.78 0.015 257);--tone-ended-border:oklch(0.36 0.012 257);
26
+ --shadow-sm:0 1px 2px oklch(0 0 0 / 0.3);`;
27
+ const STYLE = `
28
+ :root { color-scheme: light; ${LIGHT_TOKENS} --font-sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; --font-mono: "Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 10px; }
29
+ @media (prefers-color-scheme: dark) { :root { ${DARK_TOKENS} } }
30
+ * { box-sizing: border-box; }
31
+ body { margin: 0; font: 14px/20px var(--font-sans); color: var(--foreground); background: var(--background); }
32
+ a { color: inherit; }
33
+ .top { display: flex; align-items: center; gap: 16px; height: 56px; padding: 0 16px; border-bottom: 1px solid var(--border); }
34
+ .mark { display: flex; align-items: center; gap: 8px; font-weight: 600; text-decoration: none; }
35
+ .tabs { display: flex; gap: 4px; }
36
+ .tab { display: flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border-radius: var(--radius-sm); color: var(--muted-foreground); text-decoration: none; }
37
+ .tab[aria-current="page"] { color: var(--foreground); background: var(--secondary); }
38
+ main { max-width: 720px; margin: 0 auto; padding: 32px 16px; display: grid; gap: 24px; }
39
+ .lead { display: flex; align-items: center; gap: 20px; }
40
+ .lead h1 { margin: 0; font-size: 22px; line-height: 28px; font-weight: 600; }
41
+ .ring { flex: none; }
42
+ .card { display: grid; gap: 12px; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); box-shadow: var(--shadow-sm); }
43
+ .card h2 { margin: 0; font-size: 15px; line-height: 20px; font-weight: 600; }
44
+ .card p { margin: 0; }
45
+ .muted { color: var(--muted-foreground); }
46
+ .badge { display: inline-flex; align-items: center; gap: 4px; padding: 0 6px; height: 20px; border: 1px solid; border-radius: var(--radius-sm); font-size: 12px; font-weight: 500; }
47
+ .tone-waiting { color: var(--tone-waiting-fg); background: var(--tone-waiting-bg); border-color: var(--tone-waiting-border); }
48
+ .tone-active { color: var(--tone-active-fg); background: var(--tone-active-bg); border-color: var(--tone-active-border); }
49
+ .tone-ok { color: var(--tone-ok-fg); background: var(--tone-ok-bg); border-color: var(--tone-ok-border); }
50
+ .tone-attention { color: var(--tone-attention-fg); background: var(--tone-attention-bg); border-color: var(--tone-attention-border); }
51
+ .tone-ended { color: var(--tone-ended-fg); background: var(--tone-ended-bg); border-color: var(--tone-ended-border); }
52
+ .actions { display: flex; flex-wrap: wrap; gap: 8px; }
53
+ form { margin: 0; }
54
+ button, .button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 36px; padding: 0 14px; border: 1px solid var(--input); border-radius: var(--radius-md); font: inherit; font-weight: 500; color: var(--foreground); background: var(--card); text-decoration: none; cursor: pointer; }
55
+ button.primary, .button.primary { color: var(--primary-foreground); background: var(--primary); border-color: var(--primary); }
56
+ button.primary:hover, .button.primary:hover { background: var(--primary-hover); }
57
+ button.destructive { color: var(--destructive-foreground); background: var(--destructive); border-color: var(--destructive); }
58
+ button:focus-visible, .button:focus-visible, .tab:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
59
+ .alert { border-width: 1px; border-style: solid; }
60
+ .party-mark { display: inline-flex; align-items: center; justify-content: center; flex: none; width: 40px; height: 40px; border-radius: var(--radius-md); background: var(--secondary); border: 1px solid var(--border); font: 600 13px/1 var(--font-mono); }
61
+ .handshake { display: flex; align-items: center; justify-content: center; gap: 12px; }
62
+ .handshake figure { margin: 0; display: grid; justify-items: center; gap: 4px; font-size: 12px; }
63
+ .fleet-mark { display: inline-flex; }
64
+ .split { display: grid; gap: 24px; grid-template-columns: minmax(0, 1fr); }
65
+ @media (min-width: 900px) { main.wide { max-width: 1040px; } .split { grid-template-columns: minmax(0, 1fr) 280px; } }
66
+ .queue { display: grid; gap: 8px; align-content: start; }
67
+ .queue h2 { margin: 0; font-size: 12px; font-weight: 500; color: var(--muted-foreground); }
68
+ .item { display: flex; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); text-decoration: none; }
69
+ .item[aria-current="true"] { border-color: var(--primary); }
70
+ .item .text { display: grid; min-width: 0; flex: 1; } .item .text span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
71
+ .tag { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--muted-foreground); }
72
+ .mono { font-family: var(--font-mono); font-size: 12px; }
73
+ .field { display: grid; gap: 4px; } .field > span { font-size: 13px; font-weight: 500; }
74
+ input[type="text"], input[type="password"], input[type="number"], input[type="url"], select { height: 36px; padding: 0 10px; border: 1px solid var(--input); border-radius: var(--radius-md); background: var(--background); color: var(--foreground); font: inherit; }
75
+ .scope { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 1px solid var(--border); border-radius: var(--radius-md); }
76
+ .scope .label { flex: 1; }
77
+ .scopes { display: grid; gap: 6px; }
78
+ fieldset { border: 0; margin: 0; padding: 0; display: grid; gap: 8px; }
79
+ legend { font-size: 13px; font-weight: 500; padding: 0; margin-bottom: 4px; }
80
+ main.centred { max-width: 440px; min-height: 100vh; align-content: center; justify-items: center; text-align: center; }
81
+ main.centred > * { width: 100%; } main.centred p, main.centred h1 { margin: 0; } main.centred { gap: 16px; }
82
+ main.centred > .mark, main.centred > .ring, main.centred > .badge { width: auto; }
83
+ .tiles { display: grid; gap: 12px; grid-template-columns: 1fr 1fr; }
84
+ @media (max-width: 480px) { .tiles { grid-template-columns: 1fr; } }
85
+ .tile { display: grid; gap: 4px; justify-items: center; align-content: center; height: auto; min-height: 112px; padding: 16px; border-radius: var(--radius-lg); text-align: center; }
86
+ .tile:hover { border-color: var(--primary); }
87
+ .going-on { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--muted-foreground); }
88
+ .going-on::before { content: ""; width: 8px; height: 8px; border-radius: 50%; background: var(--tone-ok-fg); }
89
+ .tab { white-space: nowrap; }
90
+ @media (max-width: 480px) { .top .label { display: none; } .top { gap: 8px; } }
91
+ .sign-out { margin-left: auto; } .sign-out button { height: 32px; border: 0; background: transparent; color: var(--muted-foreground); }
92
+ .answers { display: grid; gap: 8px; } .answers button { height: 44px; }
93
+ button.pick { outline: 2px dashed var(--ring); outline-offset: 2px; }
94
+ .payload { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font: inherit; }
95
+ textarea { padding: 8px 10px; border: 1px solid var(--input); border-radius: var(--radius-md); background: var(--background); color: var(--foreground); font: inherit; resize: vertical; }
96
+ form > button.item { width: 100%; height: auto; justify-content: flex-start; text-align: left; font-weight: 400; }
97
+ .live-status { position: fixed; right: 16px; bottom: 16px; margin: 0; }
98
+ .party-cards { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
99
+ .party-card { color: inherit; text-decoration: none; display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px 12px; padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); }
100
+ .party-card:hover { border-color: var(--ring, var(--primary)); }
101
+ .party-card .text { display: grid; min-width: 0; } .party-card .text > span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
102
+ .party-card .facts { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
103
+ .tag.protocol { padding: 0 4px; border: 1px solid var(--border); border-radius: var(--radius-sm); font: 600 10px/16px var(--font-mono); color: var(--foreground); }
104
+ .back { display: inline-flex; align-items: center; gap: 6px; color: var(--primary); text-decoration: none; font-size: 14px; }
105
+ .party-head { display: grid; justify-items: center; gap: 8px; }
106
+ .party-head .facts { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; }
107
+ .fact-rows { margin: 0; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--card); }
108
+ .fact-rows > div { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border); }
109
+ .fact-rows > div:first-child { border-top: 0; }
110
+ .fact-rows dt { display: inline-flex; align-items: center; gap: 8px; color: var(--muted-foreground); font-size: 13px; }
111
+ .fact-rows dd { margin: 0; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 4px; min-width: 0; overflow-wrap: anywhere; text-align: right; }
112
+ .fact-rows dd a { margin-left: 8px; color: var(--primary); font-size: 13px; font-weight: 500; text-decoration: none; }
113
+ .steps { margin: 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; font-size: 12px; color: var(--muted-foreground); }
114
+ .steps li { padding-top: 8px; border-top: 4px solid var(--border); }
115
+ .steps li.done { border-top-color: var(--primary); color: var(--foreground); }
116
+ .split-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
117
+ .split-heading > span:first-child { display: inline-flex; align-items: center; gap: 8px; }
118
+ .count { color: var(--muted-foreground); font-weight: 500; }
119
+ .tool-rows { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; width: 100%; text-align: left; }
120
+ .tool-rows li { display: grid; gap: 2px; padding: 8px 0; border-top: 1px solid var(--border); }
121
+ .consequences { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; }
122
+ .consequences li { display: flex; align-items: center; gap: 8px; }
123
+ .counts { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; margin: 4px 0 0; }
124
+ @media (max-width: 640px) { .actions > * { flex: 1; } button, .button { height: 44px; width: 100%; } }
125
+ `;
126
+ const ICON_PATHS = {
127
+ plug: '<path d="M12 22v-5"/><path d="M9 8V2"/><path d="M15 8V2"/><path d="M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z"/>',
128
+ power: '<path d="M12 2v10"/><path d="M18.4 6.6a9 9 0 1 1-12.77.04"/>',
129
+ powerOff: '<path d="M18.36 6.64A9 9 0 0 1 20.77 15"/><path d="M6.16 6.16a9 9 0 1 0 12.68 12.68"/><path d="M12 2v4"/><path d="m2 2 20 20"/>',
130
+ alert: '<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/>',
131
+ signIn: '<path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/><path d="m10 17 5-5-5-5"/><path d="M15 12H3"/>',
132
+ house: '<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/><path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>',
133
+ hourglass: '<path d="M5 22h14"/><path d="M5 2h14"/><path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22"/><path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2"/>',
134
+ check: '<path d="M20 6 9 17l-5-5"/>',
135
+ x: '<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',
136
+ ban: '<circle cx="12" cy="12" r="10"/><path d="m4.9 4.9 14.2 14.2"/>',
137
+ lock: '<rect width="18" height="11" x="3" y="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>',
138
+ server: '<rect width="20" height="8" x="2" y="2" rx="2" ry="2"/><rect width="20" height="8" x="2" y="14" rx="2" ry="2"/><path d="M6 6h.01"/><path d="M6 18h.01"/>',
139
+ laptop: '<path d="M18 5a2 2 0 0 1 2 2v8.526a2 2 0 0 0 .212.897l1.068 2.127a1 1 0 0 1-.9 1.45H3.62a1 1 0 0 1-.9-1.45l1.068-2.127A2 2 0 0 0 4 15.526V7a2 2 0 0 1 2-2z"/><path d="M20.054 15.987H3.946"/>',
140
+ arrowLeftRight: '<path d="M8 3 4 7l4 4"/><path d="M4 7h16"/><path d="m16 21 4-4-4-4"/><path d="M20 17H4"/>',
141
+ signOut: '<path d="m16 17 5-5-5-5"/><path d="M21 12H9"/><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/>',
142
+ shieldX: '<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/><path d="m14.5 9.5-5 5"/><path d="m9.5 9.5 5 5"/>',
143
+ timerOff: '<path d="M10 2h4"/><path d="M4.6 11a8 8 0 0 0 1.7 8.7 8 8 0 0 0 8.7 1.7"/><path d="M7.4 7.4a8 8 0 0 1 10.3 1 8 8 0 0 1 .9 10.2"/><path d="m2 2 20 20"/><path d="M12 12v-2"/>',
144
+ archive: '<rect width="20" height="5" x="2" y="3" rx="1"/><path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8"/><path d="M10 12h4"/>',
145
+ arrowLeft: '<path d="m12 19-7-7 7-7"/><path d="M19 12H5"/>',
146
+ ship: '<path d="M12 10.189V14"/><path d="M12 2v3"/><path d="M19 13V7a2 2 0 0 0-2-2H7a2 2 0 0 0-2 2v6"/><path d="M19.38 20A11.6 11.6 0 0 0 21 14l-8.188-3.639a2 2 0 0 0-1.624 0L3 14a11.6 11.6 0 0 0 2.81 7.76"/><path d="M2 21c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/>',
147
+ shield: '<path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/>',
148
+ users: '<path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/>',
149
+ };
150
+ export function icon(name, size = 16) {
151
+ return `<svg width="${size}" height="${size}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${ICON_PATHS[name]}</svg>`;
152
+ }
153
+ /** A status as the console shows it: its tone, an icon and a label, never colour alone. */
154
+ export function statusBadge(status) {
155
+ return `<span class="badge tone-${status.tone}">${icon(status.icon, 12)}${escaped(status.label)}</span>`;
156
+ }
157
+ /** The app mark from aeolus-fleet brand/aeolus-mark.svg: the Ship glyph on a tile in --primary, its stroke in --primary-foreground. */
158
+ const MARK = `<svg width="24" height="24" viewBox="0 0 32 32" aria-hidden="true"><rect width="32" height="32" rx="7" fill="var(--primary)"/><g fill="none" stroke="var(--primary-foreground)" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" transform="translate(6 6) scale(0.8333)"><path d="M12 2v2"/><path d="M12 9.189V13"/><path d="M19 12V6a2 2 0 00-2-2H7a2 2 0 00-2 2v6"/><path d="M19.38 19A11.6 11.6 0 0021 13l-8.188-3.639a2 2 0 00-1.624 0L3 13.001a11.6 11.6 0 002.81 7.76"/><path d="M2 20c.6.5 1.2 1 2.5 1 2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1s1.2 1 2.5 1c2.5 0 2.5-2 5-2 1.3 0 1.9.5 2.5 1"/></g></svg>`;
159
+ const MARK_LARGE = MARK.replace('width="24" height="24"', 'width="40" height="40"');
160
+ const RING_SIZE = 96;
161
+ const RING_STROKE = 6;
162
+ /** The large shape that leads a page: a full ring in a tone, dashed for a state that ended, around an icon or a number. */
163
+ export function ring(shown) {
164
+ const size = shown.size ?? RING_SIZE;
165
+ const radius = (size - RING_STROKE) / 2;
166
+ const middle = size / 2;
167
+ const dash = shown.isDashed === true ? ' stroke-dasharray="4 6"' : '';
168
+ const iconSize = Math.round(size * 0.3);
169
+ let center;
170
+ if ('count' in shown.center) {
171
+ center = `<text x="${middle}" y="${middle}" text-anchor="middle" dominant-baseline="central" font-size="28" font-weight="600" fill="currentColor">${shown.center.count}</text>`;
172
+ }
173
+ else if ('text' in shown.center) {
174
+ // An icon above a short text, such as the time left; the page may update the text.
175
+ center = `<foreignObject x="${middle - 14}" y="${middle - 34}" width="28" height="28"><div xmlns="http://www.w3.org/1999/xhtml" style="color:var(--tone-${shown.tone}-fg)">${icon(shown.center.icon, 24)}</div></foreignObject><text x="${middle}" y="${middle + 10}" text-anchor="middle" dominant-baseline="central" font-size="22" font-weight="600" fill="currentColor" data-time-left>${escaped(shown.center.text)}</text><text x="${middle}" y="${middle + 34}" text-anchor="middle" font-size="12" fill="var(--muted-foreground)">left</text>`;
176
+ }
177
+ else {
178
+ center = `<foreignObject x="${middle - iconSize / 2}" y="${middle - iconSize / 2}" width="${iconSize}" height="${iconSize}"><div xmlns="http://www.w3.org/1999/xhtml" style="color:var(--tone-${shown.tone}-fg)">${icon(shown.center.icon, iconSize)}</div></foreignObject>`;
179
+ }
180
+ return `<svg class="ring" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}" role="img" aria-label="${escaped(shown.label)}"><circle cx="${middle}" cy="${middle}" r="${radius}" fill="none" stroke="var(--tone-${shown.tone}-fg)" stroke-width="${RING_STROKE}"${dash}/>${center}</svg>`;
181
+ }
182
+ /** An outside party's mark: the first two letters of its name on a tile, as the console's Avatar draws a ship. */
183
+ export function partyMark(name) {
184
+ return `<span class="party-mark" aria-hidden="true">${escaped(name.replaceAll(/[^\p{L}\p{N}]/gu, '').slice(0, 2).toUpperCase())}</span>`;
185
+ }
186
+ /** Who meets whom: the outside party's mark and the fleet's, side by side. */
187
+ export function handshake(party) {
188
+ return `<div class="handshake"><figure>${partyMark(party.name)}<figcaption>${escaped(party.name)}</figcaption></figure><span class="muted">${icon('arrowLeftRight', 16)}</span><figure><span class="fleet-mark">${MARK_LARGE}</span><figcaption>${escaped(party.fleet ?? 'Fleet')}</figcaption></figure></div>`;
189
+ }
190
+ const TABS = {
191
+ overview: { label: 'Overview', icon: 'house', href: '/overview' },
192
+ outsideParties: { label: 'Outside parties', icon: 'plug', href: '/outside-parties' },
193
+ };
194
+ function topBar(current, isSignedIn) {
195
+ const tabs = Object.entries(TABS)
196
+ .map(([tab, shown]) => `<a class="tab" href="${shown.href}" aria-label="${escaped(shown.label)}"${tab === current ? ' aria-current="page"' : ''}>${icon(shown.icon, 14)}<span class="label">${escaped(shown.label)}</span></a>`)
197
+ .join('');
198
+ // A person signed in to the pages signs out here; a console session signs out in the console.
199
+ const signOut = isSignedIn ? `<form method="post" action="/sign-out" class="sign-out"><button aria-label="Sign out">${icon('signOut', 14)}<span class="label">Sign out</span></button></form>` : '';
200
+ return `<header class="top"><a class="mark" href="/overview">${MARK}Aeolus</a><nav class="tabs">${tabs}</nav>${signOut}</header>`;
201
+ }
202
+ /** What a signed-out caller is shown: why, and the one way to sign in, coming back to the page they asked for. */
203
+ export function signInPrompt(shown) {
204
+ if (shown.way === 'none') {
205
+ return `<section class="card"><h2>This gateway signs no one in</h2><p class="muted">Its pages are for people signed in through pagasae, which its operator has not set.</p></section>`;
206
+ }
207
+ const link = `<a class="button" href="/sign-in?${new URLSearchParams({ return_to: shown.returnTo }).toString().replaceAll('&', '&amp;')}">${icon('signIn', 14)}Sign in</a>`;
208
+ return `<section class="card"><h2>${escaped(shown.message)}</h2><div class="actions">${link}</div></section>`;
209
+ }
210
+ /**
211
+ * What a live page runs: it opens /live for itself and swaps in each section
212
+ * it is sent; when the socket drops it shows Reconnecting and opens again
213
+ * with backoff, never for a refusal (4401 to 4404). Every minute it counts
214
+ * each days left down from its expiry, with no call to the gateway.
215
+ */
216
+ const LIVE_SCRIPT = `(function (query) {
217
+ var DAY = 86400000, wait = 500, status = document.querySelector('[data-live-status]');
218
+ function countDown() {
219
+ document.querySelectorAll('[data-expires-at]').forEach(function (holder) {
220
+ var badge = holder.querySelector('.badge'), label = badge && badge.lastChild;
221
+ if (!label) return;
222
+ var days = Math.ceil((Date.parse(holder.getAttribute('data-expires-at')) - Date.now()) / DAY);
223
+ badge.className = 'badge ' + (days <= 0 ? 'tone-ended' : days <= 1 ? 'tone-attention' : 'tone-waiting');
224
+ label.textContent = days <= 0 ? 'Expired' : days <= 1 ? 'Last day' : days + ' d left';
225
+ });
226
+ }
227
+ function open() {
228
+ var socket = new WebSocket((location.protocol === 'https:' ? 'wss://' : 'ws://') + location.host + '/live?' + query);
229
+ socket.onopen = function () { wait = 500; status.hidden = true; };
230
+ socket.onmessage = function (event) {
231
+ var sections = JSON.parse(event.data).sections;
232
+ Object.keys(sections).forEach(function (name) {
233
+ var section = document.querySelector('[data-live="' + name + '"]');
234
+ if (section) section.innerHTML = sections[name];
235
+ });
236
+ countDown();
237
+ };
238
+ socket.onclose = function (event) {
239
+ if (event.code >= 4401 && event.code <= 4404) return;
240
+ status.hidden = false;
241
+ setTimeout(open, wait);
242
+ wait = Math.min(wait * 2, 10000);
243
+ };
244
+ }
245
+ open();
246
+ setInterval(countDown, 60000);
247
+ })(document.currentScript.getAttribute('data-live-query'));`;
248
+ /**
249
+ * A page a person meets on their way in, from an outside MCP client: the
250
+ * mark and its name above one centred column, no tabs. Its own script, if
251
+ * any, comes with its body.
252
+ */
253
+ export function signInPage(page) {
254
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escaped(page.title)}</title><style>${STYLE}</style></head><body><main class="centred"><div class="mark">${MARK}Aeolus</div>${page.body}</main></body></html>`;
255
+ }
256
+ /** A whole Signal page: the top bar with its tabs, then the page's own body; a live page names itself to the live channel. */
257
+ export function signalPage(page) {
258
+ const live = page.live === undefined
259
+ ? ''
260
+ : `<p data-live-status hidden class="live-status">${statusBadge({ tone: 'waiting', icon: 'hourglass', label: 'Reconnecting' })}</p><script data-live-query="${escaped(page.live)}">${LIVE_SCRIPT}</script>`;
261
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>${escaped(page.title)}</title><style>${STYLE}</style></head><body>${topBar(page.tab, page.isSignedIn === true)}<main${page.isWide === true ? ' class="wide"' : ''}>${page.body}</main>${live}</body></html>`;
262
+ }
263
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/adapters/http/signal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,YAAY,GAAG;;;;;;;;kDAQ6B,CAAC;AAEnD,MAAM,WAAW,GAAG;;;;;;;;0CAQsB,CAAC;AAE3C,MAAM,KAAK,GAAG;+BACiB,YAAY;gDACK,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgG1D,CAAC;AAQF,MAAM,UAAU,GAAyB;IACvC,IAAI,EAAE,iHAAiH;IACvH,KAAK,EAAE,8DAA8D;IACrE,QAAQ,EAAE,iIAAiI;IAC3I,KAAK,EAAE,+HAA+H;IACtI,MAAM,EAAE,qGAAqG;IAC7G,KAAK,EAAE,iLAAiL;IACxL,SAAS,EAAE,kNAAkN;IAC7N,KAAK,EAAE,6BAA6B;IACpC,CAAC,EAAE,8CAA8C;IACjD,GAAG,EAAE,gEAAgE;IACrE,IAAI,EAAE,+FAA+F;IACrG,MAAM,EAAE,0JAA0J;IAClK,MAAM,EAAE,+LAA+L;IACvM,cAAc,EAAE,2FAA2F;IAC3G,OAAO,EAAE,mGAAmG;IAC5G,OAAO,EAAE,iOAAiO;IAC1O,QAAQ,EAAE,8KAA8K;IACxL,OAAO,EAAE,0HAA0H;IACnI,SAAS,EAAE,gDAAgD;IAC3D,IAAI,EAAE,6TAA6T;IACnU,MAAM,EAAE,gLAAgL;IACxL,KAAK,EAAE,+JAA+J;CACvK,CAAC;AAEF,MAAM,UAAU,IAAI,CAAC,IAAU,EAAE,IAAI,GAAG,EAAE;IACxC,OAAO,eAAe,IAAI,aAAa,IAAI,8IAA8I,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpN,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,MAAiD;IAC3E,OAAO,2BAA2B,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;AAC3G,CAAC;AAED,uIAAuI;AACvI,MAAM,IAAI,GAAG,8lBAA8lB,CAAC;AAE5mB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,wBAAwB,CAAC,CAAC;AAEpF,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,2HAA2H;AAC3H,MAAM,UAAU,IAAI,CAAC,KAAkJ;IACrK,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACxC,IAAI,MAAc,CAAC;IACnB,IAAI,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,YAAY,MAAM,QAAQ,MAAM,2GAA2G,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;IAClL,CAAC;SAAM,IAAI,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,mFAAmF;QACnF,MAAM,GAAG,qBAAqB,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,8FAA8F,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,kCAAkC,MAAM,QAAQ,MAAM,GAAG,EAAE,0HAA0H,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,QAAQ,MAAM,GAAG,EAAE,kFAAkF,CAAC;IACxhB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,qBAAqB,MAAM,GAAG,QAAQ,GAAG,CAAC,QAAQ,MAAM,GAAG,QAAQ,GAAG,CAAC,YAAY,QAAQ,aAAa,QAAQ,uEAAuE,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,wBAAwB,CAAC;IAC/Q,CAAC;IACD,OAAO,4BAA4B,IAAI,aAAa,IAAI,kBAAkB,IAAI,IAAI,IAAI,4BAA4B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,MAAM,SAAS,MAAM,QAAQ,MAAM,oCAAoC,KAAK,CAAC,IAAI,uBAAuB,WAAW,IAAI,IAAI,KAAK,MAAM,QAAQ,CAAC;AACxS,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,+CAA+C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;AAC3I,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,SAAS,CAAC,KAAuC;IAC/D,OAAO,kCAAkC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,2CAA2C,UAAU,sBAAsB,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,8BAA8B,CAAC;AAClT,CAAC;AAKD,MAAM,IAAI,GAA6D;IACrE,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;IACjE,cAAc,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE;CACrF,CAAC;AAEF,SAAS,MAAM,CAAC,OAAwB,EAAE,UAAmB;IAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,wBAAwB,KAAK,CAAC,IAAI,iBAAiB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;SAC/N,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,8FAA8F;IAC9F,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,yFAAyF,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,qDAAqD,CAAC,CAAC,CAAC,EAAE,CAAC;IACpM,OAAO,wDAAwD,IAAI,+BAA+B,IAAI,SAAS,OAAO,WAAW,CAAC;AACpI,CAAC;AAKD,kHAAkH;AAClH,MAAM,UAAU,YAAY,CAAC,KAA4D;IACvF,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,+KAA+K,CAAC;IACzL,CAAC;IACD,MAAM,IAAI,GAAG,oCAAoC,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC;IAC5K,OAAO,6BAA6B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,6BAA6B,IAAI,kBAAkB,CAAC;AAChH,CAAC;AAED;;;;;GAKG;AACH,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DA+BwC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAqC;IAC9D,OAAO,yIAAyI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,KAAK,gEAAgE,IAAI,eAAe,IAAI,CAAC,IAAI,uBAAuB,CAAC;AAChT,CAAC;AAED,8HAA8H;AAC9H,MAAM,UAAU,UAAU,CAAC,IAAuG;IAChI,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,KAAK,SAAS;QACrB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,kDAAkD,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,WAAW,WAAW,CAAC;IAChN,OAAO,yIAAyI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,KAAK,wBAAwB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,UAAU,IAAI,gBAAgB,CAAC;AAC7V,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The version this gateway process runs, read from its package.json: what
3
+ * runs, not what a deploy meant to ship. This file sits at src/adapters/http
4
+ * or dist/adapters/http: the package root is three levels up.
5
+ */
6
+ export declare function runningVersion(): string;
@@ -0,0 +1,12 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { z } from 'zod';
3
+ const packageJson = z.object({ version: z.string() });
4
+ /**
5
+ * The version this gateway process runs, read from its package.json: what
6
+ * runs, not what a deploy meant to ship. This file sits at src/adapters/http
7
+ * or dist/adapters/http: the package root is three levels up.
8
+ */
9
+ export function runningVersion() {
10
+ return packageJson.parse(JSON.parse(readFileSync(new URL('../../../package.json', import.meta.url), 'utf8'))).version;
11
+ }
12
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/adapters/http/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACxH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServers } from '../../core/mcp-out/ports.js';
2
+ export declare function createMcpServers(): McpServers;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * The outside MCP servers, over Streamable HTTP with the official SDK. One
3
+ * connection per listing or call, as MCP 2026-07-28 keeps no session. A
4
+ * failure reads as where it happened: before the call left the gateway
5
+ * (notSent, nothing ran) or after (unanswered, it may have run), so the core
6
+ * decides whether it may hand the call again (interop 5.2).
7
+ */
8
+ import { Client, ClientCredentialsProvider, ProtocolError, SdkError, SdkErrorCode, SdkHttpError, StreamableHTTPClientTransport, UnauthorizedError, } from '@modelcontextprotocol/client';
9
+ import { z } from 'zod';
10
+ import { err, ok } from '../../core/shared/result.js';
11
+ /** How the gateway names itself to outside MCP servers. */
12
+ const CLIENT_INFO = { name: 'aeolus-gateway', version: '1' };
13
+ /** HTTP statuses that refuse the gateway's credential: the server ran nothing. */
14
+ const HTTP_UNAUTHORIZED = 401;
15
+ const HTTP_FORBIDDEN = 403;
16
+ const jsonObject = z.record(z.string(), z.unknown());
17
+ const toolAnnotations = z.object({
18
+ title: z.string().optional(),
19
+ readOnlyHint: z.boolean().optional(),
20
+ destructiveHint: z.boolean().optional(),
21
+ idempotentHint: z.boolean().optional(),
22
+ openWorldHint: z.boolean().optional(),
23
+ });
24
+ const listedTool = z.object({
25
+ name: z.string(),
26
+ title: z.string().optional(),
27
+ description: z.string().optional(),
28
+ inputSchema: jsonObject,
29
+ outputSchema: jsonObject.optional(),
30
+ annotations: toolAnnotations.optional(),
31
+ });
32
+ const callResult = z.object({
33
+ content: z.array(z.unknown()).default([]),
34
+ structuredContent: jsonObject.optional(),
35
+ isError: z.boolean().optional(),
36
+ });
37
+ function transportFor(connection) {
38
+ const url = new URL(connection.url);
39
+ const { credential } = connection;
40
+ switch (credential.kind) {
41
+ case 'bearer':
42
+ return new StreamableHTTPClientTransport(url, { requestInit: { headers: { authorization: `Bearer ${credential.token}` } } });
43
+ case 'clientCredentials':
44
+ return new StreamableHTTPClientTransport(url, {
45
+ authProvider: new ClientCredentialsProvider({
46
+ clientId: credential.clientId,
47
+ clientSecret: credential.clientSecret,
48
+ expectedIssuer: credential.issuer,
49
+ ...(credential.scope === undefined ? {} : { scope: credential.scope }),
50
+ }),
51
+ });
52
+ }
53
+ }
54
+ async function connected(connection) {
55
+ const client = new Client(CLIENT_INFO, { versionNegotiation: { mode: 'auto' } });
56
+ await client.connect(transportFor(connection));
57
+ return client;
58
+ }
59
+ function reasonOf(error) {
60
+ return error instanceof Error ? error.message : String(error);
61
+ }
62
+ /** The server refused the gateway's credential, or could not be reached: the request did not run. */
63
+ function isNotSent(error) {
64
+ if (error instanceof UnauthorizedError) {
65
+ return true;
66
+ }
67
+ if (error instanceof SdkHttpError) {
68
+ return error.status === HTTP_UNAUTHORIZED || error.status === HTTP_FORBIDDEN;
69
+ }
70
+ if (error instanceof SdkError) {
71
+ return error.code === SdkErrorCode.SendFailed && isConnectionRefused(error.cause);
72
+ }
73
+ return error instanceof TypeError && isConnectionRefused(error.cause);
74
+ }
75
+ const systemError = z.object({ code: z.string() });
76
+ /** No connection was made, so nothing was sent. */
77
+ function isConnectionRefused(cause) {
78
+ const failure = systemError.safeParse(cause);
79
+ return failure.success && ['ECONNREFUSED', 'ENOTFOUND', 'EHOSTUNREACH'].includes(failure.data.code);
80
+ }
81
+ /** A JSON-RPC error the server answered with: an answer, so the call is over, and it ran nothing. */
82
+ function protocolErrorResult(error) {
83
+ return { content: [{ type: 'text', text: `MCP error ${String(error.code)}: ${error.message}` }], isError: true };
84
+ }
85
+ function toolOf(tool) {
86
+ return {
87
+ name: tool.name,
88
+ ...(tool.title === undefined ? {} : { title: tool.title }),
89
+ ...(tool.description === undefined ? {} : { description: tool.description }),
90
+ inputSchema: tool.inputSchema,
91
+ ...(tool.outputSchema === undefined ? {} : { outputSchema: tool.outputSchema }),
92
+ ...(tool.annotations === undefined ? {} : { annotations: tool.annotations }),
93
+ };
94
+ }
95
+ async function listEveryTool(client) {
96
+ const tools = [];
97
+ let cursor;
98
+ do {
99
+ const page = await client.listTools(cursor === undefined ? {} : { cursor });
100
+ tools.push(...page.tools.map((tool) => toolOf(listedTool.parse(tool))));
101
+ cursor = page.nextCursor;
102
+ } while (cursor !== undefined);
103
+ return tools;
104
+ }
105
+ async function callOnce(client, call) {
106
+ const answer = callResult.parse(await client.callTool({ name: call.name, arguments: { ...call.arguments } }, { timeout: call.timeoutMs }));
107
+ return {
108
+ kind: 'answered',
109
+ result: {
110
+ content: answer.content,
111
+ ...(answer.structuredContent === undefined ? {} : { structuredContent: answer.structuredContent }),
112
+ isError: answer.isError ?? false,
113
+ },
114
+ };
115
+ }
116
+ export function createMcpServers() {
117
+ return {
118
+ async listTools(connection) {
119
+ let client;
120
+ try {
121
+ client = await connected(connection);
122
+ return ok(await listEveryTool(client));
123
+ }
124
+ catch (error) {
125
+ return err({ kind: 'unreachable', reason: reasonOf(error) });
126
+ }
127
+ finally {
128
+ await client?.close();
129
+ }
130
+ },
131
+ async callTool(connection, call) {
132
+ let client;
133
+ try {
134
+ client = await connected(connection);
135
+ }
136
+ catch (error) {
137
+ return { kind: 'notSent', reason: reasonOf(error) };
138
+ }
139
+ try {
140
+ return await callOnce(client, call);
141
+ }
142
+ catch (error) {
143
+ if (error instanceof ProtocolError) {
144
+ return { kind: 'answered', result: protocolErrorResult(error) };
145
+ }
146
+ return isNotSent(error) ? { kind: 'notSent', reason: reasonOf(error) } : { kind: 'unanswered', reason: reasonOf(error) };
147
+ }
148
+ finally {
149
+ await client.close();
150
+ }
151
+ },
152
+ };
153
+ }
154
+ //# sourceMappingURL=mcp-servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-servers.js","sourceRoot":"","sources":["../../../src/adapters/mcp/mcp-servers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Clients' metadata documents (CIMD), fetched from their client id URLs: a
3
+ * small JSON document, read with a short timeout and no redirect followed,
4
+ * since the URL is the client's identity.
5
+ */
6
+ import type { ClientMetadataDocuments } from '../../core/oauth/ports.js';
7
+ export declare function createClientMetadataDocuments(options: {
8
+ timeoutMs: number;
9
+ }): ClientMetadataDocuments;
@@ -0,0 +1,25 @@
1
+ import { err, ok } from '../../core/shared/result.js';
2
+ /** The largest document the gateway reads (CIMD recommends at most 5 KB). */
3
+ const DOCUMENT_MAX_BYTES = 5 * 1024;
4
+ export function createClientMetadataDocuments(options) {
5
+ return {
6
+ fetch: async (url) => {
7
+ try {
8
+ const response = await fetch(url, { redirect: 'manual', signal: AbortSignal.timeout(options.timeoutMs), headers: { accept: 'application/json' } });
9
+ if (response.status !== 200) {
10
+ return err({ reason: `it answered ${String(response.status)}` });
11
+ }
12
+ const body = await response.arrayBuffer();
13
+ if (body.byteLength > DOCUMENT_MAX_BYTES) {
14
+ return err({ reason: `it is over ${String(DOCUMENT_MAX_BYTES)} bytes` });
15
+ }
16
+ const document = JSON.parse(new TextDecoder().decode(body));
17
+ return ok(document);
18
+ }
19
+ catch (error) {
20
+ return err({ reason: error instanceof Error ? error.message : String(error) });
21
+ }
22
+ },
23
+ };
24
+ }
25
+ //# sourceMappingURL=client-metadata-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-metadata-documents.js","sourceRoot":"","sources":["../../../src/adapters/oauth/client-metadata-documents.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAEtD,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;AAEpC,MAAM,UAAU,6BAA6B,CAAC,OAA8B;IAC1E,OAAO;QACL,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACnB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;gBACnJ,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC5B,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,IAAI,CAAC,UAAU,GAAG,kBAAkB,EAAE,CAAC;oBACzC,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM,QAAQ,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Pagasae } from '../../core/sign-in/ports.js';
2
+ export declare function createPagasae(options: {
3
+ url: string;
4
+ clientId: string;
5
+ clientSecret: string;
6
+ redirectUri: string;
7
+ timeoutMs: number;
8
+ }): Pagasae;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * pagasae, the one identity provider (decision 0054), as the gateway's
3
+ * OpenID Connect provider: its authorize address, and its token endpoint,
4
+ * where the gateway redeems a code and refreshes tokens with its own secret
5
+ * (client_secret_post).
6
+ * The access token pagasae answers is the account token for the fleet the
7
+ * person picked; the gateway reads what it names, and core checks its
8
+ * signature on every call it is presented to.
9
+ */
10
+ import { accountTokenClaimsSchema } from '@aeolus-fleet/common';
11
+ import { z } from 'zod';
12
+ import { err, ok } from '../../core/shared/result.js';
13
+ const HTTP_SERVER_ERROR = 500;
14
+ const tokenAnswerSchema = z.object({ access_token: z.string(), refresh_token: z.string() });
15
+ const errorAnswerSchema = z.object({ error: z.string() });
16
+ function claimsOf(accountToken) {
17
+ const payload = accountToken.split('.')[1];
18
+ if (payload === undefined) {
19
+ return undefined;
20
+ }
21
+ try {
22
+ return JSON.parse(Buffer.from(payload, 'base64url').toString('utf8'));
23
+ }
24
+ catch {
25
+ return undefined;
26
+ }
27
+ }
28
+ export function createPagasae(options) {
29
+ /** One call of pagasae's token endpoint with the gateway's secret: the tokens, or why not, refused only when pagasae said so. */
30
+ const tokenEndpoint = async (grant) => {
31
+ let response;
32
+ try {
33
+ response = await fetch(`${options.url}/oauth/token`, {
34
+ method: 'POST',
35
+ headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
36
+ body: new URLSearchParams({ ...grant, client_id: options.clientId, client_secret: options.clientSecret }).toString(),
37
+ redirect: 'manual',
38
+ signal: AbortSignal.timeout(options.timeoutMs),
39
+ });
40
+ }
41
+ catch {
42
+ return err({ kind: 'unavailable', reason: 'pagasae did not answer' });
43
+ }
44
+ const body = await response.json().catch(() => undefined);
45
+ if (response.status >= HTTP_SERVER_ERROR) {
46
+ return err({ kind: 'unavailable', reason: `pagasae answered ${String(response.status)}` });
47
+ }
48
+ if (!response.ok) {
49
+ const refusal = errorAnswerSchema.safeParse(body);
50
+ return err({ kind: 'refused', reason: refusal.success ? refusal.data.error : `pagasae answered ${String(response.status)}` });
51
+ }
52
+ const answer = tokenAnswerSchema.safeParse(body);
53
+ const claims = accountTokenClaimsSchema.safeParse(answer.success ? claimsOf(answer.data.access_token) : undefined);
54
+ if (!answer.success || !claims.success) {
55
+ return err({ kind: 'refused', reason: 'pagasae answered no account token the gateway can read' });
56
+ }
57
+ return ok({
58
+ accountToken: answer.data.access_token,
59
+ accountTokenExpiresAt: claims.data.endsAt,
60
+ refreshToken: answer.data.refresh_token,
61
+ fleetId: claims.data.fleetId,
62
+ accountId: claims.data.accountId,
63
+ personShipId: claims.data.personShipId,
64
+ scopes: claims.data.scopes,
65
+ });
66
+ };
67
+ return {
68
+ authorizeUrl: ({ state, codeChallenge }) => {
69
+ const url = new URL(`${options.url}/oauth/authorize`);
70
+ url.search = new URLSearchParams({
71
+ response_type: 'code',
72
+ client_id: options.clientId,
73
+ redirect_uri: options.redirectUri,
74
+ code_challenge: codeChallenge,
75
+ code_challenge_method: 'S256',
76
+ state,
77
+ scope: 'openid',
78
+ }).toString();
79
+ return url.toString();
80
+ },
81
+ redeemCode: async ({ code, verifier }) => {
82
+ const answered = await tokenEndpoint({ grant_type: 'authorization_code', code, redirect_uri: options.redirectUri, code_verifier: verifier });
83
+ return answered.isOk ? answered : err({ reason: answered.error.reason });
84
+ },
85
+ refresh: (refreshToken) => tokenEndpoint({ grant_type: 'refresh_token', refresh_token: refreshToken }),
86
+ };
87
+ }
88
+ //# sourceMappingURL=pagasae-client.js.map