@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,49 @@
1
+ import { holdLease } from '../registry/public.js';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { recordEvent } from '../shared/events.js';
4
+ import { ok } from '../shared/result.js';
5
+ import { markDone } from './delivery.js';
6
+ /**
7
+ * Marks a delivery to argo done inside the caller's unit of work, under the
8
+ * console session's lease, held until the unit of work ends: a sign-in
9
+ * elsewhere ending it waits, then returns nothing this marked. `reply` names
10
+ * the reply that made it done. Only argo: an agent acknowledges what it
11
+ * receives.
12
+ */
13
+ export async function markDoneWithin(deps, done) {
14
+ const { tx, clock, ids } = deps;
15
+ const { crew, deliveryId, reply } = done;
16
+ if (crew.kind !== 'operator') {
17
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo marks a message done; a ship acknowledges what it receives');
18
+ }
19
+ const held = await holdLease(tx, crew);
20
+ if (!held.isOk) {
21
+ return held;
22
+ }
23
+ const delivery = await tx.deliveries.findForUpdate(crew.fleetId, deliveryId);
24
+ if (!delivery) {
25
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${deliveryId} does not exist`);
26
+ }
27
+ const marked = markDone(delivery, { crew, at: clock.now(), reply });
28
+ if (!marked.isOk) {
29
+ return marked;
30
+ }
31
+ const { delivery: changed, events } = marked.value;
32
+ if (events.length > 0) {
33
+ await tx.deliveries.update(changed);
34
+ }
35
+ for (const event of events) {
36
+ await recordEvent({ events: tx.events, ids }, event);
37
+ }
38
+ return ok(undefined);
39
+ }
40
+ /**
41
+ * Use case: argo marks a message to it done from the operator inbox, without
42
+ * a reply (docs/blueprint.md, "Inbox"). Its scope (messages:receive) is
43
+ * checked before this runs. One unit of work: the claim, the acknowledgement
44
+ * and their events.
45
+ */
46
+ export function createMarkDone(deps) {
47
+ return (crew, input) => deps.uow.run((tx) => markDoneWithin({ tx, clock: deps.clock, ids: deps.ids }, { crew, deliveryId: input.deliveryId }));
48
+ }
49
+ //# sourceMappingURL=mark-done.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark-done.js","sourceRoot":"","sources":["../../../src/domain/messaging/mark-done.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAqC,MAAM,uBAAuB,CAAC;AAGrF,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,QAAQ,EAAwB,MAAM,eAAe,CAAC;AAe/D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAwD,EACxD,IAA+D;IAE/D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,uBAAuB,EAAE,sEAAsE,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,UAAU,iBAAiB,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACnD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAqE;IAClG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAC3H,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { DeliveryId } 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 { DeliveryRepository } from './ports.js';
8
+ export interface MarkReadTx {
9
+ deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'markRead' | 'markUnread'>;
10
+ }
11
+ export type MarkReadRefusal = DomainError<'DELIVERY_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP'>;
12
+ export type MarkRead = (crew: Crew, input: {
13
+ deliveryId: DeliveryId;
14
+ isRead: boolean;
15
+ }) => Promise<Result<undefined, MarkReadRefusal>>;
16
+ /**
17
+ * Use case: argo opens a message to it, which marks it read, or marks it
18
+ * unread again (docs/blueprint.md, "Inbox"). Its scope (messages:receive) is
19
+ * checked before this runs. Read is not done: the delivery's state stays as
20
+ * it is, and no event is written, since read is how the operator sees a
21
+ * message, not a step of its delivery. Opening it again keeps when it was
22
+ * first read. Done messages are read or unread too.
23
+ */
24
+ export declare function createMarkRead(deps: {
25
+ uow: UnitOfWork<MarkReadTx>;
26
+ clock: Clock;
27
+ }): MarkRead;
@@ -0,0 +1,34 @@
1
+ import { refuse } from '../shared/errors.js';
2
+ import { ok } from '../shared/result.js';
3
+ import { isInInboxOf } from './delivery.js';
4
+ /**
5
+ * Use case: argo opens a message to it, which marks it read, or marks it
6
+ * unread again (docs/blueprint.md, "Inbox"). Its scope (messages:receive) is
7
+ * checked before this runs. Read is not done: the delivery's state stays as
8
+ * it is, and no event is written, since read is how the operator sees a
9
+ * message, not a step of its delivery. Opening it again keeps when it was
10
+ * first read. Done messages are read or unread too.
11
+ */
12
+ export function createMarkRead(deps) {
13
+ return async (crew, input) => {
14
+ if (crew.kind !== 'operator') {
15
+ return refuse('NOT_THE_OPERATOR_SHIP', 'Only argo marks a message read in the operator inbox');
16
+ }
17
+ return deps.uow.run(async (tx) => {
18
+ const { fleetId } = crew;
19
+ const { deliveryId } = input;
20
+ const delivery = await tx.deliveries.findForUpdate(fleetId, deliveryId);
21
+ if (!isInInboxOf(delivery, crew.shipId)) {
22
+ return refuse('DELIVERY_NOT_FOUND', `Delivery ${deliveryId} is not in your inbox`);
23
+ }
24
+ if (input.isRead) {
25
+ await tx.deliveries.markRead({ fleetId, deliveryId, at: deps.clock.now() });
26
+ }
27
+ else {
28
+ await tx.deliveries.markUnread({ fleetId, deliveryId });
29
+ }
30
+ return ok(undefined);
31
+ });
32
+ };
33
+ }
34
+ //# sourceMappingURL=mark-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mark-read.js","sourceRoot":"","sources":["../../../src/domain/messaging/mark-read.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;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAmD;IAChF,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,uBAAuB,EAAE,sDAAsD,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA+C,EAAE;YAC5E,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YACzB,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YACxE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,UAAU,uBAAuB,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { type DeliveryId, type DeliveryState, type FleetId, type LeaseId, type MessageId, type ShipId, type ShipKind } from '@aeolus-fleet/common';
2
+ import { type DomainError } from '../shared/errors.js';
3
+ import { type NewEvent } from '../shared/events.js';
4
+ import { type Result } from '../shared/result.js';
5
+ import type { Recipient } from '../shared/selector.js';
6
+ /**
7
+ * An immutable envelope plus an opaque payload, sent by one ship to a
8
+ * selector (docs/blueprint.md, "Message"). Accepted only once its selector
9
+ * resolved to a ship that is not retired, or to a type with one.
10
+ */
11
+ export interface Message {
12
+ id: MessageId;
13
+ fleetId: FleetId;
14
+ /** The calling ship: every sender is a ship, `argo` included. */
15
+ senderShipId: ShipId;
16
+ /** The selector as resolved at send time: a ship's id, never its name, or a type. */
17
+ selector: Recipient;
18
+ payload: string;
19
+ /** A media type, exactly as the sender gave it. */
20
+ contentType: string;
21
+ /** The model the sender's session stated it runs; none from argo, and none on messages from before models were stated. */
22
+ model: string | null;
23
+ /** Unique per sender: a repeat of the same request returns this message instead of storing a new one. */
24
+ idempotencyKey: string;
25
+ /** The hash of the request the message was sent with: what a repeat of its key must match. */
26
+ requestHash: string;
27
+ /** The message of the same fleet this one replies to. */
28
+ inReplyToMessageId: MessageId | null;
29
+ /** The message this one resends: an undeliverable one the operator sent again. */
30
+ resendOfMessageId: MessageId | null;
31
+ createdAt: Date;
32
+ }
33
+ /**
34
+ * One message to one resolved recipient, with its own state. Pending until a
35
+ * ship receives it; for a type, the first ship of that type to receive it
36
+ * claims it.
37
+ */
38
+ export interface Delivery {
39
+ id: DeliveryId;
40
+ fleetId: FleetId;
41
+ messageId: MessageId;
42
+ recipient: Recipient;
43
+ state: DeliveryState;
44
+ /**
45
+ * The ship and the lease of the crew whose receive claimed it: set while it
46
+ * is in flight, kept once acknowledged, none while it is pending.
47
+ */
48
+ claimedByShipId: ShipId | null;
49
+ claimedByLeaseId: LeaseId | null;
50
+ /** How many times a receive claimed it. */
51
+ attempts: number;
52
+ createdAt: Date;
53
+ }
54
+ /** What the sender asked for, its payload and key already checked. */
55
+ export interface MessageToAccept {
56
+ messageId: MessageId;
57
+ deliveryId: DeliveryId;
58
+ fleetId: FleetId;
59
+ senderShipId: ShipId;
60
+ payload: string;
61
+ contentType: string;
62
+ /** The model the sender states; a resend carries the original's. */
63
+ model: string | undefined;
64
+ /** Whether the sender is argo or an agent ship, for the model rule; a resend carries none, as it keeps the original's model. */
65
+ senderKind?: ShipKind;
66
+ idempotencyKey: string;
67
+ requestHash: string;
68
+ inReplyTo: MessageId | undefined;
69
+ /**
70
+ * For a resend: the message it resends and the ship that resent it, the
71
+ * operator. The sender stays the original one, so an answer goes back to
72
+ * whoever asked; the operator is the actor of MessageAccepted.
73
+ */
74
+ resendOf?: {
75
+ messageId: MessageId;
76
+ by: ShipId;
77
+ };
78
+ at: Date;
79
+ }
80
+ export type RepeatRefusal = DomainError<'IDEMPOTENCY_KEY_REUSED'>;
81
+ /**
82
+ * A send with a key its sender used before. The same request is a repeat, a
83
+ * retry, and gets the original message's id; another request with that key is
84
+ * refused, so one key never stands for two messages.
85
+ */
86
+ export declare function repeatOf(original: Message, requestHash: string): Result<MessageId, RepeatRefusal>;
87
+ export type AcceptRefusal = DomainError<'IN_REPLY_TO_NOT_FOUND' | 'MODEL_REQUIRED' | 'MODEL_FROM_ARGO'>;
88
+ /**
89
+ * Accepts a message: the message, its one pending delivery to the recipient
90
+ * its selector resolved to, and MessageAccepted, caused by the sender. A reply
91
+ * names a message of the same fleet: `repliedTo` is that message as the fleet
92
+ * holds it, if it does. Every ship but argo states the model its session
93
+ * runs (docs/blueprint.md, "Model"); argo states none. A resend carries the
94
+ * original message's model as it was, so it is not asked again; a ping is the
95
+ * fleet's question, not a session's message, so it carries none.
96
+ */
97
+ export declare function acceptMessage(fleet: {
98
+ recipient: Recipient;
99
+ repliedTo: Message | undefined;
100
+ }, send: MessageToAccept): Result<{
101
+ message: Message;
102
+ delivery: Delivery;
103
+ events: NewEvent[];
104
+ }, AcceptRefusal>;
@@ -0,0 +1,84 @@
1
+ import { isPingContentType } from '@aeolus-fleet/common';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { shipActor } from '../shared/events.js';
4
+ import { ok } from '../shared/result.js';
5
+ /**
6
+ * A send with a key its sender used before. The same request is a repeat, a
7
+ * retry, and gets the original message's id; another request with that key is
8
+ * refused, so one key never stands for two messages.
9
+ */
10
+ export function repeatOf(original, requestHash) {
11
+ return original.requestHash === requestHash
12
+ ? ok(original.id)
13
+ : refuse('IDEMPOTENCY_KEY_REUSED', 'This idempotency key was already used for another message: send a new message with a new key');
14
+ }
15
+ /**
16
+ * Accepts a message: the message, its one pending delivery to the recipient
17
+ * its selector resolved to, and MessageAccepted, caused by the sender. A reply
18
+ * names a message of the same fleet: `repliedTo` is that message as the fleet
19
+ * holds it, if it does. Every ship but argo states the model its session
20
+ * runs (docs/blueprint.md, "Model"); argo states none. A resend carries the
21
+ * original message's model as it was, so it is not asked again; a ping is the
22
+ * fleet's question, not a session's message, so it carries none.
23
+ */
24
+ export function acceptMessage(fleet, send) {
25
+ const { recipient, repliedTo } = fleet;
26
+ const { messageId, deliveryId, fleetId, senderShipId, inReplyTo, resendOf, at } = send;
27
+ if (inReplyTo !== undefined && repliedTo?.id !== inReplyTo) {
28
+ return refuse('IN_REPLY_TO_NOT_FOUND', `Message ${inReplyTo} does not exist: a reply names a message of the fleet`);
29
+ }
30
+ const isStated = resendOf === undefined && !isPingContentType(send.contentType);
31
+ if (isStated && send.senderKind === 'operator' && send.model !== undefined) {
32
+ return refuse('MODEL_FROM_ARGO', 'argo states no model: send without one');
33
+ }
34
+ if (isStated && send.senderKind !== 'operator' && send.model === undefined) {
35
+ return refuse('MODEL_REQUIRED', 'send needs model: the exact model id this session runs, such as claude-opus-5-5');
36
+ }
37
+ const message = {
38
+ id: messageId,
39
+ fleetId,
40
+ senderShipId,
41
+ selector: recipient,
42
+ payload: send.payload,
43
+ contentType: send.contentType,
44
+ model: send.model ?? null,
45
+ idempotencyKey: send.idempotencyKey,
46
+ requestHash: send.requestHash,
47
+ inReplyToMessageId: inReplyTo ?? null,
48
+ resendOfMessageId: resendOf?.messageId ?? null,
49
+ createdAt: at,
50
+ };
51
+ const delivery = {
52
+ id: deliveryId,
53
+ fleetId,
54
+ messageId,
55
+ recipient,
56
+ state: 'pending',
57
+ claimedByShipId: null,
58
+ claimedByLeaseId: null,
59
+ attempts: 0,
60
+ createdAt: at,
61
+ };
62
+ return ok({
63
+ message,
64
+ delivery,
65
+ events: [
66
+ {
67
+ fleetId,
68
+ type: 'MessageAccepted',
69
+ occurredAt: at,
70
+ actor: shipActor(resendOf?.by ?? senderShipId),
71
+ shipId: recipient.kind === 'ship' ? recipient.shipId : undefined,
72
+ messageId,
73
+ deliveryId,
74
+ details: {
75
+ selector: recipient.kind,
76
+ recipientType: recipient.kind === 'type' ? recipient.type : null,
77
+ model: send.model ?? null,
78
+ ...(resendOf && { resendOf: resendOf.messageId }),
79
+ },
80
+ },
81
+ ],
82
+ });
83
+ }
84
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/domain/messaging/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+G,MAAM,sBAAsB,CAAC;AAEtK,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AA+EtD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAiB,EAAE,WAAmB;IAC7D,OAAO,QAAQ,CAAC,WAAW,KAAK,WAAW;QACzC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjB,CAAC,CAAC,MAAM,CACJ,wBAAwB,EACxB,8FAA8F,CAC/F,CAAC;AACR,CAAC;AAID;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,KAA+D,EAC/D,IAAqB;IAErB,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACvC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IACvF,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,EAAE,EAAE,KAAK,SAAS,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,uBAAuB,EAAE,WAAW,SAAS,uDAAuD,CAAC,CAAC;IACtH,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChF,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,gBAAgB,EAAE,iFAAiF,CAAC,CAAC;IACrH,CAAC;IAED,MAAM,OAAO,GAAY;QACvB,EAAE,EAAE,SAAS;QACb,OAAO;QACP,YAAY;QACZ,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,kBAAkB,EAAE,SAAS,IAAI,IAAI;QACrC,iBAAiB,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI;QAC9C,SAAS,EAAE,EAAE;KACd,CAAC;IACF,MAAM,QAAQ,GAAa;QACzB,EAAE,EAAE,UAAU;QACd,OAAO;QACP,SAAS;QACT,SAAS;QACT,KAAK,EAAE,SAAS;QAChB,eAAe,EAAE,IAAI;QACrB,gBAAgB,EAAE,IAAI;QACtB,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,EAAE;KACd,CAAC;IACF,OAAO,EAAE,CAAC;QACR,OAAO;QACP,QAAQ;QACR,MAAM,EAAE;YACN;gBACE,OAAO;gBACP,IAAI,EAAE,iBAAiB;gBACvB,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,YAAY,CAAC;gBAC9C,MAAM,EAAE,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAChE,SAAS;gBACT,UAAU;gBACV,OAAO,EAAE;oBACP,QAAQ,EAAE,SAAS,CAAC,IAAI;oBACxB,aAAa,EAAE,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;oBAChE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;oBACzB,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;iBAClD;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type DomainError } from '../shared/errors.js';
2
+ import { type Result } from '../shared/result.js';
3
+ /**
4
+ * A message's payload: text, opaque to the fleet, which never reads, parses or
5
+ * changes it. At most 64 KB serialized, counted in UTF-8 bytes (ADR 0006): a
6
+ * message carries a reference and an instruction, not the content itself. The
7
+ * rule is shared with the common schema, so the door checks the same thing.
8
+ */
9
+ export declare function payload(text: string): Result<string, DomainError<'PAYLOAD_TOO_LARGE'>>;
@@ -0,0 +1,16 @@
1
+ import { PAYLOAD_MAX_BYTES, payloadBytes } from '@aeolus-fleet/common';
2
+ import { refuse } from '../shared/errors.js';
3
+ import { ok } from '../shared/result.js';
4
+ /**
5
+ * A message's payload: text, opaque to the fleet, which never reads, parses or
6
+ * changes it. At most 64 KB serialized, counted in UTF-8 bytes (ADR 0006): a
7
+ * message carries a reference and an instruction, not the content itself. The
8
+ * rule is shared with the common schema, so the door checks the same thing.
9
+ */
10
+ export function payload(text) {
11
+ const bytes = payloadBytes(text);
12
+ return bytes <= PAYLOAD_MAX_BYTES
13
+ ? ok(text)
14
+ : refuse('PAYLOAD_TOO_LARGE', `A payload is at most ${PAYLOAD_MAX_BYTES} bytes (64 KB) in UTF-8, not ${bytes}`);
15
+ }
16
+ //# sourceMappingURL=payload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload.js","sourceRoot":"","sources":["../../../src/domain/messaging/payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,KAAK,IAAI,iBAAiB;QAC/B,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;QACV,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,iBAAiB,gCAAgC,KAAK,EAAE,CAAC,CAAC;AACpH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { type IdGenerator, type MessageId, type ShipId } from '@aeolus-fleet/common';
2
+ import { type PingableShipTx, type UnpingableShip } from '../registry/public.js';
3
+ import type { Caller } from '../shared/caller.js';
4
+ import type { Clock } from '../shared/clock.js';
5
+ import { type Result } from '../shared/result.js';
6
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
7
+ import type { RequestHasher } from './ports.js';
8
+ import { type SendMessageRefusal, type SendMessageTx } from './send-message.js';
9
+ /** What every ping says: the session answers it with pong, and does nothing else with it. */
10
+ export declare const PING_PAYLOAD = "Ping from argo: answer with pong(deliveryId).";
11
+ export type PingShipTx = SendMessageTx & PingableShipTx;
12
+ export interface PingSent {
13
+ /** The ship's open ping: the one this call sent, or the one already waiting. */
14
+ messageId: MessageId;
15
+ sentAt: Date;
16
+ /** Whether this call sent it. */
17
+ isNew: boolean;
18
+ }
19
+ export type PingShipRefusal = UnpingableShip | SendMessageRefusal;
20
+ export type PingShip = (caller: Caller, input: {
21
+ shipId: ShipId;
22
+ }) => Promise<Result<PingSent, PingShipRefusal>>;
23
+ /**
24
+ * Use case: argo pings a crewed ship (`fleet.ping`), asking its session to
25
+ * answer with pong. Its scope (fleet:manage) is checked before this runs. A
26
+ * ping is a message with the reserved content type and a fixed payload, sent
27
+ * and delivered as any message is. At most one is open per ship: while one
28
+ * waits unanswered, pending or in flight, this answers with that one and
29
+ * stores nothing. The ship stays locked meanwhile, so two pings take turns.
30
+ * Each new ping carries a fresh idempotency key: a repeat is answered by the
31
+ * open ping, never by the key.
32
+ */
33
+ export declare function createPingShip(deps: {
34
+ uow: UnitOfWork<PingShipTx>;
35
+ clock: Clock;
36
+ ids: IdGenerator;
37
+ hasher: RequestHasher;
38
+ }): PingShip;
@@ -0,0 +1,42 @@
1
+ import { PING_CONTENT_TYPE } from '@aeolus-fleet/common';
2
+ import { findPingableShip } from '../registry/public.js';
3
+ import { ok } from '../shared/result.js';
4
+ import { checkedSend, sendWithin } from './send-message.js';
5
+ /** What every ping says: the session answers it with pong, and does nothing else with it. */
6
+ export const PING_PAYLOAD = 'Ping from argo: answer with pong(deliveryId).';
7
+ /**
8
+ * Use case: argo pings a crewed ship (`fleet.ping`), asking its session to
9
+ * answer with pong. Its scope (fleet:manage) is checked before this runs. A
10
+ * ping is a message with the reserved content type and a fixed payload, sent
11
+ * and delivered as any message is. At most one is open per ship: while one
12
+ * waits unanswered, pending or in flight, this answers with that one and
13
+ * stores nothing. The ship stays locked meanwhile, so two pings take turns.
14
+ * Each new ping carries a fresh idempotency key: a repeat is answered by the
15
+ * open ping, never by the key.
16
+ */
17
+ export function createPingShip(deps) {
18
+ return (caller, input) => deps.uow.run(async (tx) => {
19
+ const { fleetId } = caller;
20
+ const ship = await findPingableShip(tx, { fleetId, shipId: input.shipId });
21
+ if (!ship.isOk) {
22
+ return ship;
23
+ }
24
+ const open = await tx.deliveries.findOpenPing(fleetId, input.shipId);
25
+ if (open) {
26
+ return ok({ messageId: open.id, sentAt: open.createdAt, isNew: false });
27
+ }
28
+ const request = checkedSend({
29
+ selector: { kind: 'ship', shipId: input.shipId },
30
+ payload: PING_PAYLOAD,
31
+ contentType: PING_CONTENT_TYPE,
32
+ idempotencyKey: `ping-${deps.ids('message')}`,
33
+ }, deps.hasher);
34
+ if (!request.isOk) {
35
+ return request;
36
+ }
37
+ const sentAt = deps.clock.now();
38
+ const sent = await sendWithin({ tx, clock: { now: () => sentAt }, ids: deps.ids }, { caller, request: request.value });
39
+ return sent.isOk ? ok({ messageId: sent.value.messageId, sentAt, isNew: true }) : sent;
40
+ });
41
+ }
42
+ //# sourceMappingURL=ping-ship.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping-ship.js","sourceRoot":"","sources":["../../../src/domain/messaging/ping-ship.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAiD,MAAM,sBAAsB,CAAC;AAExG,OAAO,EAAE,gBAAgB,EAA4C,MAAM,uBAAuB,CAAC;AAGnG,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,UAAU,EAA+C,MAAM,mBAAmB,CAAC;AAEzG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,+CAA+C,CAAC;AAgB5E;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAA8C,EAAE;QACpE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CACzB;YACE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;YAChD,OAAO,EAAE,YAAY;YACrB,WAAW,EAAE,iBAAiB;YAC9B,cAAc,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;SAC9C,EACD,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACvH,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { DeliveryId, FleetId, LeaseId, MessageId, ShipId } from '@aeolus-fleet/common';
2
+ import type { Delivery, Message } from './message.js';
3
+ /** One sender's idempotency key, in its fleet. */
4
+ export interface SenderKey {
5
+ fleetId: FleetId;
6
+ senderShipId: ShipId;
7
+ idempotencyKey: string;
8
+ }
9
+ /** Outbound port: messages, always within one fleet. Never changed once stored. */
10
+ export interface MessageRepository {
11
+ create(message: Message): Promise<void>;
12
+ /**
13
+ * Holds the lock on the sender's idempotency key until the unit of work
14
+ * ends, so two sends with one key never both find it unused: the second
15
+ * waits, then finds the first one's message. Taken before anything else a
16
+ * send locks.
17
+ */
18
+ lockIdempotencyKey(key: SenderKey): Promise<void>;
19
+ /** The message the sender stored with this key, if any. */
20
+ findByIdempotencyKey(key: SenderKey): Promise<Message | undefined>;
21
+ find(fleetId: FleetId, messageId: MessageId): Promise<Message | undefined>;
22
+ /**
23
+ * Holds the fleet's daily message-count lock until the unit of work ends, so
24
+ * two sends at the daily limit never both see room for one more.
25
+ */
26
+ lockDailyCount(fleetId: FleetId): Promise<void>;
27
+ /** How many messages the fleet stored at or after `since`, of any kind and from any sender. */
28
+ countCreatedSince(fleetId: FleetId, since: Date): Promise<number>;
29
+ }
30
+ /**
31
+ * Outbound port: hashes a send's request text (SHA-256). The message keeps the
32
+ * hash, so a repeat of its key is told from a reuse without storing the
33
+ * request twice.
34
+ */
35
+ export interface RequestHasher {
36
+ hash(request: string): string;
37
+ }
38
+ /** Which deliveries a crew may claim, and at most how many. */
39
+ export interface ClaimableDeliveries {
40
+ fleetId: FleetId;
41
+ /** The crew's ship, and its type: deliveries pending for either are the crew's to claim. */
42
+ shipId: ShipId;
43
+ type: string;
44
+ /** The crew's lease: deliveries in flight with it are returned again. */
45
+ leaseId: LeaseId;
46
+ limit: number;
47
+ /** Deliveries this receive has already claimed, left out. */
48
+ excluding: readonly DeliveryId[];
49
+ }
50
+ /** A delivery a crew may claim, with the message it carries. */
51
+ export interface ClaimableDelivery {
52
+ delivery: Delivery;
53
+ message: Message;
54
+ }
55
+ /** Outbound port: deliveries, always within one fleet. */
56
+ export interface DeliveryRepository {
57
+ create(delivery: Delivery): Promise<void>;
58
+ /**
59
+ * Up to `limit` deliveries the crew may claim, each with its message: first
60
+ * those in flight with the crew's lease, then those pending for its ship or
61
+ * its type, oldest first within each. Each is locked until the unit of work
62
+ * ends, and one that another unit of work holds is skipped, never waited
63
+ * for: two receivers never get the same delivery (ADR 0003).
64
+ */
65
+ findClaimableForUpdate(query: ClaimableDeliveries): Promise<ClaimableDelivery[]>;
66
+ /**
67
+ * How many deliveries the crew's next receive would hand it: those in
68
+ * flight with its lease, and those pending for its ship or its type. Locks
69
+ * nothing and claims nothing.
70
+ */
71
+ countReceivable(query: Omit<ClaimableDeliveries, 'limit' | 'excluding'>): Promise<number>;
72
+ /** The delivery, locked until the unit of work ends. */
73
+ findForUpdate(fleetId: FleetId, deliveryId: DeliveryId): Promise<Delivery | undefined>;
74
+ /**
75
+ * The ping to the ship whose delivery is still open, pending or in flight:
76
+ * at most one, since pings never stack. Locks nothing: a ping holds the ship.
77
+ */
78
+ findOpenPing(fleetId: FleetId, shipId: ShipId): Promise<Message | undefined>;
79
+ /** Stores the delivery's state, its claim and its attempts. */
80
+ update(delivery: Delivery): Promise<void>;
81
+ /**
82
+ * Records that the delivery's recipient read it at `at`, keeping an earlier
83
+ * read: read is how the operator sees a message, not a delivery state.
84
+ */
85
+ markRead(read: {
86
+ fleetId: FleetId;
87
+ deliveryId: DeliveryId;
88
+ at: Date;
89
+ }): Promise<void>;
90
+ /** Forgets that the delivery was read: unread again. */
91
+ markUnread(read: {
92
+ fleetId: FleetId;
93
+ deliveryId: DeliveryId;
94
+ }): Promise<void>;
95
+ }
96
+ /** Where a waiting receive listens: its ship, and the queue of its type, in its fleet. */
97
+ export interface ReceiverAddress {
98
+ fleetId: FleetId;
99
+ shipId: ShipId;
100
+ type: string;
101
+ }
102
+ /**
103
+ * Outbound port: wakes a waiting receive when a delivery may be pending for its
104
+ * ship or its type. A wake-up is a hint to look again, never a delivery: the
105
+ * receive finds out in the database whether one is there for it.
106
+ */
107
+ export interface ReceiverWakeups {
108
+ /** Starts watching. A wake-up that comes before the next wait is kept for it. */
109
+ watch(address: ReceiverAddress): ReceiverWatch;
110
+ }
111
+ export interface ReceiverWatch {
112
+ /** Settles when the receive is woken, or once `waitMs` has passed. */
113
+ next(waitMs: number): Promise<'woken' | 'timedOut'>;
114
+ /** Stops watching. */
115
+ stop(): void;
116
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/domain/messaging/ports.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import type { DeliveryId, IdGenerator, MessageId, ShipId } from '@aeolus-fleet/common';
2
+ import { type HoldLeaseTx, type LeaseEnded } 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 { Recipient } from '../shared/selector.js';
9
+ import type { UnitOfWork } from '../shared/unit-of-work.js';
10
+ import type { DeliveryRepository, ReceiverWakeups } from './ports.js';
11
+ export interface ReceiveDeliveriesTx extends HoldLeaseTx {
12
+ deliveries: DeliveryRepository;
13
+ events: EventLog;
14
+ }
15
+ /** One delivery handed to the crew, with its message. */
16
+ export interface ReceivedDelivery {
17
+ deliveryId: DeliveryId;
18
+ messageId: MessageId;
19
+ senderShipId: ShipId;
20
+ /** The sender's name and type as they are now, so the crew can answer it by name. */
21
+ senderName: string;
22
+ senderType: string;
23
+ /** Who the delivery is for: the crew's ship, or its type. */
24
+ recipient: Recipient;
25
+ payload: string;
26
+ contentType: string;
27
+ /** The model the sender's session stated; none from argo. */
28
+ model: string | null;
29
+ inReplyTo: MessageId | null;
30
+ sentAt: Date;
31
+ /** How many times the delivery has been claimed, this time included. */
32
+ attempts: number;
33
+ }
34
+ export interface DeliveriesReceived {
35
+ /** None when the wait ended without a delivery. */
36
+ deliveries: ReceivedDelivery[];
37
+ }
38
+ export type ReceiveRefusal = DomainError<'INVALID_RECEIVE_MAX' | 'SHIP_NOT_FOUND'> | LeaseEnded;
39
+ export type ReceiveDeliveries = (crew: Crew, input: {
40
+ max?: number;
41
+ }) => Promise<Result<DeliveriesReceived, ReceiveRefusal>>;
42
+ /** How long a receive waits for a delivery when none is there: about 25 seconds, then it returns empty. */
43
+ export declare const RECEIVE_WAIT_MS = 25000;
44
+ /**
45
+ * Use case: a crew receives its deliveries (`receive`), up to `max`, 1 to 10,
46
+ * one by default. Its scope (messages:receive) is checked before this runs.
47
+ * Each attempt is one unit of work (see `claimForCrew`): every delivery it
48
+ * returns is in flight, claimed by the crew's ship and lease, until the ship
49
+ * acknowledges it or the lease ends, and the crew's next receive returns it
50
+ * again, counted as another claim, so a lost reply loses nothing. Its fifth
51
+ * claim makes it undeliverable instead. Each delivery names its sender by id,
52
+ * and by the name and type the sender has now, so the crew can answer by name.
53
+ *
54
+ * When nothing is there it waits, about 25 seconds, for a wake-up for its ship
55
+ * or its type (ADR 0003: LISTEN/NOTIFY after commit), then returns empty. It
56
+ * starts watching before it looks a second time, so a delivery that commits
57
+ * between its first look and its watch is found by that second look. A
58
+ * wake-up that brings nothing for it, a type delivery another ship took,
59
+ * leaves it waiting for the rest of its time.
60
+ */
61
+ export declare function createReceiveDeliveries(deps: {
62
+ uow: UnitOfWork<ReceiveDeliveriesTx>;
63
+ clock: Clock;
64
+ ids: IdGenerator;
65
+ wakeups: ReceiverWakeups;
66
+ /** How long a receive waits on an empty inbox; about 25 seconds unless a test says otherwise. */
67
+ waitMs?: number;
68
+ }): ReceiveDeliveries;