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