@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,193 @@
|
|
|
1
|
+
import type { ConsoleSessionId, CredentialId, FleetId, LeaseId, OperatorId, ShipId, Theme } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Caller, Crew } from '../shared/caller.js';
|
|
3
|
+
import type { ConsoleSession, ConsoleSessionEndReason } from './console-session.js';
|
|
4
|
+
import type { Credential } from './credential.js';
|
|
5
|
+
import type { Guide, GuideProgress } from './guide.js';
|
|
6
|
+
import type { Notice } from './notice.js';
|
|
7
|
+
import type { OperatorAccount } from './operator-account.js';
|
|
8
|
+
import type { SignInAs, SignInTicket } from './sign-in-ticket.js';
|
|
9
|
+
/** The ship a crew token or a console session token belongs to, as the caller it makes. */
|
|
10
|
+
export type AuthenticatedShip = Omit<Caller, 'consoleSessionId'>;
|
|
11
|
+
/** The ship a crew token crews, and the open lease the token belongs to. */
|
|
12
|
+
export type AuthenticatedCrew = AuthenticatedShip & {
|
|
13
|
+
leaseId: LeaseId;
|
|
14
|
+
};
|
|
15
|
+
/** The lease a crew token belongs to, as the lookup finds it: open, with the crew it makes the caller, or ended. */
|
|
16
|
+
export type CrewTokenLease = {
|
|
17
|
+
isOpen: true;
|
|
18
|
+
crew: AuthenticatedCrew;
|
|
19
|
+
} | {
|
|
20
|
+
isOpen: false;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Outbound port: ship secrets.
|
|
24
|
+
*
|
|
25
|
+
* Lock order, so concurrent sign-ins, sign-outs, claims, starting prompts and
|
|
26
|
+
* password resets never deadlock: the ship when the use case locks it, then a
|
|
27
|
+
* credential or the operator account, then console sessions, then leases.
|
|
28
|
+
*/
|
|
29
|
+
export interface CredentialRepository {
|
|
30
|
+
create(credential: Credential): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* The valid credential with this hash, locked until the unit of work ends.
|
|
33
|
+
* Not scoped by fleet: a secret carries no fleet, and its hash is unique
|
|
34
|
+
* across all fleets (ADR 0007).
|
|
35
|
+
*/
|
|
36
|
+
findValidBySecretHashForUpdate(secretHash: string): Promise<Credential | undefined>;
|
|
37
|
+
/** The ship's valid credential, locked until the unit of work ends. */
|
|
38
|
+
findValidForShipForUpdate(fleetId: FleetId, shipId: ShipId): Promise<Credential | undefined>;
|
|
39
|
+
markClaimed(change: {
|
|
40
|
+
fleetId: FleetId;
|
|
41
|
+
credentialId: CredentialId;
|
|
42
|
+
at: Date;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
invalidate(change: {
|
|
45
|
+
fleetId: FleetId;
|
|
46
|
+
credentialId: CredentialId;
|
|
47
|
+
at: Date;
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Outbound port: finds the operator account by its normalised email outside
|
|
52
|
+
* any unit of work, so checking a password holds no row and no connection.
|
|
53
|
+
* One query, not scoped by fleet: signing in names no fleet (ADR 0007).
|
|
54
|
+
*/
|
|
55
|
+
export interface OperatorAccountLookup {
|
|
56
|
+
byEmail(email: string): Promise<OperatorAccount | undefined>;
|
|
57
|
+
}
|
|
58
|
+
/** Outbound port: the operator account. */
|
|
59
|
+
export interface OperatorAccountRepository {
|
|
60
|
+
create(account: OperatorAccount): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Holds the lock on this normalised email until the unit of work ends, so
|
|
63
|
+
* two fleets created at once never both take it.
|
|
64
|
+
*/
|
|
65
|
+
lockEmail(email: string): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* The account with this normalised email, locked until the unit of work
|
|
68
|
+
* ends. Not scoped by fleet: signing in names no fleet, and the email is
|
|
69
|
+
* unique across all fleets (ADR 0007).
|
|
70
|
+
*/
|
|
71
|
+
findByEmailForUpdate(email: string): Promise<OperatorAccount | undefined>;
|
|
72
|
+
/** The fleet's operator account, locked until the unit of work ends. */
|
|
73
|
+
findForFleetForUpdate(fleetId: FleetId): Promise<OperatorAccount | undefined>;
|
|
74
|
+
changePassword(change: {
|
|
75
|
+
fleetId: FleetId;
|
|
76
|
+
operatorId: OperatorId;
|
|
77
|
+
passwordHash: string;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
/** The fleet's operator account, read without a lock. */
|
|
80
|
+
findForFleet(fleetId: FleetId): Promise<OperatorAccount | undefined>;
|
|
81
|
+
setTheme(change: {
|
|
82
|
+
fleetId: FleetId;
|
|
83
|
+
operatorId: OperatorId;
|
|
84
|
+
theme: Theme;
|
|
85
|
+
}): Promise<void>;
|
|
86
|
+
}
|
|
87
|
+
/** Outbound port: sign-in tickets, found by their hash before the fleet is known (ADR 0007). */
|
|
88
|
+
export interface SignInTicketRepository {
|
|
89
|
+
create(ticket: SignInTicket): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Marks the ticket with this hash used and answers its fleet and whom it
|
|
92
|
+
* signs in as, when it is unused and not expired at `at`; undefined
|
|
93
|
+
* otherwise. At most one redeem of a ticket ever answers, however many run
|
|
94
|
+
* at once.
|
|
95
|
+
*/
|
|
96
|
+
redeem(tokenHash: string, at: Date): Promise<{
|
|
97
|
+
fleetId: FleetId;
|
|
98
|
+
as: SignInAs;
|
|
99
|
+
} | undefined>;
|
|
100
|
+
}
|
|
101
|
+
/** Outbound port: console sessions, always within one fleet. */
|
|
102
|
+
export interface ConsoleSessionRepository {
|
|
103
|
+
create(session: ConsoleSession): Promise<void>;
|
|
104
|
+
/** The session, read without a lock. */
|
|
105
|
+
find(fleetId: FleetId, consoleSessionId: ConsoleSessionId): Promise<ConsoleSession | undefined>;
|
|
106
|
+
/** Ends the session if it has not ended and returns it; undefined when it had already ended. */
|
|
107
|
+
end(change: {
|
|
108
|
+
fleetId: FleetId;
|
|
109
|
+
consoleSessionId: ConsoleSessionId;
|
|
110
|
+
at: Date;
|
|
111
|
+
reason: ConsoleSessionEndReason;
|
|
112
|
+
}): Promise<ConsoleSession | undefined>;
|
|
113
|
+
/** Ends every session of the ship that has not ended, expired ones included, and returns them. */
|
|
114
|
+
endAll(of: {
|
|
115
|
+
fleetId: FleetId;
|
|
116
|
+
shipId: ShipId;
|
|
117
|
+
}, ending: {
|
|
118
|
+
at: Date;
|
|
119
|
+
reason: ConsoleSessionEndReason;
|
|
120
|
+
}): Promise<ConsoleSession[]>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Outbound port: who is calling. Each lookup is one query that returns the
|
|
124
|
+
* ship, its fleet, kind and scopes, and is not scoped by fleet, because a
|
|
125
|
+
* token carries no fleet (ADR 0007).
|
|
126
|
+
*/
|
|
127
|
+
export interface CallerLookup {
|
|
128
|
+
/**
|
|
129
|
+
* The lease that holds this crew token hash, open or ended; undefined when
|
|
130
|
+
* no lease of a ship that is not retired ever held it. An open lease is
|
|
131
|
+
* marked seen `at`: every call by its crew shows the ship alive. Observation
|
|
132
|
+
* only (ADR 0016): nothing acts on it.
|
|
133
|
+
*/
|
|
134
|
+
byCrewTokenHash(crewTokenHash: string, seen: {
|
|
135
|
+
at: Date;
|
|
136
|
+
}): Promise<CrewTokenLease | undefined>;
|
|
137
|
+
/**
|
|
138
|
+
* The caller of the console session with this token hash, when the session
|
|
139
|
+
* has not ended and expires after `now`: argo, crewed under the lease the
|
|
140
|
+
* session holds, or the viewer ship, without a lease. Using it moves its
|
|
141
|
+
* last use to `now` and its expiry to its idle limit after `now`, never
|
|
142
|
+
* past the moment it ends by, and marks argo's lease seen `now`. Answers
|
|
143
|
+
* the new expiry.
|
|
144
|
+
*/
|
|
145
|
+
useConsoleSession(use: {
|
|
146
|
+
tokenHash: string;
|
|
147
|
+
now: Date;
|
|
148
|
+
}): Promise<{
|
|
149
|
+
caller: Caller | Crew;
|
|
150
|
+
expiresAt: Date;
|
|
151
|
+
} | undefined>;
|
|
152
|
+
/** Why the console session with this token hash ended; undefined when it has not, or no session has the hash. */
|
|
153
|
+
consoleSessionEnding(tokenHash: string): Promise<ConsoleSessionEndReason | undefined>;
|
|
154
|
+
}
|
|
155
|
+
/** Outbound port: the installation's notices (decision 0023), kept in its order; they belong to no fleet. */
|
|
156
|
+
export interface NoticeRepository {
|
|
157
|
+
read(): Promise<Notice[]>;
|
|
158
|
+
/** Replaces every notice with these, in this order. */
|
|
159
|
+
replace(notices: readonly Notice[]): Promise<void>;
|
|
160
|
+
}
|
|
161
|
+
/** Outbound port: the notices each console session dismissed, by notice id; they go with the session's fleet. */
|
|
162
|
+
export interface NoticeDismissals {
|
|
163
|
+
dismissed(of: {
|
|
164
|
+
fleetId: FleetId;
|
|
165
|
+
consoleSessionId: ConsoleSessionId;
|
|
166
|
+
}): Promise<string[]>;
|
|
167
|
+
/** Records the dismissal; one already recorded stays as it was. */
|
|
168
|
+
dismiss(dismissal: {
|
|
169
|
+
fleetId: FleetId;
|
|
170
|
+
consoleSessionId: ConsoleSessionId;
|
|
171
|
+
noticeId: string;
|
|
172
|
+
at: Date;
|
|
173
|
+
}): Promise<void>;
|
|
174
|
+
}
|
|
175
|
+
/** Outbound port: the installation's guide (decision 0024), one or none; it belongs to no fleet. */
|
|
176
|
+
export interface GuideRepository {
|
|
177
|
+
read(): Promise<Guide | null>;
|
|
178
|
+
/** Replaces the guide with this one; null clears it. */
|
|
179
|
+
replace(guide: Guide | null): Promise<void>;
|
|
180
|
+
}
|
|
181
|
+
/** Outbound port: where each console session is in the guide; it goes with the session's fleet. */
|
|
182
|
+
export interface GuideProgressRepository {
|
|
183
|
+
progress(of: {
|
|
184
|
+
fleetId: FleetId;
|
|
185
|
+
consoleSessionId: ConsoleSessionId;
|
|
186
|
+
}): Promise<GuideProgress | null>;
|
|
187
|
+
/** Records the session's progress over any it recorded before. */
|
|
188
|
+
record(progress: {
|
|
189
|
+
fleetId: FleetId;
|
|
190
|
+
consoleSessionId: ConsoleSessionId;
|
|
191
|
+
at: Date;
|
|
192
|
+
} & GuideProgress): Promise<void>;
|
|
193
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/domain/identity/ports.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { findValidShipSecret, issueShipSecret, markShipSecretClaimed, revokeShipSecret, SHIP_SECRET_PREFIX, type Credential, type CredentialTx, type SecretTools, } from './credential.js';
|
|
2
|
+
export { operatorEmail, operatorPassword } from './operator-account.js';
|
|
3
|
+
export type { CredentialRepository, OperatorAccountRepository } from './ports.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Identity's published surface: what other contexts may use. Use cases are not
|
|
2
|
+
// part of it; adapters import them from their own modules.
|
|
3
|
+
export { findValidShipSecret, issueShipSecret, markShipSecretClaimed, revokeShipSecret, SHIP_SECRET_PREFIX, } from './credential.js';
|
|
4
|
+
export { operatorEmail, operatorPassword } from './operator-account.js';
|
|
5
|
+
//# sourceMappingURL=public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../../src/domain/identity/public.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2DAA2D;AAC3D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GAInB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Theme } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Caller } from '../shared/caller.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
6
|
+
import type { ConsoleSessionRepository, OperatorAccountRepository } from './ports.js';
|
|
7
|
+
export interface ReadAccountTx {
|
|
8
|
+
operatorAccounts: Pick<OperatorAccountRepository, 'findForFleet'>;
|
|
9
|
+
consoleSessions: Pick<ConsoleSessionRepository, 'find'>;
|
|
10
|
+
}
|
|
11
|
+
/** This console session: the device it signed in from, and since when. */
|
|
12
|
+
interface SessionView {
|
|
13
|
+
device: string;
|
|
14
|
+
since: Date;
|
|
15
|
+
}
|
|
16
|
+
/** The operator's account with this session, or a viewer's session alone: a viewer has no email and no theme (decision 0022). */
|
|
17
|
+
export type AccountView = {
|
|
18
|
+
kind: 'operator';
|
|
19
|
+
email: string;
|
|
20
|
+
theme: Theme;
|
|
21
|
+
session: SessionView;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'viewer';
|
|
24
|
+
session: SessionView;
|
|
25
|
+
};
|
|
26
|
+
export type ReadAccount = (caller: Caller) => Promise<Result<AccountView, DomainError<'NOT_THE_OPERATOR_SHIP'>>>;
|
|
27
|
+
/**
|
|
28
|
+
* Use case: the signed-in operator's account, for the AccountMenu: their
|
|
29
|
+
* email, their theme, and this console session; for a viewer session, the
|
|
30
|
+
* session alone. Only a console session has one; any other caller is refused.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createReadAccount(deps: {
|
|
33
|
+
uow: UnitOfWork<ReadAccountTx>;
|
|
34
|
+
}): ReadAccount;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the signed-in operator's account, for the AccountMenu: their
|
|
5
|
+
* email, their theme, and this console session; for a viewer session, the
|
|
6
|
+
* session alone. Only a console session has one; any other caller is refused.
|
|
7
|
+
*/
|
|
8
|
+
export function createReadAccount(deps) {
|
|
9
|
+
return (caller) => deps.uow.run(async (tx) => {
|
|
10
|
+
const { consoleSessionId } = caller;
|
|
11
|
+
const session = consoleSessionId && (await tx.consoleSessions.find(caller.fleetId, consoleSessionId));
|
|
12
|
+
if (session && caller.kind === 'viewer') {
|
|
13
|
+
return ok({ kind: 'viewer', session: { device: session.device, since: session.createdAt } });
|
|
14
|
+
}
|
|
15
|
+
const account = session && (await tx.operatorAccounts.findForFleet(caller.fleetId));
|
|
16
|
+
if (!session || !account) {
|
|
17
|
+
return refuse('NOT_THE_OPERATOR_SHIP', 'Only the operator, signed in to the console, has an account');
|
|
18
|
+
}
|
|
19
|
+
return ok({
|
|
20
|
+
kind: 'operator',
|
|
21
|
+
email: account.email,
|
|
22
|
+
theme: account.theme,
|
|
23
|
+
session: { device: session.device, since: session.createdAt },
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=read-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-account.js","sourceRoot":"","sources":["../../../src/domain/identity/read-account.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAoBtD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwC;IACxE,OAAO,CAAC,MAAM,EAAE,EAAE,CAChB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAsE,EAAE;QAC5F,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,MAAM,OAAO,GAAG,gBAAgB,IAAI,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACtG,IAAI,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,uBAAuB,EAAE,6DAA6D,CAAC,CAAC;QACxG,CAAC;QACD,OAAO,EAAE,CAAC;YACR,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE;SAC9D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Caller } from '../shared/caller.js';
|
|
2
|
+
import { type GuideProgress, type GuideStep } from './guide.js';
|
|
3
|
+
import type { GuideProgressRepository, GuideRepository } from './ports.js';
|
|
4
|
+
export type ReadGuide = (caller: Caller) => Promise<{
|
|
5
|
+
steps: readonly GuideStep[];
|
|
6
|
+
progress: GuideProgress;
|
|
7
|
+
} | null>;
|
|
8
|
+
/**
|
|
9
|
+
* Use case: the guide a console session shows (decision 0024): the
|
|
10
|
+
* installation's, when it is for the session's audience, with where the
|
|
11
|
+
* session is in it; open at the first step until the session moves. A step
|
|
12
|
+
* past the end of a guide set shorter since reads as its last step. None
|
|
13
|
+
* without a console session.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createReadGuide(deps: {
|
|
16
|
+
guide: GuideRepository;
|
|
17
|
+
progress: GuideProgressRepository;
|
|
18
|
+
}): ReadGuide;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NOT_STARTED } from './guide.js';
|
|
2
|
+
import { isForSessionOf } from './notice.js';
|
|
3
|
+
/**
|
|
4
|
+
* Use case: the guide a console session shows (decision 0024): the
|
|
5
|
+
* installation's, when it is for the session's audience, with where the
|
|
6
|
+
* session is in it; open at the first step until the session moves. A step
|
|
7
|
+
* past the end of a guide set shorter since reads as its last step. None
|
|
8
|
+
* without a console session.
|
|
9
|
+
*/
|
|
10
|
+
export function createReadGuide(deps) {
|
|
11
|
+
return async (caller) => {
|
|
12
|
+
const { consoleSessionId } = caller;
|
|
13
|
+
const guide = await deps.guide.read();
|
|
14
|
+
if (consoleSessionId === undefined || guide === null || !isForSessionOf(guide, caller.kind)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const progress = (await deps.progress.progress({ fleetId: caller.fleetId, consoleSessionId })) ?? NOT_STARTED;
|
|
18
|
+
return { steps: guide.steps, progress: { ...progress, step: Math.min(progress.step, guide.steps.length - 1) } };
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=read-guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-guide.js","sourceRoot":"","sources":["../../../src/domain/identity/read-guide.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAsC,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,IAAmE;IACjG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,gBAAgB,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5F,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC;QAC9G,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IAClH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Caller } from '../shared/caller.js';
|
|
2
|
+
import { type Notice } from './notice.js';
|
|
3
|
+
import type { NoticeDismissals, NoticeRepository } from './ports.js';
|
|
4
|
+
export type ReadNotices = (caller: Caller) => Promise<Notice[]>;
|
|
5
|
+
/**
|
|
6
|
+
* Use case: the notices a console session shows above every page (decision
|
|
7
|
+
* 0023): those of its audience, in the installation's order, less the
|
|
8
|
+
* dismissible ones it dismissed. A caller without a console session reads none.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createReadNotices(deps: {
|
|
11
|
+
notices: NoticeRepository;
|
|
12
|
+
dismissals: NoticeDismissals;
|
|
13
|
+
}): ReadNotices;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isForSessionOf } from './notice.js';
|
|
2
|
+
/**
|
|
3
|
+
* Use case: the notices a console session shows above every page (decision
|
|
4
|
+
* 0023): those of its audience, in the installation's order, less the
|
|
5
|
+
* dismissible ones it dismissed. A caller without a console session reads none.
|
|
6
|
+
*/
|
|
7
|
+
export function createReadNotices(deps) {
|
|
8
|
+
return async (caller) => {
|
|
9
|
+
const { consoleSessionId } = caller;
|
|
10
|
+
if (consoleSessionId === undefined) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
const [notices, dismissed] = await Promise.all([deps.notices.read(), deps.dismissals.dismissed({ fleetId: caller.fleetId, consoleSessionId })]);
|
|
14
|
+
return notices.filter((notice) => isForSessionOf(notice, caller.kind) && !(notice.isDismissible && dismissed.includes(notice.id)));
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=read-notices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-notices.js","sourceRoot":"","sources":["../../../src/domain/identity/read-notices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAe,MAAM,aAAa,CAAC;AAK1D;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiE;IACjG,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC;QAChJ,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrI,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Caller } from '../shared/caller.js';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { GuideProgress } from './guide.js';
|
|
6
|
+
import type { GuideProgressRepository, GuideRepository } from './ports.js';
|
|
7
|
+
export type RecordGuideProgressRefusal = DomainError<'GUIDE_NOT_FOUND' | 'GUIDE_STEP_NOT_FOUND'>;
|
|
8
|
+
export type RecordGuideProgress = (caller: Caller, progress: GuideProgress) => Promise<Result<undefined, RecordGuideProgressRefusal>>;
|
|
9
|
+
/**
|
|
10
|
+
* Use case: a console session records where it is in the guide, for itself
|
|
11
|
+
* only (decision 0024): open at a step, skipped or finished; open at the
|
|
12
|
+
* first step again is Take the tour. No event: the guide is how the console
|
|
13
|
+
* looks, not a change to the fleet.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createRecordGuideProgress(deps: {
|
|
16
|
+
guide: GuideRepository;
|
|
17
|
+
progress: GuideProgressRepository;
|
|
18
|
+
clock: Clock;
|
|
19
|
+
}): RecordGuideProgress;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { ok } from '../shared/result.js';
|
|
3
|
+
import { isForSessionOf } from './notice.js';
|
|
4
|
+
/**
|
|
5
|
+
* Use case: a console session records where it is in the guide, for itself
|
|
6
|
+
* only (decision 0024): open at a step, skipped or finished; open at the
|
|
7
|
+
* first step again is Take the tour. No event: the guide is how the console
|
|
8
|
+
* looks, not a change to the fleet.
|
|
9
|
+
*/
|
|
10
|
+
export function createRecordGuideProgress(deps) {
|
|
11
|
+
return async (caller, { step, state }) => {
|
|
12
|
+
const { consoleSessionId } = caller;
|
|
13
|
+
const guide = await deps.guide.read();
|
|
14
|
+
if (consoleSessionId === undefined || guide === null || !isForSessionOf(guide, caller.kind)) {
|
|
15
|
+
return refuse('GUIDE_NOT_FOUND', 'No guide shows in this console session');
|
|
16
|
+
}
|
|
17
|
+
if (step >= guide.steps.length) {
|
|
18
|
+
return refuse('GUIDE_STEP_NOT_FOUND', `The guide has ${String(guide.steps.length)} steps, so no step ${String(step + 1)}`);
|
|
19
|
+
}
|
|
20
|
+
await deps.progress.record({ fleetId: caller.fleetId, consoleSessionId, step, state, at: deps.clock.now() });
|
|
21
|
+
return ok(undefined);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=record-guide-progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-guide-progress.js","sourceRoot":"","sources":["../../../src/domain/identity/record-guide-progress.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7C;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAiF;IACzH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACvC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,gBAAgB,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5F,OAAO,MAAM,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7H,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC7G,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Clock } from '../shared/clock.js';
|
|
3
|
+
import { type DomainError } from '../shared/errors.js';
|
|
4
|
+
import type { Result } from '../shared/result.js';
|
|
5
|
+
import type { RandomTokens, SecretHasher } from '../shared/secrets.js';
|
|
6
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
7
|
+
import type { SignInTicketRepository } from './ports.js';
|
|
8
|
+
import type { SignedIn } from './sign-in.js';
|
|
9
|
+
import { type StartConsoleSessionTx } from './start-console-session.js';
|
|
10
|
+
import { type StartViewerSessionTx } from './start-viewer-session.js';
|
|
11
|
+
export interface RedeemSignInTicketTx extends StartConsoleSessionTx, StartViewerSessionTx {
|
|
12
|
+
signInTickets: SignInTicketRepository;
|
|
13
|
+
}
|
|
14
|
+
export type RedeemSignInTicketRefusal = DomainError<'SIGN_IN_TICKET_INVALID' | 'FLEET_NOT_FOUND' | 'NOT_THE_OPERATOR_SHIP' | 'FLEET_HAS_NO_VIEWER'>;
|
|
15
|
+
export type RedeemSignInTicket = (input: {
|
|
16
|
+
ticket: string;
|
|
17
|
+
/** The device it signs in from, as the console words it; an unknown device when not told. */
|
|
18
|
+
device?: string;
|
|
19
|
+
}) => Promise<Result<SignedIn, RedeemSignInTicketRefusal>>;
|
|
20
|
+
/**
|
|
21
|
+
* Use case: the console redeems a sign-in ticket the installation issued. An
|
|
22
|
+
* operator's ticket starts the session exactly as after a password sign-in:
|
|
23
|
+
* it takes argo's lease over and ends any previous session. A viewer's starts
|
|
24
|
+
* a viewer session beside any others (decision 0022). A ticket signs in once and
|
|
25
|
+
* only before it expires; used, expired and unknown tickets are one refusal,
|
|
26
|
+
* which says nothing about which it was.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createRedeemSignInTicket(deps: {
|
|
29
|
+
uow: UnitOfWork<RedeemSignInTicketTx>;
|
|
30
|
+
clock: Clock;
|
|
31
|
+
ids: IdGenerator;
|
|
32
|
+
hasher: SecretHasher;
|
|
33
|
+
random: RandomTokens;
|
|
34
|
+
}): RedeemSignInTicket;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { UNKNOWN_DEVICE } from './console-session.js';
|
|
3
|
+
import { startConsoleSession } from './start-console-session.js';
|
|
4
|
+
import { startViewerSession } from './start-viewer-session.js';
|
|
5
|
+
/**
|
|
6
|
+
* Use case: the console redeems a sign-in ticket the installation issued. An
|
|
7
|
+
* operator's ticket starts the session exactly as after a password sign-in:
|
|
8
|
+
* it takes argo's lease over and ends any previous session. A viewer's starts
|
|
9
|
+
* a viewer session beside any others (decision 0022). A ticket signs in once and
|
|
10
|
+
* only before it expires; used, expired and unknown tickets are one refusal,
|
|
11
|
+
* which says nothing about which it was.
|
|
12
|
+
*/
|
|
13
|
+
export function createRedeemSignInTicket(deps) {
|
|
14
|
+
return (input) => deps.uow.run(async (tx) => {
|
|
15
|
+
const at = deps.clock.now();
|
|
16
|
+
const redeemed = await tx.signInTickets.redeem(deps.hasher.hash(input.ticket), at);
|
|
17
|
+
if (redeemed === undefined) {
|
|
18
|
+
return refuse('SIGN_IN_TICKET_INVALID', 'This sign-in link is used or expired: sign in again');
|
|
19
|
+
}
|
|
20
|
+
const session = { fleetId: redeemed.fleetId, device: input.device ?? UNKNOWN_DEVICE, at };
|
|
21
|
+
const starting = { tx, ids: deps.ids, hasher: deps.hasher, random: deps.random };
|
|
22
|
+
return redeemed.as === 'viewer' ? startViewerSession(starting, session) : startConsoleSession(starting, session);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=redeem-sign-in-ticket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redeem-sign-in-ticket.js","sourceRoot":"","sources":["../../../src/domain/identity/redeem-sign-in-ticket.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAI/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAA8B,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAA6B,MAAM,2BAA2B,CAAC;AAc1F;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAMxC;IACC,OAAO,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAwD,EAAE;QAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,wBAAwB,EAAE,qDAAqD,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc,EAAE,EAAE,EAAE,CAAC;QAC1F,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QACjF,OAAO,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FleetId, IdGenerator, OperatorId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type LeaseTx, type ShipTx } from '../registry/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 { PasswordHasher } from '../shared/secrets.js';
|
|
7
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
|
+
import type { ConsoleSessionRepository, OperatorAccountRepository } from './ports.js';
|
|
9
|
+
export interface ResetOperatorPasswordTx extends LeaseTx, ShipTx {
|
|
10
|
+
operatorAccounts: OperatorAccountRepository;
|
|
11
|
+
consoleSessions: ConsoleSessionRepository;
|
|
12
|
+
}
|
|
13
|
+
export type ResetOperatorPassword = (input: {
|
|
14
|
+
fleetId: FleetId;
|
|
15
|
+
password: string;
|
|
16
|
+
}) => Promise<Result<{
|
|
17
|
+
operatorId: OperatorId;
|
|
18
|
+
}, DomainError<'INVALID_PASSWORD' | 'FLEET_NOT_FOUND' | 'OPERATOR_HAS_NO_PASSWORD'>>>;
|
|
19
|
+
/**
|
|
20
|
+
* Use case: a forgotten operator password is reset from the server (ADR 0012).
|
|
21
|
+
* The old password stops working, and every console session ends, and with it
|
|
22
|
+
* the lease on argo it held. A server command: the system is the actor, and
|
|
23
|
+
* the event concerns argo, so it shows on argo's timeline.
|
|
24
|
+
*
|
|
25
|
+
* Locks the account first, like sign-in, so a sign-in with the old password
|
|
26
|
+
* either finishes before the reset, whose session then ends, or sees the new
|
|
27
|
+
* password.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createResetOperatorPassword(deps: {
|
|
30
|
+
uow: UnitOfWork<ResetOperatorPasswordTx>;
|
|
31
|
+
clock: Clock;
|
|
32
|
+
ids: IdGenerator;
|
|
33
|
+
passwords: PasswordHasher;
|
|
34
|
+
}): ResetOperatorPassword;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { endLease, findOperatorShip } from '../registry/public.js';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { recordEvent, SYSTEM } from '../shared/events.js';
|
|
4
|
+
import { ok } from '../shared/result.js';
|
|
5
|
+
import { operatorPassword } from './operator-account.js';
|
|
6
|
+
/**
|
|
7
|
+
* Use case: a forgotten operator password is reset from the server (ADR 0012).
|
|
8
|
+
* The old password stops working, and every console session ends, and with it
|
|
9
|
+
* the lease on argo it held. A server command: the system is the actor, and
|
|
10
|
+
* the event concerns argo, so it shows on argo's timeline.
|
|
11
|
+
*
|
|
12
|
+
* Locks the account first, like sign-in, so a sign-in with the old password
|
|
13
|
+
* either finishes before the reset, whose session then ends, or sees the new
|
|
14
|
+
* password.
|
|
15
|
+
*/
|
|
16
|
+
export function createResetOperatorPassword(deps) {
|
|
17
|
+
return async ({ fleetId, password }) => {
|
|
18
|
+
const valid = operatorPassword(password);
|
|
19
|
+
if (!valid.isOk) {
|
|
20
|
+
return valid;
|
|
21
|
+
}
|
|
22
|
+
// Hashed before the transaction: Argon2 takes its time on purpose.
|
|
23
|
+
const passwordHash = await deps.passwords.hash(valid.value);
|
|
24
|
+
return deps.uow.run(async (tx) => {
|
|
25
|
+
const account = await tx.operatorAccounts.findForFleetForUpdate(fleetId);
|
|
26
|
+
if (!account) {
|
|
27
|
+
return refuse('FLEET_NOT_FOUND', `Fleet ${fleetId} does not exist`);
|
|
28
|
+
}
|
|
29
|
+
if (account.passwordHash === null) {
|
|
30
|
+
return refuse('OPERATOR_HAS_NO_PASSWORD', 'This operator has no password: they sign in only through the hosting service');
|
|
31
|
+
}
|
|
32
|
+
const argo = await findOperatorShip(tx, fleetId);
|
|
33
|
+
if (!argo.isOk) {
|
|
34
|
+
return argo;
|
|
35
|
+
}
|
|
36
|
+
const at = deps.clock.now();
|
|
37
|
+
await tx.operatorAccounts.changePassword({ fleetId, operatorId: account.id, passwordHash });
|
|
38
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, {
|
|
39
|
+
fleetId,
|
|
40
|
+
type: 'OperatorPasswordReset',
|
|
41
|
+
occurredAt: at,
|
|
42
|
+
actor: SYSTEM,
|
|
43
|
+
shipId: argo.value.id,
|
|
44
|
+
details: { operatorId: account.id },
|
|
45
|
+
});
|
|
46
|
+
for (const session of await tx.consoleSessions.endAll({ fleetId, shipId: argo.value.id }, { at, reason: 'passwordReset' })) {
|
|
47
|
+
if (session.leaseId !== null) {
|
|
48
|
+
await endLease({ tx, ids: deps.ids }, { fleetId, leaseId: session.leaseId, actor: SYSTEM, at, reason: 'passwordReset' });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return ok({ operatorId: account.id });
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=reset-operator-password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-operator-password.js","sourceRoot":"","sources":["../../../src/domain/identity/reset-operator-password.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAA6B,MAAM,uBAAuB,CAAC;AAE9F,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAazD;;;;;;;;;GASG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAK3C;IACC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAqC,EAAE;YAClE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC,iBAAiB,EAAE,SAAS,OAAO,iBAAiB,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBAClC,OAAO,MAAM,CAAC,0BAA0B,EAAE,8EAA8E,CAAC,CAAC;YAC5H,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAE5B,MAAM,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5F,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;gBACtD,OAAO;gBACP,IAAI,EAAE,uBAAuB;gBAC7B,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE;gBACrB,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE;aACpC,CAAC,CAAC;YAEH,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;gBAC3H,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC7B,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC3H,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Guide } from './guide.js';
|
|
2
|
+
import type { GuideRepository } from './ports.js';
|
|
3
|
+
export type SetGuide = (input: {
|
|
4
|
+
guide: Guide | null;
|
|
5
|
+
}) => Promise<Guide | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Use case: the installation sets the console's guide (decision 0024),
|
|
8
|
+
* replacing the one it set before; null clears it. No event: the guide
|
|
9
|
+
* belongs to the installation, not to a fleet.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createSetGuide(deps: {
|
|
12
|
+
guide: GuideRepository;
|
|
13
|
+
}): SetGuide;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use case: the installation sets the console's guide (decision 0024),
|
|
3
|
+
* replacing the one it set before; null clears it. No event: the guide
|
|
4
|
+
* belongs to the installation, not to a fleet.
|
|
5
|
+
*/
|
|
6
|
+
export function createSetGuide(deps) {
|
|
7
|
+
return async ({ guide }) => {
|
|
8
|
+
await deps.guide.replace(guide);
|
|
9
|
+
return guide;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=set-guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-guide.js","sourceRoot":"","sources":["../../../src/domain/identity/set-guide.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgC;IAC7D,OAAO,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QACzB,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Notice } from './notice.js';
|
|
2
|
+
import type { NoticeRepository } from './ports.js';
|
|
3
|
+
export type SetNotices = (input: {
|
|
4
|
+
notices: readonly Notice[];
|
|
5
|
+
}) => Promise<Notice[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Use case: the installation sets the console's notices (decision 0023),
|
|
8
|
+
* replacing those it set before, in its order; none clears them. No event:
|
|
9
|
+
* notices belong to the installation, not to a fleet.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createSetNotices(deps: {
|
|
12
|
+
notices: NoticeRepository;
|
|
13
|
+
}): SetNotices;
|