@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,12 @@
1
+ /**
2
+ * Use case: the installation sets the console's notices (decision 0023),
3
+ * replacing those it set before, in its order; none clears them. No event:
4
+ * notices belong to the installation, not to a fleet.
5
+ */
6
+ export function createSetNotices(deps) {
7
+ return async ({ notices }) => {
8
+ await deps.notices.replace(notices);
9
+ return [...notices];
10
+ };
11
+ }
12
+ //# sourceMappingURL=set-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-notices.js","sourceRoot":"","sources":["../../../src/domain/identity/set-notices.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAmC;IAClE,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IACtB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Theme } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import { type DomainError } from '../shared/errors.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
6
+ import type { OperatorAccountRepository } from './ports.js';
7
+ export interface SetThemeTx {
8
+ operatorAccounts: Pick<OperatorAccountRepository, 'findForFleetForUpdate' | 'setTheme'>;
9
+ }
10
+ export type SetTheme = (caller: Caller, input: {
11
+ theme: Theme;
12
+ }) => Promise<Result<undefined, DomainError<'NOT_THE_OPERATOR_SHIP'>>>;
13
+ /**
14
+ * Use case: the operator chooses how the console looks (Light, Dark or
15
+ * System), stored on their account so it follows them to any browser. No
16
+ * event: a theme is how the console looks, not a change to the fleet. Only the
17
+ * operator's console session chooses it; a viewer's keeps its theme in the browser.
18
+ */
19
+ export declare function createSetTheme(deps: {
20
+ uow: UnitOfWork<SetThemeTx>;
21
+ }): SetTheme;
@@ -0,0 +1,19 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ /**
4
+ * Use case: the operator chooses how the console looks (Light, Dark or
5
+ * System), stored on their account so it follows them to any browser. No
6
+ * event: a theme is how the console looks, not a change to the fleet. Only the
7
+ * operator's console session chooses it; a viewer's keeps its theme in the browser.
8
+ */
9
+ export function createSetTheme(deps) {
10
+ return (caller, input) => deps.uow.run(async (tx) => {
11
+ const account = caller.consoleSessionId && caller.kind === 'operator' && (await tx.operatorAccounts.findForFleetForUpdate(caller.fleetId));
12
+ if (!account) {
13
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only the operator, signed in to the console, chooses a theme');
14
+ }
15
+ await tx.operatorAccounts.setTheme({ fleetId: caller.fleetId, operatorId: account.id, theme: input.theme });
16
+ return ok(undefined);
17
+ });
18
+ }
19
+ //# sourceMappingURL=set-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-theme.js","sourceRoot":"","sources":["../../../src/domain/identity/set-theme.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAUtD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAqC;IAClE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoE,EAAE;QAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3I,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,CAAC,uBAAuB,EAAE,8DAA8D,CAAC,CAAC;QACzG,CAAC;QACD,MAAM,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5G,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { FleetId } from '@aeolus-fleet/common';
2
+ /** Every sign-in ticket starts so: it says what it is, as a ship secret and a crew token do. */
3
+ export declare const SIGN_IN_TICKET_PREFIX = "aeolus_st_v1_";
4
+ /** How long a sign-in ticket stays valid after it is issued. */
5
+ export declare const SIGN_IN_TICKET_VALID_MS: number;
6
+ /** Whom a ticket signs in as: the operator, crewing argo, or a viewer, through the viewer ship (decision 0022). */
7
+ export type SignInAs = 'operator' | 'viewer';
8
+ /**
9
+ * A one-time sign-in ticket for a fleet's operator or for a viewer, issued by
10
+ * a hosting installation (docs/blueprint.md, "Installation") and redeemed in
11
+ * the console for a session. Only its hash is stored; it signs in once,
12
+ * before it expires.
13
+ */
14
+ export interface SignInTicket {
15
+ fleetId: FleetId;
16
+ as: SignInAs;
17
+ tokenHash: string;
18
+ issuedAt: Date;
19
+ expiresAt: Date;
20
+ usedAt: Date | null;
21
+ }
@@ -0,0 +1,5 @@
1
+ /** Every sign-in ticket starts so: it says what it is, as a ship secret and a crew token do. */
2
+ export const SIGN_IN_TICKET_PREFIX = 'aeolus_st_v1_';
3
+ /** How long a sign-in ticket stays valid after it is issued. */
4
+ export const SIGN_IN_TICKET_VALID_MS = 2 * 60 * 1000;
5
+ //# sourceMappingURL=sign-in-ticket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-ticket.js","sourceRoot":"","sources":["../../../src/domain/identity/sign-in-ticket.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAErD,gEAAgE;AAChE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,51 @@
1
+ import type { ConsoleSessionId, IdGenerator } from '@aeolus-fleet/common';
2
+ import type { Caller } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import type { Result } from '../shared/result.js';
6
+ import type { PasswordHasher, RandomTokens, SecretHasher } from '../shared/secrets.js';
7
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
8
+ import type { OperatorAccountLookup, OperatorAccountRepository } from './ports.js';
9
+ import { type StartConsoleSessionTx } from './start-console-session.js';
10
+ export interface SignInTx extends StartConsoleSessionTx {
11
+ operatorAccounts: OperatorAccountRepository;
12
+ }
13
+ export interface SignedIn {
14
+ /** The session token for the cookie, in plain text only here. */
15
+ token: string;
16
+ consoleSessionId: ConsoleSessionId;
17
+ expiresAt: Date;
18
+ caller: Caller;
19
+ }
20
+ /** Only a wrong email or password in practice: the account's fleet always has its argo. */
21
+ export type SignInRefusal = DomainError<'WRONG_EMAIL_OR_PASSWORD' | 'FLEET_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP'>;
22
+ export type SignIn = (input: {
23
+ email: string;
24
+ password: string;
25
+ /** The device it signs in from, as the console words it; an unknown device when not told. */
26
+ device?: string;
27
+ }) => Promise<Result<SignedIn, SignInRefusal>>;
28
+ /**
29
+ * Use case: the operator signs in to the console with email and password, and
30
+ * the session crews `argo` (ADR 0012). Signing in ends the previous console
31
+ * session and takes argo's lease over, so its deliveries in flight return to
32
+ * pending. The session records the device it signed in from, which is also
33
+ * where argo's lease runs.
34
+ *
35
+ * A wrong email and a wrong password are one refusal, and both check a
36
+ * password, so neither the answer nor its timing says whether the email
37
+ * exists. The password is checked before the unit of work: Argon2 takes its
38
+ * time on purpose, and no account row or connection waits on it. The unit of
39
+ * work then locks the account and finds the same password hash, or refuses:
40
+ * a reset in between makes the checked password wrong, and a reset after
41
+ * waits for the lock, then ends the new session.
42
+ */
43
+ export declare function createSignIn(deps: {
44
+ uow: UnitOfWork<SignInTx>;
45
+ accounts: OperatorAccountLookup;
46
+ clock: Clock;
47
+ ids: IdGenerator;
48
+ hasher: SecretHasher;
49
+ random: RandomTokens;
50
+ passwords: PasswordHasher;
51
+ }): SignIn;
@@ -0,0 +1,43 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { UNKNOWN_DEVICE } from './console-session.js';
3
+ import { normaliseEmail } from './operator-account.js';
4
+ import { startConsoleSession } from './start-console-session.js';
5
+ const WRONG_EMAIL_OR_PASSWORD = 'Wrong email or password';
6
+ /**
7
+ * Use case: the operator signs in to the console with email and password, and
8
+ * the session crews `argo` (ADR 0012). Signing in ends the previous console
9
+ * session and takes argo's lease over, so its deliveries in flight return to
10
+ * pending. The session records the device it signed in from, which is also
11
+ * where argo's lease runs.
12
+ *
13
+ * A wrong email and a wrong password are one refusal, and both check a
14
+ * password, so neither the answer nor its timing says whether the email
15
+ * exists. The password is checked before the unit of work: Argon2 takes its
16
+ * time on purpose, and no account row or connection waits on it. The unit of
17
+ * work then locks the account and finds the same password hash, or refuses:
18
+ * a reset in between makes the checked password wrong, and a reset after
19
+ * waits for the lock, then ends the new session.
20
+ */
21
+ export function createSignIn(deps) {
22
+ return async (input) => {
23
+ const email = normaliseEmail(input.email);
24
+ const account = await deps.accounts.byEmail(email);
25
+ // An account without a password checks against none, as a missing account does: no password signs it in.
26
+ const isPasswordRight = await deps.passwords.verify(input.password, account?.passwordHash ?? undefined);
27
+ if (!account || !isPasswordRight) {
28
+ return refuse('WRONG_EMAIL_OR_PASSWORD', WRONG_EMAIL_OR_PASSWORD);
29
+ }
30
+ return deps.uow.run(async (tx) => {
31
+ const locked = await tx.operatorAccounts.findByEmailForUpdate(email);
32
+ if (locked?.id !== account.id || locked.passwordHash !== account.passwordHash) {
33
+ return refuse('WRONG_EMAIL_OR_PASSWORD', WRONG_EMAIL_OR_PASSWORD);
34
+ }
35
+ return startConsoleSession({ tx, ids: deps.ids, hasher: deps.hasher, random: deps.random }, {
36
+ fleetId: account.fleetId,
37
+ device: input.device ?? UNKNOWN_DEVICE,
38
+ at: deps.clock.now(),
39
+ });
40
+ });
41
+ };
42
+ }
43
+ //# sourceMappingURL=sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../../src/domain/identity/sign-in.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAI/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAA8B,MAAM,4BAA4B,CAAC;AAwB7F,MAAM,uBAAuB,GAAG,yBAAyB,CAAC;AAE1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,IAQ5B;IACC,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,yGAAyG;QACzG,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC;QACxG,IAAI,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA4C,EAAE;YACzE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACrE,IAAI,MAAM,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC9E,OAAO,MAAM,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;gBAC1F,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc;gBACtC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { IdGenerator } from '@aeolus-fleet/common';
2
+ import { type LeaseTx } from '../registry/public.js';
3
+ import type { Caller } from '../shared/caller.js';
4
+ import type { Clock } from '../shared/clock.js';
5
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
6
+ import type { ConsoleSessionRepository } from './ports.js';
7
+ export interface SignOutTx extends LeaseTx {
8
+ consoleSessions: ConsoleSessionRepository;
9
+ }
10
+ export type SignOut = (caller: Caller) => Promise<void>;
11
+ /**
12
+ * Use case: ends the caller's console session and releases the lease on `argo`
13
+ * it holds; a viewer session holds none. Signing out twice, or without a
14
+ * console session, changes nothing.
15
+ */
16
+ export declare function createSignOut(deps: {
17
+ uow: UnitOfWork<SignOutTx>;
18
+ clock: Clock;
19
+ ids: IdGenerator;
20
+ }): SignOut;
@@ -0,0 +1,32 @@
1
+ import { endLease } from '../registry/public.js';
2
+ import { shipActor } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ /**
5
+ * Use case: ends the caller's console session and releases the lease on `argo`
6
+ * it holds; a viewer session holds none. Signing out twice, or without a
7
+ * console session, changes nothing.
8
+ */
9
+ export function createSignOut(deps) {
10
+ return async (caller) => {
11
+ const { consoleSessionId } = caller;
12
+ if (consoleSessionId === undefined) {
13
+ return;
14
+ }
15
+ await deps.uow.run(async (tx) => {
16
+ const at = deps.clock.now();
17
+ const session = await tx.consoleSessions.end({ fleetId: caller.fleetId, consoleSessionId, at, reason: 'signedOut' });
18
+ // A viewer session holds no lease (decision 0022): ending it is all.
19
+ if (session?.leaseId != null) {
20
+ await endLease({ tx, ids: deps.ids }, {
21
+ fleetId: session.fleetId,
22
+ leaseId: session.leaseId,
23
+ actor: shipActor(session.shipId),
24
+ at,
25
+ reason: 'signedOut',
26
+ });
27
+ }
28
+ return ok(undefined);
29
+ });
30
+ };
31
+ }
32
+ //# sourceMappingURL=sign-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-out.js","sourceRoot":"","sources":["../../../src/domain/identity/sign-out.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAgB,MAAM,uBAAuB,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAUzC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoE;IAChG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACrH,qEAAqE;YACrE,IAAI,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;oBACpC,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBAChC,EAAE;oBACF,MAAM,EAAE,WAAW;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { FleetId, IdGenerator } from '@aeolus-fleet/common';
2
+ import { type LeaseTx, type ShipTx } from '../registry/public.js';
3
+ import type { DomainError } from '../shared/errors.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { RandomTokens, SecretHasher } from '../shared/secrets.js';
6
+ import type { ConsoleSessionRepository } from './ports.js';
7
+ import type { SignedIn } from './sign-in.js';
8
+ export interface StartConsoleSessionTx extends LeaseTx, ShipTx {
9
+ consoleSessions: ConsoleSessionRepository;
10
+ }
11
+ /**
12
+ * Starts the operator's console session crewing the fleet's argo (ADR 0012),
13
+ * in the caller's unit of work, however the operator proved who they are: a
14
+ * password or a sign-in ticket. It ends the previous console session and
15
+ * takes argo's lease over, so what argo held in flight returns to pending.
16
+ * The session records the device it signed in from, also argo's location.
17
+ */
18
+ export declare function startConsoleSession(deps: {
19
+ tx: StartConsoleSessionTx;
20
+ ids: IdGenerator;
21
+ hasher: SecretHasher;
22
+ random: RandomTokens;
23
+ }, input: {
24
+ fleetId: FleetId;
25
+ device: string;
26
+ at: Date;
27
+ }): Promise<Result<SignedIn, DomainError<'FLEET_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP'>>>;
@@ -0,0 +1,54 @@
1
+ import { findOperatorShip, takeOverOperatorLease } from '../registry/public.js';
2
+ import { shipActor } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { CONSOLE_SESSION_IDLE_LIMIT_MS, consoleLocation, consoleSessionExpiry } from './console-session.js';
5
+ /**
6
+ * Starts the operator's console session crewing the fleet's argo (ADR 0012),
7
+ * in the caller's unit of work, however the operator proved who they are: a
8
+ * password or a sign-in ticket. It ends the previous console session and
9
+ * takes argo's lease over, so what argo held in flight returns to pending.
10
+ * The session records the device it signed in from, also argo's location.
11
+ */
12
+ export async function startConsoleSession(deps, input) {
13
+ const { tx, ids } = deps;
14
+ const { fleetId, device, at } = input;
15
+ const found = await findOperatorShip(tx, fleetId);
16
+ if (!found.isOk) {
17
+ return found;
18
+ }
19
+ const argo = found.value;
20
+ // Only argo's sessions: viewer sessions run beside the operator's (decision 0022).
21
+ await tx.consoleSessions.endAll({ fleetId: argo.fleetId, shipId: argo.id }, { at, reason: 'takenOver' });
22
+ const takenOver = await takeOverOperatorLease({ tx, ids }, {
23
+ fleetId: argo.fleetId,
24
+ shipId: argo.id,
25
+ kind: argo.kind,
26
+ location: consoleLocation(device),
27
+ actor: shipActor(argo.id),
28
+ at,
29
+ });
30
+ if (!takenOver.isOk) {
31
+ return takenOver;
32
+ }
33
+ const token = deps.random.next();
34
+ const consoleSessionId = ids('consoleSession');
35
+ const expiresAt = consoleSessionExpiry(at);
36
+ await tx.consoleSessions.create({
37
+ id: consoleSessionId,
38
+ fleetId: argo.fleetId,
39
+ shipId: argo.id,
40
+ leaseId: takenOver.value,
41
+ idleLimitMs: CONSOLE_SESSION_IDLE_LIMIT_MS,
42
+ endsBy: null,
43
+ device,
44
+ tokenHash: deps.hasher.hash(token),
45
+ createdAt: at,
46
+ lastUsedAt: at,
47
+ expiresAt,
48
+ endedAt: null,
49
+ endReason: null,
50
+ });
51
+ const caller = { shipId: argo.id, fleetId: argo.fleetId, kind: argo.kind, scopes: argo.scopes, consoleSessionId };
52
+ return ok({ token, consoleSessionId, expiresAt, caller });
53
+ }
54
+ //# sourceMappingURL=start-console-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-console-session.js","sourceRoot":"","sources":["../../../src/domain/identity/start-console-session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAA6B,MAAM,uBAAuB,CAAC;AAG3G,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAQ5G;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAiG,EACjG,KAAqD;IAErD,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IAEzB,mFAAmF;IACnF,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;IACzG,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;QACzD,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,EAAE;KACH,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9B,EAAE,EAAE,gBAAgB;QACpB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,OAAO,EAAE,SAAS,CAAC,KAAK;QACxB,WAAW,EAAE,6BAA6B;QAC1C,MAAM,EAAE,IAAI;QACZ,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,SAAS;QACT,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC1H,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { FleetId, IdGenerator } from '@aeolus-fleet/common';
2
+ import { type ShipTx } from '../registry/public.js';
3
+ import type { DomainError } from '../shared/errors.js';
4
+ import { type EventLog } from '../shared/events.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { RandomTokens, SecretHasher } from '../shared/secrets.js';
7
+ import type { ConsoleSessionRepository } from './ports.js';
8
+ import type { SignedIn } from './sign-in.js';
9
+ export interface StartViewerSessionTx extends ShipTx {
10
+ consoleSessions: ConsoleSessionRepository;
11
+ events: EventLog;
12
+ }
13
+ /**
14
+ * Starts a viewer session on the fleet's viewer ship (decision 0022), in the
15
+ * caller's unit of work: it holds no lease and ends no other session, so many
16
+ * people view at once, and the operator's session is untouched. Valid 2 hours
17
+ * after its last use, never past 24 hours after it started. Writes
18
+ * ViewerSessionStarted, by the viewer ship, with the device.
19
+ */
20
+ export declare function startViewerSession(deps: {
21
+ tx: StartViewerSessionTx;
22
+ ids: IdGenerator;
23
+ hasher: SecretHasher;
24
+ random: RandomTokens;
25
+ }, input: {
26
+ fleetId: FleetId;
27
+ device: string;
28
+ at: Date;
29
+ }): Promise<Result<SignedIn, DomainError<'FLEET_HAS_NO_VIEWER'>>>;
@@ -0,0 +1,42 @@
1
+ import { findViewerShip } from '../registry/public.js';
2
+ import { recordEvent, shipActor } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { viewerSessionTimes } from './console-session.js';
5
+ /**
6
+ * Starts a viewer session on the fleet's viewer ship (decision 0022), in the
7
+ * caller's unit of work: it holds no lease and ends no other session, so many
8
+ * people view at once, and the operator's session is untouched. Valid 2 hours
9
+ * after its last use, never past 24 hours after it started. Writes
10
+ * ViewerSessionStarted, by the viewer ship, with the device.
11
+ */
12
+ export async function startViewerSession(deps, input) {
13
+ const { tx, ids } = deps;
14
+ const { fleetId, device, at } = input;
15
+ const found = await findViewerShip(tx, fleetId);
16
+ if (!found.isOk) {
17
+ return found;
18
+ }
19
+ const viewer = found.value;
20
+ const token = deps.random.next();
21
+ const consoleSessionId = ids('consoleSession');
22
+ const { idleLimitMs, endsBy, expiresAt } = viewerSessionTimes(at);
23
+ await tx.consoleSessions.create({
24
+ id: consoleSessionId,
25
+ fleetId,
26
+ shipId: viewer.id,
27
+ leaseId: null,
28
+ idleLimitMs,
29
+ endsBy,
30
+ device,
31
+ tokenHash: deps.hasher.hash(token),
32
+ createdAt: at,
33
+ lastUsedAt: at,
34
+ expiresAt,
35
+ endedAt: null,
36
+ endReason: null,
37
+ });
38
+ await recordEvent({ events: tx.events, ids }, { fleetId, type: 'ViewerSessionStarted', occurredAt: at, actor: shipActor(viewer.id), shipId: viewer.id, details: { device } });
39
+ const caller = { shipId: viewer.id, fleetId, kind: viewer.kind, scopes: viewer.scopes, consoleSessionId };
40
+ return ok({ token, consoleSessionId, expiresAt, caller });
41
+ }
42
+ //# sourceMappingURL=start-viewer-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-viewer-session.js","sourceRoot":"","sources":["../../../src/domain/identity/start-viewer-session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS1D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAgG,EAChG,KAAqD;IAErD,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;IAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAClE,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9B,EAAE,EAAE,gBAAgB;QACpB,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,EAAE;QACjB,OAAO,EAAE,IAAI;QACb,WAAW;QACX,MAAM;QACN,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,SAAS;QACT,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IAE9K,MAAM,MAAM,GAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAClH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
2
+ import type { Crew } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import { type DomainError } from '../shared/errors.js';
5
+ import { type EventLog } from '../shared/events.js';
6
+ import { type Result } from '../shared/result.js';
7
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
8
+ import { type AcknowledgeRefusal } from './delivery.js';
9
+ import type { DeliveryRepository } from './ports.js';
10
+ export interface AcknowledgeDeliveryTx {
11
+ deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
12
+ events: EventLog;
13
+ }
14
+ export type AcknowledgeDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | AcknowledgeRefusal;
15
+ export type AcknowledgeDelivery = (crew: Crew, input: {
16
+ deliveryId: DeliveryId;
17
+ }) => Promise<Result<undefined, AcknowledgeDeliveryRefusal>>;
18
+ /**
19
+ * Use case: the ship acknowledges a delivery it received (`ack`), as soon as
20
+ * it receives it (ADR 0001). Its scope (messages:receive) is checked before
21
+ * this runs. The delivery, locked, moves to acknowledged with
22
+ * DeliveryAcknowledged in one unit of work, only while it is in flight with
23
+ * the calling ship; a second ack by that ship is OK and changes nothing. The
24
+ * lock makes an ack and a receive of the same delivery take turns.
25
+ */
26
+ export declare function createAcknowledgeDelivery(deps: {
27
+ uow: UnitOfWork<AcknowledgeDeliveryTx>;
28
+ clock: Clock;
29
+ ids: IdGenerator;
30
+ }): AcknowledgeDelivery;
@@ -0,0 +1,31 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { recordEvent } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { acknowledgeDelivery } from './delivery.js';
5
+ /**
6
+ * Use case: the ship acknowledges a delivery it received (`ack`), as soon as
7
+ * it receives it (ADR 0001). Its scope (messages:receive) is checked before
8
+ * this runs. The delivery, locked, moves to acknowledged with
9
+ * DeliveryAcknowledged in one unit of work, only while it is in flight with
10
+ * the calling ship; a second ack by that ship is OK and changes nothing. The
11
+ * lock makes an ack and a receive of the same delivery take turns.
12
+ */
13
+ export function createAcknowledgeDelivery(deps) {
14
+ return (crew, input) => deps.uow.run(async (tx) => {
15
+ const delivery = await tx.deliveries.findForUpdate(crew.fleetId, input.deliveryId);
16
+ if (!delivery) {
17
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
18
+ }
19
+ const acknowledged = acknowledgeDelivery(delivery, { crew, at: deps.clock.now() });
20
+ if (!acknowledged.isOk) {
21
+ return acknowledged;
22
+ }
23
+ const { delivery: changed, events } = acknowledged.value;
24
+ await tx.deliveries.update(changed);
25
+ for (const event of events) {
26
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
27
+ }
28
+ return ok(undefined);
29
+ });
30
+ }
31
+ //# sourceMappingURL=acknowledge-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acknowledge-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/acknowledge-delivery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAA2B,MAAM,eAAe,CAAC;AAe7E;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAIzC;IACC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA0D,EAAE;QAChF,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QACzD,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
2
+ import type { LeaseRepository } from '../registry/public.js';
3
+ import type { Crew } from '../shared/caller.js';
4
+ import type { Clock } from '../shared/clock.js';
5
+ import { type DomainError } from '../shared/errors.js';
6
+ import { type EventLog } from '../shared/events.js';
7
+ import { type Result } from '../shared/result.js';
8
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
9
+ import { type AnswerPingRefusal } from './delivery.js';
10
+ import type { DeliveryRepository, MessageRepository } from './ports.js';
11
+ export interface AnswerPingTx {
12
+ deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
13
+ messages: Pick<MessageRepository, 'find'>;
14
+ leases: Pick<LeaseRepository, 'markSeen'>;
15
+ events: EventLog;
16
+ }
17
+ export type AnswerPingDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | AnswerPingRefusal;
18
+ export type AnswerPing = (crew: Crew, input: {
19
+ deliveryId: DeliveryId;
20
+ }) => Promise<Result<undefined, AnswerPingDeliveryRefusal>>;
21
+ /**
22
+ * Use case: the ship answers a ping (`pong`), proving its session's model
23
+ * read it. Its scope (messages:receive) is checked before this runs. The ping
24
+ * delivery, locked, is acknowledged with DeliveryAcknowledged saying pong
25
+ * answered it, and the crew's lease is marked last seen at that moment: one
26
+ * unit of work, so both are stored or neither. Answering again changes
27
+ * nothing.
28
+ */
29
+ export declare function createAnswerPing(deps: {
30
+ uow: UnitOfWork<AnswerPingTx>;
31
+ clock: Clock;
32
+ ids: IdGenerator;
33
+ }): AnswerPing;
@@ -0,0 +1,37 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { recordEvent } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { answerPing } from './delivery.js';
5
+ /**
6
+ * Use case: the ship answers a ping (`pong`), proving its session's model
7
+ * read it. Its scope (messages:receive) is checked before this runs. The ping
8
+ * delivery, locked, is acknowledged with DeliveryAcknowledged saying pong
9
+ * answered it, and the crew's lease is marked last seen at that moment: one
10
+ * unit of work, so both are stored or neither. Answering again changes
11
+ * nothing.
12
+ */
13
+ export function createAnswerPing(deps) {
14
+ return (crew, input) => deps.uow.run(async (tx) => {
15
+ const delivery = await tx.deliveries.findForUpdate(crew.fleetId, input.deliveryId);
16
+ const message = delivery && (await tx.messages.find(crew.fleetId, delivery.messageId));
17
+ if (!delivery || !message) {
18
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
19
+ }
20
+ const at = deps.clock.now();
21
+ const answered = answerPing(delivery, { message, crew, at });
22
+ if (!answered.isOk) {
23
+ return answered;
24
+ }
25
+ const { delivery: changed, events } = answered.value;
26
+ if (events.length === 0) {
27
+ return ok(undefined);
28
+ }
29
+ await tx.deliveries.update(changed);
30
+ await tx.leases.markSeen({ fleetId: crew.fleetId, leaseId: crew.leaseId, at });
31
+ for (const event of events) {
32
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
33
+ }
34
+ return ok(undefined);
35
+ });
36
+ }
37
+ //# sourceMappingURL=answer-ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-ping.js","sourceRoot":"","sources":["../../../src/domain/messaging/answer-ping.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAA0B,MAAM,eAAe,CAAC;AAiBnE;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuE;IACtG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAyD,EAAE;QAC/E,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type HoldLeaseTx, type LeaseEnded } from '../registry/public.js';
2
+ import type { Crew } from '../shared/caller.js';
3
+ import type { Clock } from '../shared/clock.js';
4
+ import type { DomainError } from '../shared/errors.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
7
+ import type { DeliveryRepository, ReceiverWakeups } from './ports.js';
8
+ export interface CheckInboxTx extends HoldLeaseTx {
9
+ deliveries: Pick<DeliveryRepository, 'countReceivable'>;
10
+ }
11
+ export type CheckInboxRefusal = DomainError<'INVALID_INBOX_WAIT' | 'SHIP_NOT_FOUND'> | LeaseEnded;
12
+ export type CheckInbox = (crew: Crew, input: {
13
+ waitSeconds?: number;
14
+ }) => Promise<Result<{
15
+ waiting: number;
16
+ }, CheckInboxRefusal>>;
17
+ /**
18
+ * Use case: how many deliveries wait for the crew (`inbox`): what its next
19
+ * receive would hand it, its own in flight and those pending for its ship or
20
+ * its type. It claims nothing, so a watcher can ask as often as it likes and
21
+ * leave every delivery for the receive. Its scope (messages:receive) is
22
+ * checked before this runs.
23
+ *
24
+ * With a wait, and nothing waiting, it watches the same wake-ups as a
25
+ * receive and looks again on each, until something waits or the wait has
26
+ * passed. It starts watching before it looks a second time, so a delivery
27
+ * that commits in between is counted.
28
+ */
29
+ export declare function createCheckInbox(deps: {
30
+ uow: UnitOfWork<CheckInboxTx>;
31
+ clock: Clock;
32
+ wakeups: ReceiverWakeups;
33
+ }): CheckInbox;