@aeolus-fleet/core 0.0.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +98 -1
- package/dist/adapters/cli/fleet-init.d.ts +14 -0
- package/dist/adapters/cli/fleet-init.js +68 -0
- package/dist/adapters/cli/fleet-init.js.map +1 -0
- package/dist/adapters/cli/io.d.ts +35 -0
- package/dist/adapters/cli/io.js +21 -0
- package/dist/adapters/cli/io.js.map +1 -0
- package/dist/adapters/cli/migrate.d.ts +11 -0
- package/dist/adapters/cli/migrate.js +12 -0
- package/dist/adapters/cli/migrate.js.map +1 -0
- package/dist/adapters/cli/operator-reset-password.d.ts +12 -0
- package/dist/adapters/cli/operator-reset-password.js +49 -0
- package/dist/adapters/cli/operator-reset-password.js.map +1 -0
- package/dist/adapters/cli/run.d.ts +14 -0
- package/dist/adapters/cli/run.js +40 -0
- package/dist/adapters/cli/run.js.map +1 -0
- package/dist/adapters/cli/terminal.d.ts +20 -0
- package/dist/adapters/cli/terminal.js +68 -0
- package/dist/adapters/cli/terminal.js.map +1 -0
- package/dist/adapters/crypto/passwords.d.ts +2 -0
- package/dist/adapters/crypto/passwords.js +59 -0
- package/dist/adapters/crypto/passwords.js.map +1 -0
- package/dist/adapters/crypto/secrets.d.ts +5 -0
- package/dist/adapters/crypto/secrets.js +10 -0
- package/dist/adapters/crypto/secrets.js.map +1 -0
- package/dist/adapters/http/device-label.d.ts +9 -0
- package/dist/adapters/http/device-label.js +39 -0
- package/dist/adapters/http/device-label.js.map +1 -0
- package/dist/adapters/http/rate-limiter.d.ts +21 -0
- package/dist/adapters/http/rate-limiter.js +44 -0
- package/dist/adapters/http/rate-limiter.js.map +1 -0
- package/dist/adapters/http/request-credentials.d.ts +23 -0
- package/dist/adapters/http/request-credentials.js +45 -0
- package/dist/adapters/http/request-credentials.js.map +1 -0
- package/dist/adapters/http/server.d.ts +47 -0
- package/dist/adapters/http/server.js +216 -0
- package/dist/adapters/http/server.js.map +1 -0
- package/dist/adapters/http/version.d.ts +9 -0
- package/dist/adapters/http/version.js +23 -0
- package/dist/adapters/http/version.js.map +1 -0
- package/dist/adapters/mcp/mcp-endpoint.d.ts +8 -0
- package/dist/adapters/mcp/mcp-endpoint.js +127 -0
- package/dist/adapters/mcp/mcp-endpoint.js.map +1 -0
- package/dist/adapters/prisma/client.d.ts +10 -0
- package/dist/adapters/prisma/client.js +20 -0
- package/dist/adapters/prisma/client.js.map +1 -0
- package/dist/adapters/prisma/delivery-notices.d.ts +34 -0
- package/dist/adapters/prisma/delivery-notices.js +113 -0
- package/dist/adapters/prisma/delivery-notices.js.map +1 -0
- package/dist/adapters/prisma/event-log.d.ts +11 -0
- package/dist/adapters/prisma/event-log.js +61 -0
- package/dist/adapters/prisma/event-log.js.map +1 -0
- package/dist/adapters/prisma/failure-log.d.ts +22 -0
- package/dist/adapters/prisma/failure-log.js +70 -0
- package/dist/adapters/prisma/failure-log.js.map +1 -0
- package/dist/adapters/prisma/fleet-counter.d.ts +3 -0
- package/dist/adapters/prisma/fleet-counter.js +6 -0
- package/dist/adapters/prisma/fleet-counter.js.map +1 -0
- package/dist/adapters/prisma/fleet-event-wakeups.d.ts +33 -0
- package/dist/adapters/prisma/fleet-event-wakeups.js +86 -0
- package/dist/adapters/prisma/fleet-event-wakeups.js.map +1 -0
- package/dist/adapters/prisma/generated/browser.d.ts +127 -0
- package/dist/adapters/prisma/generated/browser.js +18 -0
- package/dist/adapters/prisma/generated/browser.js.map +1 -0
- package/dist/adapters/prisma/generated/client.d.ts +146 -0
- package/dist/adapters/prisma/generated/client.js +38 -0
- package/dist/adapters/prisma/generated/client.js.map +1 -0
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +879 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js +11 -0
- package/dist/adapters/prisma/generated/commonInputTypes.js.map +1 -0
- package/dist/adapters/prisma/generated/enums.d.ts +75 -0
- package/dist/adapters/prisma/generated/enums.js +73 -0
- package/dist/adapters/prisma/generated/enums.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/class.d.ts +308 -0
- package/dist/adapters/prisma/generated/internal/class.js +52 -0
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +2131 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +295 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +273 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +265 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ConsoleSession.d.ts +2137 -0
- package/dist/adapters/prisma/generated/models/ConsoleSession.js +2 -0
- package/dist/adapters/prisma/generated/models/ConsoleSession.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Credential.d.ts +1360 -0
- package/dist/adapters/prisma/generated/models/Credential.js +2 -0
- package/dist/adapters/prisma/generated/models/Credential.js.map +1 -0
- package/dist/adapters/prisma/generated/models/CrewRequest.d.ts +1558 -0
- package/dist/adapters/prisma/generated/models/CrewRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/CrewRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +2211 -0
- package/dist/adapters/prisma/generated/models/Delivery.js +2 -0
- package/dist/adapters/prisma/generated/models/Delivery.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Event.d.ts +1991 -0
- package/dist/adapters/prisma/generated/models/Event.js +2 -0
- package/dist/adapters/prisma/generated/models/Event.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +3032 -0
- package/dist/adapters/prisma/generated/models/Fleet.js +2 -0
- package/dist/adapters/prisma/generated/models/Fleet.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Guide.d.ts +943 -0
- package/dist/adapters/prisma/generated/models/Guide.js +2 -0
- package/dist/adapters/prisma/generated/models/Guide.js.map +1 -0
- package/dist/adapters/prisma/generated/models/GuideProgress.d.ts +1323 -0
- package/dist/adapters/prisma/generated/models/GuideProgress.js +2 -0
- package/dist/adapters/prisma/generated/models/GuideProgress.js.map +1 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.d.ts +1036 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js +2 -0
- package/dist/adapters/prisma/generated/models/InstallationRequest.js.map +1 -0
- package/dist/adapters/prisma/generated/models/InstallationSettings.d.ts +1027 -0
- package/dist/adapters/prisma/generated/models/InstallationSettings.js +2 -0
- package/dist/adapters/prisma/generated/models/InstallationSettings.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Lease.d.ts +2076 -0
- package/dist/adapters/prisma/generated/models/Lease.js +2 -0
- package/dist/adapters/prisma/generated/models/Lease.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Message.d.ts +2869 -0
- package/dist/adapters/prisma/generated/models/Message.js +2 -0
- package/dist/adapters/prisma/generated/models/Message.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Notice.d.ts +1068 -0
- package/dist/adapters/prisma/generated/models/Notice.js +2 -0
- package/dist/adapters/prisma/generated/models/Notice.js.map +1 -0
- package/dist/adapters/prisma/generated/models/NoticeDismissal.d.ts +1245 -0
- package/dist/adapters/prisma/generated/models/NoticeDismissal.js +2 -0
- package/dist/adapters/prisma/generated/models/NoticeDismissal.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Operator.d.ts +1173 -0
- package/dist/adapters/prisma/generated/models/Operator.js +2 -0
- package/dist/adapters/prisma/generated/models/Operator.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +3320 -0
- package/dist/adapters/prisma/generated/models/Ship.js +2 -0
- package/dist/adapters/prisma/generated/models/Ship.js.map +1 -0
- package/dist/adapters/prisma/generated/models/SignInTicket.d.ts +1222 -0
- package/dist/adapters/prisma/generated/models/SignInTicket.js +2 -0
- package/dist/adapters/prisma/generated/models/SignInTicket.js.map +1 -0
- package/dist/adapters/prisma/generated/models.d.ts +18 -0
- package/dist/adapters/prisma/generated/models.js +2 -0
- package/dist/adapters/prisma/generated/models.js.map +1 -0
- package/dist/adapters/prisma/history.d.ts +3 -0
- package/dist/adapters/prisma/history.js +289 -0
- package/dist/adapters/prisma/history.js.map +1 -0
- package/dist/adapters/prisma/identity.d.ts +10 -0
- package/dist/adapters/prisma/identity.js +213 -0
- package/dist/adapters/prisma/identity.js.map +1 -0
- package/dist/adapters/prisma/installation.d.ts +13 -0
- package/dist/adapters/prisma/installation.js +155 -0
- package/dist/adapters/prisma/installation.js.map +1 -0
- package/dist/adapters/prisma/messaging.d.ts +4 -0
- package/dist/adapters/prisma/messaging.js +156 -0
- package/dist/adapters/prisma/messaging.js.map +1 -0
- package/dist/adapters/prisma/migrate.d.ts +5 -0
- package/dist/adapters/prisma/migrate.js +40 -0
- package/dist/adapters/prisma/migrate.js.map +1 -0
- package/dist/adapters/prisma/receiver-wakeups.d.ts +26 -0
- package/dist/adapters/prisma/receiver-wakeups.js +79 -0
- package/dist/adapters/prisma/receiver-wakeups.js.map +1 -0
- package/dist/adapters/prisma/registry.d.ts +8 -0
- package/dist/adapters/prisma/registry.js +427 -0
- package/dist/adapters/prisma/registry.js.map +1 -0
- package/dist/adapters/prisma/rows.d.ts +58 -0
- package/dist/adapters/prisma/rows.js +408 -0
- package/dist/adapters/prisma/rows.js.map +1 -0
- package/dist/adapters/prisma/unit-of-work.d.ts +36 -0
- package/dist/adapters/prisma/unit-of-work.js +66 -0
- package/dist/adapters/prisma/unit-of-work.js.map +1 -0
- package/dist/adapters/rest/openapi.d.ts +12 -0
- package/dist/adapters/rest/openapi.js +62 -0
- package/dist/adapters/rest/openapi.js.map +1 -0
- package/dist/adapters/rest/rest-api.d.ts +8 -0
- package/dist/adapters/rest/rest-api.js +61 -0
- package/dist/adapters/rest/rest-api.js.map +1 -0
- package/dist/adapters/trpc/console.d.ts +150 -0
- package/dist/adapters/trpc/console.js +102 -0
- package/dist/adapters/trpc/console.js.map +1 -0
- package/dist/adapters/trpc/context.d.ts +201 -0
- package/dist/adapters/trpc/context.js +2 -0
- package/dist/adapters/trpc/context.js.map +1 -0
- package/dist/adapters/trpc/fleet.d.ts +637 -0
- package/dist/adapters/trpc/fleet.js +437 -0
- package/dist/adapters/trpc/fleet.js.map +1 -0
- package/dist/adapters/trpc/installation.d.ts +414 -0
- package/dist/adapters/trpc/installation.js +138 -0
- package/dist/adapters/trpc/installation.js.map +1 -0
- package/dist/adapters/trpc/router.d.ts +1263 -0
- package/dist/adapters/trpc/router.js +15 -0
- package/dist/adapters/trpc/router.js.map +1 -0
- package/dist/adapters/trpc/ship-contract.d.ts +107 -0
- package/dist/adapters/trpc/ship-contract.js +165 -0
- package/dist/adapters/trpc/ship-contract.js.map +1 -0
- package/dist/adapters/trpc/ship-protocol.d.ts +9 -0
- package/dist/adapters/trpc/ship-protocol.js +25 -0
- package/dist/adapters/trpc/ship-protocol.js.map +1 -0
- package/dist/adapters/trpc/ship.d.ts +209 -0
- package/dist/adapters/trpc/ship.js +214 -0
- package/dist/adapters/trpc/ship.js.map +1 -0
- package/dist/adapters/trpc/starting-prompt-text.d.ts +7 -0
- package/dist/adapters/trpc/starting-prompt-text.js +60 -0
- package/dist/adapters/trpc/starting-prompt-text.js.map +1 -0
- package/dist/adapters/trpc/system.d.ts +29 -0
- package/dist/adapters/trpc/system.js +15 -0
- package/dist/adapters/trpc/system.js.map +1 -0
- package/dist/adapters/trpc/trpc.d.ts +131 -0
- package/dist/adapters/trpc/trpc.js +350 -0
- package/dist/adapters/trpc/trpc.js.map +1 -0
- package/dist/app.d.ts +31 -0
- package/dist/app.js +80 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/aeolus-core.d.ts +2 -0
- package/dist/bin/aeolus-core.js +45 -0
- package/dist/bin/aeolus-core.js.map +1 -0
- package/dist/config.d.ts +35 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/domain/identity/authenticate.d.ts +46 -0
- package/dist/domain/identity/authenticate.js +18 -0
- package/dist/domain/identity/authenticate.js.map +1 -0
- package/dist/domain/identity/console-session.d.ts +54 -0
- package/dist/domain/identity/console-session.js +29 -0
- package/dist/domain/identity/console-session.js.map +1 -0
- package/dist/domain/identity/credential.d.ts +76 -0
- package/dist/domain/identity/credential.js +63 -0
- package/dist/domain/identity/credential.js.map +1 -0
- package/dist/domain/identity/dismiss-notice.d.ts +19 -0
- package/dist/domain/identity/dismiss-notice.js +23 -0
- package/dist/domain/identity/dismiss-notice.js.map +1 -0
- package/dist/domain/identity/get-guide.d.ts +7 -0
- package/dist/domain/identity/get-guide.js +5 -0
- package/dist/domain/identity/get-guide.js.map +1 -0
- package/dist/domain/identity/get-notices.d.ts +7 -0
- package/dist/domain/identity/get-notices.js +5 -0
- package/dist/domain/identity/get-notices.js.map +1 -0
- package/dist/domain/identity/guide.d.ts +24 -0
- package/dist/domain/identity/guide.js +3 -0
- package/dist/domain/identity/guide.js.map +1 -0
- package/dist/domain/identity/issue-sign-in-ticket.d.ts +38 -0
- package/dist/domain/identity/issue-sign-in-ticket.js +39 -0
- package/dist/domain/identity/issue-sign-in-ticket.js.map +1 -0
- package/dist/domain/identity/notice.d.ts +16 -0
- package/dist/domain/identity/notice.js +12 -0
- package/dist/domain/identity/notice.js.map +1 -0
- package/dist/domain/identity/operator-account.d.ts +28 -0
- package/dist/domain/identity/operator-account.js +21 -0
- package/dist/domain/identity/operator-account.js.map +1 -0
- package/dist/domain/identity/ports.d.ts +193 -0
- package/dist/domain/identity/ports.js +2 -0
- package/dist/domain/identity/ports.js.map +1 -0
- package/dist/domain/identity/public.d.ts +3 -0
- package/dist/domain/identity/public.js +5 -0
- package/dist/domain/identity/public.js.map +1 -0
- package/dist/domain/identity/read-account.d.ts +35 -0
- package/dist/domain/identity/read-account.js +27 -0
- package/dist/domain/identity/read-account.js.map +1 -0
- package/dist/domain/identity/read-guide.d.ts +18 -0
- package/dist/domain/identity/read-guide.js +21 -0
- package/dist/domain/identity/read-guide.js.map +1 -0
- package/dist/domain/identity/read-notices.d.ts +13 -0
- package/dist/domain/identity/read-notices.js +17 -0
- package/dist/domain/identity/read-notices.js.map +1 -0
- package/dist/domain/identity/record-guide-progress.d.ts +19 -0
- package/dist/domain/identity/record-guide-progress.js +24 -0
- package/dist/domain/identity/record-guide-progress.js.map +1 -0
- package/dist/domain/identity/redeem-sign-in-ticket.d.ts +34 -0
- package/dist/domain/identity/redeem-sign-in-ticket.js +25 -0
- package/dist/domain/identity/redeem-sign-in-ticket.js.map +1 -0
- package/dist/domain/identity/reset-operator-password.d.ts +34 -0
- package/dist/domain/identity/reset-operator-password.js +55 -0
- package/dist/domain/identity/reset-operator-password.js.map +1 -0
- package/dist/domain/identity/set-guide.d.ts +13 -0
- package/dist/domain/identity/set-guide.js +12 -0
- package/dist/domain/identity/set-guide.js.map +1 -0
- package/dist/domain/identity/set-notices.d.ts +13 -0
- package/dist/domain/identity/set-notices.js +12 -0
- package/dist/domain/identity/set-notices.js.map +1 -0
- package/dist/domain/identity/set-theme.d.ts +21 -0
- package/dist/domain/identity/set-theme.js +19 -0
- package/dist/domain/identity/set-theme.js.map +1 -0
- package/dist/domain/identity/sign-in-ticket.d.ts +21 -0
- package/dist/domain/identity/sign-in-ticket.js +5 -0
- package/dist/domain/identity/sign-in-ticket.js.map +1 -0
- package/dist/domain/identity/sign-in.d.ts +51 -0
- package/dist/domain/identity/sign-in.js +43 -0
- package/dist/domain/identity/sign-in.js.map +1 -0
- package/dist/domain/identity/sign-out.d.ts +20 -0
- package/dist/domain/identity/sign-out.js +32 -0
- package/dist/domain/identity/sign-out.js.map +1 -0
- package/dist/domain/identity/start-console-session.d.ts +27 -0
- package/dist/domain/identity/start-console-session.js +54 -0
- package/dist/domain/identity/start-console-session.js.map +1 -0
- package/dist/domain/identity/start-viewer-session.d.ts +29 -0
- package/dist/domain/identity/start-viewer-session.js +42 -0
- package/dist/domain/identity/start-viewer-session.js.map +1 -0
- package/dist/domain/messaging/acknowledge-delivery.d.ts +30 -0
- package/dist/domain/messaging/acknowledge-delivery.js +31 -0
- package/dist/domain/messaging/acknowledge-delivery.js.map +1 -0
- package/dist/domain/messaging/answer-ping.d.ts +33 -0
- package/dist/domain/messaging/answer-ping.js +37 -0
- package/dist/domain/messaging/answer-ping.js.map +1 -0
- package/dist/domain/messaging/check-inbox.d.ts +33 -0
- package/dist/domain/messaging/check-inbox.js +61 -0
- package/dist/domain/messaging/check-inbox.js.map +1 -0
- package/dist/domain/messaging/content-type.d.ts +9 -0
- package/dist/domain/messaging/content-type.js +18 -0
- package/dist/domain/messaging/content-type.js.map +1 -0
- package/dist/domain/messaging/daily-message-limit.d.ts +19 -0
- package/dist/domain/messaging/daily-message-limit.js +24 -0
- package/dist/domain/messaging/daily-message-limit.js.map +1 -0
- package/dist/domain/messaging/delivery.d.ts +116 -0
- package/dist/domain/messaging/delivery.js +201 -0
- package/dist/domain/messaging/delivery.js.map +1 -0
- package/dist/domain/messaging/dismiss-delivery.d.ts +28 -0
- package/dist/domain/messaging/dismiss-delivery.js +29 -0
- package/dist/domain/messaging/dismiss-delivery.js.map +1 -0
- package/dist/domain/messaging/inbox-wait.d.ts +8 -0
- package/dist/domain/messaging/inbox-wait.js +19 -0
- package/dist/domain/messaging/inbox-wait.js.map +1 -0
- package/dist/domain/messaging/mark-done.d.ts +45 -0
- package/dist/domain/messaging/mark-done.js +49 -0
- package/dist/domain/messaging/mark-done.js.map +1 -0
- package/dist/domain/messaging/mark-read.d.ts +27 -0
- package/dist/domain/messaging/mark-read.js +34 -0
- package/dist/domain/messaging/mark-read.js.map +1 -0
- package/dist/domain/messaging/message.d.ts +104 -0
- package/dist/domain/messaging/message.js +84 -0
- package/dist/domain/messaging/message.js.map +1 -0
- package/dist/domain/messaging/payload.d.ts +9 -0
- package/dist/domain/messaging/payload.js +16 -0
- package/dist/domain/messaging/payload.js.map +1 -0
- package/dist/domain/messaging/ping-ship.d.ts +38 -0
- package/dist/domain/messaging/ping-ship.js +42 -0
- package/dist/domain/messaging/ping-ship.js.map +1 -0
- package/dist/domain/messaging/ports.d.ts +116 -0
- package/dist/domain/messaging/ports.js +2 -0
- package/dist/domain/messaging/ports.js.map +1 -0
- package/dist/domain/messaging/receive-deliveries.d.ts +68 -0
- package/dist/domain/messaging/receive-deliveries.js +119 -0
- package/dist/domain/messaging/receive-deliveries.js.map +1 -0
- package/dist/domain/messaging/receive-max.d.ts +8 -0
- package/dist/domain/messaging/receive-max.js +17 -0
- package/dist/domain/messaging/receive-max.js.map +1 -0
- package/dist/domain/messaging/reply-to-message.d.ts +35 -0
- package/dist/domain/messaging/reply-to-message.js +49 -0
- package/dist/domain/messaging/reply-to-message.js.map +1 -0
- package/dist/domain/messaging/resend-delivery.d.ts +48 -0
- package/dist/domain/messaging/resend-delivery.js +97 -0
- package/dist/domain/messaging/resend-delivery.js.map +1 -0
- package/dist/domain/messaging/send-message.d.ts +88 -0
- package/dist/domain/messaging/send-message.js +115 -0
- package/dist/domain/messaging/send-message.js.map +1 -0
- package/dist/domain/messaging/send-request.d.ts +16 -0
- package/dist/domain/messaging/send-request.js +18 -0
- package/dist/domain/messaging/send-request.js.map +1 -0
- package/dist/domain/registry/applied-limits.d.ts +15 -0
- package/dist/domain/registry/applied-limits.js +15 -0
- package/dist/domain/registry/applied-limits.js.map +1 -0
- package/dist/domain/registry/assign-crew.d.ts +31 -0
- package/dist/domain/registry/assign-crew.js +35 -0
- package/dist/domain/registry/assign-crew.js.map +1 -0
- package/dist/domain/registry/claim-ship.d.ts +49 -0
- package/dist/domain/registry/claim-ship.js +59 -0
- package/dist/domain/registry/claim-ship.js.map +1 -0
- package/dist/domain/registry/commission-ship.d.ts +54 -0
- package/dist/domain/registry/commission-ship.js +70 -0
- package/dist/domain/registry/commission-ship.js.map +1 -0
- package/dist/domain/registry/confirm-crew-release.d.ts +28 -0
- package/dist/domain/registry/confirm-crew-release.js +28 -0
- package/dist/domain/registry/confirm-crew-release.js.map +1 -0
- package/dist/domain/registry/create-fleet.d.ts +39 -0
- package/dist/domain/registry/create-fleet.js +56 -0
- package/dist/domain/registry/create-fleet.js.map +1 -0
- package/dist/domain/registry/crew-request.d.ts +148 -0
- package/dist/domain/registry/crew-request.js +175 -0
- package/dist/domain/registry/crew-request.js.map +1 -0
- package/dist/domain/registry/delete-fleet.d.ts +46 -0
- package/dist/domain/registry/delete-fleet.js +34 -0
- package/dist/domain/registry/delete-fleet.js.map +1 -0
- package/dist/domain/registry/deregister.d.ts +32 -0
- package/dist/domain/registry/deregister.js +38 -0
- package/dist/domain/registry/deregister.js.map +1 -0
- package/dist/domain/registry/explain-crew-request.d.ts +30 -0
- package/dist/domain/registry/explain-crew-request.js +31 -0
- package/dist/domain/registry/explain-crew-request.js.map +1 -0
- package/dist/domain/registry/fleet.d.ts +12 -0
- package/dist/domain/registry/fleet.js +12 -0
- package/dist/domain/registry/fleet.js.map +1 -0
- package/dist/domain/registry/found-fleet.d.ts +32 -0
- package/dist/domain/registry/found-fleet.js +43 -0
- package/dist/domain/registry/found-fleet.js.map +1 -0
- package/dist/domain/registry/get-fleet-limits.d.ts +17 -0
- package/dist/domain/registry/get-fleet-limits.js +14 -0
- package/dist/domain/registry/get-fleet-limits.js.map +1 -0
- package/dist/domain/registry/get-installation-fleet.d.ts +15 -0
- package/dist/domain/registry/get-installation-fleet.js +12 -0
- package/dist/domain/registry/get-installation-fleet.js.map +1 -0
- package/dist/domain/registry/get-installation-settings.d.ts +7 -0
- package/dist/domain/registry/get-installation-settings.js +5 -0
- package/dist/domain/registry/get-installation-settings.js.map +1 -0
- package/dist/domain/registry/get-ship.d.ts +34 -0
- package/dist/domain/registry/get-ship.js +36 -0
- package/dist/domain/registry/get-ship.js.map +1 -0
- package/dist/domain/registry/get-starting-prompt.d.ts +24 -0
- package/dist/domain/registry/get-starting-prompt.js +46 -0
- package/dist/domain/registry/get-starting-prompt.js.map +1 -0
- package/dist/domain/registry/initialise-fleet.d.ts +28 -0
- package/dist/domain/registry/initialise-fleet.js +39 -0
- package/dist/domain/registry/initialise-fleet.js.map +1 -0
- package/dist/domain/registry/installation-fleet.d.ts +36 -0
- package/dist/domain/registry/installation-fleet.js +22 -0
- package/dist/domain/registry/installation-fleet.js.map +1 -0
- package/dist/domain/registry/installation-request.d.ts +23 -0
- package/dist/domain/registry/installation-request.js +5 -0
- package/dist/domain/registry/installation-request.js.map +1 -0
- package/dist/domain/registry/lease.d.ts +51 -0
- package/dist/domain/registry/lease.js +39 -0
- package/dist/domain/registry/lease.js.map +1 -0
- package/dist/domain/registry/leases.d.ts +66 -0
- package/dist/domain/registry/leases.js +80 -0
- package/dist/domain/registry/leases.js.map +1 -0
- package/dist/domain/registry/limits.d.ts +50 -0
- package/dist/domain/registry/limits.js +24 -0
- package/dist/domain/registry/limits.js.map +1 -0
- package/dist/domain/registry/list-fleet.d.ts +70 -0
- package/dist/domain/registry/list-fleet.js +47 -0
- package/dist/domain/registry/list-fleet.js.map +1 -0
- package/dist/domain/registry/list-fleets.d.ts +11 -0
- package/dist/domain/registry/list-fleets.js +9 -0
- package/dist/domain/registry/list-fleets.js.map +1 -0
- package/dist/domain/registry/list-installation-fleets.d.ts +15 -0
- package/dist/domain/registry/list-installation-fleets.js +15 -0
- package/dist/domain/registry/list-installation-fleets.js.map +1 -0
- package/dist/domain/registry/ping-status.d.ts +17 -0
- package/dist/domain/registry/ping-status.js +28 -0
- package/dist/domain/registry/ping-status.js.map +1 -0
- package/dist/domain/registry/pingable-ship.d.ts +22 -0
- package/dist/domain/registry/pingable-ship.js +21 -0
- package/dist/domain/registry/pingable-ship.js.map +1 -0
- package/dist/domain/registry/ports.d.ts +318 -0
- package/dist/domain/registry/ports.js +2 -0
- package/dist/domain/registry/ports.js.map +1 -0
- package/dist/domain/registry/public.d.ts +8 -0
- package/dist/domain/registry/public.js +10 -0
- package/dist/domain/registry/public.js.map +1 -0
- package/dist/domain/registry/read-assigned-crew-requests.d.ts +14 -0
- package/dist/domain/registry/read-assigned-crew-requests.js +15 -0
- package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -0
- package/dist/domain/registry/recrew-ship.d.ts +33 -0
- package/dist/domain/registry/recrew-ship.js +34 -0
- package/dist/domain/registry/recrew-ship.js.map +1 -0
- package/dist/domain/registry/release-ship.d.ts +38 -0
- package/dist/domain/registry/release-ship.js +47 -0
- package/dist/domain/registry/release-ship.js.map +1 -0
- package/dist/domain/registry/remove-crew-request.d.ts +28 -0
- package/dist/domain/registry/remove-crew-request.js +36 -0
- package/dist/domain/registry/remove-crew-request.js.map +1 -0
- package/dist/domain/registry/rename-ship.d.ts +30 -0
- package/dist/domain/registry/rename-ship.js +39 -0
- package/dist/domain/registry/rename-ship.js.map +1 -0
- package/dist/domain/registry/report-crew-status.d.ts +29 -0
- package/dist/domain/registry/report-crew-status.js +30 -0
- package/dist/domain/registry/report-crew-status.js.map +1 -0
- package/dist/domain/registry/report-details.d.ts +18 -0
- package/dist/domain/registry/report-details.js +41 -0
- package/dist/domain/registry/report-details.js.map +1 -0
- package/dist/domain/registry/report-log.d.ts +21 -0
- package/dist/domain/registry/report-log.js +16 -0
- package/dist/domain/registry/report-log.js.map +1 -0
- package/dist/domain/registry/report.d.ts +30 -0
- package/dist/domain/registry/report.js +30 -0
- package/dist/domain/registry/report.js.map +1 -0
- package/dist/domain/registry/request-crew.d.ts +32 -0
- package/dist/domain/registry/request-crew.js +29 -0
- package/dist/domain/registry/request-crew.js.map +1 -0
- package/dist/domain/registry/resolve-selector.d.ts +25 -0
- package/dist/domain/registry/resolve-selector.js +32 -0
- package/dist/domain/registry/resolve-selector.js.map +1 -0
- package/dist/domain/registry/retire-ship.d.ts +42 -0
- package/dist/domain/registry/retire-ship.js +68 -0
- package/dist/domain/registry/retire-ship.js.map +1 -0
- package/dist/domain/registry/set-fleet-limits.d.ts +30 -0
- package/dist/domain/registry/set-fleet-limits.js +54 -0
- package/dist/domain/registry/set-fleet-limits.js.map +1 -0
- package/dist/domain/registry/set-installation-settings.d.ts +18 -0
- package/dist/domain/registry/set-installation-settings.js +31 -0
- package/dist/domain/registry/set-installation-settings.js.map +1 -0
- package/dist/domain/registry/ship-handle.d.ts +5 -0
- package/dist/domain/registry/ship-handle.js +20 -0
- package/dist/domain/registry/ship-handle.js.map +1 -0
- package/dist/domain/registry/ship-note.d.ts +7 -0
- package/dist/domain/registry/ship-note.js +15 -0
- package/dist/domain/registry/ship-note.js.map +1 -0
- package/dist/domain/registry/ship-report.d.ts +42 -0
- package/dist/domain/registry/ship-report.js +93 -0
- package/dist/domain/registry/ship-report.js.map +1 -0
- package/dist/domain/registry/ship.d.ts +190 -0
- package/dist/domain/registry/ship.js +334 -0
- package/dist/domain/registry/ship.js.map +1 -0
- package/dist/domain/registry/ships.d.ts +25 -0
- package/dist/domain/registry/ships.js +22 -0
- package/dist/domain/registry/ships.js.map +1 -0
- package/dist/domain/registry/starting-prompt.d.ts +32 -0
- package/dist/domain/registry/starting-prompt.js +22 -0
- package/dist/domain/registry/starting-prompt.js.map +1 -0
- package/dist/domain/registry/whoami.d.ts +20 -0
- package/dist/domain/registry/whoami.js +15 -0
- package/dist/domain/registry/whoami.js.map +1 -0
- package/dist/domain/shared/caller.d.ts +25 -0
- package/dist/domain/shared/caller.js +8 -0
- package/dist/domain/shared/caller.js.map +1 -0
- package/dist/domain/shared/clock.d.ts +4 -0
- package/dist/domain/shared/clock.js +2 -0
- package/dist/domain/shared/clock.js.map +1 -0
- package/dist/domain/shared/errors.d.ts +13 -0
- package/dist/domain/shared/errors.js +6 -0
- package/dist/domain/shared/errors.js.map +1 -0
- package/dist/domain/shared/events.d.ts +75 -0
- package/dist/domain/shared/events.js +9 -0
- package/dist/domain/shared/events.js.map +1 -0
- package/dist/domain/shared/follow-fleet.d.ts +32 -0
- package/dist/domain/shared/follow-fleet.js +65 -0
- package/dist/domain/shared/follow-fleet.js.map +1 -0
- package/dist/domain/shared/history.d.ts +124 -0
- package/dist/domain/shared/history.js +16 -0
- package/dist/domain/shared/history.js.map +1 -0
- package/dist/domain/shared/idempotency-key.d.ts +8 -0
- package/dist/domain/shared/idempotency-key.js +14 -0
- package/dist/domain/shared/idempotency-key.js.map +1 -0
- package/dist/domain/shared/notifier.d.ts +17 -0
- package/dist/domain/shared/notifier.js +2 -0
- package/dist/domain/shared/notifier.js.map +1 -0
- package/dist/domain/shared/ping.d.ts +18 -0
- package/dist/domain/shared/ping.js +8 -0
- package/dist/domain/shared/ping.js.map +1 -0
- package/dist/domain/shared/read-fleet-events.d.ts +29 -0
- package/dist/domain/shared/read-fleet-events.js +25 -0
- package/dist/domain/shared/read-fleet-events.js.map +1 -0
- package/dist/domain/shared/read-fleet-limits.d.ts +39 -0
- package/dist/domain/shared/read-fleet-limits.js +24 -0
- package/dist/domain/shared/read-fleet-limits.js.map +1 -0
- package/dist/domain/shared/read-inbox.d.ts +20 -0
- package/dist/domain/shared/read-inbox.js +16 -0
- package/dist/domain/shared/read-inbox.js.map +1 -0
- package/dist/domain/shared/read-message.d.ts +21 -0
- package/dist/domain/shared/read-message.js +18 -0
- package/dist/domain/shared/read-message.js.map +1 -0
- package/dist/domain/shared/read-needs-attention.d.ts +12 -0
- package/dist/domain/shared/read-needs-attention.js +10 -0
- package/dist/domain/shared/read-needs-attention.js.map +1 -0
- package/dist/domain/shared/read-ship-messages.d.ts +28 -0
- package/dist/domain/shared/read-ship-messages.js +30 -0
- package/dist/domain/shared/read-ship-messages.js.map +1 -0
- package/dist/domain/shared/read-ship-timeline.d.ts +18 -0
- package/dist/domain/shared/read-ship-timeline.js +16 -0
- package/dist/domain/shared/read-ship-timeline.js.map +1 -0
- package/dist/domain/shared/result.d.ts +16 -0
- package/dist/domain/shared/result.js +7 -0
- package/dist/domain/shared/result.js.map +1 -0
- package/dist/domain/shared/secrets.d.ts +26 -0
- package/dist/domain/shared/secrets.js +2 -0
- package/dist/domain/shared/secrets.js.map +1 -0
- package/dist/domain/shared/selector.d.ts +29 -0
- package/dist/domain/shared/selector.js +2 -0
- package/dist/domain/shared/selector.js.map +1 -0
- package/dist/domain/shared/unit-of-work.d.ts +13 -0
- package/dist/domain/shared/unit-of-work.js +2 -0
- package/dist/domain/shared/unit-of-work.js.map +1 -0
- package/dist/domain/shared/utc-day.d.ts +4 -0
- package/dist/domain/shared/utc-day.js +9 -0
- package/dist/domain/shared/utc-day.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/start.d.ts +6 -0
- package/dist/start.js +29 -0
- package/dist/start.js.map +1 -0
- package/dist/wiring.d.ts +158 -0
- package/dist/wiring.js +185 -0
- package/dist/wiring.js.map +1 -0
- package/package.json +58 -3
- package/prisma.config.ts +18 -0
- package/src/adapters/prisma/migrations/20260929124818_init/migration.sql +201 -0
- package/src/adapters/prisma/migrations/20260929160000_fleet_argo_console_session/migration.sql +130 -0
- package/src/adapters/prisma/migrations/20260929220017_operator_login/migration.sql +27 -0
- package/src/adapters/prisma/migrations/20260930090000_crew_token/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20260930120000_send/migration.sql +30 -0
- package/src/adapters/prisma/migrations/20260930150000_receive/migration.sql +24 -0
- package/src/adapters/prisma/migrations/20261001010000_event_seq/migration.sql +34 -0
- package/src/adapters/prisma/migrations/20261001020000_console_session_end_reason/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261001030000_account_theme_session_device/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261001040000_lease_last_seen/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261002190000_lease_report/migration.sql +7 -0
- package/src/adapters/prisma/migrations/20261003140000_commission_key/migration.sql +7 -0
- package/src/adapters/prisma/migrations/20261003200000_message_model/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261003201000_lease_harness/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261004120000_operator_without_password/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261004121000_installation_requests/migration.sql +21 -0
- package/src/adapters/prisma/migrations/20261004122000_events_deleted_with_their_fleet/migration.sql +11 -0
- package/src/adapters/prisma/migrations/20261004130000_sign_in_tickets/migration.sql +16 -0
- package/src/adapters/prisma/migrations/20261004140000_fleet_limits/migration.sql +6 -0
- package/src/adapters/prisma/migrations/20261004141000_installation_settings/migration.sql +12 -0
- package/src/adapters/prisma/migrations/20261005090000_viewer_ship/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261005100000_viewer_sessions/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261005110000_notices/migration.sql +37 -0
- package/src/adapters/prisma/migrations/20261005120000_guide/migration.sql +34 -0
- package/src/adapters/prisma/migrations/20261006100000_fleet_crew_scope/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261006140000_lease_report_details/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261006160000_crew_requests/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261006180000_crew_scopes/migration.sql +9 -0
- package/src/adapters/prisma/migrations/20261006190000_crew_assignment/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261006200000_crew_request_reason/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261007020000_broad_crewing_scope_retired/migration.sql +8 -0
- package/src/adapters/prisma/migrations/migration_lock.toml +3 -0
- package/src/adapters/prisma/schema.prisma +558 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { holdLease } from '../registry/public.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { inboxWait } from './inbox-wait.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: how many deliveries wait for the crew (`inbox`): what its next
|
|
6
|
+
* receive would hand it, its own in flight and those pending for its ship or
|
|
7
|
+
* its type. It claims nothing, so a watcher can ask as often as it likes and
|
|
8
|
+
* leave every delivery for the receive. Its scope (messages:receive) is
|
|
9
|
+
* checked before this runs.
|
|
10
|
+
*
|
|
11
|
+
* With a wait, and nothing waiting, it watches the same wake-ups as a
|
|
12
|
+
* receive and looks again on each, until something waits or the wait has
|
|
13
|
+
* passed. It starts watching before it looks a second time, so a delivery
|
|
14
|
+
* that commits in between is counted.
|
|
15
|
+
*/
|
|
16
|
+
export function createCheckInbox(deps) {
|
|
17
|
+
return async (crew, input) => {
|
|
18
|
+
const waitMs = inboxWait(input.waitSeconds);
|
|
19
|
+
if (!waitMs.isOk) {
|
|
20
|
+
return waitMs;
|
|
21
|
+
}
|
|
22
|
+
const until = deps.clock.now().getTime() + waitMs.value;
|
|
23
|
+
let watch;
|
|
24
|
+
try {
|
|
25
|
+
for (;;) {
|
|
26
|
+
const look = await deps.uow.run(async (tx) => {
|
|
27
|
+
const ship = await holdLease(tx, crew);
|
|
28
|
+
if (!ship.isOk) {
|
|
29
|
+
return ship;
|
|
30
|
+
}
|
|
31
|
+
const waiting = await tx.deliveries.countReceivable({
|
|
32
|
+
fleetId: crew.fleetId,
|
|
33
|
+
shipId: crew.shipId,
|
|
34
|
+
type: ship.value.type,
|
|
35
|
+
leaseId: crew.leaseId,
|
|
36
|
+
});
|
|
37
|
+
return ok({ type: ship.value.type, waiting });
|
|
38
|
+
});
|
|
39
|
+
if (!look.isOk) {
|
|
40
|
+
return look;
|
|
41
|
+
}
|
|
42
|
+
const { type, waiting } = look.value;
|
|
43
|
+
const remainingMs = until - deps.clock.now().getTime();
|
|
44
|
+
if (waiting > 0 || remainingMs <= 0) {
|
|
45
|
+
return ok({ waiting });
|
|
46
|
+
}
|
|
47
|
+
if (watch === undefined) {
|
|
48
|
+
watch = deps.wakeups.watch({ fleetId: crew.fleetId, shipId: crew.shipId, type });
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if ((await watch.next(remainingMs)) === 'timedOut') {
|
|
52
|
+
return ok({ waiting: 0 });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
watch?.stop();
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=check-inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-inbox.js","sourceRoot":"","sources":["../../../src/domain/messaging/check-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqC,MAAM,uBAAuB,CAAC;AAIrF,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAc5C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAIhC;IACC,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;QACxD,IAAI,KAAgC,CAAC;QACrC,IAAI,CAAC;YACH,SAAS,CAAC;gBACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;oBAC3C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACvC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACf,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC;wBAClD,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;qBACtB,CAAC,CAAC;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBAChD,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;gBACrC,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;gBACvD,IAAI,OAAO,GAAG,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;oBACpC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzB,CAAC;gBACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjF,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;oBACnD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,KAAK,EAAE,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type DomainError } from '../shared/errors.js';
|
|
2
|
+
import { type Result } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a payload's text is, as its sender says: any well-formed media type,
|
|
5
|
+
* taken exactly as given and passed on untouched, and text/plain when the
|
|
6
|
+
* sender does not say. The fleet never reads the payload by it and allows no
|
|
7
|
+
* list of its own (ADR 0016). The rule is shared with the common schema.
|
|
8
|
+
*/
|
|
9
|
+
export declare function contentType(raw: string | undefined): Result<string, DomainError<'INVALID_CONTENT_TYPE'>>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CONTENT_TYPE_DEFAULT, CONTENT_TYPE_MAX_LENGTH, isMediaType } from '@aeolus-fleet/common';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
/**
|
|
5
|
+
* What a payload's text is, as its sender says: any well-formed media type,
|
|
6
|
+
* taken exactly as given and passed on untouched, and text/plain when the
|
|
7
|
+
* sender does not say. The fleet never reads the payload by it and allows no
|
|
8
|
+
* list of its own (ADR 0016). The rule is shared with the common schema.
|
|
9
|
+
*/
|
|
10
|
+
export function contentType(raw) {
|
|
11
|
+
if (raw === undefined) {
|
|
12
|
+
return ok(CONTENT_TYPE_DEFAULT);
|
|
13
|
+
}
|
|
14
|
+
return raw.length <= CONTENT_TYPE_MAX_LENGTH && isMediaType(raw)
|
|
15
|
+
? ok(raw)
|
|
16
|
+
: refuse('INVALID_CONTENT_TYPE', `A content type is a media type such as text/plain or application/json; charset=utf-8, of at most ${CONTENT_TYPE_MAX_LENGTH} characters`);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=content-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-type.js","sourceRoot":"","sources":["../../../src/domain/messaging/content-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElG,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,GAAuB;IACjD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,IAAI,uBAAuB,IAAI,WAAW,CAAC,GAAG,CAAC;QAC9D,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;QACT,CAAC,CAAC,MAAM,CACJ,sBAAsB,EACtB,oGAAoG,uBAAuB,aAAa,CACzI,CAAC;AACR,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type AppliedLimitsTx } from '../registry/public.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { MessageRepository } from './ports.js';
|
|
6
|
+
export interface DailyMessageLimitTx extends AppliedLimitsTx {
|
|
7
|
+
messages: Pick<MessageRepository, 'lockDailyCount' | 'countCreatedSince'>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Whether the fleet may store one more message today, in the caller's unit of
|
|
11
|
+
* work, before it stores it: every message the fleet stored since 00:00 UTC
|
|
12
|
+
* counts, whatever its kind or sender. With a limit, the count is taken under
|
|
13
|
+
* the fleet's lock, held until the message is stored, so sends at the limit
|
|
14
|
+
* never overshoot it. Without one, nothing is counted or locked.
|
|
15
|
+
*/
|
|
16
|
+
export declare function withinDailyMessageLimit(tx: DailyMessageLimitTx, at: {
|
|
17
|
+
fleetId: FleetId;
|
|
18
|
+
time: Date;
|
|
19
|
+
}): Promise<Result<undefined, DomainError<'MESSAGE_LIMIT_REACHED'>>>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { appliedLimits } from '../registry/public.js';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
import { utcDayStart } from '../shared/utc-day.js';
|
|
5
|
+
/**
|
|
6
|
+
* Whether the fleet may store one more message today, in the caller's unit of
|
|
7
|
+
* work, before it stores it: every message the fleet stored since 00:00 UTC
|
|
8
|
+
* counts, whatever its kind or sender. With a limit, the count is taken under
|
|
9
|
+
* the fleet's lock, held until the message is stored, so sends at the limit
|
|
10
|
+
* never overshoot it. Without one, nothing is counted or locked.
|
|
11
|
+
*/
|
|
12
|
+
export async function withinDailyMessageLimit(tx, at) {
|
|
13
|
+
const { fleetId, time } = at;
|
|
14
|
+
const { dailyMessages } = await appliedLimits(tx, fleetId);
|
|
15
|
+
if (dailyMessages === null) {
|
|
16
|
+
return ok(undefined);
|
|
17
|
+
}
|
|
18
|
+
await tx.messages.lockDailyCount(fleetId);
|
|
19
|
+
if ((await tx.messages.countCreatedSince(fleetId, utcDayStart(time))) < dailyMessages) {
|
|
20
|
+
return ok(undefined);
|
|
21
|
+
}
|
|
22
|
+
return refuse('MESSAGE_LIMIT_REACHED', `The fleet reached its limit of ${String(dailyMessages)} messages today (UTC), so nothing was stored. Sending works again after 00:00 UTC.`);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=daily-message-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-message-limit.js","sourceRoot":"","sources":["../../../src/domain/messaging/daily-message-limit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAwB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAOnD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAuB,EACvB,EAAoC;IAEpC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,CAAC;QACtF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CACX,uBAAuB,EACvB,kCAAkC,MAAM,CAAC,aAAa,CAAC,oFAAoF,CAC5I,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type LeaseId, type MessageId, type ShipId } 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 { Delivery, Message } from './message.js';
|
|
6
|
+
/**
|
|
7
|
+
* The Delivery's rules once it is stored (docs/blueprint.md, "Key flows"): a
|
|
8
|
+
* receive claims it, the claiming ship acknowledges it, and a delivery that
|
|
9
|
+
* keeps being claimed without an acknowledgement stops, undeliverable, where
|
|
10
|
+
* the operator sees it.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* The claim at which a delivery never acknowledged becomes undeliverable
|
|
14
|
+
* instead of being handed out again: the fifth. A poison message stops there
|
|
15
|
+
* rather than looping forever.
|
|
16
|
+
*/
|
|
17
|
+
export declare const UNDELIVERABLE_AT_CLAIM = 5;
|
|
18
|
+
/** The crew a receive or an ack comes from: its ship and the lease it crews it under. */
|
|
19
|
+
export interface CrewOfShip {
|
|
20
|
+
shipId: ShipId;
|
|
21
|
+
leaseId: LeaseId;
|
|
22
|
+
}
|
|
23
|
+
export interface DeliveryClaim {
|
|
24
|
+
/** Claimed: handed to the crew. Undeliverable: this was the fifth claim, so it is not handed out. */
|
|
25
|
+
outcome: 'claimed' | 'undeliverable';
|
|
26
|
+
delivery: Delivery;
|
|
27
|
+
events: NewEvent[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A crew claims a delivery it may take: one pending for its ship or its type,
|
|
31
|
+
* or one of its own in flight, returned again after a lost reply. Every claim
|
|
32
|
+
* counts. The claim that reaches the fifth makes the delivery undeliverable
|
|
33
|
+
* and hands it to no one; before that, the delivery is in flight with the
|
|
34
|
+
* crew's ship and lease. Either change is caused by the receiving ship.
|
|
35
|
+
*/
|
|
36
|
+
export declare function claimDelivery(delivery: Delivery, claim: {
|
|
37
|
+
crew: CrewOfShip;
|
|
38
|
+
at: Date;
|
|
39
|
+
}): DeliveryClaim;
|
|
40
|
+
export type AcknowledgeRefusal = DomainError<'DELIVERY_NOT_IN_FLIGHT' | 'DELIVERY_HELD_BY_ANOTHER_SHIP'>;
|
|
41
|
+
/**
|
|
42
|
+
* The ship takes responsibility for a delivery it received (ADR 0001): only a
|
|
43
|
+
* delivery in flight with that ship moves to acknowledged, keeping who claimed
|
|
44
|
+
* it. Acknowledging it again is harmless: OK, and nothing changes. A delivery
|
|
45
|
+
* another ship holds or acknowledged, or one that is not in flight, is refused.
|
|
46
|
+
*/
|
|
47
|
+
export declare function acknowledgeDelivery(delivery: Delivery, ack: {
|
|
48
|
+
crew: CrewOfShip;
|
|
49
|
+
at: Date;
|
|
50
|
+
}): Result<{
|
|
51
|
+
delivery: Delivery;
|
|
52
|
+
events: NewEvent[];
|
|
53
|
+
}, AcknowledgeRefusal>;
|
|
54
|
+
export type AnswerPingRefusal = DomainError<'DELIVERY_NOT_A_PING'> | AcknowledgeRefusal;
|
|
55
|
+
/**
|
|
56
|
+
* The ship answers a ping with pong: the ping's delivery is acknowledged as
|
|
57
|
+
* an ack would, and DeliveryAcknowledged says pong answered it. Pong answers
|
|
58
|
+
* only a ping. Answering again, or after a plain ack, is harmless: OK, and
|
|
59
|
+
* nothing changes, so the first answer stands.
|
|
60
|
+
*/
|
|
61
|
+
export declare function answerPing(delivery: Delivery, pong: {
|
|
62
|
+
message: Message;
|
|
63
|
+
crew: CrewOfShip;
|
|
64
|
+
at: Date;
|
|
65
|
+
}): Result<{
|
|
66
|
+
delivery: Delivery;
|
|
67
|
+
events: NewEvent[];
|
|
68
|
+
}, AnswerPingRefusal>;
|
|
69
|
+
export type DismissRefusal = DomainError<'DELIVERY_NOT_UNDELIVERABLE'>;
|
|
70
|
+
/**
|
|
71
|
+
* The operator lets an undeliverable delivery go (docs/blueprint.md,
|
|
72
|
+
* "DeliveryUndeliverable"): it becomes dismissed, kept in history with its
|
|
73
|
+
* claims, and leaves Needs attention. The event names the ship it was for; a
|
|
74
|
+
* delivery to a type names none. Dismissing it again is harmless: OK, and
|
|
75
|
+
* nothing changes. Any other delivery is refused: only an undeliverable one
|
|
76
|
+
* waits for the operator.
|
|
77
|
+
*/
|
|
78
|
+
export declare function dismissDelivery(delivery: Delivery, dismiss: {
|
|
79
|
+
by: ShipId;
|
|
80
|
+
at: Date;
|
|
81
|
+
}): Result<{
|
|
82
|
+
delivery: Delivery;
|
|
83
|
+
events: NewEvent[];
|
|
84
|
+
}, DismissRefusal>;
|
|
85
|
+
/**
|
|
86
|
+
* A resend dismisses the delivery it resends, which must be undeliverable:
|
|
87
|
+
* one already dismissed has nothing left to resend.
|
|
88
|
+
*/
|
|
89
|
+
export declare function dismissForResend(delivery: Delivery, dismiss: {
|
|
90
|
+
by: ShipId;
|
|
91
|
+
at: Date;
|
|
92
|
+
}): Result<{
|
|
93
|
+
delivery: Delivery;
|
|
94
|
+
events: NewEvent[];
|
|
95
|
+
}, DismissRefusal>;
|
|
96
|
+
export type MarkDoneRefusal = DomainError<'DELIVERY_NOT_FOUND' | 'DELIVERY_NOT_OPEN' | 'DELIVERY_HELD_BY_ANOTHER_SHIP'>;
|
|
97
|
+
/**
|
|
98
|
+
* argo marks a message to it done (docs/blueprint.md, "Inbox"): the console
|
|
99
|
+
* never receives, so an open delivery is claimed and acknowledged at once
|
|
100
|
+
* under the console session's lease, one claim counted, and its two events
|
|
101
|
+
* written as a receive and an ack would write them. One the session already
|
|
102
|
+
* holds in flight is only acknowledged. The acknowledgement names the reply
|
|
103
|
+
* that made it done, when a reply did. Marking it done again is harmless: OK,
|
|
104
|
+
* and nothing changes. A delivery to another ship is not in argo's inbox; one
|
|
105
|
+
* undeliverable, dismissed or abandoned is no longer open.
|
|
106
|
+
*/
|
|
107
|
+
export declare function markDone(delivery: Delivery, done: {
|
|
108
|
+
crew: CrewOfShip;
|
|
109
|
+
at: Date;
|
|
110
|
+
reply?: MessageId;
|
|
111
|
+
}): Result<{
|
|
112
|
+
delivery: Delivery;
|
|
113
|
+
events: NewEvent[];
|
|
114
|
+
}, MarkDoneRefusal>;
|
|
115
|
+
/** Whether the delivery is addressed to the ship itself: in its inbox, not its type's queue. */
|
|
116
|
+
export declare function isInInboxOf(delivery: Delivery | undefined, shipId: ShipId): delivery is Delivery;
|
|
@@ -0,0 +1,201 @@
|
|
|
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
|
+
* The Delivery's rules once it is stored (docs/blueprint.md, "Key flows"): a
|
|
7
|
+
* receive claims it, the claiming ship acknowledges it, and a delivery that
|
|
8
|
+
* keeps being claimed without an acknowledgement stops, undeliverable, where
|
|
9
|
+
* the operator sees it.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The claim at which a delivery never acknowledged becomes undeliverable
|
|
13
|
+
* instead of being handed out again: the fifth. A poison message stops there
|
|
14
|
+
* rather than looping forever.
|
|
15
|
+
*/
|
|
16
|
+
export const UNDELIVERABLE_AT_CLAIM = 5;
|
|
17
|
+
/**
|
|
18
|
+
* A crew claims a delivery it may take: one pending for its ship or its type,
|
|
19
|
+
* or one of its own in flight, returned again after a lost reply. Every claim
|
|
20
|
+
* counts. The claim that reaches the fifth makes the delivery undeliverable
|
|
21
|
+
* and hands it to no one; before that, the delivery is in flight with the
|
|
22
|
+
* crew's ship and lease. Either change is caused by the receiving ship.
|
|
23
|
+
*/
|
|
24
|
+
export function claimDelivery(delivery, claim) {
|
|
25
|
+
const { crew, at } = claim;
|
|
26
|
+
const attempts = delivery.attempts + 1;
|
|
27
|
+
const concerns = {
|
|
28
|
+
fleetId: delivery.fleetId,
|
|
29
|
+
occurredAt: at,
|
|
30
|
+
actor: shipActor(crew.shipId),
|
|
31
|
+
shipId: crew.shipId,
|
|
32
|
+
messageId: delivery.messageId,
|
|
33
|
+
deliveryId: delivery.id,
|
|
34
|
+
details: { leaseId: crew.leaseId, attempts },
|
|
35
|
+
};
|
|
36
|
+
if (attempts >= UNDELIVERABLE_AT_CLAIM) {
|
|
37
|
+
return {
|
|
38
|
+
outcome: 'undeliverable',
|
|
39
|
+
delivery: { ...delivery, state: 'undeliverable', claimedByShipId: null, claimedByLeaseId: null, attempts },
|
|
40
|
+
events: [{ ...concerns, type: 'DeliveryUndeliverable' }],
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
outcome: 'claimed',
|
|
45
|
+
delivery: { ...delivery, state: 'delivered', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts },
|
|
46
|
+
events: [{ ...concerns, type: 'DeliveryClaimed' }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The ship takes responsibility for a delivery it received (ADR 0001): only a
|
|
51
|
+
* delivery in flight with that ship moves to acknowledged, keeping who claimed
|
|
52
|
+
* it. Acknowledging it again is harmless: OK, and nothing changes. A delivery
|
|
53
|
+
* another ship holds or acknowledged, or one that is not in flight, is refused.
|
|
54
|
+
*/
|
|
55
|
+
export function acknowledgeDelivery(delivery, ack) {
|
|
56
|
+
const { crew, at } = ack;
|
|
57
|
+
switch (delivery.state) {
|
|
58
|
+
case 'delivered':
|
|
59
|
+
case 'acknowledged':
|
|
60
|
+
if (delivery.claimedByShipId !== crew.shipId) {
|
|
61
|
+
return refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another ship: only the ship that received it acknowledges it`);
|
|
62
|
+
}
|
|
63
|
+
if (delivery.state === 'acknowledged') {
|
|
64
|
+
return ok({ delivery, events: [] });
|
|
65
|
+
}
|
|
66
|
+
return ok({
|
|
67
|
+
delivery: { ...delivery, state: 'acknowledged' },
|
|
68
|
+
events: [
|
|
69
|
+
{
|
|
70
|
+
fleetId: delivery.fleetId,
|
|
71
|
+
type: 'DeliveryAcknowledged',
|
|
72
|
+
occurredAt: at,
|
|
73
|
+
actor: shipActor(crew.shipId),
|
|
74
|
+
shipId: crew.shipId,
|
|
75
|
+
messageId: delivery.messageId,
|
|
76
|
+
deliveryId: delivery.id,
|
|
77
|
+
details: { leaseId: crew.leaseId },
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
81
|
+
case 'pending':
|
|
82
|
+
case 'undeliverable':
|
|
83
|
+
case 'dismissed':
|
|
84
|
+
case 'abandoned':
|
|
85
|
+
return refuse('DELIVERY_NOT_IN_FLIGHT', `Delivery ${delivery.id} is ${delivery.state}, not in flight: acknowledge a delivery once a receive hands it over`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The ship answers a ping with pong: the ping's delivery is acknowledged as
|
|
90
|
+
* an ack would, and DeliveryAcknowledged says pong answered it. Pong answers
|
|
91
|
+
* only a ping. Answering again, or after a plain ack, is harmless: OK, and
|
|
92
|
+
* nothing changes, so the first answer stands.
|
|
93
|
+
*/
|
|
94
|
+
export function answerPing(delivery, pong) {
|
|
95
|
+
if (!isPingContentType(pong.message.contentType)) {
|
|
96
|
+
return refuse('DELIVERY_NOT_A_PING', `Delivery ${delivery.id} is not a ping: pong answers only a ping, ack the others`);
|
|
97
|
+
}
|
|
98
|
+
const acknowledged = acknowledgeDelivery(delivery, pong);
|
|
99
|
+
if (!acknowledged.isOk) {
|
|
100
|
+
return acknowledged;
|
|
101
|
+
}
|
|
102
|
+
const events = acknowledged.value.events.map((event) => ({ ...event, details: { ...event.details, answer: 'pong' } }));
|
|
103
|
+
return ok({ delivery: acknowledged.value.delivery, events });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The operator lets an undeliverable delivery go (docs/blueprint.md,
|
|
107
|
+
* "DeliveryUndeliverable"): it becomes dismissed, kept in history with its
|
|
108
|
+
* claims, and leaves Needs attention. The event names the ship it was for; a
|
|
109
|
+
* delivery to a type names none. Dismissing it again is harmless: OK, and
|
|
110
|
+
* nothing changes. Any other delivery is refused: only an undeliverable one
|
|
111
|
+
* waits for the operator.
|
|
112
|
+
*/
|
|
113
|
+
export function dismissDelivery(delivery, dismiss) {
|
|
114
|
+
switch (delivery.state) {
|
|
115
|
+
case 'dismissed':
|
|
116
|
+
return ok({ delivery, events: [] });
|
|
117
|
+
case 'undeliverable':
|
|
118
|
+
return ok({
|
|
119
|
+
delivery: { ...delivery, state: 'dismissed' },
|
|
120
|
+
events: [
|
|
121
|
+
{
|
|
122
|
+
fleetId: delivery.fleetId,
|
|
123
|
+
type: 'DeliveryDismissed',
|
|
124
|
+
occurredAt: dismiss.at,
|
|
125
|
+
actor: shipActor(dismiss.by),
|
|
126
|
+
shipId: delivery.recipient.kind === 'ship' ? delivery.recipient.shipId : undefined,
|
|
127
|
+
messageId: delivery.messageId,
|
|
128
|
+
deliveryId: delivery.id,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
case 'pending':
|
|
133
|
+
case 'delivered':
|
|
134
|
+
case 'acknowledged':
|
|
135
|
+
case 'abandoned':
|
|
136
|
+
return refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}, not undeliverable: only an undeliverable delivery is dismissed`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* A resend dismisses the delivery it resends, which must be undeliverable:
|
|
141
|
+
* one already dismissed has nothing left to resend.
|
|
142
|
+
*/
|
|
143
|
+
export function dismissForResend(delivery, dismiss) {
|
|
144
|
+
return delivery.state === 'undeliverable'
|
|
145
|
+
? dismissDelivery(delivery, dismiss)
|
|
146
|
+
: refuse('DELIVERY_NOT_UNDELIVERABLE', `Delivery ${delivery.id} is ${delivery.state}, not undeliverable: only an undeliverable delivery is resent`);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* argo marks a message to it done (docs/blueprint.md, "Inbox"): the console
|
|
150
|
+
* never receives, so an open delivery is claimed and acknowledged at once
|
|
151
|
+
* under the console session's lease, one claim counted, and its two events
|
|
152
|
+
* written as a receive and an ack would write them. One the session already
|
|
153
|
+
* holds in flight is only acknowledged. The acknowledgement names the reply
|
|
154
|
+
* that made it done, when a reply did. Marking it done again is harmless: OK,
|
|
155
|
+
* and nothing changes. A delivery to another ship is not in argo's inbox; one
|
|
156
|
+
* undeliverable, dismissed or abandoned is no longer open.
|
|
157
|
+
*/
|
|
158
|
+
export function markDone(delivery, done) {
|
|
159
|
+
const { crew, at, reply } = done;
|
|
160
|
+
const { recipient } = delivery;
|
|
161
|
+
if (recipient.kind !== 'ship' || recipient.shipId !== crew.shipId) {
|
|
162
|
+
return refuse('DELIVERY_NOT_FOUND', `Delivery ${delivery.id} is not in your inbox`);
|
|
163
|
+
}
|
|
164
|
+
const concerns = {
|
|
165
|
+
fleetId: delivery.fleetId,
|
|
166
|
+
occurredAt: at,
|
|
167
|
+
actor: shipActor(crew.shipId),
|
|
168
|
+
shipId: crew.shipId,
|
|
169
|
+
messageId: delivery.messageId,
|
|
170
|
+
deliveryId: delivery.id,
|
|
171
|
+
};
|
|
172
|
+
const acknowledged = {
|
|
173
|
+
...concerns,
|
|
174
|
+
type: 'DeliveryAcknowledged',
|
|
175
|
+
details: { leaseId: crew.leaseId, ...(reply && { reply }) },
|
|
176
|
+
};
|
|
177
|
+
switch (delivery.state) {
|
|
178
|
+
case 'acknowledged':
|
|
179
|
+
return ok({ delivery, events: [] });
|
|
180
|
+
case 'pending': {
|
|
181
|
+
const attempts = delivery.attempts + 1;
|
|
182
|
+
return ok({
|
|
183
|
+
delivery: { ...delivery, state: 'acknowledged', claimedByShipId: crew.shipId, claimedByLeaseId: crew.leaseId, attempts },
|
|
184
|
+
events: [{ ...concerns, type: 'DeliveryClaimed', details: { leaseId: crew.leaseId, attempts } }, acknowledged],
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
case 'delivered':
|
|
188
|
+
return delivery.claimedByLeaseId === crew.leaseId
|
|
189
|
+
? ok({ delivery: { ...delivery, state: 'acknowledged' }, events: [acknowledged] })
|
|
190
|
+
: refuse('DELIVERY_HELD_BY_ANOTHER_SHIP', `Delivery ${delivery.id} is held by another session`);
|
|
191
|
+
case 'undeliverable':
|
|
192
|
+
case 'dismissed':
|
|
193
|
+
case 'abandoned':
|
|
194
|
+
return refuse('DELIVERY_NOT_OPEN', `Delivery ${delivery.id} is ${delivery.state}: only an open message is marked done`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** Whether the delivery is addressed to the ship itself: in its inbox, not its type's queue. */
|
|
198
|
+
export function isInInboxOf(delivery, shipId) {
|
|
199
|
+
return delivery?.recipient.kind === 'ship' && delivery.recipient.shipId === shipId;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DeliveryId, IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Caller } from '../shared/caller.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type EventLog } from '../shared/events.js';
|
|
6
|
+
import { type Result } from '../shared/result.js';
|
|
7
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
|
+
import { type DismissRefusal } from './delivery.js';
|
|
9
|
+
import type { DeliveryRepository } from './ports.js';
|
|
10
|
+
export interface DismissDeliveryTx {
|
|
11
|
+
deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
|
|
12
|
+
events: EventLog;
|
|
13
|
+
}
|
|
14
|
+
export type DismissDeliveryRefusal = DomainError<'DELIVERY_NOT_FOUND'> | DismissRefusal;
|
|
15
|
+
export type DismissDelivery = (caller: Caller, input: {
|
|
16
|
+
deliveryId: DeliveryId;
|
|
17
|
+
}) => Promise<Result<undefined, DismissDeliveryRefusal>>;
|
|
18
|
+
/**
|
|
19
|
+
* Use case: the operator dismisses an undeliverable delivery from Needs
|
|
20
|
+
* attention. Its scope (fleet:manage) is checked before this runs. The
|
|
21
|
+
* delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
|
|
22
|
+
* work, so a resend of the same delivery waits and then finds it dismissed.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createDismissDelivery(deps: {
|
|
25
|
+
uow: UnitOfWork<DismissDeliveryTx>;
|
|
26
|
+
clock: Clock;
|
|
27
|
+
ids: IdGenerator;
|
|
28
|
+
}): DismissDelivery;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { recordEvent } from '../shared/events.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
import { dismissDelivery } from './delivery.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: the operator dismisses an undeliverable delivery from Needs
|
|
7
|
+
* attention. Its scope (fleet:manage) is checked before this runs. The
|
|
8
|
+
* delivery, locked, becomes dismissed with DeliveryDismissed in one unit of
|
|
9
|
+
* work, so a resend of the same delivery waits and then finds it dismissed.
|
|
10
|
+
*/
|
|
11
|
+
export function createDismissDelivery(deps) {
|
|
12
|
+
return (caller, input) => deps.uow.run(async (tx) => {
|
|
13
|
+
const delivery = await tx.deliveries.findForUpdate(caller.fleetId, input.deliveryId);
|
|
14
|
+
if (!delivery) {
|
|
15
|
+
return refuse('DELIVERY_NOT_FOUND', `Delivery ${input.deliveryId} does not exist`);
|
|
16
|
+
}
|
|
17
|
+
const dismissed = dismissDelivery(delivery, { by: caller.shipId, at: deps.clock.now() });
|
|
18
|
+
if (!dismissed.isOk) {
|
|
19
|
+
return dismissed;
|
|
20
|
+
}
|
|
21
|
+
const { delivery: changed, events } = dismissed.value;
|
|
22
|
+
await tx.deliveries.update(changed);
|
|
23
|
+
for (const event of events) {
|
|
24
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
25
|
+
}
|
|
26
|
+
return ok(undefined);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=dismiss-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismiss-delivery.js","sourceRoot":"","sources":["../../../src/domain/messaging/dismiss-delivery.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAiB,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AAerE;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAIrC;IACC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAsD,EAAE;QAC5E,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,MAAM,CAAC,oBAAoB,EAAE,YAAY,KAAK,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;QACtD,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type DomainError } from '../shared/errors.js';
|
|
2
|
+
import { type Result } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* How long an inbox check waits while nothing waits, in milliseconds: the
|
|
5
|
+
* crew chooses 0 to 25 whole seconds, as long as a receive at most, and gets
|
|
6
|
+
* no wait when it does not say.
|
|
7
|
+
*/
|
|
8
|
+
export declare function inboxWait(waitSeconds: number | undefined): Result<number, DomainError<'INVALID_INBOX_WAIT'>>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { INBOX_WAIT_MAX_SECONDS } from '@aeolus-fleet/common';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
/** A second, in the milliseconds the wake-ups wait. */
|
|
5
|
+
const SECOND_MS = 1000;
|
|
6
|
+
/**
|
|
7
|
+
* How long an inbox check waits while nothing waits, in milliseconds: the
|
|
8
|
+
* crew chooses 0 to 25 whole seconds, as long as a receive at most, and gets
|
|
9
|
+
* no wait when it does not say.
|
|
10
|
+
*/
|
|
11
|
+
export function inboxWait(waitSeconds) {
|
|
12
|
+
if (waitSeconds === undefined) {
|
|
13
|
+
return ok(0);
|
|
14
|
+
}
|
|
15
|
+
return Number.isInteger(waitSeconds) && waitSeconds >= 0 && waitSeconds <= INBOX_WAIT_MAX_SECONDS
|
|
16
|
+
? ok(waitSeconds * SECOND_MS)
|
|
17
|
+
: refuse('INVALID_INBOX_WAIT', `An inbox check waits 0 to ${INBOX_WAIT_MAX_SECONDS} whole seconds`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=inbox-wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-wait.js","sourceRoot":"","sources":["../../../src/domain/messaging/inbox-wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,uDAAuD;AACvD,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,WAA+B;IACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,IAAI,sBAAsB;QAC/F,CAAC,CAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,CAAC,CAAC,MAAM,CAAC,oBAAoB,EAAE,6BAA6B,sBAAsB,gBAAgB,CAAC,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { DeliveryId, IdGenerator, MessageId } 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 { UnitOfWork } from '../shared/unit-of-work.js';
|
|
9
|
+
import { type MarkDoneRefusal } from './delivery.js';
|
|
10
|
+
import type { DeliveryRepository } from './ports.js';
|
|
11
|
+
export interface MarkDoneTx extends HoldLeaseTx {
|
|
12
|
+
deliveries: Pick<DeliveryRepository, 'findForUpdate' | 'update'>;
|
|
13
|
+
events: EventLog;
|
|
14
|
+
}
|
|
15
|
+
export type MarkDoneUseCaseRefusal = DomainError<'DELIVERY_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP'> | LeaseEnded | MarkDoneRefusal;
|
|
16
|
+
export type MarkDone = (crew: Crew, input: {
|
|
17
|
+
deliveryId: DeliveryId;
|
|
18
|
+
}) => Promise<Result<undefined, MarkDoneUseCaseRefusal>>;
|
|
19
|
+
/**
|
|
20
|
+
* Marks a delivery to argo done inside the caller's unit of work, under the
|
|
21
|
+
* console session's lease, held until the unit of work ends: a sign-in
|
|
22
|
+
* elsewhere ending it waits, then returns nothing this marked. `reply` names
|
|
23
|
+
* the reply that made it done. Only argo: an agent acknowledges what it
|
|
24
|
+
* receives.
|
|
25
|
+
*/
|
|
26
|
+
export declare function markDoneWithin(deps: {
|
|
27
|
+
tx: MarkDoneTx;
|
|
28
|
+
clock: Clock;
|
|
29
|
+
ids: IdGenerator;
|
|
30
|
+
}, done: {
|
|
31
|
+
crew: Crew;
|
|
32
|
+
deliveryId: DeliveryId;
|
|
33
|
+
reply?: MessageId;
|
|
34
|
+
}): Promise<Result<undefined, MarkDoneUseCaseRefusal>>;
|
|
35
|
+
/**
|
|
36
|
+
* Use case: argo marks a message to it done from the operator inbox, without
|
|
37
|
+
* a reply (docs/blueprint.md, "Inbox"). Its scope (messages:receive) is
|
|
38
|
+
* checked before this runs. One unit of work: the claim, the acknowledgement
|
|
39
|
+
* and their events.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createMarkDone(deps: {
|
|
42
|
+
uow: UnitOfWork<MarkDoneTx>;
|
|
43
|
+
clock: Clock;
|
|
44
|
+
ids: IdGenerator;
|
|
45
|
+
}): MarkDone;
|