@aeolus-fleet/core 0.0.0 → 0.18.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 (608) hide show
  1. package/README.md +98 -1
  2. package/dist/adapters/cli/fleet-init.d.ts +14 -0
  3. package/dist/adapters/cli/fleet-init.js +68 -0
  4. package/dist/adapters/cli/fleet-init.js.map +1 -0
  5. package/dist/adapters/cli/io.d.ts +35 -0
  6. package/dist/adapters/cli/io.js +21 -0
  7. package/dist/adapters/cli/io.js.map +1 -0
  8. package/dist/adapters/cli/migrate.d.ts +11 -0
  9. package/dist/adapters/cli/migrate.js +12 -0
  10. package/dist/adapters/cli/migrate.js.map +1 -0
  11. package/dist/adapters/cli/operator-reset-password.d.ts +12 -0
  12. package/dist/adapters/cli/operator-reset-password.js +49 -0
  13. package/dist/adapters/cli/operator-reset-password.js.map +1 -0
  14. package/dist/adapters/cli/run.d.ts +14 -0
  15. package/dist/adapters/cli/run.js +40 -0
  16. package/dist/adapters/cli/run.js.map +1 -0
  17. package/dist/adapters/cli/terminal.d.ts +20 -0
  18. package/dist/adapters/cli/terminal.js +68 -0
  19. package/dist/adapters/cli/terminal.js.map +1 -0
  20. package/dist/adapters/crypto/passwords.d.ts +2 -0
  21. package/dist/adapters/crypto/passwords.js +59 -0
  22. package/dist/adapters/crypto/passwords.js.map +1 -0
  23. package/dist/adapters/crypto/secrets.d.ts +5 -0
  24. package/dist/adapters/crypto/secrets.js +10 -0
  25. package/dist/adapters/crypto/secrets.js.map +1 -0
  26. package/dist/adapters/http/device-label.d.ts +9 -0
  27. package/dist/adapters/http/device-label.js +39 -0
  28. package/dist/adapters/http/device-label.js.map +1 -0
  29. package/dist/adapters/http/rate-limiter.d.ts +21 -0
  30. package/dist/adapters/http/rate-limiter.js +44 -0
  31. package/dist/adapters/http/rate-limiter.js.map +1 -0
  32. package/dist/adapters/http/request-credentials.d.ts +23 -0
  33. package/dist/adapters/http/request-credentials.js +45 -0
  34. package/dist/adapters/http/request-credentials.js.map +1 -0
  35. package/dist/adapters/http/server.d.ts +47 -0
  36. package/dist/adapters/http/server.js +216 -0
  37. package/dist/adapters/http/server.js.map +1 -0
  38. package/dist/adapters/http/version.d.ts +9 -0
  39. package/dist/adapters/http/version.js +23 -0
  40. package/dist/adapters/http/version.js.map +1 -0
  41. package/dist/adapters/mcp/mcp-endpoint.d.ts +8 -0
  42. package/dist/adapters/mcp/mcp-endpoint.js +127 -0
  43. package/dist/adapters/mcp/mcp-endpoint.js.map +1 -0
  44. package/dist/adapters/prisma/client.d.ts +10 -0
  45. package/dist/adapters/prisma/client.js +20 -0
  46. package/dist/adapters/prisma/client.js.map +1 -0
  47. package/dist/adapters/prisma/delivery-notices.d.ts +34 -0
  48. package/dist/adapters/prisma/delivery-notices.js +113 -0
  49. package/dist/adapters/prisma/delivery-notices.js.map +1 -0
  50. package/dist/adapters/prisma/event-log.d.ts +11 -0
  51. package/dist/adapters/prisma/event-log.js +61 -0
  52. package/dist/adapters/prisma/event-log.js.map +1 -0
  53. package/dist/adapters/prisma/failure-log.d.ts +22 -0
  54. package/dist/adapters/prisma/failure-log.js +70 -0
  55. package/dist/adapters/prisma/failure-log.js.map +1 -0
  56. package/dist/adapters/prisma/fleet-counter.d.ts +3 -0
  57. package/dist/adapters/prisma/fleet-counter.js +6 -0
  58. package/dist/adapters/prisma/fleet-counter.js.map +1 -0
  59. package/dist/adapters/prisma/fleet-event-wakeups.d.ts +33 -0
  60. package/dist/adapters/prisma/fleet-event-wakeups.js +86 -0
  61. package/dist/adapters/prisma/fleet-event-wakeups.js.map +1 -0
  62. package/dist/adapters/prisma/generated/browser.d.ts +127 -0
  63. package/dist/adapters/prisma/generated/browser.js +18 -0
  64. package/dist/adapters/prisma/generated/browser.js.map +1 -0
  65. package/dist/adapters/prisma/generated/client.d.ts +146 -0
  66. package/dist/adapters/prisma/generated/client.js +38 -0
  67. package/dist/adapters/prisma/generated/client.js.map +1 -0
  68. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +879 -0
  69. package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
  70. package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
  71. package/dist/adapters/prisma/generated/enums.d.ts +75 -0
  72. package/dist/adapters/prisma/generated/enums.js +73 -0
  73. package/dist/adapters/prisma/generated/enums.js.map +1 -0
  74. package/dist/adapters/prisma/generated/internal/class.d.ts +308 -0
  75. package/dist/adapters/prisma/generated/internal/class.js +52 -0
  76. package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
  77. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2131 -0
  78. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +295 -0
  79. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
  80. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
  81. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +265 -0
  82. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  83. package/dist/adapters/prisma/generated/models/ConsoleSession.d.ts +2137 -0
  84. package/dist/adapters/prisma/generated/models/ConsoleSession.js +2 -0
  85. package/dist/adapters/prisma/generated/models/ConsoleSession.js.map +1 -0
  86. package/dist/adapters/prisma/generated/models/Credential.d.ts +1360 -0
  87. package/dist/adapters/prisma/generated/models/Credential.js +2 -0
  88. package/dist/adapters/prisma/generated/models/Credential.js.map +1 -0
  89. package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +1558 -0
  90. package/dist/adapters/prisma/generated/models/CrewRequest.js +2 -0
  91. package/dist/adapters/prisma/generated/models/CrewRequest.js.map +1 -0
  92. package/dist/adapters/prisma/generated/models/Delivery.d.ts +2211 -0
  93. package/dist/adapters/prisma/generated/models/Delivery.js +2 -0
  94. package/dist/adapters/prisma/generated/models/Delivery.js.map +1 -0
  95. package/dist/adapters/prisma/generated/models/Event.d.ts +1991 -0
  96. package/dist/adapters/prisma/generated/models/Event.js +2 -0
  97. package/dist/adapters/prisma/generated/models/Event.js.map +1 -0
  98. package/dist/adapters/prisma/generated/models/Fleet.d.ts +3032 -0
  99. package/dist/adapters/prisma/generated/models/Fleet.js +2 -0
  100. package/dist/adapters/prisma/generated/models/Fleet.js.map +1 -0
  101. package/dist/adapters/prisma/generated/models/Guide.d.ts +943 -0
  102. package/dist/adapters/prisma/generated/models/Guide.js +2 -0
  103. package/dist/adapters/prisma/generated/models/Guide.js.map +1 -0
  104. package/dist/adapters/prisma/generated/models/GuideProgress.d.ts +1323 -0
  105. package/dist/adapters/prisma/generated/models/GuideProgress.js +2 -0
  106. package/dist/adapters/prisma/generated/models/GuideProgress.js.map +1 -0
  107. package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1036 -0
  108. package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
  109. package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
  110. package/dist/adapters/prisma/generated/models/InstallationSettings.d.ts +1027 -0
  111. package/dist/adapters/prisma/generated/models/InstallationSettings.js +2 -0
  112. package/dist/adapters/prisma/generated/models/InstallationSettings.js.map +1 -0
  113. package/dist/adapters/prisma/generated/models/Lease.d.ts +2076 -0
  114. package/dist/adapters/prisma/generated/models/Lease.js +2 -0
  115. package/dist/adapters/prisma/generated/models/Lease.js.map +1 -0
  116. package/dist/adapters/prisma/generated/models/Message.d.ts +2869 -0
  117. package/dist/adapters/prisma/generated/models/Message.js +2 -0
  118. package/dist/adapters/prisma/generated/models/Message.js.map +1 -0
  119. package/dist/adapters/prisma/generated/models/Notice.d.ts +1068 -0
  120. package/dist/adapters/prisma/generated/models/Notice.js +2 -0
  121. package/dist/adapters/prisma/generated/models/Notice.js.map +1 -0
  122. package/dist/adapters/prisma/generated/models/NoticeDismissal.d.ts +1245 -0
  123. package/dist/adapters/prisma/generated/models/NoticeDismissal.js +2 -0
  124. package/dist/adapters/prisma/generated/models/NoticeDismissal.js.map +1 -0
  125. package/dist/adapters/prisma/generated/models/Operator.d.ts +1173 -0
  126. package/dist/adapters/prisma/generated/models/Operator.js +2 -0
  127. package/dist/adapters/prisma/generated/models/Operator.js.map +1 -0
  128. package/dist/adapters/prisma/generated/models/Ship.d.ts +3320 -0
  129. package/dist/adapters/prisma/generated/models/Ship.js +2 -0
  130. package/dist/adapters/prisma/generated/models/Ship.js.map +1 -0
  131. package/dist/adapters/prisma/generated/models/SignInTicket.d.ts +1222 -0
  132. package/dist/adapters/prisma/generated/models/SignInTicket.js +2 -0
  133. package/dist/adapters/prisma/generated/models/SignInTicket.js.map +1 -0
  134. package/dist/adapters/prisma/generated/models.d.ts +18 -0
  135. package/dist/adapters/prisma/generated/models.js +2 -0
  136. package/dist/adapters/prisma/generated/models.js.map +1 -0
  137. package/dist/adapters/prisma/history.d.ts +3 -0
  138. package/dist/adapters/prisma/history.js +289 -0
  139. package/dist/adapters/prisma/history.js.map +1 -0
  140. package/dist/adapters/prisma/identity.d.ts +10 -0
  141. package/dist/adapters/prisma/identity.js +213 -0
  142. package/dist/adapters/prisma/identity.js.map +1 -0
  143. package/dist/adapters/prisma/installation.d.ts +13 -0
  144. package/dist/adapters/prisma/installation.js +155 -0
  145. package/dist/adapters/prisma/installation.js.map +1 -0
  146. package/dist/adapters/prisma/messaging.d.ts +4 -0
  147. package/dist/adapters/prisma/messaging.js +156 -0
  148. package/dist/adapters/prisma/messaging.js.map +1 -0
  149. package/dist/adapters/prisma/migrate.d.ts +5 -0
  150. package/dist/adapters/prisma/migrate.js +40 -0
  151. package/dist/adapters/prisma/migrate.js.map +1 -0
  152. package/dist/adapters/prisma/receiver-wakeups.d.ts +26 -0
  153. package/dist/adapters/prisma/receiver-wakeups.js +79 -0
  154. package/dist/adapters/prisma/receiver-wakeups.js.map +1 -0
  155. package/dist/adapters/prisma/registry.d.ts +8 -0
  156. package/dist/adapters/prisma/registry.js +427 -0
  157. package/dist/adapters/prisma/registry.js.map +1 -0
  158. package/dist/adapters/prisma/rows.d.ts +58 -0
  159. package/dist/adapters/prisma/rows.js +408 -0
  160. package/dist/adapters/prisma/rows.js.map +1 -0
  161. package/dist/adapters/prisma/unit-of-work.d.ts +36 -0
  162. package/dist/adapters/prisma/unit-of-work.js +66 -0
  163. package/dist/adapters/prisma/unit-of-work.js.map +1 -0
  164. package/dist/adapters/rest/openapi.d.ts +12 -0
  165. package/dist/adapters/rest/openapi.js +62 -0
  166. package/dist/adapters/rest/openapi.js.map +1 -0
  167. package/dist/adapters/rest/rest-api.d.ts +8 -0
  168. package/dist/adapters/rest/rest-api.js +61 -0
  169. package/dist/adapters/rest/rest-api.js.map +1 -0
  170. package/dist/adapters/trpc/console.d.ts +150 -0
  171. package/dist/adapters/trpc/console.js +102 -0
  172. package/dist/adapters/trpc/console.js.map +1 -0
  173. package/dist/adapters/trpc/context.d.ts +201 -0
  174. package/dist/adapters/trpc/context.js +2 -0
  175. package/dist/adapters/trpc/context.js.map +1 -0
  176. package/dist/adapters/trpc/fleet.d.ts +637 -0
  177. package/dist/adapters/trpc/fleet.js +437 -0
  178. package/dist/adapters/trpc/fleet.js.map +1 -0
  179. package/dist/adapters/trpc/installation.d.ts +414 -0
  180. package/dist/adapters/trpc/installation.js +138 -0
  181. package/dist/adapters/trpc/installation.js.map +1 -0
  182. package/dist/adapters/trpc/router.d.ts +1263 -0
  183. package/dist/adapters/trpc/router.js +15 -0
  184. package/dist/adapters/trpc/router.js.map +1 -0
  185. package/dist/adapters/trpc/ship-contract.d.ts +107 -0
  186. package/dist/adapters/trpc/ship-contract.js +165 -0
  187. package/dist/adapters/trpc/ship-contract.js.map +1 -0
  188. package/dist/adapters/trpc/ship-protocol.d.ts +9 -0
  189. package/dist/adapters/trpc/ship-protocol.js +25 -0
  190. package/dist/adapters/trpc/ship-protocol.js.map +1 -0
  191. package/dist/adapters/trpc/ship.d.ts +209 -0
  192. package/dist/adapters/trpc/ship.js +214 -0
  193. package/dist/adapters/trpc/ship.js.map +1 -0
  194. package/dist/adapters/trpc/starting-prompt-text.d.ts +7 -0
  195. package/dist/adapters/trpc/starting-prompt-text.js +60 -0
  196. package/dist/adapters/trpc/starting-prompt-text.js.map +1 -0
  197. package/dist/adapters/trpc/system.d.ts +29 -0
  198. package/dist/adapters/trpc/system.js +15 -0
  199. package/dist/adapters/trpc/system.js.map +1 -0
  200. package/dist/adapters/trpc/trpc.d.ts +131 -0
  201. package/dist/adapters/trpc/trpc.js +350 -0
  202. package/dist/adapters/trpc/trpc.js.map +1 -0
  203. package/dist/app.d.ts +31 -0
  204. package/dist/app.js +80 -0
  205. package/dist/app.js.map +1 -0
  206. package/dist/bin/aeolus-core.d.ts +2 -0
  207. package/dist/bin/aeolus-core.js +45 -0
  208. package/dist/bin/aeolus-core.js.map +1 -0
  209. package/dist/config.d.ts +35 -0
  210. package/dist/config.js +74 -0
  211. package/dist/config.js.map +1 -0
  212. package/dist/domain/identity/authenticate.d.ts +46 -0
  213. package/dist/domain/identity/authenticate.js +18 -0
  214. package/dist/domain/identity/authenticate.js.map +1 -0
  215. package/dist/domain/identity/console-session.d.ts +54 -0
  216. package/dist/domain/identity/console-session.js +29 -0
  217. package/dist/domain/identity/console-session.js.map +1 -0
  218. package/dist/domain/identity/credential.d.ts +76 -0
  219. package/dist/domain/identity/credential.js +63 -0
  220. package/dist/domain/identity/credential.js.map +1 -0
  221. package/dist/domain/identity/dismiss-notice.d.ts +19 -0
  222. package/dist/domain/identity/dismiss-notice.js +23 -0
  223. package/dist/domain/identity/dismiss-notice.js.map +1 -0
  224. package/dist/domain/identity/get-guide.d.ts +7 -0
  225. package/dist/domain/identity/get-guide.js +5 -0
  226. package/dist/domain/identity/get-guide.js.map +1 -0
  227. package/dist/domain/identity/get-notices.d.ts +7 -0
  228. package/dist/domain/identity/get-notices.js +5 -0
  229. package/dist/domain/identity/get-notices.js.map +1 -0
  230. package/dist/domain/identity/guide.d.ts +24 -0
  231. package/dist/domain/identity/guide.js +3 -0
  232. package/dist/domain/identity/guide.js.map +1 -0
  233. package/dist/domain/identity/issue-sign-in-ticket.d.ts +38 -0
  234. package/dist/domain/identity/issue-sign-in-ticket.js +39 -0
  235. package/dist/domain/identity/issue-sign-in-ticket.js.map +1 -0
  236. package/dist/domain/identity/notice.d.ts +16 -0
  237. package/dist/domain/identity/notice.js +12 -0
  238. package/dist/domain/identity/notice.js.map +1 -0
  239. package/dist/domain/identity/operator-account.d.ts +28 -0
  240. package/dist/domain/identity/operator-account.js +21 -0
  241. package/dist/domain/identity/operator-account.js.map +1 -0
  242. package/dist/domain/identity/ports.d.ts +193 -0
  243. package/dist/domain/identity/ports.js +2 -0
  244. package/dist/domain/identity/ports.js.map +1 -0
  245. package/dist/domain/identity/public.d.ts +3 -0
  246. package/dist/domain/identity/public.js +5 -0
  247. package/dist/domain/identity/public.js.map +1 -0
  248. package/dist/domain/identity/read-account.d.ts +35 -0
  249. package/dist/domain/identity/read-account.js +27 -0
  250. package/dist/domain/identity/read-account.js.map +1 -0
  251. package/dist/domain/identity/read-guide.d.ts +18 -0
  252. package/dist/domain/identity/read-guide.js +21 -0
  253. package/dist/domain/identity/read-guide.js.map +1 -0
  254. package/dist/domain/identity/read-notices.d.ts +13 -0
  255. package/dist/domain/identity/read-notices.js +17 -0
  256. package/dist/domain/identity/read-notices.js.map +1 -0
  257. package/dist/domain/identity/record-guide-progress.d.ts +19 -0
  258. package/dist/domain/identity/record-guide-progress.js +24 -0
  259. package/dist/domain/identity/record-guide-progress.js.map +1 -0
  260. package/dist/domain/identity/redeem-sign-in-ticket.d.ts +34 -0
  261. package/dist/domain/identity/redeem-sign-in-ticket.js +25 -0
  262. package/dist/domain/identity/redeem-sign-in-ticket.js.map +1 -0
  263. package/dist/domain/identity/reset-operator-password.d.ts +34 -0
  264. package/dist/domain/identity/reset-operator-password.js +55 -0
  265. package/dist/domain/identity/reset-operator-password.js.map +1 -0
  266. package/dist/domain/identity/set-guide.d.ts +13 -0
  267. package/dist/domain/identity/set-guide.js +12 -0
  268. package/dist/domain/identity/set-guide.js.map +1 -0
  269. package/dist/domain/identity/set-notices.d.ts +13 -0
  270. package/dist/domain/identity/set-notices.js +12 -0
  271. package/dist/domain/identity/set-notices.js.map +1 -0
  272. package/dist/domain/identity/set-theme.d.ts +21 -0
  273. package/dist/domain/identity/set-theme.js +19 -0
  274. package/dist/domain/identity/set-theme.js.map +1 -0
  275. package/dist/domain/identity/sign-in-ticket.d.ts +21 -0
  276. package/dist/domain/identity/sign-in-ticket.js +5 -0
  277. package/dist/domain/identity/sign-in-ticket.js.map +1 -0
  278. package/dist/domain/identity/sign-in.d.ts +51 -0
  279. package/dist/domain/identity/sign-in.js +43 -0
  280. package/dist/domain/identity/sign-in.js.map +1 -0
  281. package/dist/domain/identity/sign-out.d.ts +20 -0
  282. package/dist/domain/identity/sign-out.js +32 -0
  283. package/dist/domain/identity/sign-out.js.map +1 -0
  284. package/dist/domain/identity/start-console-session.d.ts +27 -0
  285. package/dist/domain/identity/start-console-session.js +54 -0
  286. package/dist/domain/identity/start-console-session.js.map +1 -0
  287. package/dist/domain/identity/start-viewer-session.d.ts +29 -0
  288. package/dist/domain/identity/start-viewer-session.js +42 -0
  289. package/dist/domain/identity/start-viewer-session.js.map +1 -0
  290. package/dist/domain/messaging/acknowledge-delivery.d.ts +30 -0
  291. package/dist/domain/messaging/acknowledge-delivery.js +31 -0
  292. package/dist/domain/messaging/acknowledge-delivery.js.map +1 -0
  293. package/dist/domain/messaging/answer-ping.d.ts +33 -0
  294. package/dist/domain/messaging/answer-ping.js +37 -0
  295. package/dist/domain/messaging/answer-ping.js.map +1 -0
  296. package/dist/domain/messaging/check-inbox.d.ts +33 -0
  297. package/dist/domain/messaging/check-inbox.js +61 -0
  298. package/dist/domain/messaging/check-inbox.js.map +1 -0
  299. package/dist/domain/messaging/content-type.d.ts +9 -0
  300. package/dist/domain/messaging/content-type.js +18 -0
  301. package/dist/domain/messaging/content-type.js.map +1 -0
  302. package/dist/domain/messaging/daily-message-limit.d.ts +19 -0
  303. package/dist/domain/messaging/daily-message-limit.js +24 -0
  304. package/dist/domain/messaging/daily-message-limit.js.map +1 -0
  305. package/dist/domain/messaging/delivery.d.ts +116 -0
  306. package/dist/domain/messaging/delivery.js +201 -0
  307. package/dist/domain/messaging/delivery.js.map +1 -0
  308. package/dist/domain/messaging/dismiss-delivery.d.ts +28 -0
  309. package/dist/domain/messaging/dismiss-delivery.js +29 -0
  310. package/dist/domain/messaging/dismiss-delivery.js.map +1 -0
  311. package/dist/domain/messaging/inbox-wait.d.ts +8 -0
  312. package/dist/domain/messaging/inbox-wait.js +19 -0
  313. package/dist/domain/messaging/inbox-wait.js.map +1 -0
  314. package/dist/domain/messaging/mark-done.d.ts +45 -0
  315. package/dist/domain/messaging/mark-done.js +49 -0
  316. package/dist/domain/messaging/mark-done.js.map +1 -0
  317. package/dist/domain/messaging/mark-read.d.ts +27 -0
  318. package/dist/domain/messaging/mark-read.js +34 -0
  319. package/dist/domain/messaging/mark-read.js.map +1 -0
  320. package/dist/domain/messaging/message.d.ts +104 -0
  321. package/dist/domain/messaging/message.js +84 -0
  322. package/dist/domain/messaging/message.js.map +1 -0
  323. package/dist/domain/messaging/payload.d.ts +9 -0
  324. package/dist/domain/messaging/payload.js +16 -0
  325. package/dist/domain/messaging/payload.js.map +1 -0
  326. package/dist/domain/messaging/ping-ship.d.ts +38 -0
  327. package/dist/domain/messaging/ping-ship.js +42 -0
  328. package/dist/domain/messaging/ping-ship.js.map +1 -0
  329. package/dist/domain/messaging/ports.d.ts +116 -0
  330. package/dist/domain/messaging/ports.js +2 -0
  331. package/dist/domain/messaging/ports.js.map +1 -0
  332. package/dist/domain/messaging/receive-deliveries.d.ts +68 -0
  333. package/dist/domain/messaging/receive-deliveries.js +119 -0
  334. package/dist/domain/messaging/receive-deliveries.js.map +1 -0
  335. package/dist/domain/messaging/receive-max.d.ts +8 -0
  336. package/dist/domain/messaging/receive-max.js +17 -0
  337. package/dist/domain/messaging/receive-max.js.map +1 -0
  338. package/dist/domain/messaging/reply-to-message.d.ts +35 -0
  339. package/dist/domain/messaging/reply-to-message.js +49 -0
  340. package/dist/domain/messaging/reply-to-message.js.map +1 -0
  341. package/dist/domain/messaging/resend-delivery.d.ts +48 -0
  342. package/dist/domain/messaging/resend-delivery.js +97 -0
  343. package/dist/domain/messaging/resend-delivery.js.map +1 -0
  344. package/dist/domain/messaging/send-message.d.ts +88 -0
  345. package/dist/domain/messaging/send-message.js +115 -0
  346. package/dist/domain/messaging/send-message.js.map +1 -0
  347. package/dist/domain/messaging/send-request.d.ts +16 -0
  348. package/dist/domain/messaging/send-request.js +18 -0
  349. package/dist/domain/messaging/send-request.js.map +1 -0
  350. package/dist/domain/registry/applied-limits.d.ts +15 -0
  351. package/dist/domain/registry/applied-limits.js +15 -0
  352. package/dist/domain/registry/applied-limits.js.map +1 -0
  353. package/dist/domain/registry/assign-crew.d.ts +31 -0
  354. package/dist/domain/registry/assign-crew.js +35 -0
  355. package/dist/domain/registry/assign-crew.js.map +1 -0
  356. package/dist/domain/registry/claim-ship.d.ts +49 -0
  357. package/dist/domain/registry/claim-ship.js +59 -0
  358. package/dist/domain/registry/claim-ship.js.map +1 -0
  359. package/dist/domain/registry/commission-ship.d.ts +54 -0
  360. package/dist/domain/registry/commission-ship.js +70 -0
  361. package/dist/domain/registry/commission-ship.js.map +1 -0
  362. package/dist/domain/registry/confirm-crew-release.d.ts +28 -0
  363. package/dist/domain/registry/confirm-crew-release.js +28 -0
  364. package/dist/domain/registry/confirm-crew-release.js.map +1 -0
  365. package/dist/domain/registry/create-fleet.d.ts +39 -0
  366. package/dist/domain/registry/create-fleet.js +56 -0
  367. package/dist/domain/registry/create-fleet.js.map +1 -0
  368. package/dist/domain/registry/crew-request.d.ts +148 -0
  369. package/dist/domain/registry/crew-request.js +175 -0
  370. package/dist/domain/registry/crew-request.js.map +1 -0
  371. package/dist/domain/registry/delete-fleet.d.ts +46 -0
  372. package/dist/domain/registry/delete-fleet.js +34 -0
  373. package/dist/domain/registry/delete-fleet.js.map +1 -0
  374. package/dist/domain/registry/deregister.d.ts +32 -0
  375. package/dist/domain/registry/deregister.js +38 -0
  376. package/dist/domain/registry/deregister.js.map +1 -0
  377. package/dist/domain/registry/explain-crew-request.d.ts +30 -0
  378. package/dist/domain/registry/explain-crew-request.js +31 -0
  379. package/dist/domain/registry/explain-crew-request.js.map +1 -0
  380. package/dist/domain/registry/fleet.d.ts +12 -0
  381. package/dist/domain/registry/fleet.js +12 -0
  382. package/dist/domain/registry/fleet.js.map +1 -0
  383. package/dist/domain/registry/found-fleet.d.ts +32 -0
  384. package/dist/domain/registry/found-fleet.js +43 -0
  385. package/dist/domain/registry/found-fleet.js.map +1 -0
  386. package/dist/domain/registry/get-fleet-limits.d.ts +17 -0
  387. package/dist/domain/registry/get-fleet-limits.js +14 -0
  388. package/dist/domain/registry/get-fleet-limits.js.map +1 -0
  389. package/dist/domain/registry/get-installation-fleet.d.ts +15 -0
  390. package/dist/domain/registry/get-installation-fleet.js +12 -0
  391. package/dist/domain/registry/get-installation-fleet.js.map +1 -0
  392. package/dist/domain/registry/get-installation-settings.d.ts +7 -0
  393. package/dist/domain/registry/get-installation-settings.js +5 -0
  394. package/dist/domain/registry/get-installation-settings.js.map +1 -0
  395. package/dist/domain/registry/get-ship.d.ts +34 -0
  396. package/dist/domain/registry/get-ship.js +36 -0
  397. package/dist/domain/registry/get-ship.js.map +1 -0
  398. package/dist/domain/registry/get-starting-prompt.d.ts +24 -0
  399. package/dist/domain/registry/get-starting-prompt.js +46 -0
  400. package/dist/domain/registry/get-starting-prompt.js.map +1 -0
  401. package/dist/domain/registry/initialise-fleet.d.ts +28 -0
  402. package/dist/domain/registry/initialise-fleet.js +39 -0
  403. package/dist/domain/registry/initialise-fleet.js.map +1 -0
  404. package/dist/domain/registry/installation-fleet.d.ts +36 -0
  405. package/dist/domain/registry/installation-fleet.js +22 -0
  406. package/dist/domain/registry/installation-fleet.js.map +1 -0
  407. package/dist/domain/registry/installation-request.d.ts +23 -0
  408. package/dist/domain/registry/installation-request.js +5 -0
  409. package/dist/domain/registry/installation-request.js.map +1 -0
  410. package/dist/domain/registry/lease.d.ts +51 -0
  411. package/dist/domain/registry/lease.js +39 -0
  412. package/dist/domain/registry/lease.js.map +1 -0
  413. package/dist/domain/registry/leases.d.ts +66 -0
  414. package/dist/domain/registry/leases.js +80 -0
  415. package/dist/domain/registry/leases.js.map +1 -0
  416. package/dist/domain/registry/limits.d.ts +50 -0
  417. package/dist/domain/registry/limits.js +24 -0
  418. package/dist/domain/registry/limits.js.map +1 -0
  419. package/dist/domain/registry/list-fleet.d.ts +70 -0
  420. package/dist/domain/registry/list-fleet.js +47 -0
  421. package/dist/domain/registry/list-fleet.js.map +1 -0
  422. package/dist/domain/registry/list-fleets.d.ts +11 -0
  423. package/dist/domain/registry/list-fleets.js +9 -0
  424. package/dist/domain/registry/list-fleets.js.map +1 -0
  425. package/dist/domain/registry/list-installation-fleets.d.ts +15 -0
  426. package/dist/domain/registry/list-installation-fleets.js +15 -0
  427. package/dist/domain/registry/list-installation-fleets.js.map +1 -0
  428. package/dist/domain/registry/ping-status.d.ts +17 -0
  429. package/dist/domain/registry/ping-status.js +28 -0
  430. package/dist/domain/registry/ping-status.js.map +1 -0
  431. package/dist/domain/registry/pingable-ship.d.ts +22 -0
  432. package/dist/domain/registry/pingable-ship.js +21 -0
  433. package/dist/domain/registry/pingable-ship.js.map +1 -0
  434. package/dist/domain/registry/ports.d.ts +318 -0
  435. package/dist/domain/registry/ports.js +2 -0
  436. package/dist/domain/registry/ports.js.map +1 -0
  437. package/dist/domain/registry/public.d.ts +8 -0
  438. package/dist/domain/registry/public.js +10 -0
  439. package/dist/domain/registry/public.js.map +1 -0
  440. package/dist/domain/registry/read-assigned-crew-requests.d.ts +14 -0
  441. package/dist/domain/registry/read-assigned-crew-requests.js +15 -0
  442. package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -0
  443. package/dist/domain/registry/recrew-ship.d.ts +33 -0
  444. package/dist/domain/registry/recrew-ship.js +34 -0
  445. package/dist/domain/registry/recrew-ship.js.map +1 -0
  446. package/dist/domain/registry/release-ship.d.ts +38 -0
  447. package/dist/domain/registry/release-ship.js +47 -0
  448. package/dist/domain/registry/release-ship.js.map +1 -0
  449. package/dist/domain/registry/remove-crew-request.d.ts +28 -0
  450. package/dist/domain/registry/remove-crew-request.js +36 -0
  451. package/dist/domain/registry/remove-crew-request.js.map +1 -0
  452. package/dist/domain/registry/rename-ship.d.ts +30 -0
  453. package/dist/domain/registry/rename-ship.js +39 -0
  454. package/dist/domain/registry/rename-ship.js.map +1 -0
  455. package/dist/domain/registry/report-crew-status.d.ts +29 -0
  456. package/dist/domain/registry/report-crew-status.js +30 -0
  457. package/dist/domain/registry/report-crew-status.js.map +1 -0
  458. package/dist/domain/registry/report-details.d.ts +18 -0
  459. package/dist/domain/registry/report-details.js +41 -0
  460. package/dist/domain/registry/report-details.js.map +1 -0
  461. package/dist/domain/registry/report-log.d.ts +21 -0
  462. package/dist/domain/registry/report-log.js +16 -0
  463. package/dist/domain/registry/report-log.js.map +1 -0
  464. package/dist/domain/registry/report.d.ts +30 -0
  465. package/dist/domain/registry/report.js +30 -0
  466. package/dist/domain/registry/report.js.map +1 -0
  467. package/dist/domain/registry/request-crew.d.ts +32 -0
  468. package/dist/domain/registry/request-crew.js +29 -0
  469. package/dist/domain/registry/request-crew.js.map +1 -0
  470. package/dist/domain/registry/resolve-selector.d.ts +25 -0
  471. package/dist/domain/registry/resolve-selector.js +32 -0
  472. package/dist/domain/registry/resolve-selector.js.map +1 -0
  473. package/dist/domain/registry/retire-ship.d.ts +42 -0
  474. package/dist/domain/registry/retire-ship.js +68 -0
  475. package/dist/domain/registry/retire-ship.js.map +1 -0
  476. package/dist/domain/registry/set-fleet-limits.d.ts +30 -0
  477. package/dist/domain/registry/set-fleet-limits.js +54 -0
  478. package/dist/domain/registry/set-fleet-limits.js.map +1 -0
  479. package/dist/domain/registry/set-installation-settings.d.ts +18 -0
  480. package/dist/domain/registry/set-installation-settings.js +31 -0
  481. package/dist/domain/registry/set-installation-settings.js.map +1 -0
  482. package/dist/domain/registry/ship-handle.d.ts +5 -0
  483. package/dist/domain/registry/ship-handle.js +20 -0
  484. package/dist/domain/registry/ship-handle.js.map +1 -0
  485. package/dist/domain/registry/ship-note.d.ts +7 -0
  486. package/dist/domain/registry/ship-note.js +15 -0
  487. package/dist/domain/registry/ship-note.js.map +1 -0
  488. package/dist/domain/registry/ship-report.d.ts +42 -0
  489. package/dist/domain/registry/ship-report.js +93 -0
  490. package/dist/domain/registry/ship-report.js.map +1 -0
  491. package/dist/domain/registry/ship.d.ts +190 -0
  492. package/dist/domain/registry/ship.js +334 -0
  493. package/dist/domain/registry/ship.js.map +1 -0
  494. package/dist/domain/registry/ships.d.ts +25 -0
  495. package/dist/domain/registry/ships.js +22 -0
  496. package/dist/domain/registry/ships.js.map +1 -0
  497. package/dist/domain/registry/starting-prompt.d.ts +32 -0
  498. package/dist/domain/registry/starting-prompt.js +22 -0
  499. package/dist/domain/registry/starting-prompt.js.map +1 -0
  500. package/dist/domain/registry/whoami.d.ts +20 -0
  501. package/dist/domain/registry/whoami.js +15 -0
  502. package/dist/domain/registry/whoami.js.map +1 -0
  503. package/dist/domain/shared/caller.d.ts +25 -0
  504. package/dist/domain/shared/caller.js +8 -0
  505. package/dist/domain/shared/caller.js.map +1 -0
  506. package/dist/domain/shared/clock.d.ts +4 -0
  507. package/dist/domain/shared/clock.js +2 -0
  508. package/dist/domain/shared/clock.js.map +1 -0
  509. package/dist/domain/shared/errors.d.ts +13 -0
  510. package/dist/domain/shared/errors.js +6 -0
  511. package/dist/domain/shared/errors.js.map +1 -0
  512. package/dist/domain/shared/events.d.ts +75 -0
  513. package/dist/domain/shared/events.js +9 -0
  514. package/dist/domain/shared/events.js.map +1 -0
  515. package/dist/domain/shared/follow-fleet.d.ts +32 -0
  516. package/dist/domain/shared/follow-fleet.js +65 -0
  517. package/dist/domain/shared/follow-fleet.js.map +1 -0
  518. package/dist/domain/shared/history.d.ts +124 -0
  519. package/dist/domain/shared/history.js +16 -0
  520. package/dist/domain/shared/history.js.map +1 -0
  521. package/dist/domain/shared/idempotency-key.d.ts +8 -0
  522. package/dist/domain/shared/idempotency-key.js +14 -0
  523. package/dist/domain/shared/idempotency-key.js.map +1 -0
  524. package/dist/domain/shared/notifier.d.ts +17 -0
  525. package/dist/domain/shared/notifier.js +2 -0
  526. package/dist/domain/shared/notifier.js.map +1 -0
  527. package/dist/domain/shared/ping.d.ts +18 -0
  528. package/dist/domain/shared/ping.js +8 -0
  529. package/dist/domain/shared/ping.js.map +1 -0
  530. package/dist/domain/shared/read-fleet-events.d.ts +29 -0
  531. package/dist/domain/shared/read-fleet-events.js +25 -0
  532. package/dist/domain/shared/read-fleet-events.js.map +1 -0
  533. package/dist/domain/shared/read-fleet-limits.d.ts +39 -0
  534. package/dist/domain/shared/read-fleet-limits.js +24 -0
  535. package/dist/domain/shared/read-fleet-limits.js.map +1 -0
  536. package/dist/domain/shared/read-inbox.d.ts +20 -0
  537. package/dist/domain/shared/read-inbox.js +16 -0
  538. package/dist/domain/shared/read-inbox.js.map +1 -0
  539. package/dist/domain/shared/read-message.d.ts +21 -0
  540. package/dist/domain/shared/read-message.js +18 -0
  541. package/dist/domain/shared/read-message.js.map +1 -0
  542. package/dist/domain/shared/read-needs-attention.d.ts +12 -0
  543. package/dist/domain/shared/read-needs-attention.js +10 -0
  544. package/dist/domain/shared/read-needs-attention.js.map +1 -0
  545. package/dist/domain/shared/read-ship-messages.d.ts +28 -0
  546. package/dist/domain/shared/read-ship-messages.js +30 -0
  547. package/dist/domain/shared/read-ship-messages.js.map +1 -0
  548. package/dist/domain/shared/read-ship-timeline.d.ts +18 -0
  549. package/dist/domain/shared/read-ship-timeline.js +16 -0
  550. package/dist/domain/shared/read-ship-timeline.js.map +1 -0
  551. package/dist/domain/shared/result.d.ts +16 -0
  552. package/dist/domain/shared/result.js +7 -0
  553. package/dist/domain/shared/result.js.map +1 -0
  554. package/dist/domain/shared/secrets.d.ts +26 -0
  555. package/dist/domain/shared/secrets.js +2 -0
  556. package/dist/domain/shared/secrets.js.map +1 -0
  557. package/dist/domain/shared/selector.d.ts +29 -0
  558. package/dist/domain/shared/selector.js +2 -0
  559. package/dist/domain/shared/selector.js.map +1 -0
  560. package/dist/domain/shared/unit-of-work.d.ts +13 -0
  561. package/dist/domain/shared/unit-of-work.js +2 -0
  562. package/dist/domain/shared/unit-of-work.js.map +1 -0
  563. package/dist/domain/shared/utc-day.d.ts +4 -0
  564. package/dist/domain/shared/utc-day.js +9 -0
  565. package/dist/domain/shared/utc-day.js.map +1 -0
  566. package/dist/index.d.ts +1 -0
  567. package/dist/index.js +2 -0
  568. package/dist/index.js.map +1 -0
  569. package/dist/start.d.ts +6 -0
  570. package/dist/start.js +29 -0
  571. package/dist/start.js.map +1 -0
  572. package/dist/wiring.d.ts +158 -0
  573. package/dist/wiring.js +185 -0
  574. package/dist/wiring.js.map +1 -0
  575. package/package.json +56 -3
  576. package/prisma.config.ts +18 -0
  577. package/src/adapters/prisma/migrations/20260929124818_init/migration.sql +201 -0
  578. package/src/adapters/prisma/migrations/20260929160000_fleet_argo_console_session/migration.sql +130 -0
  579. package/src/adapters/prisma/migrations/20260929220017_operator_login/migration.sql +27 -0
  580. package/src/adapters/prisma/migrations/20260930090000_crew_token/migration.sql +5 -0
  581. package/src/adapters/prisma/migrations/20260930120000_send/migration.sql +30 -0
  582. package/src/adapters/prisma/migrations/20260930150000_receive/migration.sql +24 -0
  583. package/src/adapters/prisma/migrations/20261001010000_event_seq/migration.sql +34 -0
  584. package/src/adapters/prisma/migrations/20261001020000_console_session_end_reason/migration.sql +14 -0
  585. package/src/adapters/prisma/migrations/20261001030000_account_theme_session_device/migration.sql +8 -0
  586. package/src/adapters/prisma/migrations/20261001040000_lease_last_seen/migration.sql +2 -0
  587. package/src/adapters/prisma/migrations/20261002190000_lease_report/migration.sql +7 -0
  588. package/src/adapters/prisma/migrations/20261003140000_commission_key/migration.sql +7 -0
  589. package/src/adapters/prisma/migrations/20261003200000_message_model/migration.sql +5 -0
  590. package/src/adapters/prisma/migrations/20261003201000_lease_harness/migration.sql +2 -0
  591. package/src/adapters/prisma/migrations/20261004120000_operator_without_password/migration.sql +2 -0
  592. package/src/adapters/prisma/migrations/20261004121000_installation_requests/migration.sql +21 -0
  593. package/src/adapters/prisma/migrations/20261004122000_events_deleted_with_their_fleet/migration.sql +11 -0
  594. package/src/adapters/prisma/migrations/20261004130000_sign_in_tickets/migration.sql +16 -0
  595. package/src/adapters/prisma/migrations/20261004140000_fleet_limits/migration.sql +6 -0
  596. package/src/adapters/prisma/migrations/20261004141000_installation_settings/migration.sql +12 -0
  597. package/src/adapters/prisma/migrations/20261005090000_viewer_ship/migration.sql +2 -0
  598. package/src/adapters/prisma/migrations/20261005100000_viewer_sessions/migration.sql +20 -0
  599. package/src/adapters/prisma/migrations/20261005110000_notices/migration.sql +37 -0
  600. package/src/adapters/prisma/migrations/20261005120000_guide/migration.sql +34 -0
  601. package/src/adapters/prisma/migrations/20261006100000_fleet_crew_scope/migration.sql +8 -0
  602. package/src/adapters/prisma/migrations/20261006140000_lease_report_details/migration.sql +3 -0
  603. package/src/adapters/prisma/migrations/20261006160000_crew_requests/migration.sql +20 -0
  604. package/src/adapters/prisma/migrations/20261006180000_crew_scopes/migration.sql +9 -0
  605. package/src/adapters/prisma/migrations/20261006190000_crew_assignment/migration.sql +13 -0
  606. package/src/adapters/prisma/migrations/20261006200000_crew_request_reason/migration.sql +3 -0
  607. package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
  608. package/src/adapters/prisma/schema.prisma +558 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/adapters/crypto/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAItD,wFAAwF;AACxF,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;CAC1E,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,IAAI,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;CAClD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The device a console sign-in comes from, in a few words for the operator
