@aeolus-fleet/core 0.0.0 → 0.19.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 (610) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +98 -1
  3. package/dist/adapters/cli/fleet-init.d.ts +14 -0
  4. package/dist/adapters/cli/fleet-init.js +68 -0
  5. package/dist/adapters/cli/fleet-init.js.map +1 -0
  6. package/dist/adapters/cli/io.d.ts +35 -0
  7. package/dist/adapters/cli/io.js +21 -0
  8. package/dist/adapters/cli/io.js.map +1 -0
  9. package/dist/adapters/cli/migrate.d.ts +11 -0
  10. package/dist/adapters/cli/migrate.js +12 -0
  11. package/dist/adapters/cli/migrate.js.map +1 -0
  12. package/dist/adapters/cli/operator-reset-password.d.ts +12 -0
  13. package/dist/adapters/cli/operator-reset-password.js +49 -0
  14. package/dist/adapters/cli/operator-reset-password.js.map +1 -0
  15. package/dist/adapters/cli/run.d.ts +14 -0
  16. package/dist/adapters/cli/run.js +40 -0
  17. package/dist/adapters/cli/run.js.map +1 -0
  18. package/dist/adapters/cli/terminal.d.ts +20 -0
  19. package/dist/adapters/cli/terminal.js +68 -0
  20. package/dist/adapters/cli/terminal.js.map +1 -0
  21. package/dist/adapters/crypto/passwords.d.ts +2 -0
  22. package/dist/adapters/crypto/passwords.js +59 -0
  23. package/dist/adapters/crypto/passwords.js.map +1 -0
  24. package/dist/adapters/crypto/secrets.d.ts +5 -0
  25. package/dist/adapters/crypto/secrets.js +10 -0
  26. package/dist/adapters/crypto/secrets.js.map +1 -0
  27. package/dist/adapters/http/device-label.d.ts +9 -0
  28. package/dist/adapters/http/device-label.js +39 -0
  29. package/dist/adapters/http/device-label.js.map +1 -0
  30. package/dist/adapters/http/rate-limiter.d.ts +21 -0
  31. package/dist/adapters/http/rate-limiter.js +44 -0
  32. package/dist/adapters/http/rate-limiter.js.map +1 -0
  33. package/dist/adapters/http/request-credentials.d.ts +23 -0
  34. package/dist/adapters/http/request-credentials.js +45 -0
  35. package/dist/adapters/http/request-credentials.js.map +1 -0
  36. package/dist/adapters/http/server.d.ts +47 -0
  37. package/dist/adapters/http/server.js +216 -0
  38. package/dist/adapters/http/server.js.map +1 -0
  39. package/dist/adapters/http/version.d.ts +9 -0
  40. package/dist/adapters/http/version.js +23 -0
  41. package/dist/adapters/http/version.js.map +1 -0
  42. package/dist/adapters/mcp/mcp-endpoint.d.ts +8 -0
  43. package/dist/adapters/mcp/mcp-endpoint.js +127 -0
  44. package/dist/adapters/mcp/mcp-endpoint.js.map +1 -0
  45. package/dist/adapters/prisma/client.d.ts +10 -0
  46. package/dist/adapters/prisma/client.js +20 -0
  47. package/dist/adapters/prisma/client.js.map +1 -0
  48. package/dist/adapters/prisma/delivery-notices.d.ts +34 -0
  49. package/dist/adapters/prisma/delivery-notices.js +113 -0
  50. package/dist/adapters/prisma/delivery-notices.js.map +1 -0
  51. package/dist/adapters/prisma/event-log.d.ts +11 -0
  52. package/dist/adapters/prisma/event-log.js +61 -0
  53. package/dist/adapters/prisma/event-log.js.map +1 -0
  54. package/dist/adapters/prisma/failure-log.d.ts +22 -0
  55. package/dist/adapters/prisma/failure-log.js +70 -0
  56. package/dist/adapters/prisma/failure-log.js.map +1 -0
  57. package/dist/adapters/prisma/fleet-counter.d.ts +3 -0
  58. package/dist/adapters/prisma/fleet-counter.js +6 -0
  59. package/dist/adapters/prisma/fleet-counter.js.map +1 -0
  60. package/dist/adapters/prisma/fleet-event-wakeups.d.ts +33 -0
  61. package/dist/adapters/prisma/fleet-event-wakeups.js +86 -0
  62. package/dist/adapters/prisma/fleet-event-wakeups.js.map +1 -0
  63. package/dist/adapters/prisma/generated/browser.d.ts +127 -0
  64. package/dist/adapters/prisma/generated/browser.js +18 -0
  65. package/dist/adapters/prisma/generated/browser.js.map +1 -0
  66. package/dist/adapters/prisma/generated/client.d.ts +146 -0
  67. package/dist/adapters/prisma/generated/client.js +38 -0
  68. package/dist/adapters/prisma/generated/client.js.map +1 -0
  69. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +879 -0
  70. package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
  71. package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
  72. package/dist/adapters/prisma/generated/enums.d.ts +75 -0
  73. package/dist/adapters/prisma/generated/enums.js +73 -0
  74. package/dist/adapters/prisma/generated/enums.js.map +1 -0
  75. package/dist/adapters/prisma/generated/internal/class.d.ts +308 -0
  76. package/dist/adapters/prisma/generated/internal/class.js +52 -0
  77. package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
  78. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2131 -0
  79. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +295 -0
  80. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
  81. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
  82. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +265 -0
  83. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  84. package/dist/adapters/prisma/generated/models/ConsoleSession.d.ts +2137 -0
  85. package/dist/adapters/prisma/generated/models/ConsoleSession.js +2 -0
  86. package/dist/adapters/prisma/generated/models/ConsoleSession.js.map +1 -0
  87. package/dist/adapters/prisma/generated/models/Credential.d.ts +1360 -0
  88. package/dist/adapters/prisma/generated/models/Credential.js +2 -0
  89. package/dist/adapters/prisma/generated/models/Credential.js.map +1 -0
  90. package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +1558 -0
  91. package/dist/adapters/prisma/generated/models/CrewRequest.js +2 -0
  92. package/dist/adapters/prisma/generated/models/CrewRequest.js.map +1 -0
  93. package/dist/adapters/prisma/generated/models/Delivery.d.ts +2211 -0
  94. package/dist/adapters/prisma/generated/models/Delivery.js +2 -0
  95. package/dist/adapters/prisma/generated/models/Delivery.js.map +1 -0
  96. package/dist/adapters/prisma/generated/models/Event.d.ts +1991 -0
  97. package/dist/adapters/prisma/generated/models/Event.js +2 -0
  98. package/dist/adapters/prisma/generated/models/Event.js.map +1 -0
  99. package/dist/adapters/prisma/generated/models/Fleet.d.ts +3032 -0
  100. package/dist/adapters/prisma/generated/models/Fleet.js +2 -0
  101. package/dist/adapters/prisma/generated/models/Fleet.js.map +1 -0
  102. package/dist/adapters/prisma/generated/models/Guide.d.ts +943 -0
  103. package/dist/adapters/prisma/generated/models/Guide.js +2 -0
  104. package/dist/adapters/prisma/generated/models/Guide.js.map +1 -0
  105. package/dist/adapters/prisma/generated/models/GuideProgress.d.ts +1323 -0
  106. package/dist/adapters/prisma/generated/models/GuideProgress.js +2 -0
  107. package/dist/adapters/prisma/generated/models/GuideProgress.js.map +1 -0
  108. package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1036 -0
  109. package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
  110. package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
  111. package/dist/adapters/prisma/generated/models/InstallationSettings.d.ts +1027 -0
  112. package/dist/adapters/prisma/generated/models/InstallationSettings.js +2 -0
  113. package/dist/adapters/prisma/generated/models/InstallationSettings.js.map +1 -0
  114. package/dist/adapters/prisma/generated/models/Lease.d.ts +2076 -0
  115. package/dist/adapters/prisma/generated/models/Lease.js +2 -0
  116. package/dist/adapters/prisma/generated/models/Lease.js.map +1 -0
  117. package/dist/adapters/prisma/generated/models/Message.d.ts +2869 -0
  118. package/dist/adapters/prisma/generated/models/Message.js +2 -0
  119. package/dist/adapters/prisma/generated/models/Message.js.map +1 -0
  120. package/dist/adapters/prisma/generated/models/Notice.d.ts +1068 -0
  121. package/dist/adapters/prisma/generated/models/Notice.js +2 -0
  122. package/dist/adapters/prisma/generated/models/Notice.js.map +1 -0
  123. package/dist/adapters/prisma/generated/models/NoticeDismissal.d.ts +1245 -0
  124. package/dist/adapters/prisma/generated/models/NoticeDismissal.js +2 -0
  125. package/dist/adapters/prisma/generated/models/NoticeDismissal.js.map +1 -0
  126. package/dist/adapters/prisma/generated/models/Operator.d.ts +1173 -0
  127. package/dist/adapters/prisma/generated/models/Operator.js +2 -0
  128. package/dist/adapters/prisma/generated/models/Operator.js.map +1 -0
  129. package/dist/adapters/prisma/generated/models/Ship.d.ts +3320 -0
  130. package/dist/adapters/prisma/generated/models/Ship.js +2 -0
  131. package/dist/adapters/prisma/generated/models/Ship.js.map +1 -0
  132. package/dist/adapters/prisma/generated/models/SignInTicket.d.ts +1222 -0
  133. package/dist/adapters/prisma/generated/models/SignInTicket.js +2 -0
  134. package/dist/adapters/prisma/generated/models/SignInTicket.js.map +1 -0
  135. package/dist/adapters/prisma/generated/models.d.ts +18 -0
  136. package/dist/adapters/prisma/generated/models.js +2 -0
  137. package/dist/adapters/prisma/generated/models.js.map +1 -0
  138. package/dist/adapters/prisma/history.d.ts +3 -0
  139. package/dist/adapters/prisma/history.js +289 -0
  140. package/dist/adapters/prisma/history.js.map +1 -0
  141. package/dist/adapters/prisma/identity.d.ts +10 -0
  142. package/dist/adapters/prisma/identity.js +213 -0
  143. package/dist/adapters/prisma/identity.js.map +1 -0
  144. package/dist/adapters/prisma/installation.d.ts +13 -0
  145. package/dist/adapters/prisma/installation.js +155 -0
  146. package/dist/adapters/prisma/installation.js.map +1 -0
  147. package/dist/adapters/prisma/messaging.d.ts +4 -0
  148. package/dist/adapters/prisma/messaging.js +156 -0
  149. package/dist/adapters/prisma/messaging.js.map +1 -0
  150. package/dist/adapters/prisma/migrate.d.ts +5 -0
  151. package/dist/adapters/prisma/migrate.js +40 -0
  152. package/dist/adapters/prisma/migrate.js.map +1 -0
  153. package/dist/adapters/prisma/receiver-wakeups.d.ts +26 -0
  154. package/dist/adapters/prisma/receiver-wakeups.js +79 -0
  155. package/dist/adapters/prisma/receiver-wakeups.js.map +1 -0
  156. package/dist/adapters/prisma/registry.d.ts +8 -0
  157. package/dist/adapters/prisma/registry.js +427 -0
  158. package/dist/adapters/prisma/registry.js.map +1 -0
  159. package/dist/adapters/prisma/rows.d.ts +58 -0
  160. package/dist/adapters/prisma/rows.js +408 -0
  161. package/dist/adapters/prisma/rows.js.map +1 -0
  162. package/dist/adapters/prisma/unit-of-work.d.ts +36 -0
  163. package/dist/adapters/prisma/unit-of-work.js +66 -0
  164. package/dist/adapters/prisma/unit-of-work.js.map +1 -0
  165. package/dist/adapters/rest/openapi.d.ts +12 -0
  166. package/dist/adapters/rest/openapi.js +62 -0
  167. package/dist/adapters/rest/openapi.js.map +1 -0
  168. package/dist/adapters/rest/rest-api.d.ts +8 -0
  169. package/dist/adapters/rest/rest-api.js +61 -0
  170. package/dist/adapters/rest/rest-api.js.map +1 -0
  171. package/dist/adapters/trpc/console.d.ts +150 -0
  172. package/dist/adapters/trpc/console.js +102 -0
  173. package/dist/adapters/trpc/console.js.map +1 -0
  174. package/dist/adapters/trpc/context.d.ts +201 -0
  175. package/dist/adapters/trpc/context.js +2 -0
  176. package/dist/adapters/trpc/context.js.map +1 -0
  177. package/dist/adapters/trpc/fleet.d.ts +637 -0
  178. package/dist/adapters/trpc/fleet.js +437 -0
  179. package/dist/adapters/trpc/fleet.js.map +1 -0
  180. package/dist/adapters/trpc/installation.d.ts +414 -0
  181. package/dist/adapters/trpc/installation.js +138 -0
  182. package/dist/adapters/trpc/installation.js.map +1 -0
  183. package/dist/adapters/trpc/router.d.ts +1263 -0
  184. package/dist/adapters/trpc/router.js +15 -0
  185. package/dist/adapters/trpc/router.js.map +1 -0
  186. package/dist/adapters/trpc/ship-contract.d.ts +107 -0
  187. package/dist/adapters/trpc/ship-contract.js +165 -0
  188. package/dist/adapters/trpc/ship-contract.js.map +1 -0
  189. package/dist/adapters/trpc/ship-protocol.d.ts +9 -0
  190. package/dist/adapters/trpc/ship-protocol.js +25 -0
  191. package/dist/adapters/trpc/ship-protocol.js.map +1 -0
  192. package/dist/adapters/trpc/ship.d.ts +209 -0
  193. package/dist/adapters/trpc/ship.js +214 -0
  194. package/dist/adapters/trpc/ship.js.map +1 -0
  195. package/dist/adapters/trpc/starting-prompt-text.d.ts +7 -0
  196. package/dist/adapters/trpc/starting-prompt-text.js +60 -0
  197. package/dist/adapters/trpc/starting-prompt-text.js.map +1 -0
  198. package/dist/adapters/trpc/system.d.ts +29 -0
  199. package/dist/adapters/trpc/system.js +15 -0
  200. package/dist/adapters/trpc/system.js.map +1 -0
  201. package/dist/adapters/trpc/trpc.d.ts +131 -0
  202. package/dist/adapters/trpc/trpc.js +350 -0
  203. package/dist/adapters/trpc/trpc.js.map +1 -0
  204. package/dist/app.d.ts +31 -0
  205. package/dist/app.js +80 -0
  206. package/dist/app.js.map +1 -0
  207. package/dist/bin/aeolus-core.d.ts +2 -0
  208. package/dist/bin/aeolus-core.js +45 -0
  209. package/dist/bin/aeolus-core.js.map +1 -0
  210. package/dist/config.d.ts +35 -0
  211. package/dist/config.js +74 -0
  212. package/dist/config.js.map +1 -0
  213. package/dist/domain/identity/authenticate.d.ts +46 -0
  214. package/dist/domain/identity/authenticate.js +18 -0
  215. package/dist/domain/identity/authenticate.js.map +1 -0
  216. package/dist/domain/identity/console-session.d.ts +54 -0
  217. package/dist/domain/identity/console-session.js +29 -0
  218. package/dist/domain/identity/console-session.js.map +1 -0
  219. package/dist/domain/identity/credential.d.ts +76 -0
  220. package/dist/domain/identity/credential.js +63 -0
  221. package/dist/domain/identity/credential.js.map +1 -0
  222. package/dist/domain/identity/dismiss-notice.d.ts +19 -0
  223. package/dist/domain/identity/dismiss-notice.js +23 -0
  224. package/dist/domain/identity/dismiss-notice.js.map +1 -0
  225. package/dist/domain/identity/get-guide.d.ts +7 -0
  226. package/dist/domain/identity/get-guide.js +5 -0
  227. package/dist/domain/identity/get-guide.js.map +1 -0
  228. package/dist/domain/identity/get-notices.d.ts +7 -0
  229. package/dist/domain/identity/get-notices.js +5 -0
  230. package/dist/domain/identity/get-notices.js.map +1 -0
  231. package/dist/domain/identity/guide.d.ts +24 -0
  232. package/dist/domain/identity/guide.js +3 -0
  233. package/dist/domain/identity/guide.js.map +1 -0
  234. package/dist/domain/identity/issue-sign-in-ticket.d.ts +38 -0
  235. package/dist/domain/identity/issue-sign-in-ticket.js +39 -0
  236. package/dist/domain/identity/issue-sign-in-ticket.js.map +1 -0
  237. package/dist/domain/identity/notice.d.ts +16 -0
  238. package/dist/domain/identity/notice.js +12 -0
  239. package/dist/domain/identity/notice.js.map +1 -0
  240. package/dist/domain/identity/operator-account.d.ts +28 -0
  241. package/dist/domain/identity/operator-account.js +21 -0
  242. package/dist/domain/identity/operator-account.js.map +1 -0
  243. package/dist/domain/identity/ports.d.ts +193 -0
  244. package/dist/domain/identity/ports.js +2 -0
  245. package/dist/domain/identity/ports.js.map +1 -0
  246. package/dist/domain/identity/public.d.ts +3 -0
  247. package/dist/domain/identity/public.js +5 -0
  248. package/dist/domain/identity/public.js.map +1 -0
  249. package/dist/domain/identity/read-account.d.ts +35 -0
  250. package/dist/domain/identity/read-account.js +27 -0
  251. package/dist/domain/identity/read-account.js.map +1 -0
  252. package/dist/domain/identity/read-guide.d.ts +18 -0
  253. package/dist/domain/identity/read-guide.js +21 -0
  254. package/dist/domain/identity/read-guide.js.map +1 -0
  255. package/dist/domain/identity/read-notices.d.ts +13 -0
  256. package/dist/domain/identity/read-notices.js +17 -0
  257. package/dist/domain/identity/read-notices.js.map +1 -0
  258. package/dist/domain/identity/record-guide-progress.d.ts +19 -0
  259. package/dist/domain/identity/record-guide-progress.js +24 -0
  260. package/dist/domain/identity/record-guide-progress.js.map +1 -0
  261. package/dist/domain/identity/redeem-sign-in-ticket.d.ts +34 -0
  262. package/dist/domain/identity/redeem-sign-in-ticket.js +25 -0
  263. package/dist/domain/identity/redeem-sign-in-ticket.js.map +1 -0
  264. package/dist/domain/identity/reset-operator-password.d.ts +34 -0
  265. package/dist/domain/identity/reset-operator-password.js +55 -0
  266. package/dist/domain/identity/reset-operator-password.js.map +1 -0
  267. package/dist/domain/identity/set-guide.d.ts +13 -0
  268. package/dist/domain/identity/set-guide.js +12 -0
  269. package/dist/domain/identity/set-guide.js.map +1 -0
  270. package/dist/domain/identity/set-notices.d.ts +13 -0
  271. package/dist/domain/identity/set-notices.js +12 -0
  272. package/dist/domain/identity/set-notices.js.map +1 -0
  273. package/dist/domain/identity/set-theme.d.ts +21 -0
  274. package/dist/domain/identity/set-theme.js +19 -0
  275. package/dist/domain/identity/set-theme.js.map +1 -0
  276. package/dist/domain/identity/sign-in-ticket.d.ts +21 -0
  277. package/dist/domain/identity/sign-in-ticket.js +5 -0
  278. package/dist/domain/identity/sign-in-ticket.js.map +1 -0
  279. package/dist/domain/identity/sign-in.d.ts +51 -0
  280. package/dist/domain/identity/sign-in.js +43 -0
  281. package/dist/domain/identity/sign-in.js.map +1 -0
  282. package/dist/domain/identity/sign-out.d.ts +20 -0
  283. package/dist/domain/identity/sign-out.js +32 -0
  284. package/dist/domain/identity/sign-out.js.map +1 -0
  285. package/dist/domain/identity/start-console-session.d.ts +27 -0
  286. package/dist/domain/identity/start-console-session.js +54 -0
  287. package/dist/domain/identity/start-console-session.js.map +1 -0
  288. package/dist/domain/identity/start-viewer-session.d.ts +29 -0
  289. package/dist/domain/identity/start-viewer-session.js +42 -0
  290. package/dist/domain/identity/start-viewer-session.js.map +1 -0
  291. package/dist/domain/messaging/acknowledge-delivery.d.ts +30 -0
  292. package/dist/domain/messaging/acknowledge-delivery.js +31 -0
  293. package/dist/domain/messaging/acknowledge-delivery.js.map +1 -0
  294. package/dist/domain/messaging/answer-ping.d.ts +33 -0
  295. package/dist/domain/messaging/answer-ping.js +37 -0
  296. package/dist/domain/messaging/answer-ping.js.map +1 -0
  297. package/dist/domain/messaging/check-inbox.d.ts +33 -0
  298. package/dist/domain/messaging/check-inbox.js +61 -0
  299. package/dist/domain/messaging/check-inbox.js.map +1 -0
  300. package/dist/domain/messaging/content-type.d.ts +9 -0
  301. package/dist/domain/messaging/content-type.js +18 -0
  302. package/dist/domain/messaging/content-type.js.map +1 -0
  303. package/dist/domain/messaging/daily-message-limit.d.ts +19 -0
  304. package/dist/domain/messaging/daily-message-limit.js +24 -0
  305. package/dist/domain/messaging/daily-message-limit.js.map +1 -0
  306. package/dist/domain/messaging/delivery.d.ts +116 -0
  307. package/dist/domain/messaging/delivery.js +201 -0
  308. package/dist/domain/messaging/delivery.js.map +1 -0
  309. package/dist/domain/messaging/dismiss-delivery.d.ts +28 -0
  310. package/dist/domain/messaging/dismiss-delivery.js +29 -0
  311. package/dist/domain/messaging/dismiss-delivery.js.map +1 -0
  312. package/dist/domain/messaging/inbox-wait.d.ts +8 -0
  313. package/dist/domain/messaging/inbox-wait.js +19 -0
  314. package/dist/domain/messaging/inbox-wait.js.map +1 -0
  315. package/dist/domain/messaging/mark-done.d.ts +45 -0
  316. package/dist/domain/messaging/mark-done.js +49 -0
  317. package/dist/domain/messaging/mark-done.js.map +1 -0
  318. package/dist/domain/messaging/mark-read.d.ts +27 -0
  319. package/dist/domain/messaging/mark-read.js +34 -0
  320. package/dist/domain/messaging/mark-read.js.map +1 -0
  321. package/dist/domain/messaging/message.d.ts +104 -0
  322. package/dist/domain/messaging/message.js +84 -0
  323. package/dist/domain/messaging/message.js.map +1 -0
  324. package/dist/domain/messaging/payload.d.ts +9 -0
  325. package/dist/domain/messaging/payload.js +16 -0
  326. package/dist/domain/messaging/payload.js.map +1 -0
  327. package/dist/domain/messaging/ping-ship.d.ts +38 -0
  328. package/dist/domain/messaging/ping-ship.js +42 -0
  329. package/dist/domain/messaging/ping-ship.js.map +1 -0
  330. package/dist/domain/messaging/ports.d.ts +116 -0
  331. package/dist/domain/messaging/ports.js +2 -0
  332. package/dist/domain/messaging/ports.js.map +1 -0
  333. package/dist/domain/messaging/receive-deliveries.d.ts +68 -0
  334. package/dist/domain/messaging/receive-deliveries.js +119 -0
  335. package/dist/domain/messaging/receive-deliveries.js.map +1 -0
  336. package/dist/domain/messaging/receive-max.d.ts +8 -0
  337. package/dist/domain/messaging/receive-max.js +17 -0
  338. package/dist/domain/messaging/receive-max.js.map +1 -0
  339. package/dist/domain/messaging/reply-to-message.d.ts +35 -0
  340. package/dist/domain/messaging/reply-to-message.js +49 -0
  341. package/dist/domain/messaging/reply-to-message.js.map +1 -0
  342. package/dist/domain/messaging/resend-delivery.d.ts +48 -0
  343. package/dist/domain/messaging/resend-delivery.js +97 -0
  344. package/dist/domain/messaging/resend-delivery.js.map +1 -0
  345. package/dist/domain/messaging/send-message.d.ts +88 -0
  346. package/dist/domain/messaging/send-message.js +115 -0
  347. package/dist/domain/messaging/send-message.js.map +1 -0
  348. package/dist/domain/messaging/send-request.d.ts +16 -0
  349. package/dist/domain/messaging/send-request.js +18 -0
  350. package/dist/domain/messaging/send-request.js.map +1 -0
  351. package/dist/domain/registry/applied-limits.d.ts +15 -0
  352. package/dist/domain/registry/applied-limits.js +15 -0
  353. package/dist/domain/registry/applied-limits.js.map +1 -0
  354. package/dist/domain/registry/assign-crew.d.ts +31 -0
  355. package/dist/domain/registry/assign-crew.js +35 -0
  356. package/dist/domain/registry/assign-crew.js.map +1 -0
  357. package/dist/domain/registry/claim-ship.d.ts +49 -0
  358. package/dist/domain/registry/claim-ship.js +59 -0
  359. package/dist/domain/registry/claim-ship.js.map +1 -0
  360. package/dist/domain/registry/commission-ship.d.ts +54 -0
  361. package/dist/domain/registry/commission-ship.js +70 -0
  362. package/dist/domain/registry/commission-ship.js.map +1 -0
  363. package/dist/domain/registry/confirm-crew-release.d.ts +28 -0
  364. package/dist/domain/registry/confirm-crew-release.js +28 -0
  365. package/dist/domain/registry/confirm-crew-release.js.map +1 -0
  366. package/dist/domain/registry/create-fleet.d.ts +39 -0
  367. package/dist/domain/registry/create-fleet.js +56 -0
  368. package/dist/domain/registry/create-fleet.js.map +1 -0
  369. package/dist/domain/registry/crew-request.d.ts +148 -0
  370. package/dist/domain/registry/crew-request.js +175 -0
  371. package/dist/domain/registry/crew-request.js.map +1 -0
  372. package/dist/domain/registry/delete-fleet.d.ts +46 -0
  373. package/dist/domain/registry/delete-fleet.js +34 -0
  374. package/dist/domain/registry/delete-fleet.js.map +1 -0
  375. package/dist/domain/registry/deregister.d.ts +32 -0
  376. package/dist/domain/registry/deregister.js +38 -0
  377. package/dist/domain/registry/deregister.js.map +1 -0
  378. package/dist/domain/registry/explain-crew-request.d.ts +30 -0
  379. package/dist/domain/registry/explain-crew-request.js +31 -0
  380. package/dist/domain/registry/explain-crew-request.js.map +1 -0
  381. package/dist/domain/registry/fleet.d.ts +12 -0
  382. package/dist/domain/registry/fleet.js +12 -0
  383. package/dist/domain/registry/fleet.js.map +1 -0
  384. package/dist/domain/registry/found-fleet.d.ts +32 -0
  385. package/dist/domain/registry/found-fleet.js +43 -0
  386. package/dist/domain/registry/found-fleet.js.map +1 -0
  387. package/dist/domain/registry/get-fleet-limits.d.ts +17 -0
  388. package/dist/domain/registry/get-fleet-limits.js +14 -0
  389. package/dist/domain/registry/get-fleet-limits.js.map +1 -0
  390. package/dist/domain/registry/get-installation-fleet.d.ts +15 -0
  391. package/dist/domain/registry/get-installation-fleet.js +12 -0
  392. package/dist/domain/registry/get-installation-fleet.js.map +1 -0
  393. package/dist/domain/registry/get-installation-settings.d.ts +7 -0
  394. package/dist/domain/registry/get-installation-settings.js +5 -0
  395. package/dist/domain/registry/get-installation-settings.js.map +1 -0
  396. package/dist/domain/registry/get-ship.d.ts +34 -0
  397. package/dist/domain/registry/get-ship.js +36 -0
  398. package/dist/domain/registry/get-ship.js.map +1 -0
  399. package/dist/domain/registry/get-starting-prompt.d.ts +24 -0
  400. package/dist/domain/registry/get-starting-prompt.js +46 -0
  401. package/dist/domain/registry/get-starting-prompt.js.map +1 -0
  402. package/dist/domain/registry/initialise-fleet.d.ts +28 -0
  403. package/dist/domain/registry/initialise-fleet.js +39 -0
  404. package/dist/domain/registry/initialise-fleet.js.map +1 -0
  405. package/dist/domain/registry/installation-fleet.d.ts +36 -0
  406. package/dist/domain/registry/installation-fleet.js +22 -0
  407. package/dist/domain/registry/installation-fleet.js.map +1 -0
  408. package/dist/domain/registry/installation-request.d.ts +23 -0
  409. package/dist/domain/registry/installation-request.js +5 -0
  410. package/dist/domain/registry/installation-request.js.map +1 -0
  411. package/dist/domain/registry/lease.d.ts +51 -0
  412. package/dist/domain/registry/lease.js +39 -0
  413. package/dist/domain/registry/lease.js.map +1 -0
  414. package/dist/domain/registry/leases.d.ts +66 -0
  415. package/dist/domain/registry/leases.js +80 -0
  416. package/dist/domain/registry/leases.js.map +1 -0
  417. package/dist/domain/registry/limits.d.ts +50 -0
  418. package/dist/domain/registry/limits.js +24 -0
  419. package/dist/domain/registry/limits.js.map +1 -0
  420. package/dist/domain/registry/list-fleet.d.ts +70 -0
  421. package/dist/domain/registry/list-fleet.js +47 -0
  422. package/dist/domain/registry/list-fleet.js.map +1 -0
  423. package/dist/domain/registry/list-fleets.d.ts +11 -0
  424. package/dist/domain/registry/list-fleets.js +9 -0
  425. package/dist/domain/registry/list-fleets.js.map +1 -0
  426. package/dist/domain/registry/list-installation-fleets.d.ts +15 -0
  427. package/dist/domain/registry/list-installation-fleets.js +15 -0
  428. package/dist/domain/registry/list-installation-fleets.js.map +1 -0
  429. package/dist/domain/registry/ping-status.d.ts +17 -0
  430. package/dist/domain/registry/ping-status.js +28 -0
  431. package/dist/domain/registry/ping-status.js.map +1 -0
  432. package/dist/domain/registry/pingable-ship.d.ts +22 -0
  433. package/dist/domain/registry/pingable-ship.js +21 -0
  434. package/dist/domain/registry/pingable-ship.js.map +1 -0
  435. package/dist/domain/registry/ports.d.ts +318 -0
  436. package/dist/domain/registry/ports.js +2 -0
  437. package/dist/domain/registry/ports.js.map +1 -0
  438. package/dist/domain/registry/public.d.ts +8 -0
  439. package/dist/domain/registry/public.js +10 -0
  440. package/dist/domain/registry/public.js.map +1 -0
  441. package/dist/domain/registry/read-assigned-crew-requests.d.ts +14 -0
  442. package/dist/domain/registry/read-assigned-crew-requests.js +15 -0
  443. package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -0
  444. package/dist/domain/registry/recrew-ship.d.ts +33 -0
  445. package/dist/domain/registry/recrew-ship.js +34 -0
  446. package/dist/domain/registry/recrew-ship.js.map +1 -0
  447. package/dist/domain/registry/release-ship.d.ts +38 -0
  448. package/dist/domain/registry/release-ship.js +47 -0
  449. package/dist/domain/registry/release-ship.js.map +1 -0
  450. package/dist/domain/registry/remove-crew-request.d.ts +28 -0
  451. package/dist/domain/registry/remove-crew-request.js +36 -0
  452. package/dist/domain/registry/remove-crew-request.js.map +1 -0
  453. package/dist/domain/registry/rename-ship.d.ts +30 -0
  454. package/dist/domain/registry/rename-ship.js +39 -0
  455. package/dist/domain/registry/rename-ship.js.map +1 -0
  456. package/dist/domain/registry/report-crew-status.d.ts +29 -0
  457. package/dist/domain/registry/report-crew-status.js +30 -0
  458. package/dist/domain/registry/report-crew-status.js.map +1 -0
  459. package/dist/domain/registry/report-details.d.ts +18 -0
  460. package/dist/domain/registry/report-details.js +41 -0
  461. package/dist/domain/registry/report-details.js.map +1 -0
  462. package/dist/domain/registry/report-log.d.ts +21 -0
  463. package/dist/domain/registry/report-log.js +16 -0
  464. package/dist/domain/registry/report-log.js.map +1 -0
  465. package/dist/domain/registry/report.d.ts +30 -0
  466. package/dist/domain/registry/report.js +30 -0
  467. package/dist/domain/registry/report.js.map +1 -0
  468. package/dist/domain/registry/request-crew.d.ts +32 -0
  469. package/dist/domain/registry/request-crew.js +29 -0
  470. package/dist/domain/registry/request-crew.js.map +1 -0
  471. package/dist/domain/registry/resolve-selector.d.ts +25 -0
  472. package/dist/domain/registry/resolve-selector.js +32 -0
  473. package/dist/domain/registry/resolve-selector.js.map +1 -0
  474. package/dist/domain/registry/retire-ship.d.ts +42 -0
  475. package/dist/domain/registry/retire-ship.js +68 -0
  476. package/dist/domain/registry/retire-ship.js.map +1 -0
  477. package/dist/domain/registry/set-fleet-limits.d.ts +30 -0
  478. package/dist/domain/registry/set-fleet-limits.js +54 -0
  479. package/dist/domain/registry/set-fleet-limits.js.map +1 -0
  480. package/dist/domain/registry/set-installation-settings.d.ts +18 -0
  481. package/dist/domain/registry/set-installation-settings.js +31 -0
  482. package/dist/domain/registry/set-installation-settings.js.map +1 -0
  483. package/dist/domain/registry/ship-handle.d.ts +5 -0
  484. package/dist/domain/registry/ship-handle.js +20 -0
  485. package/dist/domain/registry/ship-handle.js.map +1 -0
  486. package/dist/domain/registry/ship-note.d.ts +7 -0
  487. package/dist/domain/registry/ship-note.js +15 -0
  488. package/dist/domain/registry/ship-note.js.map +1 -0
  489. package/dist/domain/registry/ship-report.d.ts +42 -0
  490. package/dist/domain/registry/ship-report.js +93 -0
  491. package/dist/domain/registry/ship-report.js.map +1 -0
  492. package/dist/domain/registry/ship.d.ts +190 -0
  493. package/dist/domain/registry/ship.js +334 -0
  494. package/dist/domain/registry/ship.js.map +1 -0
  495. package/dist/domain/registry/ships.d.ts +25 -0
  496. package/dist/domain/registry/ships.js +22 -0
  497. package/dist/domain/registry/ships.js.map +1 -0
  498. package/dist/domain/registry/starting-prompt.d.ts +32 -0
  499. package/dist/domain/registry/starting-prompt.js +22 -0
  500. package/dist/domain/registry/starting-prompt.js.map +1 -0
  501. package/dist/domain/registry/whoami.d.ts +20 -0
  502. package/dist/domain/registry/whoami.js +15 -0
  503. package/dist/domain/registry/whoami.js.map +1 -0
  504. package/dist/domain/shared/caller.d.ts +25 -0
  505. package/dist/domain/shared/caller.js +8 -0
  506. package/dist/domain/shared/caller.js.map +1 -0
  507. package/dist/domain/shared/clock.d.ts +4 -0
  508. package/dist/domain/shared/clock.js +2 -0
  509. package/dist/domain/shared/clock.js.map +1 -0
  510. package/dist/domain/shared/errors.d.ts +13 -0
  511. package/dist/domain/shared/errors.js +6 -0
  512. package/dist/domain/shared/errors.js.map +1 -0
  513. package/dist/domain/shared/events.d.ts +75 -0
  514. package/dist/domain/shared/events.js +9 -0
  515. package/dist/domain/shared/events.js.map +1 -0
  516. package/dist/domain/shared/follow-fleet.d.ts +32 -0
  517. package/dist/domain/shared/follow-fleet.js +65 -0
  518. package/dist/domain/shared/follow-fleet.js.map +1 -0
  519. package/dist/domain/shared/history.d.ts +124 -0
  520. package/dist/domain/shared/history.js +16 -0
  521. package/dist/domain/shared/history.js.map +1 -0
  522. package/dist/domain/shared/idempotency-key.d.ts +8 -0
  523. package/dist/domain/shared/idempotency-key.js +14 -0
  524. package/dist/domain/shared/idempotency-key.js.map +1 -0
  525. package/dist/domain/shared/notifier.d.ts +17 -0
  526. package/dist/domain/shared/notifier.js +2 -0
  527. package/dist/domain/shared/notifier.js.map +1 -0
  528. package/dist/domain/shared/ping.d.ts +18 -0
  529. package/dist/domain/shared/ping.js +8 -0
  530. package/dist/domain/shared/ping.js.map +1 -0
  531. package/dist/domain/shared/read-fleet-events.d.ts +29 -0
  532. package/dist/domain/shared/read-fleet-events.js +25 -0
  533. package/dist/domain/shared/read-fleet-events.js.map +1 -0
  534. package/dist/domain/shared/read-fleet-limits.d.ts +39 -0
  535. package/dist/domain/shared/read-fleet-limits.js +24 -0
  536. package/dist/domain/shared/read-fleet-limits.js.map +1 -0
  537. package/dist/domain/shared/read-inbox.d.ts +20 -0
  538. package/dist/domain/shared/read-inbox.js +16 -0
  539. package/dist/domain/shared/read-inbox.js.map +1 -0
  540. package/dist/domain/shared/read-message.d.ts +21 -0
  541. package/dist/domain/shared/read-message.js +18 -0
  542. package/dist/domain/shared/read-message.js.map +1 -0
  543. package/dist/domain/shared/read-needs-attention.d.ts +12 -0
  544. package/dist/domain/shared/read-needs-attention.js +10 -0
  545. package/dist/domain/shared/read-needs-attention.js.map +1 -0
  546. package/dist/domain/shared/read-ship-messages.d.ts +28 -0
  547. package/dist/domain/shared/read-ship-messages.js +30 -0
  548. package/dist/domain/shared/read-ship-messages.js.map +1 -0
  549. package/dist/domain/shared/read-ship-timeline.d.ts +18 -0
  550. package/dist/domain/shared/read-ship-timeline.js +16 -0
  551. package/dist/domain/shared/read-ship-timeline.js.map +1 -0
  552. package/dist/domain/shared/result.d.ts +16 -0
  553. package/dist/domain/shared/result.js +7 -0
  554. package/dist/domain/shared/result.js.map +1 -0
  555. package/dist/domain/shared/secrets.d.ts +26 -0
  556. package/dist/domain/shared/secrets.js +2 -0
  557. package/dist/domain/shared/secrets.js.map +1 -0
  558. package/dist/domain/shared/selector.d.ts +29 -0
  559. package/dist/domain/shared/selector.js +2 -0
  560. package/dist/domain/shared/selector.js.map +1 -0
  561. package/dist/domain/shared/unit-of-work.d.ts +13 -0
  562. package/dist/domain/shared/unit-of-work.js +2 -0
  563. package/dist/domain/shared/unit-of-work.js.map +1 -0
  564. package/dist/domain/shared/utc-day.d.ts +4 -0
  565. package/dist/domain/shared/utc-day.js +9 -0
  566. package/dist/domain/shared/utc-day.js.map +1 -0
  567. package/dist/index.d.ts +1 -0
  568. package/dist/index.js +2 -0
  569. package/dist/index.js.map +1 -0
  570. package/dist/start.d.ts +6 -0
  571. package/dist/start.js +29 -0
  572. package/dist/start.js.map +1 -0
  573. package/dist/wiring.d.ts +158 -0
  574. package/dist/wiring.js +185 -0
  575. package/dist/wiring.js.map +1 -0
  576. package/package.json +58 -3
  577. package/prisma.config.ts +18 -0
  578. package/src/adapters/prisma/migrations/20260929124818_init/migration.sql +201 -0
  579. package/src/adapters/prisma/migrations/20260929160000_fleet_argo_console_session/migration.sql +130 -0
  580. package/src/adapters/prisma/migrations/20260929220017_operator_login/migration.sql +27 -0
  581. package/src/adapters/prisma/migrations/20260930090000_crew_token/migration.sql +5 -0
  582. package/src/adapters/prisma/migrations/20260930120000_send/migration.sql +30 -0
  583. package/src/adapters/prisma/migrations/20260930150000_receive/migration.sql +24 -0
  584. package/src/adapters/prisma/migrations/20261001010000_event_seq/migration.sql +34 -0
  585. package/src/adapters/prisma/migrations/20261001020000_console_session_end_reason/migration.sql +14 -0
  586. package/src/adapters/prisma/migrations/20261001030000_account_theme_session_device/migration.sql +8 -0
  587. package/src/adapters/prisma/migrations/20261001040000_lease_last_seen/migration.sql +2 -0
  588. package/src/adapters/prisma/migrations/20261002190000_lease_report/migration.sql +7 -0
  589. package/src/adapters/prisma/migrations/20261003140000_commission_key/migration.sql +7 -0
  590. package/src/adapters/prisma/migrations/20261003200000_message_model/migration.sql +5 -0
  591. package/src/adapters/prisma/migrations/20261003201000_lease_harness/migration.sql +2 -0
  592. package/src/adapters/prisma/migrations/20261004120000_operator_without_password/migration.sql +2 -0
  593. package/src/adapters/prisma/migrations/20261004121000_installation_requests/migration.sql +21 -0
  594. package/src/adapters/prisma/migrations/20261004122000_events_deleted_with_their_fleet/migration.sql +11 -0
  595. package/src/adapters/prisma/migrations/20261004130000_sign_in_tickets/migration.sql +16 -0
  596. package/src/adapters/prisma/migrations/20261004140000_fleet_limits/migration.sql +6 -0
  597. package/src/adapters/prisma/migrations/20261004141000_installation_settings/migration.sql +12 -0
  598. package/src/adapters/prisma/migrations/20261005090000_viewer_ship/migration.sql +2 -0
  599. package/src/adapters/prisma/migrations/20261005100000_viewer_sessions/migration.sql +20 -0
  600. package/src/adapters/prisma/migrations/20261005110000_notices/migration.sql +37 -0
  601. package/src/adapters/prisma/migrations/20261005120000_guide/migration.sql +34 -0
  602. package/src/adapters/prisma/migrations/20261006100000_fleet_crew_scope/migration.sql +8 -0
  603. package/src/adapters/prisma/migrations/20261006140000_lease_report_details/migration.sql +3 -0
  604. package/src/adapters/prisma/migrations/20261006160000_crew_requests/migration.sql +20 -0
  605. package/src/adapters/prisma/migrations/20261006180000_crew_scopes/migration.sql +9 -0
  606. package/src/adapters/prisma/migrations/20261006190000_crew_assignment/migration.sql +13 -0
  607. package/src/adapters/prisma/migrations/20261006200000_crew_request_reason/migration.sql +3 -0
  608. package/src/adapters/prisma/migrations/20261007020000_broad_crewing_scope_retired/migration.sql +8 -0
  609. package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
  610. package/src/adapters/prisma/schema.prisma +558 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/adapters/cli/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAiB,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6C;IAC/E,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChG,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACjH,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,OAA0F;IAE1F,OAAO,aAAa,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { Writable, type Readable } from 'node:stream';
