@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,148 @@
|
|
|
1
|
+
import { type CrewStatus, type FleetId, type Scope, type ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type Caller } from '../shared/caller.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import type { Actor, NewEvent } from '../shared/events.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { JsonObject } from './report-details.js';
|
|
7
|
+
import { type CrewRequestShipRefusal, type Ship } from './ship.js';
|
|
8
|
+
/**
|
|
9
|
+
* A standing request that a ship be kept crewed (docs/blueprint.md, "Crew
|
|
10
|
+
* request"; decision 0029): at most one per ship, in three parts with one
|
|
11
|
+
* writer each. The settings, which the server stores without meaning, by a
|
|
12
|
+
* requester with fleet:manage; the assignment, the trierarch ship that crews
|
|
13
|
+
* it, by a ship with crew:assign; the status, by the assigned trierarch.
|
|
14
|
+
* Removing an assigned request marks it releasing; it goes once its
|
|
15
|
+
* trierarch confirms.
|
|
16
|
+
*/
|
|
17
|
+
export interface CrewRequest {
|
|
18
|
+
fleetId: FleetId;
|
|
19
|
+
shipId: ShipId;
|
|
20
|
+
settings: JsonObject;
|
|
21
|
+
/** One on the first request, one more on every request after it. */
|
|
22
|
+
settingsVersion: number;
|
|
23
|
+
/** When the settings were last requested. */
|
|
24
|
+
requestedAt: Date;
|
|
25
|
+
/** The trierarch ship it is assigned to; null while unassigned. */
|
|
26
|
+
assignedTo: ShipId | null;
|
|
27
|
+
/** How its trierarch says the crew stands; null until it says. */
|
|
28
|
+
status: CrewStatus | null;
|
|
29
|
+
/** Why no trierarch can take it, written by the assigner while unassigned; null when none. */
|
|
30
|
+
reason: string | null;
|
|
31
|
+
}
|
|
32
|
+
type NotFound = DomainError<'CREW_REQUEST_NOT_FOUND'>;
|
|
33
|
+
type Releasing = DomainError<'CREW_REQUEST_RELEASING'>;
|
|
34
|
+
type NotTheCallers = DomainError<'CREW_REQUEST_NOT_ASSIGNED_TO_CALLER'>;
|
|
35
|
+
export type RequestCrewRefusal = CrewRequestShipRefusal | Releasing | DomainError<'CREW_REQUEST_SETTINGS_TOO_LARGE'>;
|
|
36
|
+
/**
|
|
37
|
+
* A requester asks that the ship be kept crewed, with these settings: the
|
|
38
|
+
* request it holds now, replacing the settings of any it held and keeping its
|
|
39
|
+
* assignment and status, and CrewRequested with the settings version, never
|
|
40
|
+
* the settings. Never argo, the viewer ship or a retired ship; settings of at
|
|
41
|
+
* most 16 KB; never while the request is releasing.
|
|
42
|
+
*/
|
|
43
|
+
export declare function requestCrew({ ship, current }: {
|
|
44
|
+
ship: Ship;
|
|
45
|
+
current: CrewRequest | undefined;
|
|
46
|
+
}, input: {
|
|
47
|
+
settings: JsonObject;
|
|
48
|
+
at: Date;
|
|
49
|
+
actor: Actor;
|
|
50
|
+
}): Result<{
|
|
51
|
+
request: CrewRequest;
|
|
52
|
+
events: NewEvent[];
|
|
53
|
+
}, RequestCrewRefusal>;
|
|
54
|
+
/**
|
|
55
|
+
* A requester removes the ship's crew request. Unassigned, it goes at once,
|
|
56
|
+
* with CrewRequestRemoved. Assigned, it is marked releasing, with
|
|
57
|
+
* CrewStatusChanged, and goes once its trierarch confirms; removing it again
|
|
58
|
+
* meanwhile changes nothing.
|
|
59
|
+
*/
|
|
60
|
+
export declare function removeCrewRequest({ ship, current }: {
|
|
61
|
+
ship: Ship;
|
|
62
|
+
current: CrewRequest | undefined;
|
|
63
|
+
}, input: {
|
|
64
|
+
at: Date;
|
|
65
|
+
actor: Actor;
|
|
66
|
+
}): Result<{
|
|
67
|
+
request: CrewRequest | undefined;
|
|
68
|
+
events: NewEvent[];
|
|
69
|
+
}, NotFound>;
|
|
70
|
+
export type AssignCrewRefusal = NotFound | DomainError<'CREW_REQUEST_ALREADY_ASSIGNED' | 'SHIP_NOT_AWAITING_CREW' | 'ASSIGNEE_NOT_ACTIVE'>;
|
|
71
|
+
/**
|
|
72
|
+
* A ship with crew:assign assigns the request to a trierarch, by optimistic
|
|
73
|
+
* claim: only while it is unassigned, so of two claims the first wins. Never
|
|
74
|
+
* a crewed ship (crewing by hand fulfils the request). Any active ship of the
|
|
75
|
+
* fleet may be the assignee: the fleet does no routing, and a ship that is no
|
|
76
|
+
* trierarch just gets work it does not understand. CrewAssigned names it.
|
|
77
|
+
*/
|
|
78
|
+
export declare function assignCrew({ ship, current, isCrewed, assignee }: {
|
|
79
|
+
ship: Ship;
|
|
80
|
+
current: CrewRequest | undefined;
|
|
81
|
+
isCrewed: boolean;
|
|
82
|
+
assignee: Ship | undefined;
|
|
83
|
+
}, input: {
|
|
84
|
+
at: Date;
|
|
85
|
+
actor: Actor;
|
|
86
|
+
}): Result<{
|
|
87
|
+
request: CrewRequest;
|
|
88
|
+
events: NewEvent[];
|
|
89
|
+
}, AssignCrewRefusal>;
|
|
90
|
+
export type ExplainCrewRequestRefusal = NotFound | DomainError<'CREW_REQUEST_ALREADY_ASSIGNED' | 'INVALID_CREW_REQUEST_REASON'>;
|
|
91
|
+
/**
|
|
92
|
+
* The assigner writes why no trierarch can take an unassigned request, one
|
|
93
|
+
* line, trimmed; none clears it. CrewRequestExplained when it changes; an
|
|
94
|
+
* assignment clears it.
|
|
95
|
+
*/
|
|
96
|
+
export declare function explainCrewRequest({ ship, current }: {
|
|
97
|
+
ship: Ship;
|
|
98
|
+
current: CrewRequest | undefined;
|
|
99
|
+
}, input: {
|
|
100
|
+
reason: string | null;
|
|
101
|
+
at: Date;
|
|
102
|
+
actor: Actor;
|
|
103
|
+
}): Result<{
|
|
104
|
+
request: CrewRequest;
|
|
105
|
+
events: NewEvent[];
|
|
106
|
+
}, ExplainCrewRequestRefusal>;
|
|
107
|
+
/**
|
|
108
|
+
* The assigned trierarch writes how its crew of the ship stands, with
|
|
109
|
+
* CrewStatusChanged when it changes. Once the request is releasing, only
|
|
110
|
+
* releasing.
|
|
111
|
+
*/
|
|
112
|
+
export declare function reportCrewStatus({ ship, current, trierarchShipId }: {
|
|
113
|
+
ship: Ship;
|
|
114
|
+
current: CrewRequest | undefined;
|
|
115
|
+
trierarchShipId: ShipId;
|
|
116
|
+
}, input: {
|
|
117
|
+
status: CrewStatus;
|
|
118
|
+
at: Date;
|
|
119
|
+
actor: Actor;
|
|
120
|
+
}): Result<{
|
|
121
|
+
request: CrewRequest;
|
|
122
|
+
events: NewEvent[];
|
|
123
|
+
}, NotFound | NotTheCallers | Releasing>;
|
|
124
|
+
/**
|
|
125
|
+
* The assigned trierarch confirms it released the ship of a releasing
|
|
126
|
+
* request: the request goes, with CrewRequestRemoved (the finalizer).
|
|
127
|
+
*/
|
|
128
|
+
export declare function confirmCrewRelease({ ship, current, trierarchShipId }: {
|
|
129
|
+
ship: Ship;
|
|
130
|
+
current: CrewRequest | undefined;
|
|
131
|
+
trierarchShipId: ShipId;
|
|
132
|
+
}, input: {
|
|
133
|
+
at: Date;
|
|
134
|
+
actor: Actor;
|
|
135
|
+
}): Result<{
|
|
136
|
+
events: NewEvent[];
|
|
137
|
+
}, NotFound | NotTheCallers | DomainError<'CREW_REQUEST_NOT_RELEASING'>>;
|
|
138
|
+
/**
|
|
139
|
+
* Whether the caller reaches the ship for a fleet action it may take with one
|
|
140
|
+
* of the broad scopes, or with crew:run: crew:run reaches only the ships
|
|
141
|
+
* whose requests are assigned to the caller's ship (decision 0029).
|
|
142
|
+
*/
|
|
143
|
+
export declare function checkReaches(caller: Caller, { ship, current, broadScopes }: {
|
|
144
|
+
ship: Ship;
|
|
145
|
+
current: CrewRequest | null | undefined;
|
|
146
|
+
broadScopes: readonly Scope[];
|
|
147
|
+
}): Result<void, NotTheCallers>;
|
|
148
|
+
export {};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { CREW_REQUEST_REASON_MAX_LENGTH, CREW_REQUEST_SETTINGS_MAX_BYTES, isOneLine, crewRequestSettingsBytes, } from '@aeolus-fleet/common';
|
|
2
|
+
import { hasScope } from '../shared/caller.js';
|
|
3
|
+
import { refuse } from '../shared/errors.js';
|
|
4
|
+
import { ok } from '../shared/result.js';
|
|
5
|
+
import { checkCanBeRequestedCrew } from './ship.js';
|
|
6
|
+
function notFound(ship) {
|
|
7
|
+
return refuse('CREW_REQUEST_NOT_FOUND', `${ship.name} has no crew request`);
|
|
8
|
+
}
|
|
9
|
+
function event(ship, change) {
|
|
10
|
+
const { at, actor, ...what } = change;
|
|
11
|
+
return { fleetId: ship.fleetId, occurredAt: at, actor, shipId: ship.id, ...what };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A requester asks that the ship be kept crewed, with these settings: the
|
|
15
|
+
* request it holds now, replacing the settings of any it held and keeping its
|
|
16
|
+
* assignment and status, and CrewRequested with the settings version, never
|
|
17
|
+
* the settings. Never argo, the viewer ship or a retired ship; settings of at
|
|
18
|
+
* most 16 KB; never while the request is releasing.
|
|
19
|
+
*/
|
|
20
|
+
export function requestCrew({ ship, current }, input) {
|
|
21
|
+
const requestable = checkCanBeRequestedCrew(ship);
|
|
22
|
+
if (!requestable.isOk) {
|
|
23
|
+
return requestable;
|
|
24
|
+
}
|
|
25
|
+
if (current?.status === 'releasing') {
|
|
26
|
+
return refuse('CREW_REQUEST_RELEASING', `${ship.name}'s crew request is releasing: request again once its trierarch confirms`);
|
|
27
|
+
}
|
|
28
|
+
const bytes = crewRequestSettingsBytes(input.settings);
|
|
29
|
+
if (bytes > CREW_REQUEST_SETTINGS_MAX_BYTES) {
|
|
30
|
+
return refuse('CREW_REQUEST_SETTINGS_TOO_LARGE', `settings is ${String(bytes)} bytes, the limit is ${String(CREW_REQUEST_SETTINGS_MAX_BYTES)} (decision 0029)`);
|
|
31
|
+
}
|
|
32
|
+
const request = {
|
|
33
|
+
fleetId: ship.fleetId,
|
|
34
|
+
shipId: ship.id,
|
|
35
|
+
settings: input.settings,
|
|
36
|
+
settingsVersion: (current?.settingsVersion ?? 0) + 1,
|
|
37
|
+
requestedAt: input.at,
|
|
38
|
+
assignedTo: current?.assignedTo ?? null,
|
|
39
|
+
status: current?.status ?? null,
|
|
40
|
+
reason: current?.reason ?? null,
|
|
41
|
+
};
|
|
42
|
+
return ok({ request, events: [event(ship, { at: input.at, actor: input.actor, type: 'CrewRequested', details: { settingsVersion: request.settingsVersion } })] });
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A requester removes the ship's crew request. Unassigned, it goes at once,
|
|
46
|
+
* with CrewRequestRemoved. Assigned, it is marked releasing, with
|
|
47
|
+
* CrewStatusChanged, and goes once its trierarch confirms; removing it again
|
|
48
|
+
* meanwhile changes nothing.
|
|
49
|
+
*/
|
|
50
|
+
export function removeCrewRequest({ ship, current }, input) {
|
|
51
|
+
if (!current) {
|
|
52
|
+
return notFound(ship);
|
|
53
|
+
}
|
|
54
|
+
if (current.assignedTo === null) {
|
|
55
|
+
return ok({ request: undefined, events: [event(ship, { ...input, type: 'CrewRequestRemoved' })] });
|
|
56
|
+
}
|
|
57
|
+
if (current.status === 'releasing') {
|
|
58
|
+
return ok({ request: current, events: [] });
|
|
59
|
+
}
|
|
60
|
+
return ok({
|
|
61
|
+
request: { ...current, status: 'releasing' },
|
|
62
|
+
events: [event(ship, { ...input, type: 'CrewStatusChanged', details: { status: 'releasing' } })],
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A ship with crew:assign assigns the request to a trierarch, by optimistic
|
|
67
|
+
* claim: only while it is unassigned, so of two claims the first wins. Never
|
|
68
|
+
* a crewed ship (crewing by hand fulfils the request). Any active ship of the
|
|
69
|
+
* fleet may be the assignee: the fleet does no routing, and a ship that is no
|
|
70
|
+
* trierarch just gets work it does not understand. CrewAssigned names it.
|
|
71
|
+
*/
|
|
72
|
+
export function assignCrew({ ship, current, isCrewed, assignee }, input) {
|
|
73
|
+
if (!current) {
|
|
74
|
+
return notFound(ship);
|
|
75
|
+
}
|
|
76
|
+
if (current.assignedTo !== null) {
|
|
77
|
+
return refuse('CREW_REQUEST_ALREADY_ASSIGNED', `${ship.name}'s crew request is assigned already`);
|
|
78
|
+
}
|
|
79
|
+
if (isCrewed) {
|
|
80
|
+
return refuse('SHIP_NOT_AWAITING_CREW', `${ship.name} is crewed: crewing it by hand fulfils its request`);
|
|
81
|
+
}
|
|
82
|
+
if (assignee?.retiredAt !== null) {
|
|
83
|
+
return refuse('ASSIGNEE_NOT_ACTIVE', 'A crew request is assigned only to an active ship of the fleet');
|
|
84
|
+
}
|
|
85
|
+
return ok({
|
|
86
|
+
request: { ...current, assignedTo: assignee.id, reason: null },
|
|
87
|
+
events: [event(ship, { ...input, type: 'CrewAssigned', details: { assignedTo: assignee.id } })],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The assigner writes why no trierarch can take an unassigned request, one
|
|
92
|
+
* line, trimmed; none clears it. CrewRequestExplained when it changes; an
|
|
93
|
+
* assignment clears it.
|
|
94
|
+
*/
|
|
95
|
+
export function explainCrewRequest({ ship, current }, input) {
|
|
96
|
+
if (!current) {
|
|
97
|
+
return notFound(ship);
|
|
98
|
+
}
|
|
99
|
+
if (current.assignedTo !== null) {
|
|
100
|
+
return refuse('CREW_REQUEST_ALREADY_ASSIGNED', `${ship.name}'s crew request is assigned: it needs no reason`);
|
|
101
|
+
}
|
|
102
|
+
const reason = input.reason?.trim() ?? '';
|
|
103
|
+
if (reason.length > CREW_REQUEST_REASON_MAX_LENGTH || !isOneLine(reason)) {
|
|
104
|
+
return refuse('INVALID_CREW_REQUEST_REASON', `A reason is one line of at most ${String(CREW_REQUEST_REASON_MAX_LENGTH)} characters`);
|
|
105
|
+
}
|
|
106
|
+
const kept = reason === '' ? null : reason;
|
|
107
|
+
if (kept === current.reason) {
|
|
108
|
+
return ok({ request: current, events: [] });
|
|
109
|
+
}
|
|
110
|
+
return ok({
|
|
111
|
+
request: { ...current, reason: kept },
|
|
112
|
+
events: [event(ship, { at: input.at, actor: input.actor, type: 'CrewRequestExplained', details: { reason: kept } })],
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** Only the trierarch the request is assigned to writes its status or confirms its release. */
|
|
116
|
+
function checkAssignedTo({ ship, current, trierarchShipId }) {
|
|
117
|
+
return current.assignedTo === trierarchShipId
|
|
118
|
+
? ok(undefined)
|
|
119
|
+
: refuse('CREW_REQUEST_NOT_ASSIGNED_TO_CALLER', `${ship.name}'s crew request is not assigned to your ship`);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The assigned trierarch writes how its crew of the ship stands, with
|
|
123
|
+
* CrewStatusChanged when it changes. Once the request is releasing, only
|
|
124
|
+
* releasing.
|
|
125
|
+
*/
|
|
126
|
+
export function reportCrewStatus({ ship, current, trierarchShipId }, input) {
|
|
127
|
+
if (!current) {
|
|
128
|
+
return notFound(ship);
|
|
129
|
+
}
|
|
130
|
+
const assigned = checkAssignedTo({ ship, current, trierarchShipId });
|
|
131
|
+
if (!assigned.isOk) {
|
|
132
|
+
return assigned;
|
|
133
|
+
}
|
|
134
|
+
if (current.status === 'releasing' && input.status !== 'releasing') {
|
|
135
|
+
return refuse('CREW_REQUEST_RELEASING', `${ship.name}'s crew request is releasing: stop its session, end its lease and confirm`);
|
|
136
|
+
}
|
|
137
|
+
if (current.status === input.status) {
|
|
138
|
+
return ok({ request: current, events: [] });
|
|
139
|
+
}
|
|
140
|
+
return ok({
|
|
141
|
+
request: { ...current, status: input.status },
|
|
142
|
+
events: [event(ship, { at: input.at, actor: input.actor, type: 'CrewStatusChanged', details: { status: input.status } })],
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* The assigned trierarch confirms it released the ship of a releasing
|
|
147
|
+
* request: the request goes, with CrewRequestRemoved (the finalizer).
|
|
148
|
+
*/
|
|
149
|
+
export function confirmCrewRelease({ ship, current, trierarchShipId }, input) {
|
|
150
|
+
if (!current) {
|
|
151
|
+
return notFound(ship);
|
|
152
|
+
}
|
|
153
|
+
const assigned = checkAssignedTo({ ship, current, trierarchShipId });
|
|
154
|
+
if (!assigned.isOk) {
|
|
155
|
+
return assigned;
|
|
156
|
+
}
|
|
157
|
+
if (current.status !== 'releasing') {
|
|
158
|
+
return refuse('CREW_REQUEST_NOT_RELEASING', `${ship.name}'s crew request is not releasing: nothing to confirm`);
|
|
159
|
+
}
|
|
160
|
+
return ok({ events: [event(ship, { ...input, type: 'CrewRequestRemoved' })] });
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Whether the caller reaches the ship for a fleet action it may take with one
|
|
164
|
+
* of the broad scopes, or with crew:run: crew:run reaches only the ships
|
|
165
|
+
* whose requests are assigned to the caller's ship (decision 0029).
|
|
166
|
+
*/
|
|
167
|
+
export function checkReaches(caller, { ship, current, broadScopes }) {
|
|
168
|
+
if (broadScopes.some((scope) => hasScope(caller, scope))) {
|
|
169
|
+
return ok(undefined);
|
|
170
|
+
}
|
|
171
|
+
return current?.assignedTo === caller.shipId
|
|
172
|
+
? ok(undefined)
|
|
173
|
+
: refuse('CREW_REQUEST_NOT_ASSIGNED_TO_CALLER', `${ship.name}'s crew request is not assigned to your ship`);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=crew-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/crew-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { OperatorAccountRepository } from '../identity/public.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 { SecretHasher } from '../shared/secrets.js';
|
|
7
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
|
+
import type { FleetRepository, InstallationRequestRepository } from './ports.js';
|
|
9
|
+
export interface DeleteFleetTx {
|
|
10
|
+
fleets: FleetRepository;
|
|
11
|
+
operatorAccounts: OperatorAccountRepository;
|
|
12
|
+
installationRequests: InstallationRequestRepository;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The fleet a delete removed. The first time, with its name and operator
|
|
16
|
+
* email: what the server logs, as no event survives it. A replay knows
|
|
17
|
+
* neither, as nothing of the fleet is kept, and is not logged again.
|
|
18
|
+
*/
|
|
19
|
+
export type FleetDeleted = {
|
|
20
|
+
fleetId: FleetId;
|
|
21
|
+
} & ({
|
|
22
|
+
isReplay: false;
|
|
23
|
+
name: string;
|
|
24
|
+
operatorEmail: string;
|
|
25
|
+
} | {
|
|
26
|
+
isReplay: true;
|
|
27
|
+
});
|
|
28
|
+
export type DeleteFleetRefusal = DomainError<'FLEET_NOT_FOUND' | 'IDEMPOTENCY_KEY_REUSED'>;
|
|
29
|
+
export type DeleteFleet = (input: {
|
|
30
|
+
requestId: string;
|
|
31
|
+
fleetId: FleetId;
|
|
32
|
+
}) => Promise<Result<FleetDeleted, DeleteFleetRefusal>>;
|
|
33
|
+
/**
|
|
34
|
+
* Use case: the installation deletes a fleet (docs/blueprint.md,
|
|
35
|
+
* "Installation"), for good: every record in it goes in one unit of work,
|
|
36
|
+
* which ends its console session and leases with it, and so does the request
|
|
37
|
+
* that created it. No event is written, as the event log is the fleet's own.
|
|
38
|
+
* Under its request id it runs once: the record keeps only the request's
|
|
39
|
+
* hash, so a replay answers that the fleet was deleted, and another request
|
|
40
|
+
* under that id is refused.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createDeleteFleet(deps: {
|
|
43
|
+
uow: UnitOfWork<DeleteFleetTx>;
|
|
44
|
+
clock: Clock;
|
|
45
|
+
hasher: SecretHasher;
|
|
46
|
+
}): DeleteFleet;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { installationRequestText } from './installation-request.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: the installation deletes a fleet (docs/blueprint.md,
|
|
6
|
+
* "Installation"), for good: every record in it goes in one unit of work,
|
|
7
|
+
* which ends its console session and leases with it, and so does the request
|
|
8
|
+
* that created it. No event is written, as the event log is the fleet's own.
|
|
9
|
+
* Under its request id it runs once: the record keeps only the request's
|
|
10
|
+
* hash, so a replay answers that the fleet was deleted, and another request
|
|
11
|
+
* under that id is refused.
|
|
12
|
+
*/
|
|
13
|
+
export function createDeleteFleet(deps) {
|
|
14
|
+
return (input) => deps.uow.run(async (tx) => {
|
|
15
|
+
const { requestId, fleetId } = input;
|
|
16
|
+
const requestHash = deps.hasher.hash(installationRequestText(['deleteFleet', fleetId]));
|
|
17
|
+
await tx.installationRequests.lock(requestId);
|
|
18
|
+
const earlier = await tx.installationRequests.find(requestId);
|
|
19
|
+
if (earlier) {
|
|
20
|
+
return earlier.kind === 'deleteFleet' && earlier.requestHash === requestHash
|
|
21
|
+
? ok({ isReplay: true, fleetId })
|
|
22
|
+
: refuse('IDEMPOTENCY_KEY_REUSED', 'This request id was used for another request: use a new one for every request');
|
|
23
|
+
}
|
|
24
|
+
const fleet = await tx.fleets.findForUpdate(fleetId);
|
|
25
|
+
if (!fleet) {
|
|
26
|
+
return refuse('FLEET_NOT_FOUND', `The installation hosts no fleet ${fleetId}`);
|
|
27
|
+
}
|
|
28
|
+
const operatorEmail = (await tx.operatorAccounts.findForFleet(fleetId))?.email ?? '';
|
|
29
|
+
await tx.fleets.delete(fleetId);
|
|
30
|
+
await tx.installationRequests.record({ requestId, at: deps.clock.now(), requestHash, kind: 'deleteFleet' });
|
|
31
|
+
return ok({ isReplay: false, fleetId, name: fleet.name, operatorEmail });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=delete-fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/delete-fleet.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAoBpE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA4E;IAC5G,OAAO,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAqD,EAAE;QAC3E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;gBAC1E,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBACjC,CAAC,CAAC,MAAM,CAAC,wBAAwB,EAAE,+EAA+E,CAAC,CAAC;QACxH,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACrF,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5G,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import { type CredentialTx } from '../identity/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 Result } from '../shared/result.js';
|
|
7
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
|
+
import { type LeaseEnded } from './lease.js';
|
|
9
|
+
import { type LeaseTx } from './leases.js';
|
|
10
|
+
import type { ShipRepository } from './ports.js';
|
|
11
|
+
export interface DeregisterTx extends LeaseTx, CredentialTx {
|
|
12
|
+
ships: ShipRepository;
|
|
13
|
+
}
|
|
14
|
+
export type DeregisterRefusal = DomainError<'OPERATOR_SHIP_IS_PERMANENT'> | LeaseEnded;
|
|
15
|
+
export type Deregister = (crew: Crew) => Promise<Result<undefined, DeregisterRefusal>>;
|
|
16
|
+
/**
|
|
17
|
+
* Use case: a crew ends its own lease (`deregister`), and the ship awaits a new
|
|
18
|
+
* crew. The same as a release, caused by the ship itself (ADR 0010): in one
|
|
19
|
+
* unit of work the secret is invalidated, the lease ends and with it the crew
|
|
20
|
+
* token, and the deliveries the lease held in flight return to pending, their
|
|
21
|
+
* attempts kept. The ship and its inbox stay; the next crew needs a new
|
|
22
|
+
* starting prompt. Needs only the crew token, no scope: a crew ends only its
|
|
23
|
+
* own lease.
|
|
24
|
+
*
|
|
25
|
+
* Locks in the fleet's order, as a release does: the ship, then its secret,
|
|
26
|
+
* then its lease. A refusal rolls the revoked secret back.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createDeregister(deps: {
|
|
29
|
+
uow: UnitOfWork<DeregisterTx>;
|
|
30
|
+
clock: Clock;
|
|
31
|
+
ids: IdGenerator;
|
|
32
|
+
}): Deregister;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { revokeShipSecret } from '../identity/public.js';
|
|
2
|
+
import { shipActor } from '../shared/events.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
import { refuseEndedLease } from './lease.js';
|
|
5
|
+
import { endLease } from './leases.js';
|
|
6
|
+
import { checkCanDeregister } from './ship.js';
|
|
7
|
+
/**
|
|
8
|
+
* Use case: a crew ends its own lease (`deregister`), and the ship awaits a new
|
|
9
|
+
* crew. The same as a release, caused by the ship itself (ADR 0010): in one
|
|
10
|
+
* unit of work the secret is invalidated, the lease ends and with it the crew
|
|
11
|
+
* token, and the deliveries the lease held in flight return to pending, their
|
|
12
|
+
* attempts kept. The ship and its inbox stay; the next crew needs a new
|
|
13
|
+
* starting prompt. Needs only the crew token, no scope: a crew ends only its
|
|
14
|
+
* own lease.
|
|
15
|
+
*
|
|
16
|
+
* Locks in the fleet's order, as a release does: the ship, then its secret,
|
|
17
|
+
* then its lease. A refusal rolls the revoked secret back.
|
|
18
|
+
*/
|
|
19
|
+
export function createDeregister(deps) {
|
|
20
|
+
return (crew) => deps.uow.run(async (tx) => {
|
|
21
|
+
const { fleetId, shipId, leaseId } = crew;
|
|
22
|
+
const ship = await tx.ships.findForUpdate(fleetId, shipId);
|
|
23
|
+
if (!ship) {
|
|
24
|
+
// A crew's ship always exists; the foreign key keeps the lease's ship in its fleet.
|
|
25
|
+
return refuseEndedLease();
|
|
26
|
+
}
|
|
27
|
+
const actor = shipActor(shipId);
|
|
28
|
+
const at = deps.clock.now();
|
|
29
|
+
await revokeShipSecret({ tx, ids: deps.ids }, { fleetId, shipId, actor, at });
|
|
30
|
+
const lease = checkCanDeregister(ship, { leaseId, heldLease: await tx.leases.findOpenForUpdate(fleetId, shipId) });
|
|
31
|
+
if (!lease.isOk) {
|
|
32
|
+
return lease;
|
|
33
|
+
}
|
|
34
|
+
await endLease({ tx, ids: deps.ids }, { fleetId, leaseId: lease.value.id, actor, at, reason: 'deregistered' });
|
|
35
|
+
return ok(undefined);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=deregister.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deregister.js","sourceRoot":"","sources":["../../../src/domain/registry/deregister.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,uBAAuB,CAAC;AAI5E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAU/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAuE;IACtG,OAAO,CAAC,IAAI,EAAE,EAAE,CACd,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAiD,EAAE;QACvE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAC1C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,oFAAoF;YACpF,OAAO,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAE5B,MAAM,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnH,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QAC/G,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { IdGenerator, ShipId } 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 ExplainCrewRequestRefusal } from './crew-request.js';
|
|
9
|
+
import type { CrewRequestRepository, ShipRepository } from './ports.js';
|
|
10
|
+
export interface ExplainCrewRequestTx {
|
|
11
|
+
ships: Pick<ShipRepository, 'findForUpdate'>;
|
|
12
|
+
crewRequests: CrewRequestRepository;
|
|
13
|
+
events: EventLog;
|
|
14
|
+
}
|
|
15
|
+
export type ExplainCrewRequest = (caller: Caller, input: {
|
|
16
|
+
shipId: ShipId;
|
|
17
|
+
reason: string | null;
|
|
18
|
+
}) => Promise<Result<undefined, DomainError<'SHIP_NOT_FOUND'> | ExplainCrewRequestRefusal>>;
|
|
19
|
+
/**
|
|
20
|
+
* Use case: the assigner (crew:assign, the trierarch plugin) writes why no trierarch
|
|
21
|
+
* can take a ship's unassigned crew request, shown in the operator's
|
|
22
|
+
* needs-crew to-do. Its scope is checked before this runs. In one unit of
|
|
23
|
+
* work, locking the ship first: the reason and, when it changed,
|
|
24
|
+
* CrewRequestExplained.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createExplainCrewRequest(deps: {
|
|
27
|
+
uow: UnitOfWork<ExplainCrewRequestTx>;
|
|
28
|
+
clock: Clock;
|
|
29
|
+
ids: IdGenerator;
|
|
30
|
+
}): ExplainCrewRequest;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { recordEvent, shipActor } from '../shared/events.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
import { explainCrewRequest } from './crew-request.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: the assigner (crew:assign, the trierarch plugin) writes why no trierarch
|
|
7
|
+
* can take a ship's unassigned crew request, shown in the operator's
|
|
8
|
+
* needs-crew to-do. Its scope is checked before this runs. In one unit of
|
|
9
|
+
* work, locking the ship first: the reason and, when it changed,
|
|
10
|
+
* CrewRequestExplained.
|
|
11
|
+
*/
|
|
12
|
+
export function createExplainCrewRequest(deps) {
|
|
13
|
+
return (caller, input) => deps.uow.run(async (tx) => {
|
|
14
|
+
const ship = await tx.ships.findForUpdate(caller.fleetId, input.shipId);
|
|
15
|
+
if (!ship) {
|
|
16
|
+
return refuse('SHIP_NOT_FOUND', `Ship ${input.shipId} does not exist`);
|
|
17
|
+
}
|
|
18
|
+
const explained = explainCrewRequest({ ship, current: await tx.crewRequests.find(caller.fleetId, ship.id) }, { reason: input.reason, at: deps.clock.now(), actor: shipActor(caller.shipId) });
|
|
19
|
+
if (!explained.isOk) {
|
|
20
|
+
return explained;
|
|
21
|
+
}
|
|
22
|
+
if (explained.value.events.length > 0) {
|
|
23
|
+
await tx.crewRequests.save(explained.value.request);
|
|
24
|
+
}
|
|
25
|
+
for (const event of explained.value.events) {
|
|
26
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, event);
|
|
27
|
+
}
|
|
28
|
+
return ok(undefined);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=explain-crew-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain-crew-request.js","sourceRoot":"","sources":["../../../src/domain/registry/explain-crew-request.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAkC,MAAM,mBAAmB,CAAC;AAcvF;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAA+E;IACtH,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAyF,EAAE;QAC/G,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,SAAS,GAAG,kBAAkB,CAClC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EACtE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAChF,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,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,12 @@
|
|
|
1
|
+
import type { FleetId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
/** The tenant: one operator's ships, messages and history. */
|
|
5
|
+
export interface Fleet {
|
|
6
|
+
id: FleetId;
|
|
7
|
+
name: string;
|
|
8
|
+
createdAt: Date;
|
|
9
|
+
}
|
|
10
|
+
export declare const FLEET_NAME_MAX_LENGTH = 100;
|
|
11
|
+
/** A fleet name is trimmed, and between 1 and 100 characters. */
|
|
12
|
+
export declare function fleetName(raw: string): Result<string, DomainError<'INVALID_FLEET_NAME'>>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
export const FLEET_NAME_MAX_LENGTH = 100;
|
|
4
|
+
/** A fleet name is trimmed, and between 1 and 100 characters. */
|
|
5
|
+
export function fleetName(raw) {
|
|
6
|
+
const name = raw.trim();
|
|
7
|
+
if (name.length === 0 || name.length > FLEET_NAME_MAX_LENGTH) {
|
|
8
|
+
return refuse('INVALID_FLEET_NAME', `A fleet name is 1 to ${FLEET_NAME_MAX_LENGTH} characters, not counting spaces around it`);
|
|
9
|
+
}
|
|
10
|
+
return ok(name);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/domain/registry/fleet.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAStD,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC7D,OAAO,MAAM,CACX,oBAAoB,EACpB,wBAAwB,qBAAqB,4CAA4C,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FleetId, IdGenerator, OperatorId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { OperatorAccountRepository } from '../identity/public.js';
|
|
3
|
+
import { type EventLog } from '../shared/events.js';
|
|
4
|
+
import type { FleetRepository, ShipRepository } from './ports.js';
|
|
5
|
+
export interface FoundFleetTx {
|
|
6
|
+
fleets: FleetRepository;
|
|
7
|
+
ships: ShipRepository;
|
|
8
|
+
operatorAccounts: OperatorAccountRepository;
|
|
9
|
+
events: EventLog;
|
|
10
|
+
}
|
|
11
|
+
export interface FleetFounded {
|
|
12
|
+
fleetId: FleetId;
|
|
13
|
+
operatorShipId: ShipId;
|
|
14
|
+
operatorId: OperatorId;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Writes a new fleet, its operator ship `argo` and the operator account, with
|
|
18
|
+
* FleetInitialised and ShipCommissioned, in the caller's unit of work. argo
|
|
19
|
+
* gets no secret: the operator's sign-in is the only way to crew it (ADR
|
|
20
|
+
* 0012). With `hasViewer`, the viewer ship comes too, with its own
|
|
21
|
+
* ShipCommissioned (decision 0022). The caller has validated the name and email.
|
|
22
|
+
*/
|
|
23
|
+
export declare function foundFleet(deps: {
|
|
24
|
+
tx: FoundFleetTx;
|
|
25
|
+
ids: IdGenerator;
|
|
26
|
+
}, input: {
|
|
27
|
+
name: string;
|
|
28
|
+
email: string;
|
|
29
|
+
passwordHash: string | null;
|
|
30
|
+
at: Date;
|
|
31
|
+
hasViewer?: boolean;
|
|
32
|
+
}): Promise<FleetFounded>;
|