@aeolus-fleet/core 0.0.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/README.md +98 -1
  2. package/dist/adapters/cli/fleet-init.d.ts +14 -0
  3. package/dist/adapters/cli/fleet-init.js +68 -0
  4. package/dist/adapters/cli/fleet-init.js.map +1 -0
  5. package/dist/adapters/cli/io.d.ts +35 -0
  6. package/dist/adapters/cli/io.js +21 -0
  7. package/dist/adapters/cli/io.js.map +1 -0
  8. package/dist/adapters/cli/migrate.d.ts +11 -0
  9. package/dist/adapters/cli/migrate.js +12 -0
  10. package/dist/adapters/cli/migrate.js.map +1 -0
  11. package/dist/adapters/cli/operator-reset-password.d.ts +12 -0
  12. package/dist/adapters/cli/operator-reset-password.js +49 -0
  13. package/dist/adapters/cli/operator-reset-password.js.map +1 -0
  14. package/dist/adapters/cli/run.d.ts +14 -0
  15. package/dist/adapters/cli/run.js +40 -0
  16. package/dist/adapters/cli/run.js.map +1 -0
  17. package/dist/adapters/cli/terminal.d.ts +20 -0
  18. package/dist/adapters/cli/terminal.js +68 -0
  19. package/dist/adapters/cli/terminal.js.map +1 -0
  20. package/dist/adapters/crypto/passwords.d.ts +2 -0
  21. package/dist/adapters/crypto/passwords.js +59 -0
  22. package/dist/adapters/crypto/passwords.js.map +1 -0
  23. package/dist/adapters/crypto/secrets.d.ts +5 -0
  24. package/dist/adapters/crypto/secrets.js +10 -0
  25. package/dist/adapters/crypto/secrets.js.map +1 -0
  26. package/dist/adapters/http/device-label.d.ts +9 -0
  27. package/dist/adapters/http/device-label.js +39 -0
  28. package/dist/adapters/http/device-label.js.map +1 -0
  29. package/dist/adapters/http/rate-limiter.d.ts +21 -0
  30. package/dist/adapters/http/rate-limiter.js +44 -0
  31. package/dist/adapters/http/rate-limiter.js.map +1 -0
  32. package/dist/adapters/http/request-credentials.d.ts +23 -0
  33. package/dist/adapters/http/request-credentials.js +45 -0
  34. package/dist/adapters/http/request-credentials.js.map +1 -0
  35. package/dist/adapters/http/server.d.ts +47 -0
  36. package/dist/adapters/http/server.js +216 -0
  37. package/dist/adapters/http/server.js.map +1 -0
  38. package/dist/adapters/http/version.d.ts +9 -0
  39. package/dist/adapters/http/version.js +23 -0
  40. package/dist/adapters/http/version.js.map +1 -0
  41. package/dist/adapters/mcp/mcp-endpoint.d.ts +8 -0
  42. package/dist/adapters/mcp/mcp-endpoint.js +127 -0
  43. package/dist/adapters/mcp/mcp-endpoint.js.map +1 -0
  44. package/dist/adapters/prisma/client.d.ts +10 -0
  45. package/dist/adapters/prisma/client.js +20 -0
  46. package/dist/adapters/prisma/client.js.map +1 -0
  47. package/dist/adapters/prisma/delivery-notices.d.ts +34 -0
  48. package/dist/adapters/prisma/delivery-notices.js +113 -0
  49. package/dist/adapters/prisma/delivery-notices.js.map +1 -0
  50. package/dist/adapters/prisma/event-log.d.ts +11 -0
  51. package/dist/adapters/prisma/event-log.js +61 -0
  52. package/dist/adapters/prisma/event-log.js.map +1 -0
  53. package/dist/adapters/prisma/failure-log.d.ts +22 -0
  54. package/dist/adapters/prisma/failure-log.js +70 -0
  55. package/dist/adapters/prisma/failure-log.js.map +1 -0
  56. package/dist/adapters/prisma/fleet-counter.d.ts +3 -0
  57. package/dist/adapters/prisma/fleet-counter.js +6 -0
  58. package/dist/adapters/prisma/fleet-counter.js.map +1 -0
  59. package/dist/adapters/prisma/fleet-event-wakeups.d.ts +33 -0
  60. package/dist/adapters/prisma/fleet-event-wakeups.js +86 -0
  61. package/dist/adapters/prisma/fleet-event-wakeups.js.map +1 -0
  62. package/dist/adapters/prisma/generated/browser.d.ts +127 -0
  63. package/dist/adapters/prisma/generated/browser.js +18 -0
  64. package/dist/adapters/prisma/generated/browser.js.map +1 -0
  65. package/dist/adapters/prisma/generated/client.d.ts +146 -0
  66. package/dist/adapters/prisma/generated/client.js +38 -0
  67. package/dist/adapters/prisma/generated/client.js.map +1 -0
  68. package/dist/adapters/prisma/generated/commonInputTypes.d.ts +879 -0
  69. package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
  70. package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
  71. package/dist/adapters/prisma/generated/enums.d.ts +75 -0
  72. package/dist/adapters/prisma/generated/enums.js +73 -0
  73. package/dist/adapters/prisma/generated/enums.js.map +1 -0
  74. package/dist/adapters/prisma/generated/internal/class.d.ts +308 -0
  75. package/dist/adapters/prisma/generated/internal/class.js +52 -0
  76. package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
  77. package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2131 -0
  78. package/dist/adapters/prisma/generated/internal/prismaNamespace.js +295 -0
  79. package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
  80. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
  81. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +265 -0
  82. package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
  83. package/dist/adapters/prisma/generated/models/ConsoleSession.d.ts +2137 -0
  84. package/dist/adapters/prisma/generated/models/ConsoleSession.js +2 -0
  85. package/dist/adapters/prisma/generated/models/ConsoleSession.js.map +1 -0
  86. package/dist/adapters/prisma/generated/models/Credential.d.ts +1360 -0
  87. package/dist/adapters/prisma/generated/models/Credential.js +2 -0
  88. package/dist/adapters/prisma/generated/models/Credential.js.map +1 -0
  89. package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +1558 -0
  90. package/dist/adapters/prisma/generated/models/CrewRequest.js +2 -0
  91. package/dist/adapters/prisma/generated/models/CrewRequest.js.map +1 -0
  92. package/dist/adapters/prisma/generated/models/Delivery.d.ts +2211 -0
  93. package/dist/adapters/prisma/generated/models/Delivery.js +2 -0
  94. package/dist/adapters/prisma/generated/models/Delivery.js.map +1 -0
  95. package/dist/adapters/prisma/generated/models/Event.d.ts +1991 -0
  96. package/dist/adapters/prisma/generated/models/Event.js +2 -0
  97. package/dist/adapters/prisma/generated/models/Event.js.map +1 -0
  98. package/dist/adapters/prisma/generated/models/Fleet.d.ts +3032 -0
  99. package/dist/adapters/prisma/generated/models/Fleet.js +2 -0
  100. package/dist/adapters/prisma/generated/models/Fleet.js.map +1 -0
  101. package/dist/adapters/prisma/generated/models/Guide.d.ts +943 -0
  102. package/dist/adapters/prisma/generated/models/Guide.js +2 -0
  103. package/dist/adapters/prisma/generated/models/Guide.js.map +1 -0
  104. package/dist/adapters/prisma/generated/models/GuideProgress.d.ts +1323 -0
  105. package/dist/adapters/prisma/generated/models/GuideProgress.js +2 -0
  106. package/dist/adapters/prisma/generated/models/GuideProgress.js.map +1 -0
  107. package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1036 -0
  108. package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
  109. package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
  110. package/dist/adapters/prisma/generated/models/InstallationSettings.d.ts +1027 -0
  111. package/dist/adapters/prisma/generated/models/InstallationSettings.js +2 -0
  112. package/dist/adapters/prisma/generated/models/InstallationSettings.js.map +1 -0
  113. package/dist/adapters/prisma/generated/models/Lease.d.ts +2076 -0
  114. package/dist/adapters/prisma/generated/models/Lease.js +2 -0
  115. package/dist/adapters/prisma/generated/models/Lease.js.map +1 -0
  116. package/dist/adapters/prisma/generated/models/Message.d.ts +2869 -0
  117. package/dist/adapters/prisma/generated/models/Message.js +2 -0
  118. package/dist/adapters/prisma/generated/models/Message.js.map +1 -0
  119. package/dist/adapters/prisma/generated/models/Notice.d.ts +1068 -0
  120. package/dist/adapters/prisma/generated/models/Notice.js +2 -0
  121. package/dist/adapters/prisma/generated/models/Notice.js.map +1 -0
  122. package/dist/adapters/prisma/generated/models/NoticeDismissal.d.ts +1245 -0
  123. package/dist/adapters/prisma/generated/models/NoticeDismissal.js +2 -0
  124. package/dist/adapters/prisma/generated/models/NoticeDismissal.js.map +1 -0
  125. package/dist/adapters/prisma/generated/models/Operator.d.ts +1173 -0
  126. package/dist/adapters/prisma/generated/models/Operator.js +2 -0
  127. package/dist/adapters/prisma/generated/models/Operator.js.map +1 -0
  128. package/dist/adapters/prisma/generated/models/Ship.d.ts +3320 -0
  129. package/dist/adapters/prisma/generated/models/Ship.js +2 -0
  130. package/dist/adapters/prisma/generated/models/Ship.js.map +1 -0
  131. package/dist/adapters/prisma/generated/models/SignInTicket.d.ts +1222 -0
  132. package/dist/adapters/prisma/generated/models/SignInTicket.js +2 -0
  133. package/dist/adapters/prisma/generated/models/SignInTicket.js.map +1 -0
  134. package/dist/adapters/prisma/generated/models.d.ts +18 -0
  135. package/dist/adapters/prisma/generated/models.js +2 -0
  136. package/dist/adapters/prisma/generated/models.js.map +1 -0
  137. package/dist/adapters/prisma/history.d.ts +3 -0
  138. package/dist/adapters/prisma/history.js +289 -0
  139. package/dist/adapters/prisma/history.js.map +1 -0
  140. package/dist/adapters/prisma/identity.d.ts +10 -0
  141. package/dist/adapters/prisma/identity.js +213 -0
  142. package/dist/adapters/prisma/identity.js.map +1 -0
  143. package/dist/adapters/prisma/installation.d.ts +13 -0
  144. package/dist/adapters/prisma/installation.js +155 -0
  145. package/dist/adapters/prisma/installation.js.map +1 -0
  146. package/dist/adapters/prisma/messaging.d.ts +4 -0
  147. package/dist/adapters/prisma/messaging.js +156 -0
  148. package/dist/adapters/prisma/messaging.js.map +1 -0
  149. package/dist/adapters/prisma/migrate.d.ts +5 -0
  150. package/dist/adapters/prisma/migrate.js +40 -0
  151. package/dist/adapters/prisma/migrate.js.map +1 -0
  152. package/dist/adapters/prisma/receiver-wakeups.d.ts +26 -0
  153. package/dist/adapters/prisma/receiver-wakeups.js +79 -0
  154. package/dist/adapters/prisma/receiver-wakeups.js.map +1 -0
  155. package/dist/adapters/prisma/registry.d.ts +8 -0
  156. package/dist/adapters/prisma/registry.js +427 -0
  157. package/dist/adapters/prisma/registry.js.map +1 -0
  158. package/dist/adapters/prisma/rows.d.ts +58 -0
  159. package/dist/adapters/prisma/rows.js +408 -0
  160. package/dist/adapters/prisma/rows.js.map +1 -0
  161. package/dist/adapters/prisma/unit-of-work.d.ts +36 -0
  162. package/dist/adapters/prisma/unit-of-work.js +66 -0
  163. package/dist/adapters/prisma/unit-of-work.js.map +1 -0
  164. package/dist/adapters/rest/openapi.d.ts +12 -0
  165. package/dist/adapters/rest/openapi.js +62 -0
  166. package/dist/adapters/rest/openapi.js.map +1 -0
  167. package/dist/adapters/rest/rest-api.d.ts +8 -0
  168. package/dist/adapters/rest/rest-api.js +61 -0
  169. package/dist/adapters/rest/rest-api.js.map +1 -0
  170. package/dist/adapters/trpc/console.d.ts +150 -0
  171. package/dist/adapters/trpc/console.js +102 -0
  172. package/dist/adapters/trpc/console.js.map +1 -0
  173. package/dist/adapters/trpc/context.d.ts +201 -0
  174. package/dist/adapters/trpc/context.js +2 -0
  175. package/dist/adapters/trpc/context.js.map +1 -0
  176. package/dist/adapters/trpc/fleet.d.ts +637 -0
  177. package/dist/adapters/trpc/fleet.js +437 -0
  178. package/dist/adapters/trpc/fleet.js.map +1 -0
  179. package/dist/adapters/trpc/installation.d.ts +414 -0
  180. package/dist/adapters/trpc/installation.js +138 -0
  181. package/dist/adapters/trpc/installation.js.map +1 -0
  182. package/dist/adapters/trpc/router.d.ts +1263 -0
  183. package/dist/adapters/trpc/router.js +15 -0
  184. package/dist/adapters/trpc/router.js.map +1 -0
  185. package/dist/adapters/trpc/ship-contract.d.ts +107 -0
  186. package/dist/adapters/trpc/ship-contract.js +165 -0
  187. package/dist/adapters/trpc/ship-contract.js.map +1 -0
  188. package/dist/adapters/trpc/ship-protocol.d.ts +9 -0
  189. package/dist/adapters/trpc/ship-protocol.js +25 -0
  190. package/dist/adapters/trpc/ship-protocol.js.map +1 -0
  191. package/dist/adapters/trpc/ship.d.ts +209 -0
  192. package/dist/adapters/trpc/ship.js +214 -0
  193. package/dist/adapters/trpc/ship.js.map +1 -0
  194. package/dist/adapters/trpc/starting-prompt-text.d.ts +7 -0
  195. package/dist/adapters/trpc/starting-prompt-text.js +60 -0
  196. package/dist/adapters/trpc/starting-prompt-text.js.map +1 -0
  197. package/dist/adapters/trpc/system.d.ts +29 -0
  198. package/dist/adapters/trpc/system.js +15 -0
  199. package/dist/adapters/trpc/system.js.map +1 -0
  200. package/dist/adapters/trpc/trpc.d.ts +131 -0
  201. package/dist/adapters/trpc/trpc.js +350 -0
  202. package/dist/adapters/trpc/trpc.js.map +1 -0
  203. package/dist/app.d.ts +31 -0
  204. package/dist/app.js +80 -0
  205. package/dist/app.js.map +1 -0
  206. package/dist/bin/aeolus-core.d.ts +2 -0
  207. package/dist/bin/aeolus-core.js +45 -0
  208. package/dist/bin/aeolus-core.js.map +1 -0
  209. package/dist/config.d.ts +35 -0
  210. package/dist/config.js +74 -0
  211. package/dist/config.js.map +1 -0
  212. package/dist/domain/identity/authenticate.d.ts +46 -0
  213. package/dist/domain/identity/authenticate.js +18 -0
  214. package/dist/domain/identity/authenticate.js.map +1 -0
  215. package/dist/domain/identity/console-session.d.ts +54 -0
  216. package/dist/domain/identity/console-session.js +29 -0
  217. package/dist/domain/identity/console-session.js.map +1 -0
  218. package/dist/domain/identity/credential.d.ts +76 -0
  219. package/dist/domain/identity/credential.js +63 -0
  220. package/dist/domain/identity/credential.js.map +1 -0
  221. package/dist/domain/identity/dismiss-notice.d.ts +19 -0
  222. package/dist/domain/identity/dismiss-notice.js +23 -0
  223. package/dist/domain/identity/dismiss-notice.js.map +1 -0
  224. package/dist/domain/identity/get-guide.d.ts +7 -0
  225. package/dist/domain/identity/get-guide.js +5 -0
  226. package/dist/domain/identity/get-guide.js.map +1 -0
  227. package/dist/domain/identity/get-notices.d.ts +7 -0
  228. package/dist/domain/identity/get-notices.js +5 -0
  229. package/dist/domain/identity/get-notices.js.map +1 -0
  230. package/dist/domain/identity/guide.d.ts +24 -0
  231. package/dist/domain/identity/guide.js +3 -0
  232. package/dist/domain/identity/guide.js.map +1 -0
  233. package/dist/domain/identity/issue-sign-in-ticket.d.ts +38 -0
  234. package/dist/domain/identity/issue-sign-in-ticket.js +39 -0
  235. package/dist/domain/identity/issue-sign-in-ticket.js.map +1 -0
  236. package/dist/domain/identity/notice.d.ts +16 -0
  237. package/dist/domain/identity/notice.js +12 -0
  238. package/dist/domain/identity/notice.js.map +1 -0
  239. package/dist/domain/identity/operator-account.d.ts +28 -0
  240. package/dist/domain/identity/operator-account.js +21 -0
  241. package/dist/domain/identity/operator-account.js.map +1 -0
  242. package/dist/domain/identity/ports.d.ts +193 -0
  243. package/dist/domain/identity/ports.js +2 -0
  244. package/dist/domain/identity/ports.js.map +1 -0
  245. package/dist/domain/identity/public.d.ts +3 -0
  246. package/dist/domain/identity/public.js +5 -0
  247. package/dist/domain/identity/public.js.map +1 -0
  248. package/dist/domain/identity/read-account.d.ts +35 -0
  249. package/dist/domain/identity/read-account.js +27 -0
  250. package/dist/domain/identity/read-account.js.map +1 -0
  251. package/dist/domain/identity/read-guide.d.ts +18 -0
  252. package/dist/domain/identity/read-guide.js +21 -0
  253. package/dist/domain/identity/read-guide.js.map +1 -0
  254. package/dist/domain/identity/read-notices.d.ts +13 -0
  255. package/dist/domain/identity/read-notices.js +17 -0
  256. package/dist/domain/identity/read-notices.js.map +1 -0
  257. package/dist/domain/identity/record-guide-progress.d.ts +19 -0
  258. package/dist/domain/identity/record-guide-progress.js +24 -0
  259. package/dist/domain/identity/record-guide-progress.js.map +1 -0
  260. package/dist/domain/identity/redeem-sign-in-ticket.d.ts +34 -0
  261. package/dist/domain/identity/redeem-sign-in-ticket.js +25 -0
  262. package/dist/domain/identity/redeem-sign-in-ticket.js.map +1 -0
  263. package/dist/domain/identity/reset-operator-password.d.ts +34 -0
  264. package/dist/domain/identity/reset-operator-password.js +55 -0
  265. package/dist/domain/identity/reset-operator-password.js.map +1 -0
  266. package/dist/domain/identity/set-guide.d.ts +13 -0
  267. package/dist/domain/identity/set-guide.js +12 -0
  268. package/dist/domain/identity/set-guide.js.map +1 -0
  269. package/dist/domain/identity/set-notices.d.ts +13 -0
  270. package/dist/domain/identity/set-notices.js +12 -0
  271. package/dist/domain/identity/set-notices.js.map +1 -0
  272. package/dist/domain/identity/set-theme.d.ts +21 -0
  273. package/dist/domain/identity/set-theme.js +19 -0
  274. package/dist/domain/identity/set-theme.js.map +1 -0
  275. package/dist/domain/identity/sign-in-ticket.d.ts +21 -0
  276. package/dist/domain/identity/sign-in-ticket.js +5 -0
  277. package/dist/domain/identity/sign-in-ticket.js.map +1 -0
  278. package/dist/domain/identity/sign-in.d.ts +51 -0
  279. package/dist/domain/identity/sign-in.js +43 -0
  280. package/dist/domain/identity/sign-in.js.map +1 -0
  281. package/dist/domain/identity/sign-out.d.ts +20 -0
  282. package/dist/domain/identity/sign-out.js +32 -0
  283. package/dist/domain/identity/sign-out.js.map +1 -0
  284. package/dist/domain/identity/start-console-session.d.ts +27 -0
  285. package/dist/domain/identity/start-console-session.js +54 -0
  286. package/dist/domain/identity/start-console-session.js.map +1 -0
  287. package/dist/domain/identity/start-viewer-session.d.ts +29 -0
  288. package/dist/domain/identity/start-viewer-session.js +42 -0
  289. package/dist/domain/identity/start-viewer-session.js.map +1 -0
  290. package/dist/domain/messaging/acknowledge-delivery.d.ts +30 -0
  291. package/dist/domain/messaging/acknowledge-delivery.js +31 -0
  292. package/dist/domain/messaging/acknowledge-delivery.js.map +1 -0
  293. package/dist/domain/messaging/answer-ping.d.ts +33 -0
  294. package/dist/domain/messaging/answer-ping.js +37 -0
  295. package/dist/domain/messaging/answer-ping.js.map +1 -0
  296. package/dist/domain/messaging/check-inbox.d.ts +33 -0
  297. package/dist/domain/messaging/check-inbox.js +61 -0
  298. package/dist/domain/messaging/check-inbox.js.map +1 -0
  299. package/dist/domain/messaging/content-type.d.ts +9 -0
  300. package/dist/domain/messaging/content-type.js +18 -0
  301. package/dist/domain/messaging/content-type.js.map +1 -0
  302. package/dist/domain/messaging/daily-message-limit.d.ts +19 -0
  303. package/dist/domain/messaging/daily-message-limit.js +24 -0
  304. package/dist/domain/messaging/daily-message-limit.js.map +1 -0
  305. package/dist/domain/messaging/delivery.d.ts +116 -0
  306. package/dist/domain/messaging/delivery.js +201 -0
  307. package/dist/domain/messaging/delivery.js.map +1 -0
  308. package/dist/domain/messaging/dismiss-delivery.d.ts +28 -0
  309. package/dist/domain/messaging/dismiss-delivery.js +29 -0
  310. package/dist/domain/messaging/dismiss-delivery.js.map +1 -0
  311. package/dist/domain/messaging/inbox-wait.d.ts +8 -0
  312. package/dist/domain/messaging/inbox-wait.js +19 -0
  313. package/dist/domain/messaging/inbox-wait.js.map +1 -0
  314. package/dist/domain/messaging/mark-done.d.ts +45 -0
  315. package/dist/domain/messaging/mark-done.js +49 -0
  316. package/dist/domain/messaging/mark-done.js.map +1 -0
  317. package/dist/domain/messaging/mark-read.d.ts +27 -0
  318. package/dist/domain/messaging/mark-read.js +34 -0
  319. package/dist/domain/messaging/mark-read.js.map +1 -0
  320. package/dist/domain/messaging/message.d.ts +104 -0
  321. package/dist/domain/messaging/message.js +84 -0
  322. package/dist/domain/messaging/message.js.map +1 -0
  323. package/dist/domain/messaging/payload.d.ts +9 -0
  324. package/dist/domain/messaging/payload.js +16 -0
  325. package/dist/domain/messaging/payload.js.map +1 -0
  326. package/dist/domain/messaging/ping-ship.d.ts +38 -0
  327. package/dist/domain/messaging/ping-ship.js +42 -0
  328. package/dist/domain/messaging/ping-ship.js.map +1 -0
  329. package/dist/domain/messaging/ports.d.ts +116 -0
  330. package/dist/domain/messaging/ports.js +2 -0
  331. package/dist/domain/messaging/ports.js.map +1 -0
  332. package/dist/domain/messaging/receive-deliveries.d.ts +68 -0
  333. package/dist/domain/messaging/receive-deliveries.js +119 -0
  334. package/dist/domain/messaging/receive-deliveries.js.map +1 -0
  335. package/dist/domain/messaging/receive-max.d.ts +8 -0
  336. package/dist/domain/messaging/receive-max.js +17 -0
  337. package/dist/domain/messaging/receive-max.js.map +1 -0
  338. package/dist/domain/messaging/reply-to-message.d.ts +35 -0
  339. package/dist/domain/messaging/reply-to-message.js +49 -0
  340. package/dist/domain/messaging/reply-to-message.js.map +1 -0
  341. package/dist/domain/messaging/resend-delivery.d.ts +48 -0
  342. package/dist/domain/messaging/resend-delivery.js +97 -0
  343. package/dist/domain/messaging/resend-delivery.js.map +1 -0
  344. package/dist/domain/messaging/send-message.d.ts +88 -0
  345. package/dist/domain/messaging/send-message.js +115 -0
  346. package/dist/domain/messaging/send-message.js.map +1 -0
  347. package/dist/domain/messaging/send-request.d.ts +16 -0
  348. package/dist/domain/messaging/send-request.js +18 -0
  349. package/dist/domain/messaging/send-request.js.map +1 -0
  350. package/dist/domain/registry/applied-limits.d.ts +15 -0
  351. package/dist/domain/registry/applied-limits.js +15 -0
  352. package/dist/domain/registry/applied-limits.js.map +1 -0
  353. package/dist/domain/registry/assign-crew.d.ts +31 -0
  354. package/dist/domain/registry/assign-crew.js +35 -0
  355. package/dist/domain/registry/assign-crew.js.map +1 -0
  356. package/dist/domain/registry/claim-ship.d.ts +49 -0
  357. package/dist/domain/registry/claim-ship.js +59 -0
  358. package/dist/domain/registry/claim-ship.js.map +1 -0
  359. package/dist/domain/registry/commission-ship.d.ts +54 -0
  360. package/dist/domain/registry/commission-ship.js +70 -0
  361. package/dist/domain/registry/commission-ship.js.map +1 -0
  362. package/dist/domain/registry/confirm-crew-release.d.ts +28 -0
  363. package/dist/domain/registry/confirm-crew-release.js +28 -0
  364. package/dist/domain/registry/confirm-crew-release.js.map +1 -0
  365. package/dist/domain/registry/create-fleet.d.ts +39 -0
  366. package/dist/domain/registry/create-fleet.js +56 -0
  367. package/dist/domain/registry/create-fleet.js.map +1 -0
  368. package/dist/domain/registry/crew-request.d.ts +148 -0
  369. package/dist/domain/registry/crew-request.js +175 -0
  370. package/dist/domain/registry/crew-request.js.map +1 -0
  371. package/dist/domain/registry/delete-fleet.d.ts +46 -0
  372. package/dist/domain/registry/delete-fleet.js +34 -0
  373. package/dist/domain/registry/delete-fleet.js.map +1 -0
  374. package/dist/domain/registry/deregister.d.ts +32 -0
  375. package/dist/domain/registry/deregister.js +38 -0
  376. package/dist/domain/registry/deregister.js.map +1 -0
  377. package/dist/domain/registry/explain-crew-request.d.ts +30 -0
  378. package/dist/domain/registry/explain-crew-request.js +31 -0
  379. package/dist/domain/registry/explain-crew-request.js.map +1 -0
  380. package/dist/domain/registry/fleet.d.ts +12 -0
  381. package/dist/domain/registry/fleet.js +12 -0
  382. package/dist/domain/registry/fleet.js.map +1 -0
  383. package/dist/domain/registry/found-fleet.d.ts +32 -0
  384. package/dist/domain/registry/found-fleet.js +43 -0
  385. package/dist/domain/registry/found-fleet.js.map +1 -0
  386. package/dist/domain/registry/get-fleet-limits.d.ts +17 -0
  387. package/dist/domain/registry/get-fleet-limits.js +14 -0
  388. package/dist/domain/registry/get-fleet-limits.js.map +1 -0
  389. package/dist/domain/registry/get-installation-fleet.d.ts +15 -0
  390. package/dist/domain/registry/get-installation-fleet.js +12 -0
  391. package/dist/domain/registry/get-installation-fleet.js.map +1 -0
  392. package/dist/domain/registry/get-installation-settings.d.ts +7 -0
  393. package/dist/domain/registry/get-installation-settings.js +5 -0
  394. package/dist/domain/registry/get-installation-settings.js.map +1 -0
  395. package/dist/domain/registry/get-ship.d.ts +34 -0
  396. package/dist/domain/registry/get-ship.js +36 -0
  397. package/dist/domain/registry/get-ship.js.map +1 -0
  398. package/dist/domain/registry/get-starting-prompt.d.ts +24 -0
  399. package/dist/domain/registry/get-starting-prompt.js +46 -0
  400. package/dist/domain/registry/get-starting-prompt.js.map +1 -0
  401. package/dist/domain/registry/initialise-fleet.d.ts +28 -0
  402. package/dist/domain/registry/initialise-fleet.js +39 -0
  403. package/dist/domain/registry/initialise-fleet.js.map +1 -0
  404. package/dist/domain/registry/installation-fleet.d.ts +36 -0
  405. package/dist/domain/registry/installation-fleet.js +22 -0
  406. package/dist/domain/registry/installation-fleet.js.map +1 -0
  407. package/dist/domain/registry/installation-request.d.ts +23 -0
  408. package/dist/domain/registry/installation-request.js +5 -0
  409. package/dist/domain/registry/installation-request.js.map +1 -0
  410. package/dist/domain/registry/lease.d.ts +51 -0
  411. package/dist/domain/registry/lease.js +39 -0
  412. package/dist/domain/registry/lease.js.map +1 -0
  413. package/dist/domain/registry/leases.d.ts +66 -0
  414. package/dist/domain/registry/leases.js +80 -0
  415. package/dist/domain/registry/leases.js.map +1 -0
  416. package/dist/domain/registry/limits.d.ts +50 -0
  417. package/dist/domain/registry/limits.js +24 -0
  418. package/dist/domain/registry/limits.js.map +1 -0
  419. package/dist/domain/registry/list-fleet.d.ts +70 -0
  420. package/dist/domain/registry/list-fleet.js +47 -0
  421. package/dist/domain/registry/list-fleet.js.map +1 -0
  422. package/dist/domain/registry/list-fleets.d.ts +11 -0
  423. package/dist/domain/registry/list-fleets.js +9 -0
  424. package/dist/domain/registry/list-fleets.js.map +1 -0
  425. package/dist/domain/registry/list-installation-fleets.d.ts +15 -0
  426. package/dist/domain/registry/list-installation-fleets.js +15 -0
  427. package/dist/domain/registry/list-installation-fleets.js.map +1 -0
  428. package/dist/domain/registry/ping-status.d.ts +17 -0
  429. package/dist/domain/registry/ping-status.js +28 -0
  430. package/dist/domain/registry/ping-status.js.map +1 -0
  431. package/dist/domain/registry/pingable-ship.d.ts +22 -0
  432. package/dist/domain/registry/pingable-ship.js +21 -0
  433. package/dist/domain/registry/pingable-ship.js.map +1 -0
  434. package/dist/domain/registry/ports.d.ts +318 -0
  435. package/dist/domain/registry/ports.js +2 -0
  436. package/dist/domain/registry/ports.js.map +1 -0
  437. package/dist/domain/registry/public.d.ts +8 -0
  438. package/dist/domain/registry/public.js +10 -0
  439. package/dist/domain/registry/public.js.map +1 -0
  440. package/dist/domain/registry/read-assigned-crew-requests.d.ts +14 -0
  441. package/dist/domain/registry/read-assigned-crew-requests.js +15 -0
  442. package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -0
  443. package/dist/domain/registry/recrew-ship.d.ts +33 -0
  444. package/dist/domain/registry/recrew-ship.js +34 -0
  445. package/dist/domain/registry/recrew-ship.js.map +1 -0
  446. package/dist/domain/registry/release-ship.d.ts +38 -0
  447. package/dist/domain/registry/release-ship.js +47 -0
  448. package/dist/domain/registry/release-ship.js.map +1 -0
  449. package/dist/domain/registry/remove-crew-request.d.ts +28 -0
  450. package/dist/domain/registry/remove-crew-request.js +36 -0
  451. package/dist/domain/registry/remove-crew-request.js.map +1 -0
  452. package/dist/domain/registry/rename-ship.d.ts +30 -0
  453. package/dist/domain/registry/rename-ship.js +39 -0
  454. package/dist/domain/registry/rename-ship.js.map +1 -0
  455. package/dist/domain/registry/report-crew-status.d.ts +29 -0
  456. package/dist/domain/registry/report-crew-status.js +30 -0
  457. package/dist/domain/registry/report-crew-status.js.map +1 -0
  458. package/dist/domain/registry/report-details.d.ts +18 -0
  459. package/dist/domain/registry/report-details.js +41 -0
  460. package/dist/domain/registry/report-details.js.map +1 -0
  461. package/dist/domain/registry/report-log.d.ts +21 -0
  462. package/dist/domain/registry/report-log.js +16 -0
  463. package/dist/domain/registry/report-log.js.map +1 -0
  464. package/dist/domain/registry/report.d.ts +30 -0
  465. package/dist/domain/registry/report.js +30 -0
  466. package/dist/domain/registry/report.js.map +1 -0
  467. package/dist/domain/registry/request-crew.d.ts +32 -0
  468. package/dist/domain/registry/request-crew.js +29 -0
  469. package/dist/domain/registry/request-crew.js.map +1 -0
  470. package/dist/domain/registry/resolve-selector.d.ts +25 -0
  471. package/dist/domain/registry/resolve-selector.js +32 -0
  472. package/dist/domain/registry/resolve-selector.js.map +1 -0
  473. package/dist/domain/registry/retire-ship.d.ts +42 -0
  474. package/dist/domain/registry/retire-ship.js +68 -0
  475. package/dist/domain/registry/retire-ship.js.map +1 -0
  476. package/dist/domain/registry/set-fleet-limits.d.ts +30 -0
  477. package/dist/domain/registry/set-fleet-limits.js +54 -0
  478. package/dist/domain/registry/set-fleet-limits.js.map +1 -0
  479. package/dist/domain/registry/set-installation-settings.d.ts +18 -0
  480. package/dist/domain/registry/set-installation-settings.js +31 -0
  481. package/dist/domain/registry/set-installation-settings.js.map +1 -0
  482. package/dist/domain/registry/ship-handle.d.ts +5 -0
  483. package/dist/domain/registry/ship-handle.js +20 -0
  484. package/dist/domain/registry/ship-handle.js.map +1 -0
  485. package/dist/domain/registry/ship-note.d.ts +7 -0
  486. package/dist/domain/registry/ship-note.js +15 -0
  487. package/dist/domain/registry/ship-note.js.map +1 -0
  488. package/dist/domain/registry/ship-report.d.ts +42 -0
  489. package/dist/domain/registry/ship-report.js +93 -0
  490. package/dist/domain/registry/ship-report.js.map +1 -0
  491. package/dist/domain/registry/ship.d.ts +190 -0
  492. package/dist/domain/registry/ship.js +334 -0
  493. package/dist/domain/registry/ship.js.map +1 -0
  494. package/dist/domain/registry/ships.d.ts +25 -0
  495. package/dist/domain/registry/ships.js +22 -0
  496. package/dist/domain/registry/ships.js.map +1 -0
  497. package/dist/domain/registry/starting-prompt.d.ts +32 -0
  498. package/dist/domain/registry/starting-prompt.js +22 -0
  499. package/dist/domain/registry/starting-prompt.js.map +1 -0
  500. package/dist/domain/registry/whoami.d.ts +20 -0
  501. package/dist/domain/registry/whoami.js +15 -0
  502. package/dist/domain/registry/whoami.js.map +1 -0
  503. package/dist/domain/shared/caller.d.ts +25 -0
  504. package/dist/domain/shared/caller.js +8 -0
  505. package/dist/domain/shared/caller.js.map +1 -0
  506. package/dist/domain/shared/clock.d.ts +4 -0
  507. package/dist/domain/shared/clock.js +2 -0
  508. package/dist/domain/shared/clock.js.map +1 -0
  509. package/dist/domain/shared/errors.d.ts +13 -0
  510. package/dist/domain/shared/errors.js +6 -0
  511. package/dist/domain/shared/errors.js.map +1 -0
  512. package/dist/domain/shared/events.d.ts +75 -0
  513. package/dist/domain/shared/events.js +9 -0
  514. package/dist/domain/shared/events.js.map +1 -0
  515. package/dist/domain/shared/follow-fleet.d.ts +32 -0
  516. package/dist/domain/shared/follow-fleet.js +65 -0
  517. package/dist/domain/shared/follow-fleet.js.map +1 -0
  518. package/dist/domain/shared/history.d.ts +124 -0
  519. package/dist/domain/shared/history.js +16 -0
  520. package/dist/domain/shared/history.js.map +1 -0
  521. package/dist/domain/shared/idempotency-key.d.ts +8 -0
  522. package/dist/domain/shared/idempotency-key.js +14 -0
  523. package/dist/domain/shared/idempotency-key.js.map +1 -0
  524. package/dist/domain/shared/notifier.d.ts +17 -0
  525. package/dist/domain/shared/notifier.js +2 -0
  526. package/dist/domain/shared/notifier.js.map +1 -0
  527. package/dist/domain/shared/ping.d.ts +18 -0
  528. package/dist/domain/shared/ping.js +8 -0
  529. package/dist/domain/shared/ping.js.map +1 -0
  530. package/dist/domain/shared/read-fleet-events.d.ts +29 -0
  531. package/dist/domain/shared/read-fleet-events.js +25 -0
  532. package/dist/domain/shared/read-fleet-events.js.map +1 -0
  533. package/dist/domain/shared/read-fleet-limits.d.ts +39 -0
  534. package/dist/domain/shared/read-fleet-limits.js +24 -0
  535. package/dist/domain/shared/read-fleet-limits.js.map +1 -0
  536. package/dist/domain/shared/read-inbox.d.ts +20 -0
  537. package/dist/domain/shared/read-inbox.js +16 -0
  538. package/dist/domain/shared/read-inbox.js.map +1 -0
  539. package/dist/domain/shared/read-message.d.ts +21 -0
  540. package/dist/domain/shared/read-message.js +18 -0
  541. package/dist/domain/shared/read-message.js.map +1 -0
  542. package/dist/domain/shared/read-needs-attention.d.ts +12 -0
  543. package/dist/domain/shared/read-needs-attention.js +10 -0
  544. package/dist/domain/shared/read-needs-attention.js.map +1 -0
  545. package/dist/domain/shared/read-ship-messages.d.ts +28 -0
  546. package/dist/domain/shared/read-ship-messages.js +30 -0
  547. package/dist/domain/shared/read-ship-messages.js.map +1 -0
  548. package/dist/domain/shared/read-ship-timeline.d.ts +18 -0
  549. package/dist/domain/shared/read-ship-timeline.js +16 -0
  550. package/dist/domain/shared/read-ship-timeline.js.map +1 -0
  551. package/dist/domain/shared/result.d.ts +16 -0
  552. package/dist/domain/shared/result.js +7 -0
  553. package/dist/domain/shared/result.js.map +1 -0
  554. package/dist/domain/shared/secrets.d.ts +26 -0
  555. package/dist/domain/shared/secrets.js +2 -0
  556. package/dist/domain/shared/secrets.js.map +1 -0
  557. package/dist/domain/shared/selector.d.ts +29 -0
  558. package/dist/domain/shared/selector.js +2 -0
  559. package/dist/domain/shared/selector.js.map +1 -0
  560. package/dist/domain/shared/unit-of-work.d.ts +13 -0
  561. package/dist/domain/shared/unit-of-work.js +2 -0
  562. package/dist/domain/shared/unit-of-work.js.map +1 -0
  563. package/dist/domain/shared/utc-day.d.ts +4 -0
  564. package/dist/domain/shared/utc-day.js +9 -0
  565. package/dist/domain/shared/utc-day.js.map +1 -0
  566. package/dist/index.d.ts +1 -0
  567. package/dist/index.js +2 -0
  568. package/dist/index.js.map +1 -0
  569. package/dist/start.d.ts +6 -0
  570. package/dist/start.js +29 -0
  571. package/dist/start.js.map +1 -0
  572. package/dist/wiring.d.ts +158 -0
  573. package/dist/wiring.js +185 -0
  574. package/dist/wiring.js.map +1 -0
  575. package/package.json +56 -3
  576. package/prisma.config.ts +18 -0
  577. package/src/adapters/prisma/migrations/20260929124818_init/migration.sql +201 -0
  578. package/src/adapters/prisma/migrations/20260929160000_fleet_argo_console_session/migration.sql +130 -0
  579. package/src/adapters/prisma/migrations/20260929220017_operator_login/migration.sql +27 -0
  580. package/src/adapters/prisma/migrations/20260930090000_crew_token/migration.sql +5 -0
  581. package/src/adapters/prisma/migrations/20260930120000_send/migration.sql +30 -0
  582. package/src/adapters/prisma/migrations/20260930150000_receive/migration.sql +24 -0
  583. package/src/adapters/prisma/migrations/20261001010000_event_seq/migration.sql +34 -0
  584. package/src/adapters/prisma/migrations/20261001020000_console_session_end_reason/migration.sql +14 -0
  585. package/src/adapters/prisma/migrations/20261001030000_account_theme_session_device/migration.sql +8 -0
  586. package/src/adapters/prisma/migrations/20261001040000_lease_last_seen/migration.sql +2 -0
  587. package/src/adapters/prisma/migrations/20261002190000_lease_report/migration.sql +7 -0
  588. package/src/adapters/prisma/migrations/20261003140000_commission_key/migration.sql +7 -0
  589. package/src/adapters/prisma/migrations/20261003200000_message_model/migration.sql +5 -0
  590. package/src/adapters/prisma/migrations/20261003201000_lease_harness/migration.sql +2 -0
  591. package/src/adapters/prisma/migrations/20261004120000_operator_without_password/migration.sql +2 -0
  592. package/src/adapters/prisma/migrations/20261004121000_installation_requests/migration.sql +21 -0
  593. package/src/adapters/prisma/migrations/20261004122000_events_deleted_with_their_fleet/migration.sql +11 -0
  594. package/src/adapters/prisma/migrations/20261004130000_sign_in_tickets/migration.sql +16 -0
  595. package/src/adapters/prisma/migrations/20261004140000_fleet_limits/migration.sql +6 -0
  596. package/src/adapters/prisma/migrations/20261004141000_installation_settings/migration.sql +12 -0
  597. package/src/adapters/prisma/migrations/20261005090000_viewer_ship/migration.sql +2 -0
  598. package/src/adapters/prisma/migrations/20261005100000_viewer_sessions/migration.sql +20 -0
  599. package/src/adapters/prisma/migrations/20261005110000_notices/migration.sql +37 -0
  600. package/src/adapters/prisma/migrations/20261005120000_guide/migration.sql +34 -0
  601. package/src/adapters/prisma/migrations/20261006100000_fleet_crew_scope/migration.sql +8 -0
  602. package/src/adapters/prisma/migrations/20261006140000_lease_report_details/migration.sql +3 -0
  603. package/src/adapters/prisma/migrations/20261006160000_crew_requests/migration.sql +20 -0
  604. package/src/adapters/prisma/migrations/20261006180000_crew_scopes/migration.sql +9 -0
  605. package/src/adapters/prisma/migrations/20261006190000_crew_assignment/migration.sql +13 -0
  606. package/src/adapters/prisma/migrations/20261006200000_crew_request_reason/migration.sql +3 -0
  607. package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
  608. package/src/adapters/prisma/schema.prisma +558 -0