2
+ import type { CommandIo } from './io.js';
3
+ /** Where a server command reads and writes: standard input, output and error. */
4
+ export interface TerminalStreams {
5
+ input: Readable & {
6
+ isTTY?: boolean;
7
+ };
8
+ output: Writable;
9
+ errors: Writable;
10
+ }
11
+ /**
12
+ * The operator's terminal for a server command. Answers are read a line at a
13
+ * time from standard input, so they can also be piped in. A hidden answer is
14
+ * not echoed on a terminal: readline's echo goes through an output that is
15
+ * muted while it is typed. Each question is readline's prompt, so a line
16
+ * redrawn after a correction keeps it.
17
+ */
18
+ export declare function terminalIo(streams: TerminalStreams): CommandIo & {
19
+ close(): void;
20
+ };
@@ -0,0 +1,68 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { Writable } from 'node:stream';
3
+ /**
4
+ * The operator's terminal for a server command. Answers are read a line at a
5
+ * time from standard input, so they can also be piped in. A hidden answer is
6
+ * not echoed on a terminal: readline's echo goes through an output that is
7
+ * muted while it is typed. Each question is readline's prompt, so a line
8
+ * redrawn after a correction keeps it.
9
+ */
10
+ export function terminalIo(streams) {
11
+ const { input, output, errors } = streams;
12
+ const isTerminal = input.isTTY === true;
13
+ let isMuted = false;
14
+ let isClosed = false;
15
+ let reader;
16
+ const echo = new Writable({
17
+ writev: (chunks, done) => {
18
+ for (const { chunk } of chunks) {
19
+ if (!isMuted && (typeof chunk === 'string' || chunk instanceof Uint8Array)) {
20
+ output.write(chunk);
21
+ }
22
+ }
23
+ done();
24
+ },
25
+ });
26
+ // Opened on the first question only: a command that asks nothing leaves the terminal alone.
27
+ function open() {
28
+ if (!reader) {
29
+ const lines = createInterface({ input, output: echo, terminal: isTerminal, historySize: 0 });
30
+ lines.on('close', () => {
31
+ isClosed = true;
32
+ });
33
+ reader = { lines, answers: lines[Symbol.asyncIterator]() };
34
+ }
35
+ return reader;
36
+ }
37
+ return {
38
+ out: (text) => {
39
+ output.write(`${text}\n`);
40
+ },
41
+ err: (text) => {
42
+ errors.write(`${text}\n`);
43
+ },
44
+ ask: async (question, options) => {
45
+ const { lines, answers } = open();
46
+ // Once piped input has ended, readline is closed but may still hold answers it read.
47
+ if (isClosed) {
48
+ output.write(question);
49
+ }
50
+ else {
51
+ lines.setPrompt(question);
52
+ lines.prompt();
53
+ }
54
+ isMuted = options?.isHidden === true;
55
+ const answer = await answers.next();
56
+ // Nothing echoed the end of a hidden or piped answer: end its line here.
57
+ if (isMuted || !isTerminal) {
58
+ output.write('\n');
59
+ }
60
+ isMuted = false;
61
+ return answer.done === true ? undefined : answer.value;
62
+ },
63
+ close: () => {
64
+ reader?.lines.close();
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/adapters/cli/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkB,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AAWtD;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAwB;IACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,MAAwE,CAAC;IAE7E,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC;QACxB,MAAM,EAAE,CAAC,MAAqC,EAAE,IAAI,EAAE,EAAE;YACtD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,UAAU,CAAC,EAAE,CAAC;oBAC3E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC,CAAC;IAEH,4FAA4F;IAC5F,SAAS,IAAI;QACX,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7F,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;YAC/B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;YAClC,qFAAqF;YACrF,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC1B,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,yEAAyE;YACzE,IAAI,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;YAChB,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACzD,CAAC;QACD,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { PasswordHasher } from '../../domain/shared/secrets.js';
2
+ export declare const argon2idPasswordHasher: PasswordHasher;
@@ -0,0 +1,59 @@
1
+ import { argon2, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ /**
4
+ * Argon2id from Node's crypto module, stored in the PHC string format the
5
+ * reference implementation uses:
6
+ * `$argon2id$v=19$m=<KiB>,t=<passes>,p=<lanes>$<salt>$<hash>`, base64 without
7
+ * padding. The parameters travel in the string, so hashes made with other
8
+ * parameters keep verifying after these change.
9
+ */
10
+ const deriveKey = promisify(argon2);
11
+ /** OWASP's baseline for Argon2id: 19 MiB of memory, two passes, one lane. */
12
+ const COST = { memory: 19_456, passes: 2, parallelism: 1 };
13
+ const SALT_BYTES = 16;
14
+ const HASH_BYTES = 32;
15
+ const ARGON2_VERSION = 19;
16
+ const PHC_PATTERN = /^\$argon2id\$v=19\$m=(\d+),t=(\d+),p=(\d+)\$([A-Za-z0-9+/]+)\$([A-Za-z0-9+/]+)$/;
17
+ function encode({ cost, salt, hash }) {
18
+ const unpadded = (bytes) => bytes.toString('base64').replace(/=+$/, '');
19
+ return `$argon2id$v=${String(ARGON2_VERSION)}$m=${String(cost.memory)},t=${String(cost.passes)},p=${String(cost.parallelism)}$${unpadded(salt)}$${unpadded(hash)}`;
20
+ }
21
+ /** Throws on anything but an Argon2id hash of version 19: a stored hash this adapter did not make is a system failure. */
22
+ function decode(stored) {
23
+ const match = PHC_PATTERN.exec(stored);
24
+ const [, memory, passes, parallelism, salt, hash] = match ?? [];
25
+ if (!memory || !passes || !parallelism || !salt || !hash) {
26
+ throw new Error('The stored password hash is not an Argon2id hash');
27
+ }
28
+ return {
29
+ cost: { memory: Number(memory), passes: Number(passes), parallelism: Number(parallelism) },
30
+ salt: Buffer.from(salt, 'base64'),
31
+ hash: Buffer.from(hash, 'base64'),
32
+ };
33
+ }
34
+ function derive(password, stored) {
35
+ const parameters = {
36
+ message: password,
37
+ nonce: stored.salt,
38
+ tagLength: stored.length,
39
+ ...stored.cost,
40
+ };
41
+ return deriveKey('argon2id', parameters);
42
+ }
43
+ export const argon2idPasswordHasher = {
44
+ hash: async (password) => {
45
+ const salt = randomBytes(SALT_BYTES);
46
+ const hash = await derive(password, { cost: COST, salt, length: HASH_BYTES });
47
+ return encode({ cost: COST, salt, hash });
48
+ },
49
+ verify: async (password, passwordHash) => {
50
+ if (passwordHash === undefined) {
51
+ await derive(password, { cost: COST, salt: randomBytes(SALT_BYTES), length: HASH_BYTES });
52
+ return false;
53
+ }
54
+ const stored = decode(passwordHash);
55
+ const attempt = await derive(password, { ...stored, length: stored.hash.length });
56
+ return timingSafeEqual(attempt, stored.hash);
57
+ },
58
+ };
59
+ //# sourceMappingURL=passwords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passwords.js","sourceRoot":"","sources":["../../../src/adapters/crypto/passwords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;;;;;GAMG;AAEH,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,MAAM,WAAW,GAAG,iFAAiF,CAAC;AAUtG,SAAS,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAc;IAC9C,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChF,OAAO,eAAe,MAAM,CAAC,cAAc,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AACrK,CAAC;AAED,0HAA0H;AAC1H,SAAS,MAAM,CAAC,MAAc;IAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;IAChE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE;QAC1F,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,QAAgB,EAAE,MAAqD;IACrF,MAAM,UAAU,GAAqB;QACnC,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,MAAM,CAAC,IAAI;QAClB,SAAS,EAAE,MAAM,CAAC,MAAM;QACxB,GAAG,MAAM,CAAC,IAAI;KACf,CAAC;IACF,OAAO,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvB,MAAM,IAAI,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9E,OAAO,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QACvC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,OAAO,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RandomTokens, SecretHasher } from '../../domain/shared/secrets.js';
2
+ /** SHA-256 in hex. The inputs are 256-bit random strings, so a plain hash is enough. */
3
+ export declare const sha256Hasher: SecretHasher;
4
+ /** 32 random bytes from the operating system, base64url encoded (43 characters). */
5
+ export declare const cryptoRandomTokens: RandomTokens;
@@ -0,0 +1,10 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ /** SHA-256 in hex. The inputs are 256-bit random strings, so a plain hash is enough. */
3
+ export const sha256Hasher = {
4
+ hash: (value) => createHash('sha256').update(value, 'utf8').digest('hex'),
5
+ };
6
+ /** 32 random bytes from the operating system, base64url encoded (43 characters). */
7
+ export const cryptoRandomTokens = {
8
+ next: () => randomBytes(32).toString('base64url'),
9
+ };
10
+ //# sourceMappingURL=secrets.js.map
@@ -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;