@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,127 @@
1
+ /**
2
+ * `/mcp`: the ship contract as a remote MCP server, over streamable HTTP with
3
+ * the official SDK (ADR 0004). One tool per ship procedure, listed and called
4
+ * through the router (see trpc/ship-contract.ts); nothing here decides
5
+ * anything about a ship.
6
+ *
7
+ * The connection carries no ship (ADR 0015): many conversations share one
8
+ * MCP connection, each crewing its own ship. So every tool but `register`
9
+ * takes the crew token as its `crewToken` argument, and no header of the
10
+ * connection is ever read as a credential. The endpoint is stateless: a fresh
11
+ * server answers each HTTP request, and nothing is kept between them.
12
+ */
13
+ import { MCP_PATH } from '@aeolus-fleet/common';
14
+ import { createMcpHandler, McpServer, } from '@modelcontextprotocol/server';
15
+ import { z } from 'zod';
16
+ import { callShip, refusalBody, SHIP_CALLS, unexpectedFailure, } from '../trpc/ship-contract.js';
17
+ import { SHIP_PROTOCOL } from '../trpc/ship-protocol.js';
18
+ /** How the server names itself to MCP clients. Its version is the ship contract's, as in `/api/v1`. */
19
+ const SERVER_INFO = { name: 'aeolus-fleet', version: '1' };
20
+ const CREW_TOKEN_PROPERTY = {
21
+ type: 'string',
22
+ description: 'The crew token register gave you (aeolus_ct_v1_...): it says which ship you crew.',
23
+ };
24
+ /** The one credential a tool takes as an argument. Whether it is a valid one is for the router to judge. */
25
+ const crewTokenArgument = z.string();
26
+ const objectOutput = z.looseObject({ type: z.literal('object') });
27
+ /** A ship call as an MCP tool: every one but `register` asks for the crew token first. */
28
+ function toolOf(call) {
29
+ const input = call.input?.schema ?? { type: 'object', properties: {}, required: [] };
30
+ const inputSchema = call.credential === 'crewToken'
31
+ ? {
32
+ ...input,
33
+ properties: { crewToken: CREW_TOKEN_PROPERTY, ...input.properties },
34
+ required: ['crewToken', ...input.required],
35
+ }
36
+ : input;
37
+ // MCP takes an output schema only for an object; fleet_list answers a list, as text.
38
+ return {
39
+ name: call.name,
40
+ description: call.description,
41
+ inputSchema,
42
+ ...(call.output.type === 'object' && { outputSchema: objectOutput.parse(call.output) }),
43
+ };
44
+ }
45
+ const TOOLS = SHIP_CALLS.map(toolOf);
46
+ /** A tool error the model reads: the code first, so it can tell a refusal from a failure. */
47
+ function refusalResult(refusal) {
48
+ const { code, message, requestId } = refusal;
49
+ const text = requestId === undefined ? `${code}: ${message}` : `${code}: ${message} (request id ${requestId})`;
50
+ return { content: [{ type: 'text', text }], isError: true };
51
+ }
52
+ /** One tool call, as a call through the router with the crew token its arguments carry. */
53
+ async function callTool(params, at) {
54
+ const { request, options } = at;
55
+ const call = SHIP_CALLS.find((candidate) => candidate.name === params.name);
56
+ if (!call) {
57
+ const names = SHIP_CALLS.map((known) => known.name).join(', ');
58
+ return refusalResult({
59
+ code: 'NOT_FOUND',
60
+ message: `There is no tool named ${params.name}. The tools are ${names}.`,
61
+ });
62
+ }
63
+ const args = params.arguments ?? {};
64
+ const { crewToken, ...input } = args;
65
+ const result = await callShip(call, call.credential === 'crewToken'
66
+ ? { ctx: options.contextFor(request, { bearer: crewTokenArgument.safeParse(crewToken).data }), input, log: request.log }
67
+ : { ctx: options.contextFor(request, {}), input: args, log: request.log });
68
+ if (!result.isOk) {
69
+ return refusalResult(result.refusal);
70
+ }
71
+ const text = JSON.stringify(result.output);
72
+ const structuredContent = z.record(z.string(), z.unknown()).safeParse(result.output);
73
+ return structuredContent.success
74
+ ? { content: [{ type: 'text', text }], structuredContent: structuredContent.data }
75
+ : { content: [{ type: 'text', text }] };
76
+ }
77
+ /**
78
+ * The MCP server answering one HTTP request: the ship tools, each a call
79
+ * through the router, and the ship protocol as its instructions, which a
80
+ * client reads when it connects. It answers `tools/list` and `tools/call`
81
+ * itself, at the protocol level, rather than registering each tool: a
82
+ * registered tool's arguments are validated by the SDK before its handler
83
+ * runs, and the router must be the one to judge them, so a refusal reads with
84
+ * its own code.
85
+ */
86
+ function shipToolServer(request, options) {
87
+ const mcp = new McpServer(SERVER_INFO, { capabilities: { tools: {} }, instructions: SHIP_PROTOCOL });
88
+ mcp.server.setRequestHandler('tools/list', () => ({ tools: TOOLS }));
89
+ // A failure here would otherwise reach the client as a protocol error in its own words.
90
+ mcp.server.setRequestHandler('tools/call', async ({ params }) => {
91
+ try {
92
+ return await callTool(params, { request, options });
93
+ }
94
+ catch (thrown) {
95
+ return refusalResult(unexpectedFailure(thrown, { log: request.log, requestId: request.id }));
96
+ }
97
+ });
98
+ return mcp;
99
+ }
100
+ /** The request as the SDK's web-standard handler takes it. Fastify has read the JSON body already. */
101
+ function webRequestOf(request) {
102
+ const headers = new Headers();
103
+ for (const [name, value] of Object.entries(request.headers)) {
104
+ for (const each of Array.isArray(value) ? value : [value]) {
105
+ if (each !== undefined) {
106
+ headers.append(name, each);
107
+ }
108
+ }
109
+ }
110
+ return new Request(new URL(request.url, `${request.protocol}://${request.host}`), { method: request.method, headers });
111
+ }
112
+ /** Mounts `/mcp` on the HTTP server. */
113
+ export function registerMcpEndpoint(server, options) {
114
+ server.all(MCP_PATH, async (request, reply) => {
115
+ try {
116
+ // A handler per request, so each tool call knows the request it came
117
+ // with: its client address for the register limit, its id for the log.
118
+ const handler = createMcpHandler(() => shipToolServer(request, options));
119
+ return await handler.fetch(webRequestOf(request), { parsedBody: request.body });
120
+ }
121
+ catch (thrown) {
122
+ const refusal = unexpectedFailure(thrown, { log: request.log, requestId: request.id });
123
+ return await reply.code(refusal.httpStatus).send(refusalBody(refusal));
124
+ }
125
+ });
126
+ }
127
+ //# sourceMappingURL=mcp-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-endpoint.js","sourceRoot":"","sources":["../../../src/adapters/mcp/mcp-endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { PrismaClient, type Prisma } from './generated/client.js';
2
+ export type { PrismaClient } from './generated/client.js';
3
+ /** The client itself, or the client of one interactive transaction. Repositories take either. */
4
+ export type Db = PrismaClient | Prisma.TransactionClient;
5
+ /** Creates a Prisma client on a pg connection pool for the given database. */
6
+ export declare function createPrismaClient(databaseUrl: string): PrismaClient;
7
+ /** Throws when the database cannot answer a trivial query. */
8
+ export declare function checkDatabase(prisma: PrismaClient): Promise<void>;
9
+ /** The latest migration applied to the database, by name; null before the first. */
10
+ export declare function latestMigration(db: PrismaClient): Promise<string | null>;
@@ -0,0 +1,20 @@
1
+ import { PrismaPg } from '@prisma/adapter-pg';
2
+ import { PrismaClient } from './generated/client.js';
3
+ /** Creates a Prisma client on a pg connection pool for the given database. */
4
+ export function createPrismaClient(databaseUrl) {
5
+ return new PrismaClient({ adapter: new PrismaPg({ connectionString: databaseUrl }) });
6
+ }
7
+ /** Throws when the database cannot answer a trivial query. */
8
+ export async function checkDatabase(prisma) {
9
+ await prisma.$queryRaw `SELECT 1`;
10
+ }
11
+ /** The latest migration applied to the database, by name; null before the first. */
12
+ export async function latestMigration(db) {
13
+ const [row] = await db.$queryRaw `
14
+ SELECT migration_name FROM _prisma_migrations
15
+ WHERE finished_at IS NOT NULL AND rolled_back_at IS NULL
16
+ ORDER BY migration_name DESC
17
+ LIMIT 1`;
18
+ return row?.migration_name ?? null;
19
+ }
20
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/prisma/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAe,MAAM,uBAAuB,CAAC;AAOlE,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAoB;IACtD,MAAM,MAAM,CAAC,SAAS,CAAA,UAAU,CAAC;AACnC,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAgB;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,CAA8B;;;;YAIpD,CAAC;IACX,OAAO,GAAG,EAAE,cAAc,IAAI,IAAI,CAAC;AACrC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { FleetEventNotice } from '../../domain/shared/events.js';
2
+ import type { DeliveryNotice, Notifier } from '../../domain/shared/notifier.js';
3
+ import type { Db } from './client.js';
4
+ /** The one channel every pending delivery is announced on. */
5
+ export declare const DELIVERY_PENDING_CHANNEL = "aeolus_delivery_pending";
6
+ export declare function createPrismaNotifier(db: Db): Notifier;
7
+ /** How the listener names its connection in Postgres (`application_name`), so it can be found there. */
8
+ export declare const LISTENER_APPLICATION_NAME = "aeolus-delivery-listener";
9
+ export interface DeliveryListener {
10
+ /** Settles once the listener first listens: notices of later commits reach it. */
11
+ listening: Promise<void>;
12
+ close(): Promise<void>;
13
+ }
14
+ /**
15
+ * Listens for pending deliveries on a connection of its own: LISTEN needs one
16
+ * that no pool hands to another query, and it must be direct, not through a
17
+ * transaction pooler. Waiting receives and live subscriptions are woken
18
+ * through it. Returns at once.
19
+ *
20
+ * It never throws: a failed connect or a lost connection goes to `onError`,
21
+ * and it tries again after a delay that doubles with each failure, up to 30
22
+ * seconds. Notices sent while it did not listen are gone, so `onListening`
23
+ * runs each time it starts listening, for the waiting receives to look again.
24
+ */
25
+ export declare function listenForPendingDeliveries(options: {
26
+ databaseUrl: string;
27
+ onNotice: (notice: DeliveryNotice) => void;
28
+ /** Hears that a fleet's events up to a number have committed (event-log.ts), for live subscriptions. */
29
+ onFleetEvent?: (notice: FleetEventNotice) => void;
30
+ onListening?: () => void;
31
+ onError?: (error: Error) => void;
32
+ /** The first wait before trying again; 1 second unless a test says otherwise. */
33
+ reconnectDelayMs?: number;
34
+ }): DeliveryListener;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Wakes receivers with Postgres LISTEN/NOTIFY (ADR 0003). A send notifies on
3
+ * one channel inside its transaction; Postgres hands the notice to listeners
4
+ * only when that transaction commits, and drops it when it rolls back. The
5
+ * payload says which delivery is pending and for whom, never the message's
6
+ * payload. The same connection hears committed events (event-log.ts) for the
7
+ * live subscriptions.
8
+ */
9
+ import pg from 'pg';
10
+ import { FLEET_EVENT_CHANNEL } from './event-log.js';
11
+ import { toDeliveryNotice, toFleetEventNotice } from './rows.js';
12
+ /** The one channel every pending delivery is announced on. */
13
+ export const DELIVERY_PENDING_CHANNEL = 'aeolus_delivery_pending';
14
+ export function createPrismaNotifier(db) {
15
+ return {
16
+ deliveryPending: async (notice) => {
17
+ await db.$executeRaw `SELECT pg_notify(${DELIVERY_PENDING_CHANNEL}, ${JSON.stringify(notice)})`;
18
+ },
19
+ };
20
+ }
21
+ /** How the listener names its connection in Postgres (`application_name`), so it can be found there. */
22
+ export const LISTENER_APPLICATION_NAME = 'aeolus-delivery-listener';
23
+ /** The first wait before the listener tries again after losing its connection; each failure doubles it. */
24
+ const RECONNECT_DELAY_MS = 1_000;
25
+ /** The longest wait between two tries. */
26
+ const RECONNECT_DELAY_MAX_MS = 30_000;
27
+ /**
28
+ * Listens for pending deliveries on a connection of its own: LISTEN needs one
29
+ * that no pool hands to another query, and it must be direct, not through a
30
+ * transaction pooler. Waiting receives and live subscriptions are woken
31
+ * through it. Returns at once.
32
+ *
33
+ * It never throws: a failed connect or a lost connection goes to `onError`,
34
+ * and it tries again after a delay that doubles with each failure, up to 30
35
+ * seconds. Notices sent while it did not listen are gone, so `onListening`
36
+ * runs each time it starts listening, for the waiting receives to look again.
37
+ */
38
+ export function listenForPendingDeliveries(options) {
39
+ const firstDelayMs = options.reconnectDelayMs ?? RECONNECT_DELAY_MS;
40
+ const listening = Promise.withResolvers();
41
+ const report = (error) => {
42
+ options.onError?.(error instanceof Error ? error : new Error(String(error)));
43
+ };
44
+ let current;
45
+ let retry;
46
+ let delayMs = firstDelayMs;
47
+ let isClosed = false;
48
+ /** Gives up a client that failed and tries again later: once per client, and never after close. */
49
+ const tryAgainLater = (failed) => {
50
+ if (isClosed || failed !== current) {
51
+ return;
52
+ }
53
+ current = undefined;
54
+ failed.end().catch(() => undefined);
55
+ retry = setTimeout(connect, delayMs);
56
+ delayMs = Math.min(delayMs * 2, RECONNECT_DELAY_MAX_MS);
57
+ };
58
+ const connect = () => {
59
+ retry = undefined;
60
+ const client = new pg.Client({ connectionString: options.databaseUrl, application_name: LISTENER_APPLICATION_NAME });
61
+ current = client;
62
+ client.on('error', (error) => {
63
+ report(error);
64
+ tryAgainLater(client);
65
+ });
66
+ client.on('end', () => {
67
+ tryAgainLater(client);
68
+ });
69
+ client.on('notification', ({ channel, payload }) => {
70
+ if (payload === undefined) {
71
+ return;
72
+ }
73
+ try {
74
+ if (channel === DELIVERY_PENDING_CHANNEL) {
75
+ options.onNotice(toDeliveryNotice(JSON.parse(payload)));
76
+ }
77
+ else if (channel === FLEET_EVENT_CHANNEL) {
78
+ options.onFleetEvent?.(toFleetEventNotice(JSON.parse(payload)));
79
+ }
80
+ }
81
+ catch (error) {
82
+ report(error);
83
+ }
84
+ });
85
+ client
86
+ .connect()
87
+ // The channels are constants, never outside input.
88
+ .then(() => client.query(`LISTEN ${DELIVERY_PENDING_CHANNEL}; LISTEN ${FLEET_EVENT_CHANNEL}`))
89
+ .then(() => {
90
+ if (client !== current) {
91
+ return;
92
+ }
93
+ delayMs = firstDelayMs;
94
+ listening.resolve(undefined);
95
+ options.onListening?.();
96
+ }, (error) => {
97
+ report(error);
98
+ tryAgainLater(client);
99
+ });
100
+ };
101
+ connect();
102
+ return {
103
+ listening: listening.promise,
104
+ close: async () => {
105
+ isClosed = true;
106
+ clearTimeout(retry);
107
+ const client = current;
108
+ current = undefined;
109
+ await client?.end().catch(() => undefined);
110
+ },
111
+ };
112
+ }
113
+ //# sourceMappingURL=delivery-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delivery-notices.js","sourceRoot":"","sources":["../../../src/adapters/prisma/delivery-notices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { EventLog, FleetEventFeed } from '../../domain/shared/events.js';
2
+ import type { Db } from './client.js';
3
+ /** The one channel every committed event is announced on, with its fleet and the last number. */
4
+ export declare const FLEET_EVENT_CHANNEL = "aeolus_event";
5
+ export interface BufferedEventLog extends EventLog {
6
+ /** Numbers and writes the held events and announces them. The unit of work's last step before commit. */
7
+ flush(): Promise<void>;
8
+ }
9
+ export declare function createPrismaEventLog(db: Db): BufferedEventLog;
10
+ /** Reads committed events by number. Each read is one statement, outside a unit of work. */
11
+ export declare function createPrismaFleetEventFeed(db: Db): FleetEventFeed;
@@ -0,0 +1,61 @@
1
+ import { toLastEventSeq, toSequencedEvent } from './rows.js';
2
+ /** The one channel every committed event is announced on, with its fleet and the last number. */
3
+ export const FLEET_EVENT_CHANNEL = 'aeolus_event';
4
+ export function createPrismaEventLog(db) {
5
+ const held = [];
6
+ return {
7
+ append: (event) => {
8
+ held.push(event);
9
+ return Promise.resolve();
10
+ },
11
+ flush: async () => {
12
+ const fleets = [...new Set(held.map((event) => event.fleetId))].toSorted();
13
+ for (const fleetId of fleets) {
14
+ await writeNumbered(db, { fleetId, events: held.filter((event) => event.fleetId === fleetId) });
15
+ }
16
+ held.length = 0;
17
+ },
18
+ };
19
+ }
20
+ async function writeNumbered(db, of) {
21
+ const { fleetId, events } = of;
22
+ const [row] = await db.$queryRaw `
23
+ UPDATE fleets SET last_event_seq = last_event_seq + ${events.length}
24
+ WHERE id = ${fleetId}
25
+ RETURNING last_event_seq`;
26
+ const lastSeq = toLastEventSeq(row);
27
+ const firstSeq = lastSeq - events.length + 1;
28
+ await db.event.createMany({
29
+ data: events.map((event, index) => ({
30
+ id: event.id,
31
+ fleetId: event.fleetId,
32
+ type: event.type,
33
+ occurredAt: event.occurredAt,
34
+ actorShipId: event.actor.kind === 'ship' ? event.actor.shipId : null,
35
+ shipId: event.shipId ?? null,
36
+ messageId: event.messageId ?? null,
37
+ deliveryId: event.deliveryId ?? null,
38
+ details: event.details,
39
+ seq: BigInt(firstSeq + index),
40
+ })),
41
+ });
42
+ await db.$executeRaw `SELECT pg_notify(${FLEET_EVENT_CHANNEL}, ${JSON.stringify({ fleetId, seq: lastSeq })})`;
43
+ }
44
+ /** Reads committed events by number. Each read is one statement, outside a unit of work. */
45
+ export function createPrismaFleetEventFeed(db) {
46
+ return {
47
+ lastSeq: async (fleetId) => {
48
+ const fleet = await db.fleet.findUnique({ where: { id: fleetId }, select: { lastEventSeq: true } });
49
+ return Number(fleet?.lastEventSeq ?? 0);
50
+ },
51
+ after: async (fleetId, { seq, limit }) => {
52
+ const rows = await db.event.findMany({
53
+ where: { fleetId, seq: { gt: seq } },
54
+ orderBy: { seq: 'asc' },
55
+ take: limit,
56
+ });
57
+ return rows.map(toSequencedEvent);
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=event-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../../src/adapters/prisma/event-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface DatabaseErrorCodes {
2
+ /** Prisma's error code, such as P2002. */
3
+ code?: string;
4
+ /** Postgres's SQLSTATE, such as 23505. */
5
+ sqlState?: string;
6
+ /** The driver adapter's name for the error, such as UniqueConstraintViolation. */
7
+ kind?: string;
8
+ }
9
+ export type LoggedFailure = {
10
+ database: DatabaseErrorCodes;
11
+ } | {
12
+ reason: string;
13
+ stack: string | undefined;
14
+ };
15
+ /**
16
+ * A failure as the log holds it: a database error by its codes, anything else
17
+ * with its reason and stack. A failure wrapping a database error, such as a
18
+ * tRPC error whose cause it is, counts as one: it usually repeats its words.
19
+ */
20
+ export declare function failureForLog(error: unknown): LoggedFailure;
21
+ /** A failure as one line for the operator's terminal: a database error by its codes, never its message. */
22
+ export declare function describeFailure(error: unknown): string;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * What the log holds of a failure. A database error's message can quote what
3
+ * the request held (Postgres echoes values back: `invalid input syntax for
4
+ * type integer: "..."`), and its stack opens with that message. So a database
5
+ * error is logged by its codes only: Prisma's, Postgres's SQLSTATE and the
6
+ * driver adapter's kind. Any other failure is logged whole.
7
+ */
8
+ import pg from 'pg';
9
+ import { z } from 'zod';
10
+ import { Prisma } from './generated/client.js';
11
+ /** Where Prisma keeps the driver adapter's error, whose cause holds Postgres's code. */
12
+ const prismaMetaSchema = z.object({
13
+ driverAdapterError: z.object({
14
+ cause: z.object({ originalCode: z.string().optional(), kind: z.string().optional() }),
15
+ }),
16
+ });
17
+ const driverAdapterErrorSchema = z.object({
18
+ name: z.literal('DriverAdapterError'),
19
+ cause: z.object({ originalCode: z.string().optional(), kind: z.string().optional() }),
20
+ });
21
+ /** Only the codes that are there: an absent one is left out, not logged as undefined. */
22
+ function codes(found) {
23
+ return Object.fromEntries(Object.entries(found).filter(([, value]) => value !== undefined));
24
+ }
25
+ /** The codes of a database error, anywhere in the chain of causes; undefined when the failure is not one. */
26
+ function databaseCodesOf(error) {
27
+ if (error instanceof Prisma.PrismaClientKnownRequestError) {
28
+ const cause = prismaMetaSchema.safeParse(error.meta).data?.driverAdapterError.cause;
29
+ return codes({ code: error.code, sqlState: cause?.originalCode, kind: cause?.kind });
30
+ }
31
+ if (error instanceof Prisma.PrismaClientInitializationError) {
32
+ return codes({ code: error.errorCode });
33
+ }
34
+ if (error instanceof Prisma.PrismaClientUnknownRequestError ||
35
+ error instanceof Prisma.PrismaClientRustPanicError ||
36
+ error instanceof Prisma.PrismaClientValidationError) {
37
+ return {};
38
+ }
39
+ if (error instanceof pg.DatabaseError) {
40
+ return codes({ sqlState: error.code });
41
+ }
42
+ const adapterError = driverAdapterErrorSchema.safeParse(error).data;
43
+ if (adapterError !== undefined) {
44
+ return codes({ sqlState: adapterError.cause.originalCode, kind: adapterError.cause.kind });
45
+ }
46
+ return error instanceof Error && error.cause !== undefined ? databaseCodesOf(error.cause) : undefined;
47
+ }
48
+ /**
49
+ * A failure as the log holds it: a database error by its codes, anything else
50
+ * with its reason and stack. A failure wrapping a database error, such as a
51
+ * tRPC error whose cause it is, counts as one: it usually repeats its words.
52
+ */
53
+ export function failureForLog(error) {
54
+ const database = databaseCodesOf(error);
55
+ if (database !== undefined) {
56
+ return { database };
57
+ }
58
+ return error instanceof Error ? { reason: error.message, stack: error.stack } : { reason: String(error), stack: undefined };
59
+ }
60
+ /** A failure as one line for the operator's terminal: a database error by its codes, never its message. */
61
+ export function describeFailure(error) {
62
+ const failure = failureForLog(error);
63
+ if ('reason' in failure) {
64
+ return failure.reason;
65
+ }
66
+ const { code, sqlState, kind } = failure.database;
67
+ const named = [code, sqlState, kind].filter((part) => part !== undefined);
68
+ return `The database failed (${named.length > 0 ? named.join(', ') : 'no code'}).`;
69
+ }
70
+ //# sourceMappingURL=failure-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-log.js","sourceRoot":"","sources":["../../../src/adapters/prisma/failure-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FleetCounter } from '../../domain/shared/ping.js';
2
+ import type { PrismaClient } from './client.js';
3
+ export declare function createPrismaFleetCounter(prisma: PrismaClient): FleetCounter;
@@ -0,0 +1,6 @@
1
+ export function createPrismaFleetCounter(prisma) {
2
+ return {
3
+ countFleets: () => prisma.fleet.count(),
4
+ };
5
+ }
6
+ //# sourceMappingURL=fleet-counter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-counter.js","sourceRoot":"","sources":["../../../src/adapters/prisma/fleet-counter.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,MAAoB;IAC3D,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Wakes live subscriptions from the event notices the listener hears
3
+ * (event-log.ts). Each subscription watches its fleet; a notice for it wakes
4
+ * the subscription, which reads the events table again. Held in the server's
5
+ * memory only: a wake-up is a hint and the table is the truth, so a notice
6
+ * lost while the listener reconnects costs nothing once `wakeAll` runs.
7
+ */
8
+ import type { FleetId } from '@aeolus-fleet/common';
9
+ import type { FleetEventNotice, FleetEventWakeups } from '../../domain/shared/events.js';
10
+ export interface FleetEventWatch {
11
+ /**
12
+ * Settles once the fleet has news: at once when a notice came since the last
13
+ * call. True when woken; false when the signal aborted or the server stops.
14
+ */
15
+ next(signal: AbortSignal): Promise<boolean>;
16
+ stop(): void;
17
+ }
18
+ export interface FleetEventWakeupHub {
19
+ watch(fleetId: FleetId): FleetEventWatch;
20
+ /** Wakes the subscriptions of the notice's fleet. */
21
+ eventCommitted(notice: FleetEventNotice): void;
22
+ /** Wakes every subscription, so each reads again: for when the listener starts listening again. */
23
+ wakeAll(): void;
24
+ /** Ends every wait and every later one, for a stopping server. */
25
+ endAll(): void;
26
+ }
27
+ export declare function createFleetEventWakeups(): FleetEventWakeupHub;
28
+ /**
29
+ * The hub as the core's port for a waiting follow: each wait ends when the
30
+ * fleet has news, or once its time has passed, or when the server stops,
31
+ * which reads as the time having passed.
32
+ */
33
+ export declare function fleetEventWakeupsOf(hub: Pick<FleetEventWakeupHub, 'watch'>): FleetEventWakeups;