@@ -0,0 +1,119 @@
1
+ import { findShip, holdLease } from '../registry/public.js';
2
+ import { recordEvent } from '../shared/events.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { claimDelivery } from './delivery.js';
5
+ import { receiveMax } from './receive-max.js';
6
+ /** How long a receive waits for a delivery when none is there: about 25 seconds, then it returns empty. */
7
+ export const RECEIVE_WAIT_MS = 25_000;
8
+ /**
9
+ * Claims up to `max` deliveries for the crew in one unit of work: holds its
10
+ * lease, then takes its own deliveries in flight, then the oldest pending ones
11
+ * for its ship or its type. One that turns undeliverable is handed to no one,
12
+ * and the next one claimable takes its place. Each one handed over names its
13
+ * sender as Registry holds it now.
14
+ */
15
+ async function claimForCrew(deps, claim) {
16
+ const { tx, ids, at } = deps;
17
+ const { crew, max } = claim;
18
+ const ship = await holdLease(tx, crew);
19
+ if (!ship.isOk) {
20
+ return ship;
21
+ }
22
+ const handedOut = [];
23
+ const claimed = [];
24
+ let hasMore = true;
25
+ while (hasMore && handedOut.length < max) {
26
+ const limit = max - handedOut.length;
27
+ const claimable = await tx.deliveries.findClaimableForUpdate({
28
+ fleetId: crew.fleetId,
29
+ shipId: crew.shipId,
30
+ type: ship.value.type,
31
+ leaseId: crew.leaseId,
32
+ limit,
33
+ excluding: claimed,
34
+ });
35
+ hasMore = claimable.length === limit;
36
+ for (const { delivery, message } of claimable) {
37
+ claimed.push(delivery.id);
38
+ const { outcome, delivery: changed, events } = claimDelivery(delivery, { crew, at });
39
+ await tx.deliveries.update(changed);
40
+ for (const event of events) {
41
+ await recordEvent({ events: tx.events, ids }, event);
42
+ }
43
+ if (outcome === 'claimed') {
44
+ const sender = await findShip(tx, { fleetId: crew.fleetId, shipId: message.senderShipId });
45
+ if (!sender.isOk) {
46
+ // A message's sender always exists: ships are never deleted, and the foreign key keeps the sender in its fleet.
47
+ return sender;
48
+ }
49
+ handedOut.push({
50
+ deliveryId: changed.id,
51
+ messageId: message.id,
52
+ senderShipId: message.senderShipId,
53
+ senderName: sender.value.name,
54
+ senderType: sender.value.type,
55
+ recipient: changed.recipient,
56
+ payload: message.payload,
57
+ contentType: message.contentType,
58
+ model: message.model,
59
+ inReplyTo: message.inReplyToMessageId,
60
+ sentAt: message.createdAt,
61
+ attempts: changed.attempts,
62
+ });
63
+ }
64
+ }
65
+ }
66
+ return ok({ ship: ship.value, deliveries: handedOut });
67
+ }
68
+ /**
69
+ * Use case: a crew receives its deliveries (`receive`), up to `max`, 1 to 10,
70
+ * one by default. Its scope (messages:receive) is checked before this runs.
71
+ * Each attempt is one unit of work (see `claimForCrew`): every delivery it
72
+ * returns is in flight, claimed by the crew's ship and lease, until the ship
73
+ * acknowledges it or the lease ends, and the crew's next receive returns it
74
+ * again, counted as another claim, so a lost reply loses nothing. Its fifth
75
+ * claim makes it undeliverable instead. Each delivery names its sender by id,
76
+ * and by the name and type the sender has now, so the crew can answer by name.
77
+ *
78
+ * When nothing is there it waits, about 25 seconds, for a wake-up for its ship
79
+ * or its type (ADR 0003: LISTEN/NOTIFY after commit), then returns empty. It
80
+ * starts watching before it looks a second time, so a delivery that commits
81
+ * between its first look and its watch is found by that second look. A
82
+ * wake-up that brings nothing for it, a type delivery another ship took,
83
+ * leaves it waiting for the rest of its time.
84
+ */
85
+ export function createReceiveDeliveries(deps) {
86
+ const waitMs = deps.waitMs ?? RECEIVE_WAIT_MS;
87
+ return async (crew, input) => {
88
+ const max = receiveMax(input.max);
89
+ if (!max.isOk) {
90
+ return max;
91
+ }
92
+ const until = deps.clock.now().getTime() + waitMs;
93
+ let watch;
94
+ try {
95
+ for (;;) {
96
+ const attempt = await deps.uow.run((tx) => claimForCrew({ tx, ids: deps.ids, at: deps.clock.now() }, { crew, max: max.value }));
97
+ if (!attempt.isOk) {
98
+ return attempt;
99
+ }
100
+ const { ship, deliveries } = attempt.value;
101
+ if (deliveries.length > 0) {
102
+ return ok({ deliveries });
103
+ }
104
+ if (watch === undefined) {
105
+ watch = deps.wakeups.watch({ fleetId: crew.fleetId, shipId: crew.shipId, type: ship.type });
106
+ continue;
107
+ }
108
+ const remainingMs = until - deps.clock.now().getTime();
109
+ if (remainingMs <= 0 || (await watch.next(remainingMs)) === 'timedOut') {
110
+ return ok({ deliveries: [] });
111
+ }
112
+ }
113
+ }
114
+ finally {
115
+ watch?.stop();
116
+ }
117
+ };
118
+ }
119
+ //# sourceMappingURL=receive-deliveries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive-deliveries.js","sourceRoot":"","sources":["../../../src/domain/messaging/receive-deliveries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type DomainError } from '../shared/errors.js';
2
+ import { type Result } from '../shared/result.js';
3
+ /**
4
+ * How many deliveries a receive returns at most: the ship chooses, 1 to 10,
5
+ * and gets one when it does not say (ADR 0016: the fleet does not decide for
6
+ * the ship).
7
+ */
8
+ export declare function receiveMax(max: number | undefined): Result<number, DomainError<'INVALID_RECEIVE_MAX'>>;
@@ -0,0 +1,17 @@
1
+ import { RECEIVE_MAX_DEFAULT, RECEIVE_MAX_UPPER_BOUND } from '@aeolus-fleet/common';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { ok } from '../shared/result.js';
4
+ /**
5
+ * How many deliveries a receive returns at most: the ship chooses, 1 to 10,
6
+ * and gets one when it does not say (ADR 0016: the fleet does not decide for
7
+ * the ship).
8
+ */
9
+ export function receiveMax(max) {
10
+ if (max === undefined) {
11
+ return ok(RECEIVE_MAX_DEFAULT);
12
+ }
13
+ return Number.isInteger(max) && max >= 1 && max <= RECEIVE_MAX_UPPER_BOUND
14
+ ? ok(max)
15
+ : refuse('INVALID_RECEIVE_MAX', `A receive returns 1 to ${RECEIVE_MAX_UPPER_BOUND} deliveries at once`);
16
+ }
17
+ //# sourceMappingURL=receive-max.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receive-max.js","sourceRoot":"","sources":["../../../src/domain/messaging/receive-max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAuB;IAChD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,uBAAuB;QACxE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;QACT,CAAC,CAAC,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,uBAAuB,qBAAqB,CAAC,CAAC;AAC5G,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { DeliveryId, IdGenerator, MessageId } 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 Result } from '../shared/result.js';
6
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
7
+ import { type MarkDoneTx, type MarkDoneUseCaseRefusal } from './mark-done.js';
8
+ import type { RequestHasher } from './ports.js';
9
+ import { type SendMessageRefusal, type SendMessageTx } from './send-message.js';
10
+ export type ReplyToMessageTx = SendMessageTx & MarkDoneTx;
11
+ export type ReplyToMessageRefusal = DomainError<'DELIVERY_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP'> | SendMessageRefusal | MarkDoneUseCaseRefusal;
12
+ export type ReplyToMessage = (crew: Crew, input: {
13
+ deliveryId: DeliveryId;
14
+ payload: string;
15
+ idempotencyKey: string;
16
+ }) => Promise<Result<{
17
+ messageId: MessageId;
18
+ }, ReplyToMessageRefusal>>;
19
+ /**
20
+ * Use case: argo replies to a message to it from the operator inbox
21
+ * (docs/blueprint.md, "Inbox"). Its scopes (messages:send and
22
+ * messages:receive) are checked before this runs. One unit of work: the reply
23
+ * as plain text from argo to the message's sender, naming the message, as a
24
+ * send would store it, and the message marked done, its acknowledgement
25
+ * naming the reply. A message already done stays done; the reply is a new
26
+ * message all the same. A repeat of the key answers the same reply. Any
27
+ * refusal, a retired sender included, sends nothing and leaves the message
28
+ * open.
29
+ */
30
+ export declare function createReplyToMessage(deps: {
31
+ uow: UnitOfWork<ReplyToMessageTx>;
32
+ clock: Clock;
33
+ ids: IdGenerator;
34
+ hasher: RequestHasher;
35
+ }): ReplyToMessage;
@@ -0,0 +1,49 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { isInInboxOf } from './delivery.js';
4
+ import { markDoneWithin } from './mark-done.js';
5
+ import { checkedSend, sendWithin } from './send-message.js';
6
+ /**
7
+ * Use case: argo replies to a message to it from the operator inbox
8
+ * (docs/blueprint.md, "Inbox"). Its scopes (messages:send and
9
+ * messages:receive) are checked before this runs. One unit of work: the reply
10
+ * as plain text from argo to the message's sender, naming the message, as a
11
+ * send would store it, and the message marked done, its acknowledgement
12
+ * naming the reply. A message already done stays done; the reply is a new
13
+ * message all the same. A repeat of the key answers the same reply. Any
14
+ * refusal, a retired sender included, sends nothing and leaves the message
15
+ * open.
16
+ */
17
+ export function createReplyToMessage(deps) {
18
+ return async (crew, input) => {
19
+ if (crew.kind !== 'operator') {
20
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo replies from the operator inbox; a ship sends its answer');
21
+ }
22
+ return deps.uow.run(async (tx) => {
23
+ const { fleetId } = crew;
24
+ const delivery = await tx.deliveries.findForUpdate(fleetId, input.deliveryId);
25
+ const asked = delivery && (await tx.messages.find(fleetId, delivery.messageId));
26
+ if (!isInInboxOf(delivery, crew.shipId) || !asked) {
27
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} is not in your inbox`);
28
+ }
29
+ const request = checkedSend({
30
+ selector: { kind: 'ship', shipId: asked.senderShipId },
31
+ payload: input.payload,
32
+ contentType: 'text/plain',
33
+ idempotencyKey: input.idempotencyKey,
34
+ inReplyTo: asked.id,
35
+ }, deps.hasher);
36
+ if (!request.isOk) {
37
+ return request;
38
+ }
39
+ const inTx = { tx, clock: deps.clock, ids: deps.ids };
40
+ const sent = await sendWithin(inTx, { caller: crew, request: request.value });
41
+ if (!sent.isOk) {
42
+ return sent;
43
+ }
44
+ const done = await markDoneWithin(inTx, { crew, deliveryId: delivery.id, reply: sent.value.messageId });
45
+ return done.isOk ? ok(sent.value) : done;
46
+ });
47
+ };
48
+ }
49
+ //# sourceMappingURL=reply-to-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply-to-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/reply-to-message.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAgD,MAAM,gBAAgB,CAAC;AAE9F,OAAO,EAAE,WAAW,EAAE,UAAU,EAA+C,MAAM,mBAAmB,CAAC;AAWzG;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAKpC;IACC,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,uBAAuB,EAAE,oEAAoE,CAAC,CAAC;QAC/G,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAoE,EAAE;YACjG,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YACzB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;YAC9E,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,uBAAuB,CAAC,CAAC;YAC3F,CAAC;YACD,MAAM,OAAO,GAAG,WAAW,CACzB;gBACE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE;gBACtD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,WAAW,EAAE,YAAY;gBACzB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,SAAS,EAAE,KAAK,CAAC,EAAE;aACpB,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClB,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YACxG,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type DeliveryId, type IdGenerator, type MessageId } from '@aeolus-fleet/common';
2
+ import { type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
3
+ import type { Caller } 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 { Notifier } from '../shared/notifier.js';
8
+ import { type Result } from '../shared/result.js';
9
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
10
+ import { type DailyMessageLimitTx } from './daily-message-limit.js';
11
+ import { type DismissRefusal } from './delivery.js';
12
+ import { type AcceptRefusal, type RepeatRefusal } from './message.js';
13
+ import type { DeliveryRepository, MessageRepository, RequestHasher } from './ports.js';
14
+ export interface ResendDeliveryTx extends ResolveSelectorTx, DailyMessageLimitTx {
15
+ messages: MessageRepository;
16
+ deliveries: DeliveryRepository;
17
+ events: EventLog;
18
+ notifier: Notifier;
19
+ }
20
+ export type ResendDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND' | 'PING_NOT_RESENT'> | DismissRefusal | DomainError<'MESSAGE_LIMIT_REACHED'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal;
21
+ export type ResendDelivery = (caller: Caller, input: {
22
+ deliveryId: DeliveryId;
23
+ }) => Promise<Result<{
24
+ messageId: MessageId;
25
+ }, ResendDeliveryRefusal>>;
26
+ /**
27
+ * Use case: the operator resends an undeliverable delivery from Needs
28
+ * attention (docs/blueprint.md, "DeliveryUndeliverable"). Its scope
29
+ * (fleet:manage) is checked before this runs. A resend is a retry of the same
30
+ * delivery: a new message with the original's sender, selector, payload,
31
+ * content type and reply, naming the message it resends, so an answer goes
32
+ * back to whoever asked. In one unit of work it stores the message and its
33
+ * pending delivery, MessageAccepted and DeliveryDismissed (both caused by the
34
+ * operator), dismisses the original and wakes the receivers.
35
+ *
36
+ * A second resend of the delivery answers the first one's message and stores
37
+ * nothing. When the selector no longer resolves, a retired ship or no ship of
38
+ * the type left, the resend is refused and the original stays undeliverable,
39
+ * for the operator to dismiss. A ping is never resent: it is dismissed, and
40
+ * the ship pinged again through ping, so pings never stack. Locks, in this order: the original delivery,
41
+ * then the resend's key, then the ship the message is addressed to.
42
+ */
43
+ export declare function createResendDelivery(deps: {
44
+ uow: UnitOfWork<ResendDeliveryTx>;
45
+ clock: Clock;
46
+ ids: IdGenerator;
47
+ hasher: RequestHasher;
48
+ }): ResendDelivery;
@@ -0,0 +1,97 @@
1
+ import { isPingContentType } from '@aeolus-fleet/common';
2
+ import { resolveSelector } from '../registry/public.js';
3
+ import { refuse } from '../shared/errors.js';
4
+ import { recordEvent } from '../shared/events.js';
5
+ import { ok } from '../shared/result.js';
6
+ import { withinDailyMessageLimit } from './daily-message-limit.js';
7
+ import { dismissForResend } from './delivery.js';
8
+ import { acceptMessage, repeatOf } from './message.js';
9
+ import { sendRequestText } from './send-request.js';
10
+ /**
11
+ * The idempotency key of a delivery's resend, the original sender's: one
12
+ * resend per delivery, so a second one finds the first one's message.
13
+ */
14
+ function resendKey(deliveryId) {
15
+ return `resend-${deliveryId}`;
16
+ }
17
+ /**
18
+ * Use case: the operator resends an undeliverable delivery from Needs
19
+ * attention (docs/blueprint.md, "DeliveryUndeliverable"). Its scope
20
+ * (fleet:manage) is checked before this runs. A resend is a retry of the same
21
+ * delivery: a new message with the original's sender, selector, payload,
22
+ * content type and reply, naming the message it resends, so an answer goes
23
+ * back to whoever asked. In one unit of work it stores the message and its
24
+ * pending delivery, MessageAccepted and DeliveryDismissed (both caused by the
25
+ * operator), dismisses the original and wakes the receivers.
26
+ *
27
+ * A second resend of the delivery answers the first one's message and stores
28
+ * nothing. When the selector no longer resolves, a retired ship or no ship of
29
+ * the type left, the resend is refused and the original stays undeliverable,
30
+ * for the operator to dismiss. A ping is never resent: it is dismissed, and
31
+ * the ship pinged again through ping, so pings never stack. Locks, in this order: the original delivery,
32
+ * then the resend's key, then the ship the message is addressed to.
33
+ */
34
+ export function createResendDelivery(deps) {
35
+ return (caller, input) => deps.uow.run(async (tx) => {
36
+ const { fleetId } = caller;
37
+ const delivery = await tx.deliveries.findForUpdate(fleetId, input.deliveryId);
38
+ const original = delivery && (await tx.messages.find(fleetId, delivery.messageId));
39
+ if (!delivery || !original) {
40
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
41
+ }
42
+ if (isPingContentType(original.contentType)) {
43
+ return refuse('PING_NOT_RESENT', 'A ping is not resent: dismiss it, and ping the ship again');
44
+ }
45
+ const selector = original.selector;
46
+ const inReplyTo = original.inReplyToMessageId ?? undefined;
47
+ const requestHash = deps.hasher.hash(sendRequestText({ selector, payload: original.payload, contentType: original.contentType, inReplyTo }));
48
+ const senderKey = { fleetId, senderShipId: original.senderShipId, idempotencyKey: resendKey(delivery.id) };
49
+ await tx.messages.lockIdempotencyKey(senderKey);
50
+ const earlier = await tx.messages.findByIdempotencyKey(senderKey);
51
+ if (earlier) {
52
+ const repeat = repeatOf(earlier, requestHash);
53
+ return repeat.isOk ? ok({ messageId: repeat.value }) : repeat;
54
+ }
55
+ const at = deps.clock.now();
56
+ const dismissed = dismissForResend(delivery, { by: caller.shipId, at });
57
+ if (!dismissed.isOk) {
58
+ return dismissed;
59
+ }
60
+ const recipient = await resolveSelector(tx, { fleetId, selector });
61
+ if (!recipient.isOk) {
62
+ return recipient;
63
+ }
64
+ const withinLimit = await withinDailyMessageLimit(tx, { fleetId, time: at });
65
+ if (!withinLimit.isOk) {
66
+ return withinLimit;
67
+ }
68
+ const repliedTo = inReplyTo === undefined ? undefined : await tx.messages.find(fleetId, inReplyTo);
69
+ const accepted = acceptMessage({ recipient: recipient.value, repliedTo }, {
70
+ messageId: deps.ids('message'),
71
+ deliveryId: deps.ids('delivery'),
72
+ fleetId,
73
+ senderShipId: original.senderShipId,
74
+ payload: original.payload,
75
+ contentType: original.contentType,
76
+ model: original.model ?? undefined,
77
+ idempotencyKey: senderKey.idempotencyKey,
78
+ requestHash,
79
+ inReplyTo,
80
+ resendOf: { messageId: original.id, by: caller.shipId },
81
+ at,
82
+ });
83
+ if (!accepted.isOk) {
84
+ return accepted;
85
+ }
86
+ const { message, delivery: resent, events } = accepted.value;
87
+ await tx.messages.create(message);
88
+ await tx.deliveries.create(resent);
89
+ await tx.deliveries.update(dismissed.value.delivery);
90
+ for (const event of [...events, ...dismissed.value.events]) {
91
+ await recordEvent({ events: tx.events, ids: deps.ids }, event);
92
+ }
93
+ await tx.notifier.deliveryPending({ fleetId, deliveryId: resent.id, recipient: resent.recipient });
94
+ return ok({ messageId: message.id });
95
+ });
96
+ }
97
+ //# sourceMappingURL=resend-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/resend-delivery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { type IdGenerator, type MessageId } from '@aeolus-fleet/common';
2
+ import { type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
3
+ import type { Caller } 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 { Notifier } from '../shared/notifier.js';
8
+ import { type Result } from '../shared/result.js';
9
+ import type { Selector } from '../shared/selector.js';
10
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
11
+ import { type DailyMessageLimitTx } from './daily-message-limit.js';
12
+ import { type AcceptRefusal, type RepeatRefusal } from './message.js';
13
+ import type { DeliveryRepository, MessageRepository, RequestHasher } from './ports.js';
14
+ export interface SendMessageTx extends ResolveSelectorTx, DailyMessageLimitTx {
15
+ messages: MessageRepository;
16
+ deliveries: DeliveryRepository;
17
+ events: EventLog;
18
+ notifier: Notifier;
19
+ }
20
+ export interface MessageToSend {
21
+ selector: Selector;
22
+ payload: string;
23
+ /** Any well-formed media type, passed on untouched; text/plain when the sender gives none. */
24
+ contentType?: string;
25
+ /** The exact model the sender's session runs: every ship but argo states it. */
26
+ model?: string;
27
+ idempotencyKey: string;
28
+ /** The id of the message, in the same fleet, this one replies to. */
29
+ inReplyTo?: MessageId;
30
+ }
31
+ export interface MessageSent {
32
+ /** The message's id: the original one when the sender used the idempotency key before. */
33
+ messageId: MessageId;
34
+ }
35
+ export type SendMessageRefusal = DomainError<'PAYLOAD_TOO_LARGE' | 'INVALID_CONTENT_TYPE' | 'INVALID_IDEMPOTENCY_KEY' | 'RESERVED_CONTENT_TYPE'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal | DomainError<'MESSAGE_LIMIT_REACHED'>;
36
+ export type SendMessage = (caller: Caller, input: MessageToSend) => Promise<Result<MessageSent, SendMessageRefusal>>;
37
+ /**
38
+ * Use case: the calling ship sends a message (`send`). The sender is always
39
+ * the caller, `argo` included; its scope (messages:send) is checked before
40
+ * this runs. The message, its delivery, MessageAccepted and the notice that
41
+ * wakes its receivers are one unit of work: the sender gets its id only once
42
+ * all of it is committed (ADR 0003). A payload over 64 KB, a content type that
43
+ * is no media type or a bad key is refused before the unit of work starts, so
44
+ * nothing is stored. Without a content type the message is text/plain: the
45
+ * same request as one that names text/plain. The ping content type is
46
+ * reserved: only the ping call sends one, so pings never stack. Every ship but
47
+ * argo states its model; the model is no part of the request, so a retry
48
+ * after the session switched model is still a repeat.
49
+ *
50
+ * A repeat, the same sender with the same idempotency key and the same
51
+ * request, returns the original message's id and stores nothing; the same key
52
+ * with another request is refused. The key is checked before the selector, so
53
+ * a retry still gets its OK after the recipient was retired. Locks, in this
54
+ * order: the sender's key, so two sends with one key take turns and the second
55
+ * finds the first one's message; then the ship the message is addressed to,
56
+ * held against a retire.
57
+ */
58
+ export declare function createSendMessage(deps: {
59
+ uow: UnitOfWork<SendMessageTx>;
60
+ clock: Clock;
61
+ ids: IdGenerator;
62
+ hasher: RequestHasher;
63
+ }): SendMessage;
64
+ /** A send whose payload, content type and key were checked, with the hash of its request. */
65
+ export interface CheckedSend {
66
+ selector: Selector;
67
+ payload: string;
68
+ contentType: string;
69
+ model: string | undefined;
70
+ idempotencyKey: string;
71
+ inReplyTo: MessageId | undefined;
72
+ requestHash: string;
73
+ }
74
+ /**
75
+ * Checks what a send asks for before any unit of work starts, so a refusal
76
+ * stores nothing: the payload, the content type (text/plain when none is
77
+ * given) and the key; and hashes the request.
78
+ */
79
+ export declare function checkedSend(input: MessageToSend, hasher: RequestHasher): Result<CheckedSend, SendMessageRefusal>;
80
+ /** Sends a checked request inside the caller's unit of work, as {@link createSendMessage} describes. */
81
+ export declare function sendWithin(deps: {
82
+ tx: SendMessageTx;
83
+ clock: Clock;
84
+ ids: IdGenerator;
85
+ }, send: {
86
+ caller: Caller;
87
+ request: CheckedSend;
88
+ }): Promise<Result<MessageSent, SendMessageRefusal>>;
@@ -0,0 +1,115 @@
1
+ import { isPingContentType, PING_CONTENT_TYPE } from '@aeolus-fleet/common';
2
+ import { resolveSelector } from '../registry/public.js';
3
+ import { refuse } from '../shared/errors.js';
4
+ import { recordEvent } from '../shared/events.js';
5
+ import { ok } from '../shared/result.js';
6
+ import { contentType } from './content-type.js';
7
+ import { withinDailyMessageLimit } from './daily-message-limit.js';
8
+ import { idempotencyKey } from '../shared/idempotency-key.js';
9
+ import { acceptMessage, repeatOf } from './message.js';
10
+ import { payload } from './payload.js';
11
+ import { sendRequestText } from './send-request.js';
12
+ /**
13
+ * Use case: the calling ship sends a message (`send`). The sender is always
14
+ * the caller, `argo` included; its scope (messages:send) is checked before
15
+ * this runs. The message, its delivery, MessageAccepted and the notice that
16
+ * wakes its receivers are one unit of work: the sender gets its id only once
17
+ * all of it is committed (ADR 0003). A payload over 64 KB, a content type that
18
+ * is no media type or a bad key is refused before the unit of work starts, so
19
+ * nothing is stored. Without a content type the message is text/plain: the
20
+ * same request as one that names text/plain. The ping content type is
21
+ * reserved: only the ping call sends one, so pings never stack. Every ship but
22
+ * argo states its model; the model is no part of the request, so a retry
23
+ * after the session switched model is still a repeat.
24
+ *
25
+ * A repeat, the same sender with the same idempotency key and the same
26
+ * request, returns the original message's id and stores nothing; the same key
27
+ * with another request is refused. The key is checked before the selector, so
28
+ * a retry still gets its OK after the recipient was retired. Locks, in this
29
+ * order: the sender's key, so two sends with one key take turns and the second
30
+ * finds the first one's message; then the ship the message is addressed to,
31
+ * held against a retire.
32
+ */
33
+ export function createSendMessage(deps) {
34
+ return async (caller, input) => {
35
+ if (input.contentType !== undefined && isPingContentType(input.contentType)) {
36
+ return refuse('RESERVED_CONTENT_TYPE', `${PING_CONTENT_TYPE} is reserved for pings: ping a ship from the console`);
37
+ }
38
+ const request = checkedSend(input, deps.hasher);
39
+ if (!request.isOk) {
40
+ return request;
41
+ }
42
+ return deps.uow.run((tx) => sendWithin({ tx, clock: deps.clock, ids: deps.ids }, { caller, request: request.value }));
43
+ };
44
+ }
45
+ /**
46
+ * Checks what a send asks for before any unit of work starts, so a refusal
47
+ * stores nothing: the payload, the content type (text/plain when none is
48
+ * given) and the key; and hashes the request.
49
+ */
50
+ export function checkedSend(input, hasher) {
51
+ const text = payload(input.payload);
52
+ if (!text.isOk) {
53
+ return text;
54
+ }
55
+ const mediaType = contentType(input.contentType);
56
+ if (!mediaType.isOk) {
57
+ return mediaType;
58
+ }
59
+ const key = idempotencyKey(input.idempotencyKey);
60
+ if (!key.isOk) {
61
+ return key;
62
+ }
63
+ const { selector, inReplyTo } = input;
64
+ const requestHash = hasher.hash(sendRequestText({ selector, payload: text.value, contentType: mediaType.value, inReplyTo }));
65
+ return ok({ selector, payload: text.value, contentType: mediaType.value, model: input.model, idempotencyKey: key.value, inReplyTo, requestHash });
66
+ }
67
+ /** Sends a checked request inside the caller's unit of work, as {@link createSendMessage} describes. */
68
+ export async function sendWithin(deps, send) {
69
+ const { tx, clock, ids } = deps;
70
+ const { fleetId, shipId: senderShipId } = send.caller;
71
+ const { selector, inReplyTo, requestHash } = send.request;
72
+ const senderKey = { fleetId, senderShipId, idempotencyKey: send.request.idempotencyKey };
73
+ await tx.messages.lockIdempotencyKey(senderKey);
74
+ const original = await tx.messages.findByIdempotencyKey(senderKey);
75
+ if (original) {
76
+ const repeat = repeatOf(original, requestHash);
77
+ return repeat.isOk ? ok({ messageId: repeat.value }) : repeat;
78
+ }
79
+ const recipient = await resolveSelector(tx, { fleetId, selector });
80
+ if (!recipient.isOk) {
81
+ return recipient;
82
+ }
83
+ const at = clock.now();
84
+ const withinLimit = await withinDailyMessageLimit(tx, { fleetId, time: at });
85
+ if (!withinLimit.isOk) {
86
+ return withinLimit;
87
+ }
88
+ const repliedTo = inReplyTo === undefined ? undefined : await tx.messages.find(fleetId, inReplyTo);
89
+ const accepted = acceptMessage({ recipient: recipient.value, repliedTo }, {
90
+ messageId: ids('message'),
91
+ deliveryId: ids('delivery'),
92
+ fleetId,
93
+ senderShipId,
94
+ payload: send.request.payload,
95
+ contentType: send.request.contentType,
96
+ model: send.request.model,
97
+ senderKind: send.caller.kind,
98
+ idempotencyKey: send.request.idempotencyKey,
99
+ requestHash,
100
+ inReplyTo,
101
+ at,
102
+ });
103
+ if (!accepted.isOk) {
104
+ return accepted;
105
+ }
106
+ const { message, delivery, events } = accepted.value;
107
+ await tx.messages.create(message);
108
+ await tx.deliveries.create(delivery);
109
+ for (const event of events) {
110
+ await recordEvent({ events: tx.events, ids }, event);
111
+ }
112
+ await tx.notifier.deliveryPending({ fleetId, deliveryId: delivery.id, recipient: delivery.recipient });
113
+ return ok({ messageId: message.id });
114
+ }
115
+ //# sourceMappingURL=send-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { MessageId } from '@aeolus-fleet/common';
2
+ import type { Selector } from '../shared/selector.js';
3
+ /** What a send asks for, its key aside: what a repeat of the key must ask for too. */
4
+ export interface SendRequest {
5
+ selector: Selector;
6
+ payload: string;
7
+ contentType: string;
8
+ inReplyTo: MessageId | undefined;
9
+ }
10
+ /**
11
+ * The request as one text, the same for the same request whatever order its
12
+ * fields came in: the selector as sent (one ship by id and by name are two
13
+ * requests), the payload, the content type and the message it replies to.
14
+ * Its hash is kept with the message to tell a repeat from a reused key.
15
+ */
16
+ export declare function sendRequestText(request: SendRequest): string;