@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,350 @@
|
|
|
1
|
+
import { initTRPC, TRPCError } from '@trpc/server';
|
|
2
|
+
import { hasScope, isCrew } from '../../domain/shared/caller.js';
|
|
3
|
+
/** All a caller learns of a server failure, with the request's id; the log keeps the rest under that id. */
|
|
4
|
+
export const INTERNAL_ERROR_MESSAGE = 'Internal error';
|
|
5
|
+
// Never development mode, whatever NODE_ENV says: in it tRPC puts the stack
|
|
6
|
+
// trace into every error it answers. A server failure answers only that it
|
|
7
|
+
// failed and the request's id; a refusal keeps its own code and message.
|
|
8
|
+
/**
|
|
9
|
+
* What the console reads beside a refusal's code, to say more than "refused":
|
|
10
|
+
* that the operator signed in somewhere else, or when a rate-limited sign-in
|
|
11
|
+
* may try again (ISO 8601). Carried as the tRPC error's cause; the error data
|
|
12
|
+
* holds its fields.
|
|
13
|
+
*/
|
|
14
|
+
export class ConsoleRefusalDetails extends Error {
|
|
15
|
+
name = 'ConsoleRefusalDetails';
|
|
16
|
+
details;
|
|
17
|
+
constructor(details) {
|
|
18
|
+
super('console refusal details');
|
|
19
|
+
this.details = details;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const t = initTRPC.context().meta().create({
|
|
23
|
+
isDev: false,
|
|
24
|
+
errorFormatter: ({ shape, error, ctx }) => {
|
|
25
|
+
if (error.code === 'INTERNAL_SERVER_ERROR') {
|
|
26
|
+
return { ...shape, message: INTERNAL_ERROR_MESSAGE, data: { ...shape.data, requestId: ctx?.requestId } };
|
|
27
|
+
}
|
|
28
|
+
return error.cause instanceof ConsoleRefusalDetails
|
|
29
|
+
? { ...shape, data: { ...shape.data, ...error.cause.details } }
|
|
30
|
+
: shape;
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
export const router = t.router;
|
|
34
|
+
const ERROR_CODES = {
|
|
35
|
+
DELIVERY_HELD_BY_ANOTHER_SHIP: 'FORBIDDEN',
|
|
36
|
+
DELIVERY_NOT_FOUND: 'NOT_FOUND',
|
|
37
|
+
DELIVERY_NOT_A_PING: 'CONFLICT',
|
|
38
|
+
ASSIGNEE_NOT_ACTIVE: 'BAD_REQUEST',
|
|
39
|
+
CREW_REQUEST_ALREADY_ASSIGNED: 'CONFLICT',
|
|
40
|
+
CREW_REQUEST_NOT_ASSIGNED_TO_CALLER: 'FORBIDDEN',
|
|
41
|
+
CREW_REQUEST_NOT_FOUND: 'NOT_FOUND',
|
|
42
|
+
CREW_REQUEST_NOT_RELEASING: 'CONFLICT',
|
|
43
|
+
CREW_REQUEST_RELEASING: 'CONFLICT',
|
|
44
|
+
// BAD_REQUEST, as for a payload or report details over their limit.
|
|
45
|
+
CREW_REQUEST_SETTINGS_TOO_LARGE: 'BAD_REQUEST',
|
|
46
|
+
DELIVERY_NOT_IN_FLIGHT: 'CONFLICT',
|
|
47
|
+
DELIVERY_NOT_OPEN: 'CONFLICT',
|
|
48
|
+
DELIVERY_NOT_UNDELIVERABLE: 'CONFLICT',
|
|
49
|
+
FLEET_ALREADY_EXISTS: 'CONFLICT',
|
|
50
|
+
FLEET_LIMIT_REACHED: 'FORBIDDEN',
|
|
51
|
+
FLEET_NOT_FOUND: 'NOT_FOUND',
|
|
52
|
+
FLEET_HAS_NO_VIEWER: 'NOT_FOUND',
|
|
53
|
+
NOTICE_NOT_FOUND: 'NOT_FOUND',
|
|
54
|
+
NOTICE_NOT_DISMISSIBLE: 'BAD_REQUEST',
|
|
55
|
+
GUIDE_NOT_FOUND: 'NOT_FOUND',
|
|
56
|
+
GUIDE_STEP_NOT_FOUND: 'BAD_REQUEST',
|
|
57
|
+
IDEMPOTENCY_KEY_REUSED: 'CONFLICT',
|
|
58
|
+
IN_REPLY_TO_NOT_FOUND: 'NOT_FOUND',
|
|
59
|
+
MESSAGE_LIMIT_REACHED: 'FORBIDDEN',
|
|
60
|
+
MODEL_REQUIRED: 'BAD_REQUEST',
|
|
61
|
+
INVALID_HARNESS: 'BAD_REQUEST',
|
|
62
|
+
MODEL_FROM_ARGO: 'BAD_REQUEST',
|
|
63
|
+
INVALID_CONTENT_TYPE: 'BAD_REQUEST',
|
|
64
|
+
INVALID_EMAIL: 'BAD_REQUEST',
|
|
65
|
+
INVALID_FLEET_NAME: 'BAD_REQUEST',
|
|
66
|
+
INVALID_FOLLOW_MAX: 'BAD_REQUEST',
|
|
67
|
+
INVALID_FOLLOW_WAIT: 'BAD_REQUEST',
|
|
68
|
+
INVALID_IDEMPOTENCY_KEY: 'BAD_REQUEST',
|
|
69
|
+
INVALID_INBOX_WAIT: 'BAD_REQUEST',
|
|
70
|
+
INVALID_LIMIT: 'BAD_REQUEST',
|
|
71
|
+
INVALID_LOCATION: 'BAD_REQUEST',
|
|
72
|
+
INVALID_PASSWORD: 'BAD_REQUEST',
|
|
73
|
+
INVALID_RECEIVE_MAX: 'BAD_REQUEST',
|
|
74
|
+
INVALID_CREW_REQUEST_REASON: 'BAD_REQUEST',
|
|
75
|
+
INVALID_REPORT_DETAILS: 'BAD_REQUEST',
|
|
76
|
+
INVALID_REPORT_NOTE: 'BAD_REQUEST',
|
|
77
|
+
INVALID_REPORT_STATE: 'BAD_REQUEST',
|
|
78
|
+
INVALID_SHIP_NAME: 'BAD_REQUEST',
|
|
79
|
+
INVALID_SHIP_NOTE: 'BAD_REQUEST',
|
|
80
|
+
INVALID_SHIP_TYPE: 'BAD_REQUEST',
|
|
81
|
+
// The crew token belonged to that lease: it no longer authenticates anyone.
|
|
82
|
+
LEASE_ENDED: 'UNAUTHORIZED',
|
|
83
|
+
MESSAGE_NOT_FOUND: 'NOT_FOUND',
|
|
84
|
+
NOT_THE_OPERATOR_SHIP: 'FORBIDDEN',
|
|
85
|
+
OPERATOR_EMAIL_TAKEN: 'CONFLICT',
|
|
86
|
+
OPERATOR_HAS_NO_PASSWORD: 'CONFLICT',
|
|
87
|
+
OPERATOR_SHIP_GETS_NO_STARTING_PROMPT: 'FORBIDDEN',
|
|
88
|
+
OPERATOR_SHIP_HAS_NO_SECRET: 'FORBIDDEN',
|
|
89
|
+
OPERATOR_SHIP_IS_NOT_PINGED: 'FORBIDDEN',
|
|
90
|
+
OPERATOR_SHIP_IS_PERMANENT: 'FORBIDDEN',
|
|
91
|
+
// BAD_REQUEST, as when the schema at the door refuses the same payload.
|
|
92
|
+
PAYLOAD_TOO_LARGE: 'BAD_REQUEST',
|
|
93
|
+
PING_NOT_RESENT: 'CONFLICT',
|
|
94
|
+
// BAD_REQUEST, as for a payload over its limit.
|
|
95
|
+
REPORT_DETAILS_TOO_LARGE: 'BAD_REQUEST',
|
|
96
|
+
RESERVED_CONTENT_TYPE: 'FORBIDDEN',
|
|
97
|
+
SHIP_ALREADY_RETIRED: 'CONFLICT',
|
|
98
|
+
SHIP_NAME_RESERVED: 'CONFLICT',
|
|
99
|
+
SHIP_NAME_TAKEN: 'CONFLICT',
|
|
100
|
+
SHIP_NOT_AWAITING_CREW: 'CONFLICT',
|
|
101
|
+
SHIP_NOT_CREWED: 'CONFLICT',
|
|
102
|
+
SHIP_LIMIT_REACHED: 'FORBIDDEN',
|
|
103
|
+
SHIP_NOT_FOUND: 'NOT_FOUND',
|
|
104
|
+
SIGN_IN_TICKET_INVALID: 'UNAUTHORIZED',
|
|
105
|
+
UNKNOWN_CREW_TOKEN: 'UNAUTHORIZED',
|
|
106
|
+
UNRESOLVABLE_SELECTOR: 'NOT_FOUND',
|
|
107
|
+
WRONG_EMAIL_OR_PASSWORD: 'UNAUTHORIZED',
|
|
108
|
+
WRONG_SHIP_ID_OR_SECRET: 'UNAUTHORIZED',
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* The code a ship reads for a refusal whose tRPC code would hide it: a crew
|
|
112
|
+
* whose lease has ended reads LEASE_ENDED, not UNAUTHORIZED, so it can tell a
|
|
113
|
+
* released ship from a wrong crew token. The HTTP status stays the tRPC
|
|
114
|
+
* code's. The ship doors read it from the tRPC error's cause.
|
|
115
|
+
*/
|
|
116
|
+
export class ShipRefusalCode extends Error {
|
|
117
|
+
name = 'ShipRefusalCode';
|
|
118
|
+
code;
|
|
119
|
+
constructor(code) {
|
|
120
|
+
super(code);
|
|
121
|
+
this.code = code;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** A refusal as the matching tRPC error, keeping its message: the one place domain error kinds meet API errors. */
|
|
125
|
+
function apiErrorOf(error) {
|
|
126
|
+
const { kind, message } = error;
|
|
127
|
+
const cause = kind === 'LEASE_ENDED' ? new ShipRefusalCode(kind) : undefined;
|
|
128
|
+
return new TRPCError({ code: ERROR_CODES[kind], message, cause });
|
|
129
|
+
}
|
|
130
|
+
/** The value of a use case's result. A refusal becomes the matching tRPC error. */
|
|
131
|
+
export function okOrThrow(result) {
|
|
132
|
+
if (!result.isOk) {
|
|
133
|
+
throw apiErrorOf(result.error);
|
|
134
|
+
}
|
|
135
|
+
return result.value;
|
|
136
|
+
}
|
|
137
|
+
/** Where in the input the first text holding U+0000 is; undefined when no text does. */
|
|
138
|
+
function pathToNul(value, path) {
|
|
139
|
+
if (typeof value === 'string') {
|
|
140
|
+
return value.includes('\u0000') ? path : undefined;
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(value)) {
|
|
143
|
+
for (const [index, item] of value.entries()) {
|
|
144
|
+
const found = pathToNul(item, [...path, index]);
|
|
145
|
+
if (found) {
|
|
146
|
+
return found;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
if (typeof value === 'object' && value !== null) {
|
|
152
|
+
for (const [key, item] of Object.entries(value)) {
|
|
153
|
+
const found = pathToNul(item, [...path, key]);
|
|
154
|
+
if (found) {
|
|
155
|
+
return found;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
/** A field's path as a caller writes it: `location.description`, `items[2].note`. */
|
|
162
|
+
function fieldName(path) {
|
|
163
|
+
return path.map((part, index) => (typeof part === 'number' ? `[${part}]` : index === 0 ? part : `.${part}`)).join('');
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* A procedure that needs no caller: the base of every procedure, of the
|
|
167
|
+
* console procedures, and of `register`, which takes the ship secret.
|
|
168
|
+
*
|
|
169
|
+
* Postgres text can never store the character U+0000, so this one check at
|
|
170
|
+
* the door refuses it in any text input, as a bad request naming the field,
|
|
171
|
+
* before anything else reads the input.
|
|
172
|
+
*/
|
|
173
|
+
export const publicProcedure = t.procedure.use(async ({ getRawInput, next }) => {
|
|
174
|
+
// Input that does not parse is left to the procedure: one without input,
|
|
175
|
+
// such as sign-out with an empty body, never reads it; one with input
|
|
176
|
+
// refuses it as before.
|
|
177
|
+
const input = await getRawInput().catch(() => undefined);
|
|
178
|
+
const path = pathToNul(input, []);
|
|
179
|
+
if (path) {
|
|
180
|
+
const where = path.length === 0 ? 'The input' : `The input field ${fieldName(path)}`;
|
|
181
|
+
throw new TRPCError({ code: 'BAD_REQUEST', message: `${where} cannot hold the character U+0000 (NUL)` });
|
|
182
|
+
}
|
|
183
|
+
return next();
|
|
184
|
+
});
|
|
185
|
+
/**
|
|
186
|
+
* Refuses a state-changing console call from anywhere but the console's
|
|
187
|
+
* origin. The session cookie is SameSite, but hosts under one domain are one
|
|
188
|
+
* site, so a page on a sibling host could make the browser post with it
|
|
189
|
+
* (cross-site request forgery). A browser sends Origin with every POST, so a
|
|
190
|
+
* call without it is refused too.
|
|
191
|
+
*/
|
|
192
|
+
function checkConsoleOrigin(ctx) {
|
|
193
|
+
if (ctx.origin !== ctx.consoleOrigin) {
|
|
194
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: "A console call that changes state must come from the console's origin" });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** A console procedure, signing in or out: it changes state, so it comes only from the console's origin. */
|
|
198
|
+
export const consoleProcedure = publicProcedure.use(({ ctx, next }) => {
|
|
199
|
+
checkConsoleOrigin(ctx);
|
|
200
|
+
return next();
|
|
201
|
+
});
|
|
202
|
+
/**
|
|
203
|
+
* The crew of a bearer crew token; undefined when it never crewed a ship. One
|
|
204
|
+
* whose lease has ended is refused as such, so its session learns that the
|
|
205
|
+
* ship was released rather than that its token is wrong.
|
|
206
|
+
*/
|
|
207
|
+
async function crewOf(ctx, bearer) {
|
|
208
|
+
const crew = await ctx.useCases.authenticate.byCrewToken(bearer);
|
|
209
|
+
if (crew.isOk) {
|
|
210
|
+
return crew.value;
|
|
211
|
+
}
|
|
212
|
+
if (crew.error.kind === 'LEASE_ENDED') {
|
|
213
|
+
throw apiErrorOf(crew.error);
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Resolves the caller from the crew token or the console session. A bearer
|
|
219
|
+
* crew token wins over the cookie, and a wrong one fails rather than falling
|
|
220
|
+
* back. The ship secret is no bearer: it works only for `register` (ADR 0015).
|
|
221
|
+
* Using a console session keeps it, and its cookie, valid for another 30 days.
|
|
222
|
+
*/
|
|
223
|
+
async function resolveCaller(ctx) {
|
|
224
|
+
const { bearer, sessionToken } = ctx.credentials;
|
|
225
|
+
if (bearer !== undefined) {
|
|
226
|
+
return crewOf(ctx, bearer);
|
|
227
|
+
}
|
|
228
|
+
if (sessionToken !== undefined) {
|
|
229
|
+
const use = await ctx.useCases.authenticate.byConsoleSession(sessionToken);
|
|
230
|
+
if (use) {
|
|
231
|
+
ctx.sessionCookie.set(sessionToken, use.expiresAt);
|
|
232
|
+
return use.caller;
|
|
233
|
+
}
|
|
234
|
+
// Signing in somewhere else is no failure: the console says so calmly.
|
|
235
|
+
if ((await ctx.useCases.authenticate.endOfConsoleSession(sessionToken)) === 'takenOver') {
|
|
236
|
+
throw new TRPCError({
|
|
237
|
+
code: 'UNAUTHORIZED',
|
|
238
|
+
message: 'You signed in somewhere else, which ended this console session',
|
|
239
|
+
cause: new ConsoleRefusalDetails({ refusal: 'SIGNED_IN_ELSEWHERE' }),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Refuses a live subscription whose caller no longer holds: its console
|
|
247
|
+
* session ended, or its crew's lease did. A subscription outlives the call
|
|
248
|
+
* that opened it, so it asks again each time it has news.
|
|
249
|
+
*/
|
|
250
|
+
export async function checkCallerStillHolds(ctx) {
|
|
251
|
+
if (!(await resolveCaller(ctx))) {
|
|
252
|
+
throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Sign in, or call with the crew token register gave you' });
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/** What a caller without a valid crew token is told, at a door for ships and for a crew procedure. */
|
|
256
|
+
const CALL_WITH_CREW_TOKEN = 'Call with the crew token register gave you';
|
|
257
|
+
/**
|
|
258
|
+
* A procedure for any caller, whatever its scopes: the base of every scoped
|
|
259
|
+
* procedure, and `whoami`, which tells a caller about itself. The caller comes
|
|
260
|
+
* from the server, never from the request.
|
|
261
|
+
*/
|
|
262
|
+
export const authenticatedProcedure = publicProcedure.use(async ({ ctx, type, next }) => {
|
|
263
|
+
// A mutation on the console session's cookie changes state: checked before
|
|
264
|
+
// the session is used, so a forged call does not even renew it. A
|
|
265
|
+
// subscription is checked too: a browser opens a WebSocket from any page
|
|
266
|
+
// with the cookie, and no CORS rule keeps that page from reading the
|
|
267
|
+
// answers. A crew token wins over the cookie, and no browser sends one by
|
|
268
|
+
// itself.
|
|
269
|
+
const { bearer, sessionToken } = ctx.credentials;
|
|
270
|
+
if ((type === 'mutation' || type === 'subscription') && bearer === undefined && sessionToken !== undefined) {
|
|
271
|
+
checkConsoleOrigin(ctx);
|
|
272
|
+
}
|
|
273
|
+
const caller = await resolveCaller(ctx);
|
|
274
|
+
if (!caller) {
|
|
275
|
+
const message = ctx.canUseConsoleSession ? 'Sign in, or call with the crew token register gave you' : CALL_WITH_CREW_TOKEN;
|
|
276
|
+
throw new TRPCError({ code: 'UNAUTHORIZED', message });
|
|
277
|
+
}
|
|
278
|
+
return next({ ctx: { caller } });
|
|
279
|
+
});
|
|
280
|
+
/**
|
|
281
|
+
* A procedure only a crew calls, with the crew token `register` gave it: one
|
|
282
|
+
* session crewing one ship under one lease. `deregister` needs nothing more,
|
|
283
|
+
* since a crew ends only its own lease. The console session is no crew token,
|
|
284
|
+
* so it is refused here.
|
|
285
|
+
*/
|
|
286
|
+
export const crewProcedure = publicProcedure.use(async ({ ctx, next }) => {
|
|
287
|
+
const { bearer } = ctx.credentials;
|
|
288
|
+
const crew = bearer === undefined ? undefined : await crewOf(ctx, bearer);
|
|
289
|
+
if (!crew) {
|
|
290
|
+
throw new TRPCError({ code: 'UNAUTHORIZED', message: CALL_WITH_CREW_TOKEN });
|
|
291
|
+
}
|
|
292
|
+
return next({ ctx: { caller: crew, crew } });
|
|
293
|
+
});
|
|
294
|
+
/**
|
|
295
|
+
* A crew procedure that also needs the given scope: receiving and
|
|
296
|
+
* acknowledging deliveries, which a crew claims under its lease. argo's inbox
|
|
297
|
+
* comes with its own procedures.
|
|
298
|
+
*/
|
|
299
|
+
export function scopedCrewProcedure(scope) {
|
|
300
|
+
return crewProcedure.use(({ ctx, next }) => {
|
|
301
|
+
if (!hasScope(ctx.crew, scope)) {
|
|
302
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: `This call needs the ${scope} scope` });
|
|
303
|
+
}
|
|
304
|
+
return next();
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* A procedure that needs the given scope. The caller and its scopes come from
|
|
309
|
+
* the server, never from the request, and are checked before any use case runs.
|
|
310
|
+
*/
|
|
311
|
+
export function scopedProcedure(scope) {
|
|
312
|
+
return authenticatedProcedure.use(({ ctx, next }) => {
|
|
313
|
+
if (!hasScope(ctx.caller, scope)) {
|
|
314
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: `This call needs the ${scope} scope` });
|
|
315
|
+
}
|
|
316
|
+
return next();
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* A procedure that needs any one of the given scopes: the few fleet calls a
|
|
321
|
+
* trierarch makes with `fleet:crew` beside the scope the console uses
|
|
322
|
+
* (decision 0002). Checked before any use case runs, as for one scope.
|
|
323
|
+
*/
|
|
324
|
+
export function anyScopeProcedure(...scopes) {
|
|
325
|
+
return authenticatedProcedure.use(({ ctx, next }) => {
|
|
326
|
+
if (!scopes.some((scope) => hasScope(ctx.caller, scope))) {
|
|
327
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: `This call needs the ${scopes.join(' or ')} scope` });
|
|
328
|
+
}
|
|
329
|
+
return next();
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* A procedure for a caller that crews its ship under a lease, with every given
|
|
334
|
+
* scope: argo's inbox, which its console session calls. A console session
|
|
335
|
+
* crews argo under the lease it holds; the use case refuses any ship but argo.
|
|
336
|
+
*/
|
|
337
|
+
export function scopedCrewCallerProcedure(...scopes) {
|
|
338
|
+
return authenticatedProcedure.use(({ ctx, next }) => {
|
|
339
|
+
const missing = scopes.find((scope) => !hasScope(ctx.caller, scope));
|
|
340
|
+
if (missing !== undefined) {
|
|
341
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: `This call needs the ${missing} scope` });
|
|
342
|
+
}
|
|
343
|
+
const { caller } = ctx;
|
|
344
|
+
if (!isCrew(caller)) {
|
|
345
|
+
throw new TRPCError({ code: 'FORBIDDEN', message: 'Only the operator inbox of argo, signed in to the console, calls this' });
|
|
346
|
+
}
|
|
347
|
+
return next({ ctx: { crew: caller } });
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=trpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trpc.js","sourceRoot":"","sources":["../../../src/adapters/trpc/trpc.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyServerOptions } from 'fastify';
|
|
2
|
+
import type { RateLimit } from './adapters/http/rate-limiter.js';
|
|
3
|
+
import type { Clock } from './domain/shared/clock.js';
|
|
4
|
+
export interface AppOptions {
|
|
5
|
+
databaseUrl: string;
|
|
6
|
+
/** Where ships reach the fleet: every starting prompt carries the fleet MCP URL under it. */
|
|
7
|
+
publicUrl: string;
|
|
8
|
+
clock?: Clock;
|
|
9
|
+
logger?: FastifyServerOptions['logger'];
|
|
10
|
+
shouldTrustProxy?: boolean;
|
|
11
|
+
signInRateLimit?: RateLimit;
|
|
12
|
+
registerRateLimit?: RateLimit;
|
|
13
|
+
/** The domain the session cookie is set for. Unset: the server's host only. */
|
|
14
|
+
cookieDomain?: string;
|
|
15
|
+
/**
|
|
16
|
+
* The console's origin: state-changing console calls come only from it.
|
|
17
|
+
* Unset: the public URL's origin, for web and server behind one host.
|
|
18
|
+
*/
|
|
19
|
+
consoleOrigin?: string;
|
|
20
|
+
/** How long a receive waits on an empty inbox; about 25 seconds unless a test says otherwise. */
|
|
21
|
+
receiveWaitMs?: number;
|
|
22
|
+
/** The installation token that opens the installation procedures; unset, they are off. */
|
|
23
|
+
installationToken?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wires adapters to use cases and returns the HTTP server, not yet listening.
|
|
27
|
+
* The delivery listener starts at once and wakes waiting receives and live
|
|
28
|
+
* subscriptions. Closing the
|
|
29
|
+
* server also stops the listener and disconnects the database.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createApp(options: AppOptions): FastifyInstance;
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { buildHttpServer } from './adapters/http/server.js';
|
|
2
|
+
import { checkDatabase, createPrismaClient, latestMigration } from './adapters/prisma/client.js';
|
|
3
|
+
import { listenForPendingDeliveries } from './adapters/prisma/delivery-notices.js';
|
|
4
|
+
import { failureForLog } from './adapters/prisma/failure-log.js';
|
|
5
|
+
import { createFleetEventWakeups, fleetEventWakeupsOf } from './adapters/prisma/fleet-event-wakeups.js';
|
|
6
|
+
import { createReceiverWakeups } from './adapters/prisma/receiver-wakeups.js';
|
|
7
|
+
import { createUseCases, systemClock } from './wiring.js';
|
|
8
|
+
/**
|
|
9
|
+
* Wires adapters to use cases and returns the HTTP server, not yet listening.
|
|
10
|
+
* The delivery listener starts at once and wakes waiting receives and live
|
|
11
|
+
* subscriptions. Closing the
|
|
12
|
+
* server also stops the listener and disconnects the database.
|
|
13
|
+
*/
|
|
14
|
+
export function createApp(options) {
|
|
15
|
+
const prisma = createPrismaClient(options.databaseUrl);
|
|
16
|
+
const clock = options.clock ?? systemClock;
|
|
17
|
+
const wakeups = createReceiverWakeups();
|
|
18
|
+
const fleetEvents = createFleetEventWakeups();
|
|
19
|
+
const server = buildHttpServer({
|
|
20
|
+
useCases: createUseCases({
|
|
21
|
+
prisma,
|
|
22
|
+
clock,
|
|
23
|
+
wakeups,
|
|
24
|
+
fleetEventWakeups: fleetEventWakeupsOf(fleetEvents),
|
|
25
|
+
receiveWaitMs: options.receiveWaitMs,
|
|
26
|
+
}),
|
|
27
|
+
fleetUrl: options.publicUrl,
|
|
28
|
+
installationToken: options.installationToken,
|
|
29
|
+
fleetEvents,
|
|
30
|
+
checkDatabase: () => checkDatabase(prisma),
|
|
31
|
+
latestMigration: () => latestMigration(prisma),
|
|
32
|
+
clock,
|
|
33
|
+
logger: options.logger,
|
|
34
|
+
shouldTrustProxy: options.shouldTrustProxy,
|
|
35
|
+
signInRateLimit: options.signInRateLimit,
|
|
36
|
+
registerRateLimit: options.registerRateLimit,
|
|
37
|
+
cookieDomain: options.cookieDomain,
|
|
38
|
+
consoleOrigin: options.consoleOrigin ?? new URL(options.publicUrl).origin,
|
|
39
|
+
});
|
|
40
|
+
const listener = listenForPendingDeliveries({
|
|
41
|
+
databaseUrl: options.databaseUrl,
|
|
42
|
+
onNotice: (notice) => {
|
|
43
|
+
wakeups.deliveryPending(notice);
|
|
44
|
+
},
|
|
45
|
+
onFleetEvent: (notice) => {
|
|
46
|
+
fleetEvents.eventCommitted(notice);
|
|
47
|
+
},
|
|
48
|
+
onListening: () => {
|
|
49
|
+
wakeups.wakeAll();
|
|
50
|
+
fleetEvents.wakeAll();
|
|
51
|
+
},
|
|
52
|
+
onError: (error) => {
|
|
53
|
+
server.log.warn(failureForLog(error), 'delivery listener lost its connection: listening again shortly');
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
// Before the server stops taking requests and waits for the ones it holds:
|
|
57
|
+
// a waiting receive answers no deliveries at once instead of holding it up,
|
|
58
|
+
// and a live subscription ends.
|
|
59
|
+
// Connections idle at that moment close at once (Fastify's default); one
|
|
60
|
+
// whose request ends later is told to close with its answer, or it would
|
|
61
|
+
// stay open, idle, until its keep-alive timeout.
|
|
62
|
+
let isStopping = false;
|
|
63
|
+
server.addHook('preClose', (done) => {
|
|
64
|
+
isStopping = true;
|
|
65
|
+
wakeups.endAll();
|
|
66
|
+
fleetEvents.endAll();
|
|
67
|
+
done();
|
|
68
|
+
});
|
|
69
|
+
server.addHook('onSend', async (_request, reply) => {
|
|
70
|
+
if (isStopping) {
|
|
71
|
+
void reply.header('connection', 'close');
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
server.addHook('onClose', async () => {
|
|
75
|
+
await listener.close();
|
|
76
|
+
await prisma.$disconnect();
|
|
77
|
+
});
|
|
78
|
+
return server;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACjG,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAwB1D;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC3C,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,MAAM,WAAW,GAAG,uBAAuB,EAAE,CAAC;IAE9C,MAAM,MAAM,GAAG,eAAe,CAAC;QAC7B,QAAQ,EAAE,cAAc,CAAC;YACvB,MAAM;YACN,KAAK;YACL,OAAO;YACP,iBAAiB,EAAE,mBAAmB,CAAC,WAAW,CAAC;YACnD,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;QACF,QAAQ,EAAE,OAAO,CAAC,SAAS;QAC3B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,WAAW;QACX,aAAa,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;QAC1C,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9C,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM;KAC1E,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,0BAA0B,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YACnB,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YACvB,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,WAAW,EAAE,GAAG,EAAE;YAChB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,WAAW,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,gEAAgE,CAAC,CAAC;QAC1G,CAAC;KACF,CAAC,CAAC;IAEH,2EAA2E;IAC3E,4EAA4E;IAC5E,gCAAgC;IAChC,yEAAyE;IACzE,yEAAyE;IACzE,iDAAiD;IACjD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QAClC,UAAU,GAAG,IAAI,CAAC;QAClB,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QACjD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `aeolus-core <command>`: what an operator runs on the server, installed
|
|
4
|
+
* from npm. Every setting comes from environment variables (see the README).
|
|
5
|
+
*/
|
|
6
|
+
import { fleetInit } from '../adapters/cli/fleet-init.js';
|
|
7
|
+
import { migrate } from '../adapters/cli/migrate.js';
|
|
8
|
+
import { operatorResetPassword } from '../adapters/cli/operator-reset-password.js';
|
|
9
|
+
import { runAtTerminal, runCommand } from '../adapters/cli/run.js';
|
|
10
|
+
import { describeFailure } from '../adapters/prisma/failure-log.js';
|
|
11
|
+
import { migrateDatabase, MigrationError } from '../adapters/prisma/migrate.js';
|
|
12
|
+
import { ConfigError } from '../config.js';
|
|
13
|
+
import { start } from '../start.js';
|
|
14
|
+
const USAGE = 'Usage: aeolus-core start | migrate | fleet:init --name "<fleet name>" | operator:reset-password';
|
|
15
|
+
const [command, ...args] = process.argv.slice(2);
|
|
16
|
+
switch (command) {
|
|
17
|
+
case 'start':
|
|
18
|
+
// Serves until a signal ends the process.
|
|
19
|
+
try {
|
|
20
|
+
await start();
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
process.stderr.write(`${error instanceof ConfigError || error instanceof MigrationError ? error.message : describeFailure(error)}\n`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
case 'migrate':
|
|
28
|
+
await runAtTerminal((io) => migrate({ environment: process.env, migrateDatabase, io }));
|
|
29
|
+
break;
|
|
30
|
+
case 'fleet:init':
|
|
31
|
+
await runCommand(args, ({ useCases, io }) => fleetInit(args, { initialiseFleet: useCases.initialiseFleet, listFleets: useCases.listFleets, io }));
|
|
32
|
+
break;
|
|
33
|
+
case 'operator:reset-password':
|
|
34
|
+
await runCommand(args, ({ useCases, io }) => operatorResetPassword(args, {
|
|
35
|
+
listFleets: useCases.listFleets,
|
|
36
|
+
resetOperatorPassword: useCases.resetOperatorPassword,
|
|
37
|
+
io,
|
|
38
|
+
}));
|
|
39
|
+
break;
|
|
40
|
+
case undefined:
|
|
41
|
+
default:
|
|
42
|
+
process.stderr.write(`${USAGE}\n`);
|
|
43
|
+
process.exit(2);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=aeolus-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aeolus-core.js","sourceRoot":"","sources":["../../src/bin/aeolus-core.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,MAAM,KAAK,GAAG,iGAAiG,CAAC;AAEhH,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEjD,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,OAAO;QACV,0CAA0C;QAC1C,IAAI,CAAC;YACH,MAAM,KAAK,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAChH,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM;IACR,KAAK,SAAS;QACZ,MAAM,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACxF,MAAM;IACR,KAAK,YAAY;QACf,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAClJ,MAAM;IACR,KAAK,yBAAyB;QAC5B,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,CAC1C,qBAAqB,CAAC,IAAI,EAAE;YAC1B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;YACrD,EAAE;SACH,CAAC,CACH,CAAC;QACF,MAAM;IACR,KAAK,SAAS,CAAC;IACf;QACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
databaseUrl: string;
|
|
3
|
+
/** Where ships reach the fleet: every starting prompt carries the fleet MCP URL under it. */
|
|
4
|
+
publicUrl: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
logLevel: string;
|
|
8
|
+
/** True behind a reverse proxy: the client address comes from X-Forwarded-For. */
|
|
9
|
+
shouldTrustProxy: boolean;
|
|
10
|
+
/** The domain the session cookie is set for, so every host under it receives it. Unset: the server's host only. */
|
|
11
|
+
cookieDomain: string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* The console's origin: state-changing console calls come only from it, and
|
|
14
|
+
* a console on another host may call from it with credentials (CORS).
|
|
15
|
+
* Defaults to the public URL's origin: web and server behind one host.
|
|
16
|
+
*/
|
|
17
|
+
consoleOrigin: string;
|
|
18
|
+
/**
|
|
19
|
+
* The token a hosting service presents to the installation procedures
|
|
20
|
+
* (docs/architecture.md, "Installation"). Unset: they are off, as on a
|
|
21
|
+
* self-hosted server.
|
|
22
|
+
*/
|
|
23
|
+
installationToken: string | undefined;
|
|
24
|
+
}
|
|
25
|
+
export declare class ConfigError extends Error {
|
|
26
|
+
name: string;
|
|
27
|
+
}
|
|
28
|
+
/** Reads DATABASE_URL alone, for a command that needs nothing else. Throws a ConfigError when it is invalid. */
|
|
29
|
+
export declare function loadDatabaseUrl(environment: Record<string, string | undefined>): string;
|
|
30
|
+
/**
|
|
31
|
+
* Reads the server configuration from environment variables. Throws a
|
|
32
|
+
* ConfigError naming every invalid variable. Values are never echoed, because
|
|
33
|
+
* the database URL carries a password.
|
|
34
|
+
*/
|
|
35
|
+
export declare function loadConfig(environment: Record<string, string | undefined>): Config;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** A domain name alone, such as example.com: no scheme, port, path or leading dot. */
|
|
3
|
+
const DOMAIN_NAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
|
|
4
|
+
/** An http or https origin: a URL with no user, path, query or fragment. A trailing slash is allowed. */
|
|
5
|
+
function isOrigin(value) {
|
|
6
|
+
const url = URL.parse(value);
|
|
7
|
+
return (url !== null &&
|
|
8
|
+
url.username === '' &&
|
|
9
|
+
url.password === '' &&
|
|
10
|
+
url.pathname === '/' &&
|
|
11
|
+
url.search === '' &&
|
|
12
|
+
url.hash === '' &&
|
|
13
|
+
!value.endsWith('?') &&
|
|
14
|
+
!value.endsWith('#'));
|
|
15
|
+
}
|
|
16
|
+
/** The shortest installation token the server takes: long enough that guessing it is hopeless. */
|
|
17
|
+
const INSTALLATION_TOKEN_MIN_LENGTH = 32;
|
|
18
|
+
const environmentSchema = z.object({
|
|
19
|
+
DATABASE_URL: z.url({ protocol: /^postgres(ql)?$/, error: 'must be a postgres:// or postgresql:// URL' }),
|
|
20
|
+
PUBLIC_URL: z.url({ protocol: /^https?$/, error: 'must be an http:// or https:// URL' }),
|
|
21
|
+
HOST: z.string().min(1).default('127.0.0.1'),
|
|
22
|
+
PORT: z.coerce.number().int().min(0).max(65_535).default(4000),
|
|
23
|
+
LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent']).default('info'),
|
|
24
|
+
TRUST_PROXY: z.enum(['true', 'false'], { error: 'must be true or false' }).default('false'),
|
|
25
|
+
COOKIE_DOMAIN: z.string().regex(DOMAIN_NAME, 'must be a domain name like example.com').optional(),
|
|
26
|
+
CONSOLE_ORIGIN: z
|
|
27
|
+
.url({ protocol: /^https?$/, error: 'must be an http:// or https:// origin' })
|
|
28
|
+
.refine(isOrigin, 'must be an origin without a path, like https://console.example.com')
|
|
29
|
+
.transform((origin) => new URL(origin).origin)
|
|
30
|
+
.optional(),
|
|
31
|
+
INSTALLATION_TOKEN: z.string().min(INSTALLATION_TOKEN_MIN_LENGTH, `must be at least ${String(INSTALLATION_TOKEN_MIN_LENGTH)} characters`).optional(),
|
|
32
|
+
});
|
|
33
|
+
/** What `aeolus-core migrate` reads: the database alone. */
|
|
34
|
+
const databaseEnvironmentSchema = environmentSchema.pick({ DATABASE_URL: true });
|
|
35
|
+
export class ConfigError extends Error {
|
|
36
|
+
name = 'ConfigError';
|
|
37
|
+
}
|
|
38
|
+
/** Every invalid variable, one line each, never its value. */
|
|
39
|
+
function configErrorOf(error) {
|
|
40
|
+
const problems = error.issues.map((issue) => ` ${issue.path.join('.')}: ${issue.message}`);
|
|
41
|
+
return new ConfigError(`Invalid configuration:\n${problems.join('\n')}`);
|
|
42
|
+
}
|
|
43
|
+
/** Reads DATABASE_URL alone, for a command that needs nothing else. Throws a ConfigError when it is invalid. */
|
|
44
|
+
export function loadDatabaseUrl(environment) {
|
|
45
|
+
const result = databaseEnvironmentSchema.safeParse(environment);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
throw configErrorOf(result.error);
|
|
48
|
+
}
|
|
49
|
+
return result.data.DATABASE_URL;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reads the server configuration from environment variables. Throws a
|
|
53
|
+
* ConfigError naming every invalid variable. Values are never echoed, because
|
|
54
|
+
* the database URL carries a password.
|
|
55
|
+
*/
|
|
56
|
+
export function loadConfig(environment) {
|
|
57
|
+
const result = environmentSchema.safeParse(environment);
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
throw configErrorOf(result.error);
|
|
60
|
+
}
|
|
61
|
+
const { DATABASE_URL, PUBLIC_URL, HOST, PORT, LOG_LEVEL, TRUST_PROXY, COOKIE_DOMAIN, CONSOLE_ORIGIN, INSTALLATION_TOKEN } = result.data;
|
|
62
|
+
return {
|
|
63
|
+
databaseUrl: DATABASE_URL,
|
|
64
|
+
publicUrl: PUBLIC_URL,
|
|
65
|
+
host: HOST,
|
|
66
|
+
port: PORT,
|
|
67
|
+
logLevel: LOG_LEVEL,
|
|
68
|
+
shouldTrustProxy: TRUST_PROXY === 'true',
|
|
69
|
+
cookieDomain: COOKIE_DOMAIN,
|
|
70
|
+
consoleOrigin: CONSOLE_ORIGIN ?? new URL(PUBLIC_URL).origin,
|
|
71
|
+
installationToken: INSTALLATION_TOKEN,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=config.js.map
|