3
+ * ("Mac · Chrome"), from the browser's User-Agent. A label only: never
4
+ * trusted for anything, so a rough reading is enough. The first match wins:
5
+ * an iPhone also says "like Mac OS X", Android also says "Linux", Edge also
6
+ * says "Chrome", and Chrome also says "Safari".
7
+ */
8
+ export declare const UNKNOWN_DEVICE_LABEL = "Unknown device";
9
+ export declare function deviceLabelOf(userAgent: string | undefined): string;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The device a console sign-in comes from, in a few words for the operator
3
+ * ("Mac · Chrome"), from the browser's User-Agent. A label only: never
4
+ * trusted for anything, so a rough reading is enough. The first match wins:
5
+ * an iPhone also says "like Mac OS X", Android also says "Linux", Edge also
6
+ * says "Chrome", and Chrome also says "Safari".
7
+ */
8
+ const SYSTEMS = [
9
+ [/iPhone/, 'iPhone'],
10
+ [/iPad/, 'iPad'],
11
+ [/Android/, 'Android'],
12
+ [/CrOS/, 'ChromeOS'],
13
+ [/Macintosh/, 'Mac'],
14
+ [/Windows/, 'Windows'],
15
+ [/Linux/, 'Linux'],
16
+ ];
17
+ const BROWSERS = [
18
+ [/Edg\//, 'Edge'],
19
+ [/OPR\//, 'Opera'],
20
+ [/Firefox\//, 'Firefox'],
21
+ [/Chrome\//, 'Chrome'],
22
+ [/Version\/[\d.]+.*Safari\//, 'Safari'],
23
+ ];
24
+ export const UNKNOWN_DEVICE_LABEL = 'Unknown device';
25
+ function firstMatch(userAgent, table) {
26
+ return table.find(([pattern]) => pattern.test(userAgent))?.[1];
27
+ }
28
+ export function deviceLabelOf(userAgent) {
29
+ if (userAgent === undefined) {
30
+ return UNKNOWN_DEVICE_LABEL;
31
+ }
32
+ const system = firstMatch(userAgent, SYSTEMS);
33
+ if (system === undefined) {
34
+ return UNKNOWN_DEVICE_LABEL;
35
+ }
36
+ const browser = firstMatch(userAgent, BROWSERS);
37
+ return browser === undefined ? system : `${system} · ${browser}`;
38
+ }
39
+ //# sourceMappingURL=device-label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-label.js","sourceRoot":"","sources":["../../../src/adapters/http/device-label.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,OAAO,GAAgC;IAC3C,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,MAAM,EAAE,UAAU,CAAC;IACpB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,SAAS,EAAE,SAAS,CAAC;IACtB,CAAC,OAAO,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAgC;IAC5C,CAAC,OAAO,EAAE,MAAM,CAAC;IACjB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,WAAW,EAAE,SAAS,CAAC;IACxB,CAAC,UAAU,EAAE,QAAQ,CAAC;IACtB,CAAC,2BAA2B,EAAE,QAAQ,CAAC;CACxC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAErD,SAAS,UAAU,CAAC,SAAiB,EAAE,KAAkC;IACvE,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAA6B;IACzD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,MAAM,OAAO,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Clock } from '../../domain/shared/clock.js';
2
+ export interface RateLimit {
3
+ /** Attempts allowed per key in one window. */
4
+ limit: number;
5
+ windowMs: number;
6
+ }
7
+ export interface RateLimiter {
8
+ /** Counts an attempt for the key. False when the key is over its limit in the current window. */
9
+ take(key: string): boolean;
10
+ /** True while the key has counted fewer than its limit in the current window. Counts nothing. */
11
+ hasRoom(key: string): boolean;
12
+ /** Counts one for the key, for a limit on some outcomes only, such as failures. */
13
+ count(key: string): void;
14
+ /** When the key's current window ends, so a key over its limit may try again; now when it has none. */
15
+ retryAt(key: string): Date;
16
+ }
17
+ /**
18
+ * A fixed-window counter per key, held in memory. v1 runs one server process
19
+ * (docs/architecture.md, "Deployment"), so a shared store is not needed yet.
20
+ */
21
+ export declare function createRateLimiter(limit: RateLimit, clock: Clock): RateLimiter;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * A fixed-window counter per key, held in memory. v1 runs one server process
3
+ * (docs/architecture.md, "Deployment"), so a shared store is not needed yet.
4
+ */
5
+ export function createRateLimiter(limit, clock) {
6
+ const windows = new Map();
7
+ /** The key's count in the current window, after forgetting finished windows. */
8
+ const countIn = (key, now) => {
9
+ const current = windows.get(key);
10
+ if (!current || now - current.startedAt >= limit.windowMs) {
11
+ forgetFinishedWindows(windows, { now, windowMs: limit.windowMs });
12
+ return 0;
13
+ }
14
+ return current.count;
15
+ };
16
+ const count = (key) => {
17
+ const now = clock.now().getTime();
18
+ const counted = countIn(key, now) + 1;
19
+ const startedAt = counted === 1 ? now : (windows.get(key)?.startedAt ?? now);
20
+ windows.set(key, { startedAt, count: counted });
21
+ return counted;
22
+ };
23
+ return {
24
+ take: (key) => count(key) <= limit.limit,
25
+ hasRoom: (key) => countIn(key, clock.now().getTime()) < limit.limit,
26
+ count: (key) => {
27
+ count(key);
28
+ },
29
+ retryAt: (key) => {
30
+ const now = clock.now().getTime();
31
+ const current = countIn(key, now) === 0 ? undefined : windows.get(key);
32
+ return new Date(current ? current.startedAt + limit.windowMs : now);
33
+ },
34
+ };
35
+ }
36
+ function forgetFinishedWindows(windows, at) {
37
+ const { now, windowMs } = at;
38
+ for (const [key, window] of windows) {
39
+ if (now - window.startedAt >= windowMs) {
40
+ windows.delete(key);
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/adapters/http/rate-limiter.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAgB,EAAE,KAAY;IAC9D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgD,CAAC;IAExE,gFAAgF;IAChF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,GAAW,EAAU,EAAE;QACnD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,OAAO,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1D,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,GAAW,EAAU,EAAE;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK;QACxC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK;QACnE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACb,KAAK,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,OAA2C,EAAE,EAAqC;IAC/G,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACpC,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * How a request says who it is: a crew token as a bearer token, or the console
3
+ * session cookie. The ship secret travels only in the body of `register`.
4
+ *
5
+ * The console session cookie holds the random session token, never the ship secret.
6
+ * httpOnly so scripts cannot read it, Secure so it only travels over HTTPS
7
+ * (browsers accept it on http://localhost for development), SameSite=Strict so
8
+ * no other site's page can make the browser send it.
9
+ */
10
+ export declare const SESSION_COOKIE_NAME = "aeolus_session";
11
+ /** The session token from a Cookie request header, if there is one. */
12
+ export declare function readSessionToken(cookieHeader: string | undefined): string | undefined;
13
+ /** A Set-Cookie value that keeps the token until the session expires. */
14
+ export declare function sessionCookie(cookie: {
15
+ token: string;
16
+ expiresAt: Date;
17
+ now: Date;
18
+ domain?: string;
19
+ }): string;
20
+ /** A Set-Cookie value that removes the cookie, for the same domain it was set for. */
21
+ export declare function clearedSessionCookie(domain?: string): string;
22
+ /** The token from an `Authorization: Bearer <token>` header, if there is one. */
23
+ export declare function readBearer(authorizationHeader: string | undefined): string | undefined;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * How a request says who it is: a crew token as a bearer token, or the console
3
+ * session cookie. The ship secret travels only in the body of `register`.
4
+ *
5
+ * The console session cookie holds the random session token, never the ship secret.
6
+ * httpOnly so scripts cannot read it, Secure so it only travels over HTTPS
7
+ * (browsers accept it on http://localhost for development), SameSite=Strict so
8
+ * no other site's page can make the browser send it.
9
+ */
10
+ export const SESSION_COOKIE_NAME = 'aeolus_session';
11
+ const ATTRIBUTES = 'Path=/; HttpOnly; Secure; SameSite=Strict';
12
+ /**
13
+ * The cookie's scope: every host under the configured domain, so a console on
14
+ * another host of that domain sends it too; otherwise the server's host only.
15
+ */
16
+ function scope(domain) {
17
+ return domain === undefined ? ATTRIBUTES : `Domain=${domain}; ${ATTRIBUTES}`;
18
+ }
19
+ /** The session token from a Cookie request header, if there is one. */
20
+ export function readSessionToken(cookieHeader) {
21
+ for (const pair of cookieHeader?.split(';') ?? []) {
22
+ const separator = pair.indexOf('=');
23
+ if (separator !== -1 && pair.slice(0, separator).trim() === SESSION_COOKIE_NAME) {
24
+ const value = pair.slice(separator + 1).trim();
25
+ return value === '' ? undefined : value;
26
+ }
27
+ }
28
+ return undefined;
29
+ }
30
+ /** A Set-Cookie value that keeps the token until the session expires. */
31
+ export function sessionCookie(cookie) {
32
+ const { token, expiresAt, now, domain } = cookie;
33
+ const maxAgeSeconds = Math.max(0, Math.floor((expiresAt.getTime() - now.getTime()) / 1000));
34
+ return `${SESSION_COOKIE_NAME}=${token}; Max-Age=${maxAgeSeconds}; ${scope(domain)}`;
35
+ }
36
+ /** A Set-Cookie value that removes the cookie, for the same domain it was set for. */
37
+ export function clearedSessionCookie(domain) {
38
+ return `${SESSION_COOKIE_NAME}=; Max-Age=0; ${scope(domain)}`;
39
+ }
40
+ /** The token from an `Authorization: Bearer <token>` header, if there is one. */
41
+ export function readBearer(authorizationHeader) {
42
+ const match = /^Bearer\s+(\S+)\s*$/i.exec(authorizationHeader ?? '');
43
+ return match?.[1];
44
+ }
45
+ //# sourceMappingURL=request-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-credentials.js","sourceRoot":"","sources":["../../../src/adapters/http/request-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,UAAU,GAAG,2CAA2C,CAAC;AAE/D;;;GAGG;AACH,SAAS,KAAK,CAAC,MAA0B;IACvC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,MAAM,KAAK,UAAU,EAAE,CAAC;AAC/E,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,YAAgC;IAC/D,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,KAAK,mBAAmB,EAAE,CAAC;YAChF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,MAAsE;IAClG,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC5F,OAAO,GAAG,mBAAmB,IAAI,KAAK,aAAa,aAAa,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAAC,MAAe;IAClD,OAAO,GAAG,mBAAmB,iBAAiB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,mBAAuC;IAChE,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { type FastifyInstance, type FastifyServerOptions } from 'fastify';
2
+ import type { Clock } from '../../domain/shared/clock.js';
3
+ import type { FleetEventWatches, UseCases } from '../trpc/context.js';
4
+ import { type RateLimit } from './rate-limiter.js';
5
+ /** Ten sign-in attempts per client per minute. */
6
+ export declare const DEFAULT_SIGN_IN_RATE_LIMIT: RateLimit;
7
+ /** Ten failed register attempts per client per minute; successful ones are never counted (ADR 0015). */
8
+ export declare const DEFAULT_REGISTER_RATE_LIMIT: RateLimit;
9
+ export interface HttpServerOptions {
10
+ useCases: UseCases;
11
+ /**
12
+ * Wakes live subscriptions when their fleet commits events. The app feeds
13
+ * them from the listener; unset, a subscription hears only what it reads
14
+ * when it starts.
15
+ */
16
+ fleetEvents?: FleetEventWatches;
17
+ /** Throws when the database is unreachable. */
18
+ checkDatabase: () => Promise<void>;
19
+ /** The latest migration applied to the database; null before the first. Throws when unreachable. */
20
+ latestMigration: () => Promise<string | null>;
21
+ clock: Clock;
22
+ logger: FastifyServerOptions['logger'];
23
+ /** Trust X-Forwarded-For from a reverse proxy in front of the server, for the client address. */
24
+ shouldTrustProxy?: boolean;
25
+ signInRateLimit?: RateLimit;
26
+ /** Failed register attempts per client; successful ones are never counted. */
27
+ registerRateLimit?: RateLimit;
28
+ /** The domain the session cookie is set for. Unset: the server's host only. */
29
+ cookieDomain?: string;
30
+ /** Where ships reach the fleet, the public URL: what starting prompts and crew lines carry. */
31
+ fleetUrl: string;
32
+ /** The installation token that opens the installation procedures; unset, they are off. */
33
+ installationToken?: string;
34
+ /**
35
+ * The console's origin: state-changing console calls come only from it, and
36
+ * a console on another host may call from it with credentials (CORS).
37
+ */
38
+ consoleOrigin: string;
39
+ }
40
+ /**
41
+ * The HTTP host: `/trpc` for the API (its subscriptions over a WebSocket on
42
+ * the same path), `/api/v1` (REST) and `/mcp` for ships, and `/health` for
43
+ * monitoring. Every door builds its calls' context the same
44
+ * way, so the register limit is one budget per client address across all of
45
+ * them.
46
+ */
47
+ export declare function buildHttpServer(options: HttpServerOptions): FastifyInstance;
@@ -0,0 +1,216 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import fastifyWebsocket from '@fastify/websocket';
3
+ import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
4
+ import { getWSConnectionHandler, handleKeepAlive } from '@trpc/server/adapters/ws';
5
+ import Fastify, {} from 'fastify';
6
+ import { registerMcpEndpoint } from '../mcp/mcp-endpoint.js';
7
+ import { createFleetEventWakeups } from '../prisma/fleet-event-wakeups.js';
8
+ import { failureForLog } from '../prisma/failure-log.js';
9
+ import { registerRestApi } from '../rest/rest-api.js';
10
+ import { appRouter } from '../trpc/router.js';
11
+ import { refusalBody, unexpectedFailure } from '../trpc/ship-contract.js';
12
+ import { createRateLimiter } from './rate-limiter.js';
13
+ import { clearedSessionCookie, readBearer, readSessionToken, sessionCookie } from './request-credentials.js';
14
+ import { runningVersions } from './version.js';
15
+ import { INSTALLATION_TOKEN_HEADER } from '../trpc/installation.js';
16
+ /** A header's one value: a header sent twice counts as not sent. */
17
+ function headerValue(value) {
18
+ return typeof value === 'string' ? value : undefined;
19
+ }
20
+ /** Ten sign-in attempts per client per minute. */
21
+ export const DEFAULT_SIGN_IN_RATE_LIMIT = { limit: 10, windowMs: 60_000 };
22
+ /** Ten failed register attempts per client per minute; successful ones are never counted (ADR 0015). */
23
+ export const DEFAULT_REGISTER_RATE_LIMIT = { limit: 10, windowMs: 60_000 };
24
+ /**
25
+ * Refusals Fastify raises itself, before any route runs, by its error code:
26
+ * our code and words, never Fastify's, whose messages may echo the request.
27
+ */
28
+ const FASTIFY_REFUSALS = {
29
+ FST_ERR_CTP_INVALID_JSON_BODY: { httpStatus: 400, code: 'BAD_REQUEST', message: 'The request body is not valid JSON' },
30
+ FST_ERR_CTP_EMPTY_JSON_BODY: { httpStatus: 400, code: 'BAD_REQUEST', message: 'The request body is not valid JSON' },
31
+ FST_ERR_CTP_BODY_TOO_LARGE: { httpStatus: 413, code: 'PAYLOAD_TOO_LARGE', message: 'The request body is over 1 MiB' },
32
+ FST_ERR_CTP_INVALID_MEDIA_TYPE: {
33
+ httpStatus: 415,
34
+ code: 'UNSUPPORTED_MEDIA_TYPE',
35
+ message: 'The request body must be JSON',
36
+ },
37
+ };
38
+ /** Any other request Fastify cannot read. */
39
+ const UNREADABLE_REQUEST = { httpStatus: 400, code: 'BAD_REQUEST', message: 'The request cannot be read' };
40
+ /**
41
+ * How often the server pings a live subscription's socket, and how long it
42
+ * waits for the pong before it closes it: a browser that went away without a
43
+ * word frees its subscription within a minute.
44
+ */
45
+ const KEEP_ALIVE = { pingMs: 30_000, pongWaitMs: 10_000 };
46
+ /** Fastify's own limit on a request body, which its refusal above names: 1 MiB. */
47
+ const BODY_LIMIT_BYTES = 1024 * 1024;
48
+ /** How long a browser may keep the answer to a preflight, in seconds. */
49
+ const PREFLIGHT_MAX_AGE_S = 600;
50
+ /**
51
+ * The session cookie at a door for ships: REST and MCP never read the console
52
+ * session, so they never set or clear its cookie either.
53
+ */
54
+ const NO_SESSION_COOKIE = { set: () => undefined, clear: () => undefined };
55
+ /**
56
+ * The HTTP host: `/trpc` for the API (its subscriptions over a WebSocket on
57
+ * the same path), `/api/v1` (REST) and `/mcp` for ships, and `/health` for
58
+ * monitoring. Every door builds its calls' context the same
59
+ * way, so the register limit is one budget per client address across all of
60
+ * them.
61
+ */
62
+ export function buildHttpServer(options) {
63
+ const server = Fastify({
64
+ logger: options.logger ?? false,
65
+ trustProxy: options.shouldTrustProxy ?? false,
66
+ // Unique across restarts, so a caller's request id finds one log line.
67
+ genReqId: () => randomUUID(),
68
+ // tRPC batches several procedure paths into one URL segment.
69
+ routerOptions: { maxParamLength: 5000 },
70
+ bodyLimit: BODY_LIMIT_BYTES,
71
+ });
72
+ // Set first, so every door inherits it. A route's own failures are its own
73
+ // to answer; what reaches this is an error Fastify raised itself.
74
+ // eslint-disable-next-line @typescript-eslint/max-params -- Fastify calls its error handler with three arguments.
75
+ server.setErrorHandler(async (error, request, reply) => {
76
+ const isRefusal = error.statusCode !== undefined && error.statusCode < 500;
77
+ const refusal = FASTIFY_REFUSALS[error.code] ?? (isRefusal ? UNREADABLE_REQUEST : undefined);
78
+ if (refusal !== undefined) {
79
+ return reply.code(refusal.httpStatus).send({ code: refusal.code, message: refusal.message });
80
+ }
81
+ const failure = unexpectedFailure(error, { log: request.log, requestId: request.id });
82
+ return reply.code(failure.httpStatus).send(refusalBody(failure));
83
+ });
84
+ server.setNotFoundHandler(async (_request, reply) => reply.code(404).send({ code: 'NOT_FOUND', message: 'Nothing is served at this path' }));
85
+ const signInLimiter = createRateLimiter(options.signInRateLimit ?? DEFAULT_SIGN_IN_RATE_LIMIT, options.clock);
86
+ const registerFailures = createRateLimiter(options.registerRateLimit ?? DEFAULT_REGISTER_RATE_LIMIT, options.clock);
87
+ const { consoleOrigin, cookieDomain } = options;
88
+ const fleetEvents = options.fleetEvents ?? createFleetEventWakeups();
89
+ // The console may run on another host under the cookie's domain (ADR 0012).
90
+ // Its origin, and no other, may call with credentials and read the answer.
91
+ // On the server's own origin the browser needs none of this, and ignores it.
92
+ server.addHook('onRequest', async (request, reply) => {
93
+ void reply.header('vary', 'Origin');
94
+ if (request.headers.origin !== consoleOrigin) {
95
+ return;
96
+ }
97
+ void reply.header('access-control-allow-origin', consoleOrigin);
98
+ void reply.header('access-control-allow-credentials', 'true');
99
+ if (request.method === 'OPTIONS') {
100
+ await reply
101
+ .code(204)
102
+ .header('access-control-allow-methods', 'GET, POST')
103
+ .header('access-control-allow-headers', 'content-type')
104
+ .header('access-control-max-age', String(PREFLIGHT_MAX_AGE_S))
105
+ .send();
106
+ }
107
+ });
108
+ // The versions this process runs and the database's latest migration, for
109
+ // whoever operates the installation. No authentication, no fleet data.
110
+ const versions = runningVersions();
111
+ server.get('/api/version', async () => {
112
+ let migration = null;
113
+ try {
114
+ migration = await options.latestMigration();
115
+ }
116
+ catch (error) {
117
+ server.log.error(failureForLog(error), 'latest migration unknown');
118
+ }
119
+ return { ...versions, migration };
120
+ });
121
+ // Server up and database reachable. Nothing about fleets.
122
+ server.get('/health', async (_request, reply) => {
123
+ try {
124
+ await options.checkDatabase();
125
+ return { server: 'up', database: 'up' };
126
+ }
127
+ catch (error) {
128
+ server.log.error(failureForLog(error), 'health check failed');
129
+ return reply.code(503).send({ server: 'up', database: 'down' });
130
+ }
131
+ });
132
+ /** A call's context: who it says it is, how it may say so at this door, and where it came from. */
133
+ const contextFor = (request, caller) => ({
134
+ useCases: options.useCases,
135
+ fleetUrl: options.fleetUrl,
136
+ installation: { configured: options.installationToken, presented: headerValue(request.headers[INSTALLATION_TOKEN_HEADER]) },
137
+ log: request.log,
138
+ fleetEvents,
139
+ ...caller,
140
+ userAgent: request.headers['user-agent'],
141
+ origin: request.headers.origin,
142
+ consoleOrigin,
143
+ clientKey: request.ip,
144
+ requestId: request.id,
145
+ takeSignInAttempt: (clientKey) => signInLimiter.take(clientKey),
146
+ signInRetryAt: (clientKey) => signInLimiter.retryAt(clientKey),
147
+ registerFailures,
148
+ });
149
+ const trpc = {
150
+ prefix: '/trpc',
151
+ trpcOptions: {
152
+ router: appRouter,
153
+ createContext: ({ req, res }) => contextFor(req, {
154
+ credentials: {
155
+ bearer: readBearer(req.headers.authorization),
156
+ sessionToken: readSessionToken(req.headers.cookie),
157
+ },
158
+ canUseConsoleSession: true,
159
+ sessionCookie: {
160
+ set: (token, expiresAt) => {
161
+ void res.header('set-cookie', sessionCookie({ token, expiresAt, now: options.clock.now(), domain: cookieDomain }));
162
+ },
163
+ clear: () => {
164
+ void res.header('set-cookie', clearedSessionCookie(cookieDomain));
165
+ },
166
+ },
167
+ }),
168
+ // The whole failure goes to the log only, under the request's id (the
169
+ // label Fastify's own request lines use); the answer carries that id.
170
+ onError: ({ path, error, ctx }) => {
171
+ if (error.code === 'INTERNAL_SERVER_ERROR') {
172
+ server.log.error({ reqId: ctx?.requestId, path, ...failureForLog(error) }, 'procedure failed');
173
+ }
174
+ },
175
+ },
176
+ };
177
+ void server.register(fastifyTRPCPlugin, trpc);
178
+ // Live subscriptions: one WebSocket per console, opened on /trpc with the
179
+ // session cookie and the page's Origin, both of which a browser sends on
180
+ // the upgrade. Nothing can set a cookie on a socket, so the session's
181
+ // renewal waits for the console's next HTTP call.
182
+ void server.register(async (scope) => {
183
+ await scope.register(fastifyWebsocket);
184
+ const onConnection = getWSConnectionHandler({
185
+ router: appRouter,
186
+ wss: scope.websocketServer,
187
+ createContext: ({ req }) => contextFor({
188
+ headers: req.headers,
189
+ ip: req.socket.remoteAddress ?? '',
190
+ id: randomUUID(),
191
+ log: server.log,
192
+ }, {
193
+ credentials: { sessionToken: readSessionToken(req.headers.cookie) },
194
+ canUseConsoleSession: true,
195
+ sessionCookie: NO_SESSION_COOKIE,
196
+ }),
197
+ onError: ({ path, error, ctx }) => {
198
+ if (error.code === 'INTERNAL_SERVER_ERROR') {
199
+ server.log.error({ reqId: ctx?.requestId, path, ...failureForLog(error) }, 'subscription failed');
200
+ }
201
+ },
202
+ });
203
+ scope.get('/trpc', { websocket: true }, (socket, request) => {
204
+ onConnection(socket, request.raw);
205
+ handleKeepAlive(socket, KEEP_ALIVE.pingMs, KEEP_ALIVE.pongWaitMs);
206
+ });
207
+ });
208
+ // The doors for ships: the credentials are the ones the call carries, never the console session.
209
+ const shipDoor = {
210
+ contextFor: (request, credentials) => contextFor(request, { credentials, canUseConsoleSession: false, sessionCookie: NO_SESSION_COOKIE }),
211
+ };
212
+ registerRestApi(server, shipDoor);
213
+ registerMcpEndpoint(server, shipDoor);
214
+ return server;
215
+ }
216
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/http/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The versions this server process runs: its own package's, and that of the
3
+ * @aeolus-fleet/common it loaded, which a deploy that failed halfway may
4
+ * leave different. Read once, when the server starts.
5
+ */
6
+ export declare function runningVersions(): {
7
+ server: string;
8
+ common: string;
9
+ };
@@ -0,0 +1,23 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { z } from 'zod';
4
+ const packageJson = z.object({ version: z.string() });
5
+ /** The version in a package.json, read from disk: what this process runs, not what a deploy meant to ship. */
6
+ function versionAt(file) {
7
+ return packageJson.parse(JSON.parse(readFileSync(file, 'utf8'))).version;
8
+ }
9
+ /**
10
+ * The versions this server process runs: its own package's, and that of the
11
+ * @aeolus-fleet/common it loaded, which a deploy that failed halfway may
12
+ * leave different. Read once, when the server starts.
13
+ */
14
+ export function runningVersions() {
15
+ // This file sits at src/adapters/http, or dist/adapters/http once built:
16
+ // the package root is three levels up either way.
17
+ const server = versionAt(new URL('../../../package.json', import.meta.url));
18
+ const commonEntry = createRequire(import.meta.url).resolve('@aeolus-fleet/common');
19
+ // Common's entry is src/index.ts or dist/index.js: its package.json is one level up.
20
+ const common = versionAt(new URL('../package.json', `file://${commonEntry}`));
21
+ return { server, common };
22
+ }
23
+ //# 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;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,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,8GAA8G;AAC9G,SAAS,SAAS,CAAC,IAAkB;IACnC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,yEAAyE;IACzE,kDAAkD;IAClD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACnF,qFAAqF;IACrF,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { FastifyInstance, FastifyRequest } from 'fastify';
2
+ import type { Context, RequestCredentials } from '../trpc/context.js';
3
+ export interface McpEndpointOptions {
4
+ /** The context of one call, for this request, with the credentials the tool call carries. */
5
+ contextFor: (request: FastifyRequest, credentials: RequestCredentials) => Context;
6
+ }
7
+ /** Mounts `/mcp` on the HTTP server. */
8
+ export declare function registerMcpEndpoint(server: FastifyInstance, options: McpEndpointOptions): void;