@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 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AACtF,MAAM,WAAW,GAAG,oEAAoE,CAAC;AAEzF,yGAAyG;AACzG,SAAS,QAAQ,CAAC,KAAa;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,CACL,GAAG,KAAK,IAAI;QACZ,GAAG,CAAC,QAAQ,KAAK,EAAE;QACnB,GAAG,CAAC,QAAQ,KAAK,EAAE;QACnB,GAAG,CAAC,QAAQ,KAAK,GAAG;QACpB,GAAG,CAAC,MAAM,KAAK,EAAE;QACjB,GAAG,CAAC,IAAI,KAAK,EAAE;QACf,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,4CAA4C,EAAE,CAAC;IACzG,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC;IACxF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9D,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjG,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC3F,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,wCAAwC,CAAC,CAAC,QAAQ,EAAE;IACjG,cAAc,EAAE,CAAC;SACd,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC;SAC7E,MAAM,CAAC,QAAQ,EAAE,oEAAoE,CAAC;SACtF,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;SAC7C,QAAQ,EAAE;IACb,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,6BAA6B,EAAE,oBAAoB,MAAM,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;CACrJ,CAAC,CAAC;AAEH,4DAA4D;AAC5D,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AA2BjF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,GAAG,aAAa,CAAC;CAC/B;AAED,8DAA8D;AAC9D,SAAS,aAAa,CAAC,KAAiB;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,OAAO,IAAI,WAAW,CAAC,2BAA2B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,eAAe,CAAC,WAA+C;IAC7E,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,WAA+C;IACxE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACxI,OAAO;QACL,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,SAAS;QACnB,gBAAgB,EAAE,WAAW,KAAK,MAAM;QACxC,YAAY,EAAE,aAAa;QAC3B,aAAa,EAAE,cAAc,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM;QAC3D,iBAAiB,EAAE,kBAAkB;KACtC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type LeaseEnded } from '../registry/public.js';
|
|
2
|
+
import type { Caller, Crew } from '../shared/caller.js';
|
|
3
|
+
import type { Clock } from '../shared/clock.js';
|
|
4
|
+
import { type DomainError } from '../shared/errors.js';
|
|
5
|
+
import { type Result } from '../shared/result.js';
|
|
6
|
+
import type { SecretHasher } from '../shared/secrets.js';
|
|
7
|
+
import type { ConsoleSessionEndReason } from './console-session.js';
|
|
8
|
+
import type { CallerLookup } from './ports.js';
|
|
9
|
+
export interface ConsoleSessionUse {
|
|
10
|
+
/** argo, crewed under the lease the session holds, or the viewer ship, holding none. */
|
|
11
|
+
caller: Caller | Crew;
|
|
12
|
+
/** The session's new expiry: its idle limit after this use, never past the moment it ends by. */
|
|
13
|
+
expiresAt: Date;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Why a crew token makes no caller: it never crewed a ship, or its lease has
|
|
17
|
+
* ended, so its session learns that the ship was released rather than that its
|
|
18
|
+
* token is wrong.
|
|
19
|
+
*/
|
|
20
|
+
export type CrewTokenRefusal = DomainError<'UNKNOWN_CREW_TOKEN'> | LeaseEnded;
|
|
21
|
+
export interface Authenticate {
|
|
22
|
+
/**
|
|
23
|
+
* The crew this token belongs to, while its lease is open: the ship and the
|
|
24
|
+
* lease. The ship secret is no crew token: it works only for `register`
|
|
25
|
+
* (ADR 0015).
|
|
26
|
+
*/
|
|
27
|
+
byCrewToken(crewToken: string): Promise<Result<Crew, CrewTokenRefusal>>;
|
|
28
|
+
/**
|
|
29
|
+
* The caller of this live console session, or undefined. Each use keeps the
|
|
30
|
+
* session valid for another 30 days, or a viewer's for another 2 hours and
|
|
31
|
+
* never past 24 hours after it started.
|
|
32
|
+
*/
|
|
33
|
+
byConsoleSession(token: string): Promise<ConsoleSessionUse | undefined>;
|
|
34
|
+
/**
|
|
35
|
+
* Why the console session of this token ended, so the console can say so:
|
|
36
|
+
* "You signed in somewhere else" is no failure. Undefined while it has not
|
|
37
|
+
* ended, once it has merely expired, or for a token no session has.
|
|
38
|
+
*/
|
|
39
|
+
endOfConsoleSession(token: string): Promise<ConsoleSessionEndReason | undefined>;
|
|
40
|
+
}
|
|
41
|
+
/** Use case: turns a crew token or a console session token into the caller. */
|
|
42
|
+
export declare function createAuthenticate(deps: {
|
|
43
|
+
callers: CallerLookup;
|
|
44
|
+
hasher: SecretHasher;
|
|
45
|
+
clock: Clock;
|
|
46
|
+
}): Authenticate;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { refuseEndedLease } from '../registry/public.js';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
/** Use case: turns a crew token or a console session token into the caller. */
|
|
5
|
+
export function createAuthenticate(deps) {
|
|
6
|
+
return {
|
|
7
|
+
byCrewToken: async (crewToken) => {
|
|
8
|
+
const lease = await deps.callers.byCrewTokenHash(deps.hasher.hash(crewToken), { at: deps.clock.now() });
|
|
9
|
+
if (!lease) {
|
|
10
|
+
return refuse('UNKNOWN_CREW_TOKEN', 'Call with the crew token register gave you');
|
|
11
|
+
}
|
|
12
|
+
return lease.isOpen ? ok(lease.crew) : refuseEndedLease();
|
|
13
|
+
},
|
|
14
|
+
byConsoleSession: (token) => deps.callers.useConsoleSession({ tokenHash: deps.hasher.hash(token), now: deps.clock.now() }),
|
|
15
|
+
endOfConsoleSession: (token) => deps.callers.consoleSessionEnding(deps.hasher.hash(token)),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=authenticate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../../../src/domain/identity/authenticate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,uBAAuB,CAAC;AAG1E,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAwCtD,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAmE;IACpG,OAAO;QACL,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxG,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC,oBAAoB,EAAE,4CAA4C,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC5D,CAAC;QACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1H,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3F,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ConsoleSessionId, FleetId, LeaseId, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { Location } from '../registry/public.js';
|
|
3
|
+
/**
|
|
4
|
+
* A console session: the operator crewing `argo`, or a person viewing the
|
|
5
|
+
* fleet through its viewer ship (decision 0022). Only the hash of the
|
|
6
|
+
* session token is stored; the token lives in the browser's cookie.
|
|
7
|
+
*/
|
|
8
|
+
export interface ConsoleSession {
|
|
9
|
+
id: ConsoleSessionId;
|
|
10
|
+
fleetId: FleetId;
|
|
11
|
+
shipId: ShipId;
|
|
12
|
+
/** The lease on `argo` this session holds; null for a viewer session, which holds none. */
|
|
13
|
+
leaseId: LeaseId | null;
|
|
14
|
+
/** How long after its last use the session stays valid. */
|
|
15
|
+
idleLimitMs: number;
|
|
16
|
+
/** The moment no use renews it past; null when only idleness ends it. */
|
|
17
|
+
endsBy: Date | null;
|
|
18
|
+
/** The device it signed in from, as the browser told: "Mac · Chrome". */
|
|
19
|
+
device: string;
|
|
20
|
+
tokenHash: string;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
lastUsedAt: Date;
|
|
23
|
+
expiresAt: Date;
|
|
24
|
+
endedAt: Date | null;
|
|
25
|
+
/** Why the session ended; null while it has not. */
|
|
26
|
+
endReason: ConsoleSessionEndReason | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Why a console session ended: the operator signed in somewhere else and took
|
|
30
|
+
* argo over, signed out, or the password was reset. An expired session never
|
|
31
|
+
* ended; it simply stopped working.
|
|
32
|
+
*/
|
|
33
|
+
export type ConsoleSessionEndReason = 'takenOver' | 'signedOut' | 'passwordReset';
|
|
34
|
+
/** The operator's console session stays valid this long after its last use. */
|
|
35
|
+
export declare const CONSOLE_SESSION_IDLE_LIMIT_MS: number;
|
|
36
|
+
/** A viewer session stays valid this long after its last use (decision 0022). */
|
|
37
|
+
export declare const VIEWER_SESSION_IDLE_LIMIT_MS: number;
|
|
38
|
+
/** No use renews a viewer session past this long after it started (decision 0022). */
|
|
39
|
+
export declare const VIEWER_SESSION_LIFETIME_MS: number;
|
|
40
|
+
/** The device of a sign-in that named none. */
|
|
41
|
+
export declare const UNKNOWN_DEVICE = "Unknown device";
|
|
42
|
+
/**
|
|
43
|
+
* Where a console session crews `argo` from: the device it signed in from, as
|
|
44
|
+
* the description of an OTHER location, the one kind that carries words.
|
|
45
|
+
*/
|
|
46
|
+
export declare function consoleLocation(device: string): Location;
|
|
47
|
+
/** When an operator's session used at `usedAt` expires: it is valid strictly before that moment. */
|
|
48
|
+
export declare function consoleSessionExpiry(usedAt: Date): Date;
|
|
49
|
+
/** A viewer session started at `at`: how long it lasts idle, when it ends at the latest, and when it first expires. */
|
|
50
|
+
export declare function viewerSessionTimes(at: Date): {
|
|
51
|
+
idleLimitMs: number;
|
|
52
|
+
endsBy: Date;
|
|
53
|
+
expiresAt: Date;
|
|
54
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** The operator's console session stays valid this long after its last use. */
|
|
2
|
+
export const CONSOLE_SESSION_IDLE_LIMIT_MS = 30 * 24 * 60 * 60 * 1000;
|
|
3
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
4
|
+
/** A viewer session stays valid this long after its last use (decision 0022). */
|
|
5
|
+
export const VIEWER_SESSION_IDLE_LIMIT_MS = 2 * HOUR_MS;
|
|
6
|
+
/** No use renews a viewer session past this long after it started (decision 0022). */
|
|
7
|
+
export const VIEWER_SESSION_LIFETIME_MS = 24 * HOUR_MS;
|
|
8
|
+
/** The device of a sign-in that named none. */
|
|
9
|
+
export const UNKNOWN_DEVICE = 'Unknown device';
|
|
10
|
+
/**
|
|
11
|
+
* Where a console session crews `argo` from: the device it signed in from, as
|
|
12
|
+
* the description of an OTHER location, the one kind that carries words.
|
|
13
|
+
*/
|
|
14
|
+
export function consoleLocation(device) {
|
|
15
|
+
return { kind: 'OTHER', description: device };
|
|
16
|
+
}
|
|
17
|
+
/** When an operator's session used at `usedAt` expires: it is valid strictly before that moment. */
|
|
18
|
+
export function consoleSessionExpiry(usedAt) {
|
|
19
|
+
return new Date(usedAt.getTime() + CONSOLE_SESSION_IDLE_LIMIT_MS);
|
|
20
|
+
}
|
|
21
|
+
/** A viewer session started at `at`: how long it lasts idle, when it ends at the latest, and when it first expires. */
|
|
22
|
+
export function viewerSessionTimes(at) {
|
|
23
|
+
return {
|
|
24
|
+
idleLimitMs: VIEWER_SESSION_IDLE_LIMIT_MS,
|
|
25
|
+
endsBy: new Date(at.getTime() + VIEWER_SESSION_LIFETIME_MS),
|
|
26
|
+
expiresAt: new Date(at.getTime() + VIEWER_SESSION_IDLE_LIMIT_MS),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=console-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-session.js","sourceRoot":"","sources":["../../../src/domain/identity/console-session.ts"],"names":[],"mappings":"AAqCA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtE,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE/B,iFAAiF;AACjF,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,OAAO,CAAC;AAExD,sFAAsF;AACtF,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,OAAO,CAAC;AAEvD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,oBAAoB,CAAC,MAAY;IAC/C,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,6BAA6B,CAAC,CAAC;AACpE,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,kBAAkB,CAAC,EAAQ;IACzC,OAAO;QACL,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,0BAA0B,CAAC;QAC3D,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,4BAA4B,CAAC;KACjE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CredentialId, FleetId, IdGenerator, ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Actor, type EventLog } from '../shared/events.js';
|
|
4
|
+
import { type Result } from '../shared/result.js';
|
|
5
|
+
import type { RandomTokens, SecretHasher } from '../shared/secrets.js';
|
|
6
|
+
import type { CredentialRepository } from './ports.js';
|
|
7
|
+
/** Versioned prefix of every ship secret (ADR 0002). */
|
|
8
|
+
export declare const SHIP_SECRET_PREFIX = "aeolus_sk_v1_";
|
|
9
|
+
/** A ship secret, stored only as its hash. At most one valid secret per ship. */
|
|
10
|
+
export interface Credential {
|
|
11
|
+
id: CredentialId;
|
|
12
|
+
fleetId: FleetId;
|
|
13
|
+
shipId: ShipId;
|
|
14
|
+
secretHash: string;
|
|
15
|
+
issuedAt: Date;
|
|
16
|
+
claimedAt: Date | null;
|
|
17
|
+
invalidatedAt: Date | null;
|
|
18
|
+
}
|
|
19
|
+
export interface CredentialTx {
|
|
20
|
+
credentials: CredentialRepository;
|
|
21
|
+
}
|
|
22
|
+
export interface SecretTools {
|
|
23
|
+
hasher: SecretHasher;
|
|
24
|
+
random: RandomTokens;
|
|
25
|
+
ids: IdGenerator;
|
|
26
|
+
}
|
|
27
|
+
export interface IssuedShipSecret {
|
|
28
|
+
/** The secret in plain text: the one moment it exists. */
|
|
29
|
+
secret: string;
|
|
30
|
+
credentialId: CredentialId;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Issues a new secret for a ship and stores only its hash. The caller
|
|
34
|
+
* invalidates any earlier secret first.
|
|
35
|
+
*/
|
|
36
|
+
export declare function issueShipSecret(deps: SecretTools & {
|
|
37
|
+
tx: CredentialTx;
|
|
38
|
+
}, input: {
|
|
39
|
+
fleetId: FleetId;
|
|
40
|
+
shipId: ShipId;
|
|
41
|
+
at: Date;
|
|
42
|
+
}): Promise<IssuedShipSecret>;
|
|
43
|
+
/**
|
|
44
|
+
* Invalidates the ship's valid secret, if it has one, and writes
|
|
45
|
+
* CredentialRevoked. The secret fails on the very next call.
|
|
46
|
+
*/
|
|
47
|
+
export declare function revokeShipSecret(deps: {
|
|
48
|
+
tx: CredentialTx & {
|
|
49
|
+
events: EventLog;
|
|
50
|
+
};
|
|
51
|
+
ids: IdGenerator;
|
|
52
|
+
}, input: {
|
|
53
|
+
fleetId: FleetId;
|
|
54
|
+
shipId: ShipId;
|
|
55
|
+
actor: Actor;
|
|
56
|
+
at: Date;
|
|
57
|
+
}): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* The given ship's valid secret, locked until the unit of work ends: a claim
|
|
60
|
+
* locks it before it opens the lease, so it serialises with a new starting
|
|
61
|
+
* prompt, which locks the same row before it replaces the secret. One refusal
|
|
62
|
+
* for an unknown secret, an invalidated one, another ship's and an unknown
|
|
63
|
+
* ship id, so the answer says nothing about which ids or secrets exist.
|
|
64
|
+
*/
|
|
65
|
+
export declare function findValidShipSecret(deps: {
|
|
66
|
+
tx: CredentialTx;
|
|
67
|
+
hasher: SecretHasher;
|
|
68
|
+
}, input: {
|
|
69
|
+
shipId: ShipId;
|
|
70
|
+
secret: string;
|
|
71
|
+
}): Promise<Result<Credential, DomainError<'WRONG_SHIP_ID_OR_SECRET'>>>;
|
|
72
|
+
/** Marks the secret claimed: a session crews the ship with it. The first claim's date stays. */
|
|
73
|
+
export declare function markShipSecretClaimed(tx: CredentialTx, claim: {
|
|
74
|
+
credential: Credential;
|
|
75
|
+
at: Date;
|
|
76
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { refuse } from '../shared/errors.js';
|
|
2
|
+
import { recordEvent } from '../shared/events.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
/** Versioned prefix of every ship secret (ADR 0002). */
|
|
5
|
+
export const SHIP_SECRET_PREFIX = 'aeolus_sk_v1_';
|
|
6
|
+
/**
|
|
7
|
+
* Issues a new secret for a ship and stores only its hash. The caller
|
|
8
|
+
* invalidates any earlier secret first.
|
|
9
|
+
*/
|
|
10
|
+
export async function issueShipSecret(deps, input) {
|
|
11
|
+
const secret = SHIP_SECRET_PREFIX + deps.random.next();
|
|
12
|
+
const credentialId = deps.ids('credential');
|
|
13
|
+
await deps.tx.credentials.create({
|
|
14
|
+
id: credentialId,
|
|
15
|
+
fleetId: input.fleetId,
|
|
16
|
+
shipId: input.shipId,
|
|
17
|
+
secretHash: deps.hasher.hash(secret),
|
|
18
|
+
issuedAt: input.at,
|
|
19
|
+
claimedAt: null,
|
|
20
|
+
invalidatedAt: null,
|
|
21
|
+
});
|
|
22
|
+
return { secret, credentialId };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Invalidates the ship's valid secret, if it has one, and writes
|
|
26
|
+
* CredentialRevoked. The secret fails on the very next call.
|
|
27
|
+
*/
|
|
28
|
+
export async function revokeShipSecret(deps, input) {
|
|
29
|
+
const { tx, ids } = deps;
|
|
30
|
+
const { fleetId, shipId, actor, at } = input;
|
|
31
|
+
const valid = await tx.credentials.findValidForShipForUpdate(fleetId, shipId);
|
|
32
|
+
if (!valid) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
await tx.credentials.invalidate({ fleetId, credentialId: valid.id, at });
|
|
36
|
+
await recordEvent({ events: tx.events, ids }, {
|
|
37
|
+
fleetId,
|
|
38
|
+
type: 'CredentialRevoked',
|
|
39
|
+
occurredAt: at,
|
|
40
|
+
actor,
|
|
41
|
+
shipId,
|
|
42
|
+
details: { credentialId: valid.id },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The given ship's valid secret, locked until the unit of work ends: a claim
|
|
47
|
+
* locks it before it opens the lease, so it serialises with a new starting
|
|
48
|
+
* prompt, which locks the same row before it replaces the secret. One refusal
|
|
49
|
+
* for an unknown secret, an invalidated one, another ship's and an unknown
|
|
50
|
+
* ship id, so the answer says nothing about which ids or secrets exist.
|
|
51
|
+
*/
|
|
52
|
+
export async function findValidShipSecret(deps, input) {
|
|
53
|
+
const credential = await deps.tx.credentials.findValidBySecretHashForUpdate(deps.hasher.hash(input.secret));
|
|
54
|
+
return credential?.shipId === input.shipId
|
|
55
|
+
? ok(credential)
|
|
56
|
+
: refuse('WRONG_SHIP_ID_OR_SECRET', 'Wrong ship id or secret');
|
|
57
|
+
}
|
|
58
|
+
/** Marks the secret claimed: a session crews the ship with it. The first claim's date stays. */
|
|
59
|
+
export async function markShipSecretClaimed(tx, claim) {
|
|
60
|
+
const { credential, at } = claim;
|
|
61
|
+
await tx.credentials.markClaimed({ fleetId: credential.fleetId, credentialId: credential.id, at });
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential.js","sourceRoot":"","sources":["../../../src/domain/identity/credential.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAA6B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAItD,wDAAwD;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,eAAe,CAAC;AA6BlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAwC,EACxC,KAAqD;IAErD,MAAM,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;QAC/B,EAAE,EAAE,YAAY;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,QAAQ,EAAE,KAAK,CAAC,EAAE;QAClB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAmE,EACnE,KAAmE;IAEnE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IAE7C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,yBAAyB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,MAAM,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzE,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC5C,OAAO;QACP,IAAI,EAAE,mBAAmB;QACzB,UAAU,EAAE,EAAE;QACd,KAAK;QACL,MAAM;QACN,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,EAAE;KACpC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAgD,EAChD,KAAyC;IAEzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,8BAA8B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5G,OAAO,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC,MAAM;QACxC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAChB,CAAC,CAAC,MAAM,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAC;AACnE,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAgB,EAAE,KAA2C;IACvG,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IACjC,MAAM,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACrG,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 { NoticeDismissals, NoticeRepository } from './ports.js';
|
|
6
|
+
export type DismissNoticeRefusal = DomainError<'NOTICE_NOT_FOUND' | 'NOTICE_NOT_DISMISSIBLE'>;
|
|
7
|
+
export type DismissNotice = (caller: Caller, input: {
|
|
8
|
+
noticeId: string;
|
|
9
|
+
}) => Promise<Result<undefined, DismissNoticeRefusal>>;
|
|
10
|
+
/**
|
|
11
|
+
* Use case: a console session dismisses a dismissible notice it sees, for
|
|
12
|
+
* itself only (decision 0023); again is OK and changes nothing. No event: a
|
|
13
|
+
* notice is how the console looks, not a change to the fleet.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createDismissNotice(deps: {
|
|
16
|
+
notices: NoticeRepository;
|
|
17
|
+
dismissals: NoticeDismissals;
|
|
18
|
+
clock: Clock;
|
|
19
|
+
}): DismissNotice;
|
|
@@ -0,0 +1,23 @@
|
|
|
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 dismisses a dismissible notice it sees, for
|
|
6
|
+
* itself only (decision 0023); again is OK and changes nothing. No event: a
|
|
7
|
+
* notice is how the console looks, not a change to the fleet.
|
|
8
|
+
*/
|
|
9
|
+
export function createDismissNotice(deps) {
|
|
10
|
+
return async (caller, { noticeId }) => {
|
|
11
|
+
const { consoleSessionId } = caller;
|
|
12
|
+
const notice = (await deps.notices.read()).find((each) => each.id === noticeId && isForSessionOf(each, caller.kind));
|
|
13
|
+
if (consoleSessionId === undefined || notice === undefined) {
|
|
14
|
+
return refuse('NOTICE_NOT_FOUND', `No notice ${noticeId} shows in this console session`);
|
|
15
|
+
}
|
|
16
|
+
if (!notice.isDismissible) {
|
|
17
|
+
return refuse('NOTICE_NOT_DISMISSIBLE', `Notice ${noticeId} stays: the installation made it not dismissible`);
|
|
18
|
+
}
|
|
19
|
+
await deps.dismissals.dismiss({ fleetId: caller.fleetId, consoleSessionId, noticeId, at: deps.clock.now() });
|
|
20
|
+
return ok(undefined);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=dismiss-notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dismiss-notice.js","sourceRoot":"","sources":["../../../src/domain/identity/dismiss-notice.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA+E;IACjH,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACpC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACrH,IAAI,gBAAgB,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAC,kBAAkB,EAAE,aAAa,QAAQ,gCAAgC,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,wBAAwB,EAAE,UAAU,QAAQ,kDAAkD,CAAC,CAAC;QAChH,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,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,7 @@
|
|
|
1
|
+
import type { Guide } from './guide.js';
|
|
2
|
+
import type { GuideRepository } from './ports.js';
|
|
3
|
+
export type GetGuide = () => Promise<Guide | null>;
|
|
4
|
+
/** Use case: the guide the installation set (decision 0024); none before it sets one. */
|
|
5
|
+
export declare function createGetGuide(deps: {
|
|
6
|
+
guide: GuideRepository;
|
|
7
|
+
}): GetGuide;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-guide.js","sourceRoot":"","sources":["../../../src/domain/identity/get-guide.ts"],"names":[],"mappings":"AAKA,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAAgC;IAC7D,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Notice } from './notice.js';
|
|
2
|
+
import type { NoticeRepository } from './ports.js';
|
|
3
|
+
export type GetNotices = () => Promise<Notice[]>;
|
|
4
|
+
/** Use case: the notices the installation set (decision 0023), in its order; none before it sets any. */
|
|
5
|
+
export declare function createGetNotices(deps: {
|
|
6
|
+
notices: NoticeRepository;
|
|
7
|
+
}): GetNotices;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-notices.js","sourceRoot":"","sources":["../../../src/domain/identity/get-notices.ts"],"names":[],"mappings":"AAKA,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,IAAmC;IAClE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GuideProgressState, NoticeAudience } from '@aeolus-fleet/common';
|
|
2
|
+
/** A guide's step (decision 0024): a console page, the element it points at (centred without one), a title and a text. */
|
|
3
|
+
export interface GuideStep {
|
|
4
|
+
path: string;
|
|
5
|
+
anchor?: string;
|
|
6
|
+
title: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The guide (decision 0024): steps the installation sets for the console
|
|
11
|
+
* sessions of one audience. Its shape is checked where the installation sets
|
|
12
|
+
* it (`setGuideInputSchema`); here it is trusted.
|
|
13
|
+
*/
|
|
14
|
+
export interface Guide {
|
|
15
|
+
audience: NoticeAudience;
|
|
16
|
+
steps: readonly GuideStep[];
|
|
17
|
+
}
|
|
18
|
+
/** Where a console session is in the guide: open at a step, counted from 0, or skipped or finished. */
|
|
19
|
+
export interface GuideProgress {
|
|
20
|
+
step: number;
|
|
21
|
+
state: GuideProgressState;
|
|
22
|
+
}
|
|
23
|
+
/** A session that has not moved in the guide yet: open at its first step, so the guide opens by itself. */
|
|
24
|
+
export declare const NOT_STARTED: GuideProgress;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../../src/domain/identity/guide.ts"],"names":[],"mappings":"AA0BA,2GAA2G;AAC3G,MAAM,CAAC,MAAM,WAAW,GAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { FleetId, IdGenerator } from '@aeolus-fleet/common';
|
|
2
|
+
import { 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 EventLog } from '../shared/events.js';
|
|
6
|
+
import { type Result } from '../shared/result.js';
|
|
7
|
+
import type { RandomTokens, SecretHasher } from '../shared/secrets.js';
|
|
8
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
9
|
+
import type { OperatorAccountRepository, SignInTicketRepository } from './ports.js';
|
|
10
|
+
import { type SignInAs } from './sign-in-ticket.js';
|
|
11
|
+
export interface IssueSignInTicketTx extends ShipTx {
|
|
12
|
+
operatorAccounts: OperatorAccountRepository;
|
|
13
|
+
signInTickets: SignInTicketRepository;
|
|
14
|
+
events: EventLog;
|
|
15
|
+
}
|
|
16
|
+
export type IssueSignInTicketRefusal = DomainError<'FLEET_NOT_FOUND' | 'FLEET_HAS_NO_VIEWER'>;
|
|
17
|
+
export type IssueSignInTicket = (input: {
|
|
18
|
+
fleetId: FleetId;
|
|
19
|
+
/** Whom it signs in as: the operator when left out, or a viewer of a fleet with a viewer ship (decision 0022). */
|
|
20
|
+
as?: SignInAs;
|
|
21
|
+
}) => Promise<Result<{
|
|
22
|
+
ticket: string;
|
|
23
|
+
}, IssueSignInTicketRefusal>>;
|
|
24
|
+
/**
|
|
25
|
+
* Use case: the installation issues a one-time sign-in ticket for a fleet's
|
|
26
|
+
* operator, or for a viewer of a fleet with a viewer ship (docs/blueprint.md,
|
|
27
|
+
* "Installation"; decision 0022): the hosting service hands it to the
|
|
28
|
+
* person's browser, and the console redeems it for a session. Only
|
|
29
|
+
* its hash is stored; it is valid 2 minutes and signs in once. Each ticket
|
|
30
|
+
* stands alone: a new one leaves an earlier unused one to expire.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createIssueSignInTicket(deps: {
|
|
33
|
+
uow: UnitOfWork<IssueSignInTicketTx>;
|
|
34
|
+
clock: Clock;
|
|
35
|
+
ids: IdGenerator;
|
|
36
|
+
hasher: SecretHasher;
|
|
37
|
+
random: RandomTokens;
|
|
38
|
+
}): IssueSignInTicket;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { findViewerShip } 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 { SIGN_IN_TICKET_PREFIX, SIGN_IN_TICKET_VALID_MS } from './sign-in-ticket.js';
|
|
6
|
+
/**
|
|
7
|
+
* Use case: the installation issues a one-time sign-in ticket for a fleet's
|
|
8
|
+
* operator, or for a viewer of a fleet with a viewer ship (docs/blueprint.md,
|
|
9
|
+
* "Installation"; decision 0022): the hosting service hands it to the
|
|
10
|
+
* person's browser, and the console redeems it for a session. Only
|
|
11
|
+
* its hash is stored; it is valid 2 minutes and signs in once. Each ticket
|
|
12
|
+
* stands alone: a new one leaves an earlier unused one to expire.
|
|
13
|
+
*/
|
|
14
|
+
export function createIssueSignInTicket(deps) {
|
|
15
|
+
return ({ fleetId, as = 'operator' }) => deps.uow.run(async (tx) => {
|
|
16
|
+
if (!(await tx.operatorAccounts.findForFleet(fleetId))) {
|
|
17
|
+
return refuse('FLEET_NOT_FOUND', `The installation hosts no fleet ${fleetId}`);
|
|
18
|
+
}
|
|
19
|
+
if (as === 'viewer') {
|
|
20
|
+
const viewer = await findViewerShip(tx, fleetId);
|
|
21
|
+
if (!viewer.isOk) {
|
|
22
|
+
return viewer;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const at = deps.clock.now();
|
|
26
|
+
const ticket = SIGN_IN_TICKET_PREFIX + deps.random.next();
|
|
27
|
+
await tx.signInTickets.create({
|
|
28
|
+
fleetId,
|
|
29
|
+
as,
|
|
30
|
+
tokenHash: deps.hasher.hash(ticket),
|
|
31
|
+
issuedAt: at,
|
|
32
|
+
expiresAt: new Date(at.getTime() + SIGN_IN_TICKET_VALID_MS),
|
|
33
|
+
usedAt: null,
|
|
34
|
+
});
|
|
35
|
+
await recordEvent({ events: tx.events, ids: deps.ids }, { fleetId, type: 'SignInTicketIssued', occurredAt: at, actor: SYSTEM, details: { as } });
|
|
36
|
+
return ok({ ticket });
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=issue-sign-in-ticket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-sign-in-ticket.js","sourceRoot":"","sources":["../../../src/domain/identity/issue-sign-in-ticket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,EAAiB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAiB,MAAM,qBAAqB,CAAC;AAgBpG;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAMvC;IACC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,CACtC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAiE,EAAE;QACvF,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACvD,OAAO,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;YAC5B,OAAO;YACP,EAAE;YACF,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAC;YAC3D,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACjJ,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { NoticeAudience, NoticeLink, ShipKind } from '@aeolus-fleet/common';
|
|
2
|
+
/**
|
|
3
|
+
* A notice (decision 0023): plain text the installation shows above every
|
|
4
|
+
* console page to the sessions of its audience, with optional links, and
|
|
5
|
+
* dismissible or not. Its shape is checked where the installation sets it
|
|
6
|
+
* (`setNoticesInputSchema`); here it is trusted.
|
|
7
|
+
*/
|
|
8
|
+
export interface Notice {
|
|
9
|
+
id: string;
|
|
10
|
+
audience: NoticeAudience;
|
|
11
|
+
text: string;
|
|
12
|
+
links: readonly NoticeLink[];
|
|
13
|
+
isDismissible: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Whether a console session of a ship of this kind sees the notice (or the guide, decision 0024): everyone's always, the operators' on argo, the viewers' on the viewer ship. */
|
|
16
|
+
export declare function isForSessionOf(notice: Pick<Notice, 'audience'>, kind: ShipKind): boolean;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Whether a console session of a ship of this kind sees the notice (or the guide, decision 0024): everyone's always, the operators' on argo, the viewers' on the viewer ship. */
|
|
2
|
+
export function isForSessionOf(notice, kind) {
|
|
3
|
+
switch (notice.audience) {
|
|
4
|
+
case 'everyone':
|
|
5
|
+
return true;
|
|
6
|
+
case 'operators':
|
|
7
|
+
return kind === 'operator';
|
|
8
|
+
case 'viewers':
|
|
9
|
+
return kind === 'viewer';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notice.js","sourceRoot":"","sources":["../../../src/domain/identity/notice.ts"],"names":[],"mappings":"AAgBA,kLAAkL;AAClL,MAAM,UAAU,cAAc,CAAC,MAAgC,EAAE,IAAc;IAC7E,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,KAAK,UAAU,CAAC;QAC7B,KAAK,SAAS;YACZ,OAAO,IAAI,KAAK,QAAQ,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type FleetId, type OperatorId, type Theme } from '@aeolus-fleet/common';
|
|
2
|
+
import { type DomainError } from '../shared/errors.js';
|
|
3
|
+
import { type Result } from '../shared/result.js';
|
|
4
|
+
/**
|
|
5
|
+
* The operator's login (ADR 0012): signing in with its email and password
|
|
6
|
+
* crews `argo`. One account per fleet in v1. Only the Argon2id hash of the
|
|
7
|
+
* password is stored, and an operator may have no password at all.
|
|
8
|
+
*/
|
|
9
|
+
export interface OperatorAccount {
|
|
10
|
+
id: OperatorId;
|
|
11
|
+
fleetId: FleetId;
|
|
12
|
+
/** Normalised: unique across the installation, found before the fleet is known (ADR 0007). */
|
|
13
|
+
email: string;
|
|
14
|
+
/**
|
|
15
|
+
* The Argon2id hash of the password; null for an operator who has none,
|
|
16
|
+
* such as one a hosting installation created, who signs in another way.
|
|
17
|
+
*/
|
|
18
|
+
passwordHash: string | null;
|
|
19
|
+
/** How the console looks for this operator; System until they choose. */
|
|
20
|
+
theme: Theme;
|
|
21
|
+
createdAt: Date;
|
|
22
|
+
}
|
|
23
|
+
/** The form an email is stored and found in: without the spaces around it, in lowercase. */
|
|
24
|
+
export declare function normaliseEmail(raw: string): string;
|
|
25
|
+
/** An operator email, normalised: one @ with something on each side, no whitespace, at most 254 characters. */
|
|
26
|
+
export declare function operatorEmail(raw: string): Result<string, DomainError<'INVALID_EMAIL'>>;
|
|
27
|
+
/** Any password of 1 to 1024 characters, kept exactly as typed: no strength rules (ADR 0016). */
|
|
28
|
+
export declare function operatorPassword(raw: string): Result<string, DomainError<'INVALID_PASSWORD'>>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OPERATOR_EMAIL_MAX_LENGTH, OPERATOR_EMAIL_PATTERN, OPERATOR_PASSWORD_MAX_LENGTH, } from '@aeolus-fleet/common';
|
|
2
|
+
import { refuse } from '../shared/errors.js';
|
|
3
|
+
import { ok } from '../shared/result.js';
|
|
4
|
+
/** The form an email is stored and found in: without the spaces around it, in lowercase. */
|
|
5
|
+
export function normaliseEmail(raw) {
|
|
6
|
+
return raw.trim().toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
/** An operator email, normalised: one @ with something on each side, no whitespace, at most 254 characters. */
|
|
9
|
+
export function operatorEmail(raw) {
|
|
10
|
+
const email = normaliseEmail(raw);
|
|
11
|
+
return email.length <= OPERATOR_EMAIL_MAX_LENGTH && OPERATOR_EMAIL_PATTERN.test(email)
|
|
12
|
+
? ok(email)
|
|
13
|
+
: refuse('INVALID_EMAIL', `An operator email is an address like name@example.com, at most ${String(OPERATOR_EMAIL_MAX_LENGTH)} characters`);
|
|
14
|
+
}
|
|
15
|
+
/** Any password of 1 to 1024 characters, kept exactly as typed: no strength rules (ADR 0016). */
|
|
16
|
+
export function operatorPassword(raw) {
|
|
17
|
+
return raw.length > 0 && raw.length <= OPERATOR_PASSWORD_MAX_LENGTH
|
|
18
|
+
? ok(raw)
|
|
19
|
+
: refuse('INVALID_PASSWORD', `A password is 1 to ${String(OPERATOR_PASSWORD_MAX_LENGTH)} characters`);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=operator-account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-account.js","sourceRoot":"","sources":["../../../src/domain/identity/operator-account.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,GAI7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAsBtD,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,MAAM,IAAI,yBAAyB,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC;QACpF,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,MAAM,CACJ,eAAe,EACf,kEAAkE,MAAM,CAAC,yBAAyB,CAAC,aAAa,CACjH,CAAC;AACR,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,4BAA4B;QACjE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;QACT,CAAC,CAAC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,MAAM,CAAC,4BAA4B,CAAC,aAAa,CAAC,CAAC;AAC1G,CAAC"}
|