@cats-inc/cats-platform 0.1.10 → 0.2.8
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/.env.example +9 -16
- package/README.md +18 -0
- package/build/desktop/bootstrapNavigation.d.ts.map +1 -1
- package/build/desktop/bootstrapNavigation.js +6 -13
- package/build/desktop/bootstrapNavigation.js.map +1 -1
- package/build/desktop/bootstrapPage.d.ts.map +1 -1
- package/build/desktop/bootstrapPage.js +264 -77
- package/build/desktop/bootstrapPage.js.map +1 -1
- package/build/desktop/cliInventoryProbe.d.ts +23 -2
- package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
- package/build/desktop/cliInventoryProbe.js +54 -9
- package/build/desktop/cliInventoryProbe.js.map +1 -1
- package/build/desktop/config.d.ts +0 -4
- package/build/desktop/config.d.ts.map +1 -1
- package/build/desktop/config.js +1 -6
- package/build/desktop/config.js.map +1 -1
- package/build/desktop/contracts.d.ts +19 -2
- package/build/desktop/contracts.d.ts.map +1 -1
- package/build/desktop/contracts.js +1 -2
- package/build/desktop/contracts.js.map +1 -1
- package/build/desktop/hostVersion.d.ts.map +1 -1
- package/build/desktop/hostVersion.js +3 -5
- package/build/desktop/hostVersion.js.map +1 -1
- package/build/desktop/main.js +177 -201
- package/build/desktop/main.js.map +1 -1
- package/build/desktop/packaging.d.ts +2 -0
- package/build/desktop/packaging.d.ts.map +1 -1
- package/build/desktop/packaging.js +34 -14
- package/build/desktop/packaging.js.map +1 -1
- package/build/desktop/preload.cjs +7 -0
- package/build/desktop/preload.cjs.map +1 -1
- package/build/desktop/processSupervisor.d.ts.map +1 -1
- package/build/desktop/processSupervisor.js +3 -0
- package/build/desktop/processSupervisor.js.map +1 -1
- package/build/desktop/providerSelection.d.ts +37 -0
- package/build/desktop/providerSelection.d.ts.map +1 -0
- package/build/desktop/providerSelection.js +112 -0
- package/build/desktop/providerSelection.js.map +1 -0
- package/build/desktop/readiness.d.ts +2 -0
- package/build/desktop/readiness.d.ts.map +1 -1
- package/build/desktop/readiness.js +49 -35
- package/build/desktop/readiness.js.map +1 -1
- package/build/desktop/setupAssets.d.ts.map +1 -1
- package/build/desktop/setupAssets.js +16 -14
- package/build/desktop/setupAssets.js.map +1 -1
- package/build/desktop/setupAudit.d.ts +2 -3
- package/build/desktop/setupAudit.d.ts.map +1 -1
- package/build/desktop/setupAudit.js +14 -34
- package/build/desktop/setupAudit.js.map +1 -1
- package/build/desktop/tray.d.ts +1 -1
- package/build/desktop/tray.d.ts.map +1 -1
- package/build/desktop/tray.js +2 -7
- package/build/desktop/tray.js.map +1 -1
- package/build/desktop/trayMenu.d.ts +23 -2
- package/build/desktop/trayMenu.d.ts.map +1 -1
- package/build/desktop/trayMenu.js +24 -30
- package/build/desktop/trayMenu.js.map +1 -1
- package/build/desktop/updateDialog.d.ts +66 -0
- package/build/desktop/updateDialog.d.ts.map +1 -0
- package/build/desktop/updateDialog.js +258 -0
- package/build/desktop/updateDialog.js.map +1 -0
- package/build/desktop/updaterAdapter.d.ts +1 -0
- package/build/desktop/updaterAdapter.d.ts.map +1 -1
- package/build/desktop/updaterAdapter.js +13 -1
- package/build/desktop/updaterAdapter.js.map +1 -1
- package/build/renderer/assets/{ActiveSessionPermissionChip-Dl2UOFgh.js → ActiveSessionPermissionChip-CAgN-tXv.js} +1 -1
- package/build/renderer/assets/App-BZA23O2J.js +2 -0
- package/build/renderer/assets/App-DxsV-tKS.css +1 -0
- package/build/renderer/assets/{App-ChvP0G9X.js → App-YqprEL2n.js} +1 -1
- package/build/renderer/assets/App-rGw9J8PZ.js +1 -0
- package/build/renderer/assets/WorkspaceAppRoutes-BCHCikmJ.js +1 -0
- package/build/renderer/assets/app-BV3UAQkR.css +1 -0
- package/build/renderer/assets/app-CVPqqfZo.js +45 -0
- package/build/renderer/assets/conversationSidebarRecentEntries-iqaLqA1n.js +6 -0
- package/build/renderer/assets/{useDraftSessionChips-By3XXabI.js → useDraftSessionChips-D9BX6X92.js} +1 -1
- package/build/renderer/index.html +2 -2
- package/build/server/app/renderer/auth/api.d.ts +28 -2
- package/build/server/app/renderer/auth/api.d.ts.map +1 -1
- package/build/server/app/renderer/auth/api.js +29 -4
- package/build/server/app/renderer/auth/api.js.map +1 -1
- package/build/server/app/renderer/providerCatalogClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerCatalogClient.js +15 -6
- package/build/server/app/renderer/providerCatalogClient.js.map +1 -1
- package/build/server/app/renderer/providerRegistryClient.d.ts +1 -1
- package/build/server/app/renderer/providerRegistryClient.d.ts.map +1 -1
- package/build/server/app/renderer/providerRegistryClient.js +23 -41
- package/build/server/app/renderer/providerRegistryClient.js.map +1 -1
- package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts +11 -4
- package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.d.ts.map +1 -1
- package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js +25 -5
- package/build/server/app/renderer/settings/settingsDesktopUpdateLabels.js.map +1 -1
- package/build/server/app/server/appPackageRoutes.d.ts +2 -0
- package/build/server/app/server/appPackageRoutes.d.ts.map +1 -1
- package/build/server/app/server/appPackageRoutes.js +105 -0
- package/build/server/app/server/appPackageRoutes.js.map +1 -1
- package/build/server/app/server/authGatePolicy.js +8 -3
- package/build/server/app/server/authGatePolicy.js.map +1 -1
- package/build/server/app/server/authRoutes.d.ts +14 -1
- package/build/server/app/server/authRoutes.d.ts.map +1 -1
- package/build/server/app/server/authRoutes.js +395 -76
- package/build/server/app/server/authRoutes.js.map +1 -1
- package/build/server/app/server/contracts.d.ts +19 -1
- package/build/server/app/server/contracts.d.ts.map +1 -1
- package/build/server/app/server/dependencies.d.ts.map +1 -1
- package/build/server/app/server/dependencies.js +48 -2
- package/build/server/app/server/dependencies.js.map +1 -1
- package/build/server/app/server/goldenPathStartupResume.d.ts +55 -0
- package/build/server/app/server/goldenPathStartupResume.d.ts.map +1 -0
- package/build/server/app/server/goldenPathStartupResume.js +109 -0
- package/build/server/app/server/goldenPathStartupResume.js.map +1 -0
- package/build/server/app/server/platformSetupRoutes.d.ts +2 -1
- package/build/server/app/server/platformSetupRoutes.d.ts.map +1 -1
- package/build/server/app/server/platformSetupRoutes.js +117 -64
- package/build/server/app/server/platformSetupRoutes.js.map +1 -1
- package/build/server/app/server/polling.d.ts.map +1 -1
- package/build/server/app/server/polling.js +2 -0
- package/build/server/app/server/polling.js.map +1 -1
- package/build/server/app/server/requestRouter.d.ts.map +1 -1
- package/build/server/app/server/requestRouter.js +33 -0
- package/build/server/app/server/requestRouter.js.map +1 -1
- package/build/server/app/server/runtimeSurfaceProxy.d.ts.map +1 -1
- package/build/server/app/server/runtimeSurfaceProxy.js +16 -19
- package/build/server/app/server/runtimeSurfaceProxy.js.map +1 -1
- package/build/server/app/server/startupRecovery.d.ts.map +1 -1
- package/build/server/app/server/startupRecovery.js +5 -0
- package/build/server/app/server/startupRecovery.js.map +1 -1
- package/build/server/app/server/telegramCommandSurface.d.ts +29 -0
- package/build/server/app/server/telegramCommandSurface.d.ts.map +1 -0
- package/build/server/app/server/telegramCommandSurface.js +123 -0
- package/build/server/app/server/telegramCommandSurface.js.map +1 -0
- package/build/server/app/server/transportWorkGoldenPath.d.ts +82 -0
- package/build/server/app/server/transportWorkGoldenPath.d.ts.map +1 -0
- package/build/server/app/server/transportWorkGoldenPath.js +307 -0
- package/build/server/app/server/transportWorkGoldenPath.js.map +1 -0
- package/build/server/config.d.ts +22 -3
- package/build/server/config.d.ts.map +1 -1
- package/build/server/config.js +14 -13
- package/build/server/config.js.map +1 -1
- package/build/server/design/components/providerModelFieldsSupport.d.ts +3 -3
- package/build/server/design/components/providerModelFieldsSupport.d.ts.map +1 -1
- package/build/server/design/components/providerModelFieldsSupport.js +40 -38
- package/build/server/design/components/providerModelFieldsSupport.js.map +1 -1
- package/build/server/design/components/useProviderCatalogState.d.ts +1 -0
- package/build/server/design/components/useProviderCatalogState.d.ts.map +1 -1
- package/build/server/design/components/useProviderCatalogState.js +1 -0
- package/build/server/design/components/useProviderCatalogState.js.map +1 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.d.ts.map +1 -1
- package/build/server/design/components/useProviderRegistryAutoRecheck.js +20 -13
- package/build/server/design/components/useProviderRegistryAutoRecheck.js.map +1 -1
- package/build/server/design/components/useProviderRegistryState.d.ts.map +1 -1
- package/build/server/design/components/useProviderRegistryState.js +12 -25
- package/build/server/design/components/useProviderRegistryState.js.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.d.ts.map +1 -1
- package/build/server/design/components/useProviderTargetReconciliation.js +5 -2
- package/build/server/design/components/useProviderTargetReconciliation.js.map +1 -1
- package/build/server/index.js +4 -0
- package/build/server/index.js.map +1 -1
- package/build/server/platform/apps/packageInstaller.d.ts +19 -0
- package/build/server/platform/apps/packageInstaller.d.ts.map +1 -0
- package/build/server/platform/apps/packageInstaller.js +92 -0
- package/build/server/platform/apps/packageInstaller.js.map +1 -0
- package/build/server/platform/apps/registry.d.ts +6 -0
- package/build/server/platform/apps/registry.d.ts.map +1 -1
- package/build/server/platform/apps/registry.js +24 -0
- package/build/server/platform/apps/registry.js.map +1 -1
- package/build/server/platform/apps/renderer.d.ts +6 -0
- package/build/server/platform/apps/renderer.d.ts.map +1 -0
- package/build/server/platform/apps/renderer.js +18 -0
- package/build/server/platform/apps/renderer.js.map +1 -0
- package/build/server/platform/auth/actionGrant.d.ts +61 -0
- package/build/server/platform/auth/actionGrant.d.ts.map +1 -0
- package/build/server/platform/auth/actionGrant.js +108 -0
- package/build/server/platform/auth/actionGrant.js.map +1 -0
- package/build/server/platform/auth/adminCredentials.d.ts +37 -0
- package/build/server/platform/auth/adminCredentials.d.ts.map +1 -0
- package/build/server/platform/auth/adminCredentials.js +63 -0
- package/build/server/platform/auth/adminCredentials.js.map +1 -0
- package/build/server/platform/auth/bootstrap.d.ts +14 -0
- package/build/server/platform/auth/bootstrap.d.ts.map +1 -1
- package/build/server/platform/auth/bootstrap.js +29 -4
- package/build/server/platform/auth/bootstrap.js.map +1 -1
- package/build/server/platform/auth/config.d.ts.map +1 -1
- package/build/server/platform/auth/config.js +1 -1
- package/build/server/platform/auth/config.js.map +1 -1
- package/build/server/platform/auth/errorCodes.d.ts +2 -0
- package/build/server/platform/auth/errorCodes.d.ts.map +1 -1
- package/build/server/platform/auth/errorCodes.js +2 -0
- package/build/server/platform/auth/errorCodes.js.map +1 -1
- package/build/server/platform/auth/googleAccount.d.ts +40 -13
- package/build/server/platform/auth/googleAccount.d.ts.map +1 -1
- package/build/server/platform/auth/googleAccount.js +89 -70
- package/build/server/platform/auth/googleAccount.js.map +1 -1
- package/build/server/platform/auth/index.d.ts +4 -0
- package/build/server/platform/auth/index.d.ts.map +1 -1
- package/build/server/platform/auth/index.js +4 -0
- package/build/server/platform/auth/index.js.map +1 -1
- package/build/server/platform/auth/localLogin.d.ts +10 -0
- package/build/server/platform/auth/localLogin.d.ts.map +1 -1
- package/build/server/platform/auth/localLogin.js +17 -0
- package/build/server/platform/auth/localLogin.js.map +1 -1
- package/build/server/platform/auth/loginMethods.d.ts +18 -0
- package/build/server/platform/auth/loginMethods.d.ts.map +1 -0
- package/build/server/platform/auth/loginMethods.js +19 -0
- package/build/server/platform/auth/loginMethods.js.map +1 -0
- package/build/server/platform/auth/securityEvents.d.ts +31 -0
- package/build/server/platform/auth/securityEvents.d.ts.map +1 -0
- package/build/server/platform/auth/securityEvents.js +45 -0
- package/build/server/platform/auth/securityEvents.js.map +1 -0
- package/build/server/platform/runtime/deliveryClient.d.ts +111 -0
- package/build/server/platform/runtime/deliveryClient.d.ts.map +1 -0
- package/build/server/platform/runtime/deliveryClient.js +289 -0
- package/build/server/platform/runtime/deliveryClient.js.map +1 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts +1 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.d.ts.map +1 -1
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js +10 -0
- package/build/server/platform/supervision/providerCapabilityBootstrapYaml.js.map +1 -1
- package/build/server/platform/supervision/runtimeBoundary.d.ts +11 -1
- package/build/server/platform/supervision/runtimeBoundary.d.ts.map +1 -1
- package/build/server/platform/supervision/runtimeBoundary.js +2 -2
- package/build/server/platform/supervision/runtimeBoundary.js.map +1 -1
- package/build/server/platform/transports/telegram/bridge.d.ts +18 -0
- package/build/server/platform/transports/telegram/bridge.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/bridge.js +176 -0
- package/build/server/platform/transports/telegram/bridge.js.map +1 -1
- package/build/server/platform/transports/telegram/commandPort.d.ts +40 -0
- package/build/server/platform/transports/telegram/commandPort.d.ts.map +1 -0
- package/build/server/platform/transports/telegram/commandPort.js +17 -0
- package/build/server/platform/transports/telegram/commandPort.js.map +1 -0
- package/build/server/platform/transports/telegram/commandRouter.d.ts +22 -0
- package/build/server/platform/transports/telegram/commandRouter.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/commandRouter.js.map +1 -1
- package/build/server/platform/transports/telegram/commands/index.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/commands/index.js +38 -0
- package/build/server/platform/transports/telegram/commands/index.js.map +1 -1
- package/build/server/platform/transports/telegram/ingressDispatch.d.ts +56 -0
- package/build/server/platform/transports/telegram/ingressDispatch.d.ts.map +1 -0
- package/build/server/platform/transports/telegram/ingressDispatch.js +93 -0
- package/build/server/platform/transports/telegram/ingressDispatch.js.map +1 -0
- package/build/server/platform/transports/telegram/polling.d.ts +34 -0
- package/build/server/platform/transports/telegram/polling.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/polling.js +86 -9
- package/build/server/platform/transports/telegram/polling.js.map +1 -1
- package/build/server/platform/transports/telegram/relay/index.d.ts +3 -0
- package/build/server/platform/transports/telegram/relay/index.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/relay/index.js +5 -1
- package/build/server/platform/transports/telegram/relay/index.js.map +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.d.ts +2 -0
- package/build/server/platform/transports/telegram/relay/ingress.d.ts.map +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.js +1 -1
- package/build/server/platform/transports/telegram/relay/ingress.js.map +1 -1
- package/build/server/platform/transports/work-delivery/actionTokens.d.ts +66 -0
- package/build/server/platform/transports/work-delivery/actionTokens.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/actionTokens.js +145 -0
- package/build/server/platform/transports/work-delivery/actionTokens.js.map +1 -0
- package/build/server/platform/transports/work-delivery/contracts.d.ts +172 -0
- package/build/server/platform/transports/work-delivery/contracts.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/contracts.js +26 -0
- package/build/server/platform/transports/work-delivery/contracts.js.map +1 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.d.ts +32 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.js +45 -0
- package/build/server/platform/transports/work-delivery/deliveryGates.js.map +1 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.d.ts +31 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.js +52 -0
- package/build/server/platform/transports/work-delivery/inboundClassification.js.map +1 -0
- package/build/server/platform/transports/work-delivery/outbox.d.ts +84 -0
- package/build/server/platform/transports/work-delivery/outbox.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/outbox.js +270 -0
- package/build/server/platform/transports/work-delivery/outbox.js.map +1 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts +57 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.js +74 -0
- package/build/server/platform/transports/work-delivery/permissionEnvelope.js.map +1 -0
- package/build/server/platform/transports/work-delivery/port.d.ts +60 -0
- package/build/server/platform/transports/work-delivery/port.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/port.js +15 -0
- package/build/server/platform/transports/work-delivery/port.js.map +1 -0
- package/build/server/platform/transports/work-delivery/proposal.d.ts +31 -0
- package/build/server/platform/transports/work-delivery/proposal.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/proposal.js +59 -0
- package/build/server/platform/transports/work-delivery/proposal.js.map +1 -0
- package/build/server/platform/transports/work-delivery/readiness.d.ts +61 -0
- package/build/server/platform/transports/work-delivery/readiness.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/readiness.js +123 -0
- package/build/server/platform/transports/work-delivery/readiness.js.map +1 -0
- package/build/server/platform/transports/work-delivery/stageProjection.d.ts +43 -0
- package/build/server/platform/transports/work-delivery/stageProjection.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/stageProjection.js +132 -0
- package/build/server/platform/transports/work-delivery/stageProjection.js.map +1 -0
- package/build/server/platform/transports/work-delivery/stateStore.d.ts +21 -0
- package/build/server/platform/transports/work-delivery/stateStore.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/stateStore.js +193 -0
- package/build/server/platform/transports/work-delivery/stateStore.js.map +1 -0
- package/build/server/platform/transports/work-delivery/telemetry.d.ts +49 -0
- package/build/server/platform/transports/work-delivery/telemetry.d.ts.map +1 -0
- package/build/server/platform/transports/work-delivery/telemetry.js +80 -0
- package/build/server/platform/transports/work-delivery/telemetry.js.map +1 -0
- package/build/server/products/chat/api/contracts.d.ts +10 -8
- package/build/server/products/chat/api/contracts.d.ts.map +1 -1
- package/build/server/products/chat/api/resources/channelRoutes.d.ts.map +1 -1
- package/build/server/products/chat/api/resources/channelRoutes.js +27 -1
- package/build/server/products/chat/api/resources/channelRoutes.js.map +1 -1
- package/build/server/products/chat/api/routeSupport.d.ts +8 -0
- package/build/server/products/chat/api/routeSupport.d.ts.map +1 -1
- package/build/server/products/chat/api/routeSupport.js +5 -4
- package/build/server/products/chat/api/routeSupport.js.map +1 -1
- package/build/server/products/chat/api/setupRoutes.d.ts.map +1 -1
- package/build/server/products/chat/api/setupRoutes.js +24 -91
- package/build/server/products/chat/api/setupRoutes.js.map +1 -1
- package/build/server/products/chat/state/model/channelExecutionTargets.d.ts +15 -0
- package/build/server/products/chat/state/model/channelExecutionTargets.d.ts.map +1 -1
- package/build/server/products/chat/state/model/channelExecutionTargets.js +25 -0
- package/build/server/products/chat/state/model/channelExecutionTargets.js.map +1 -1
- package/build/server/products/chat/state/model/index.d.ts +1 -1
- package/build/server/products/chat/state/model/index.d.ts.map +1 -1
- package/build/server/products/chat/state/model/index.js +1 -1
- package/build/server/products/chat/state/model/index.js.map +1 -1
- package/build/server/products/code/api/relayRoutes.d.ts.map +1 -1
- package/build/server/products/code/api/relayRoutes.js +36 -7
- package/build/server/products/code/api/relayRoutes.js.map +1 -1
- package/build/server/products/code/state/relayState.d.ts +2 -1
- package/build/server/products/code/state/relayState.d.ts.map +1 -1
- package/build/server/products/code/state/relayState.js +7 -7
- package/build/server/products/code/state/relayState.js.map +1 -1
- package/build/server/products/shared/api/workspaceContracts.d.ts +5 -8
- package/build/server/products/shared/api/workspaceContracts.d.ts.map +1 -1
- package/build/server/products/work/api/goldenPathProjection.d.ts +156 -0
- package/build/server/products/work/api/goldenPathProjection.d.ts.map +1 -0
- package/build/server/products/work/api/goldenPathProjection.js +252 -0
- package/build/server/products/work/api/goldenPathProjection.js.map +1 -0
- package/build/server/products/work/api/index.d.ts +54 -1
- package/build/server/products/work/api/index.d.ts.map +1 -1
- package/build/server/products/work/api/index.js +182 -4
- package/build/server/products/work/api/index.js.map +1 -1
- package/build/server/products/work/api/projection.d.ts +7 -1
- package/build/server/products/work/api/projection.d.ts.map +1 -1
- package/build/server/products/work/api/projection.js +7 -1
- package/build/server/products/work/api/projection.js.map +1 -1
- package/build/server/products/work/shared/apiPaths.d.ts +8 -0
- package/build/server/products/work/shared/apiPaths.d.ts.map +1 -1
- package/build/server/products/work/shared/apiPaths.js +8 -0
- package/build/server/products/work/shared/apiPaths.js.map +1 -1
- package/build/server/products/work/shared/workGoldenPathMessages.d.ts +83 -0
- package/build/server/products/work/shared/workGoldenPathMessages.d.ts.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMessages.js +211 -0
- package/build/server/products/work/shared/workGoldenPathMessages.js.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.d.ts +45 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.d.ts.map +1 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.js +122 -0
- package/build/server/products/work/shared/workGoldenPathMetadata.js.map +1 -0
- package/build/server/products/work/state/workCompletionEvidence.d.ts +42 -0
- package/build/server/products/work/state/workCompletionEvidence.d.ts.map +1 -0
- package/build/server/products/work/state/workCompletionEvidence.js +59 -0
- package/build/server/products/work/state/workCompletionEvidence.js.map +1 -0
- package/build/server/products/work/state/workExecutionTaskDelegate.d.ts +16 -0
- package/build/server/products/work/state/workExecutionTaskDelegate.d.ts.map +1 -1
- package/build/server/products/work/state/workExecutionTaskDelegate.js +91 -68
- package/build/server/products/work/state/workExecutionTaskDelegate.js.map +1 -1
- package/build/server/products/work/state/workGoldenPathAdmission.d.ts +78 -0
- package/build/server/products/work/state/workGoldenPathAdmission.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathAdmission.js +249 -0
- package/build/server/products/work/state/workGoldenPathAdmission.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts +33 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js +161 -0
- package/build/server/products/work/state/workGoldenPathDeliveryEvidence.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathIntake.d.ts +34 -0
- package/build/server/products/work/state/workGoldenPathIntake.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathIntake.js +50 -0
- package/build/server/products/work/state/workGoldenPathIntake.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.d.ts +44 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.js +146 -0
- package/build/server/products/work/state/workGoldenPathLifecycle.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathPublish.d.ts +84 -0
- package/build/server/products/work/state/workGoldenPathPublish.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathPublish.js +488 -0
- package/build/server/products/work/state/workGoldenPathPublish.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathRunner.d.ts +121 -0
- package/build/server/products/work/state/workGoldenPathRunner.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathRunner.js +447 -0
- package/build/server/products/work/state/workGoldenPathRunner.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts +74 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js +239 -0
- package/build/server/products/work/state/workGoldenPathRuntimeExecutor.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathService.d.ts +152 -0
- package/build/server/products/work/state/workGoldenPathService.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathService.js +1057 -0
- package/build/server/products/work/state/workGoldenPathService.js.map +1 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts +87 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.d.ts.map +1 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.js +220 -0
- package/build/server/products/work/state/workGoldenPathTelegramPort.js.map +1 -0
- package/build/server/runtime/client.d.ts +24 -0
- package/build/server/runtime/client.d.ts.map +1 -1
- package/build/server/runtime/client.js +62 -1
- package/build/server/runtime/client.js.map +1 -1
- package/build/server/runtime/setup.d.ts +10 -4
- package/build/server/runtime/setup.d.ts.map +1 -1
- package/build/server/runtime/setup.js +14 -18
- package/build/server/runtime/setup.js.map +1 -1
- package/build/server/runtime/usageSnapshot.d.ts +3 -0
- package/build/server/runtime/usageSnapshot.d.ts.map +1 -0
- package/build/server/runtime/usageSnapshot.js +69 -0
- package/build/server/runtime/usageSnapshot.js.map +1 -0
- package/build/server/server/routes/providerCapabilityBootstrap.d.ts +69 -0
- package/build/server/server/routes/providerCapabilityBootstrap.d.ts.map +1 -0
- package/build/server/server/routes/providerCapabilityBootstrap.js +165 -0
- package/build/server/server/routes/providerCapabilityBootstrap.js.map +1 -0
- package/build/server/server/routes/providers.d.ts.map +1 -1
- package/build/server/server/routes/providers.js +112 -81
- package/build/server/server/routes/providers.js.map +1 -1
- package/build/server/server/routes/telegram.d.ts +9 -0
- package/build/server/server/routes/telegram.d.ts.map +1 -1
- package/build/server/server/routes/telegram.js +79 -72
- package/build/server/server/routes/telegram.js.map +1 -1
- package/build/server/shared/catsAppManifest.d.ts +3 -1
- package/build/server/shared/catsAppManifest.d.ts.map +1 -1
- package/build/server/shared/catsAppManifest.js +2 -0
- package/build/server/shared/catsAppManifest.js.map +1 -1
- package/build/server/shared/executionLabel.d.ts.map +1 -1
- package/build/server/shared/executionLabel.js +8 -1
- package/build/server/shared/executionLabel.js.map +1 -1
- package/build/server/shared/i18n/catalogs/en.d.ts.map +1 -1
- package/build/server/shared/i18n/catalogs/en.js +238 -3
- package/build/server/shared/i18n/catalogs/en.js.map +1 -1
- package/build/server/shared/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/build/server/shared/i18n/catalogs/zh-TW.js +236 -3
- package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
- package/build/server/shared/i18n/index.d.ts +231 -0
- package/build/server/shared/i18n/index.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.d.ts +231 -0
- package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.js +231 -0
- package/build/server/shared/i18n/messageKeys.js.map +1 -1
- package/build/server/shared/platformSetupOperation.d.ts +2 -0
- package/build/server/shared/platformSetupOperation.d.ts.map +1 -0
- package/build/server/shared/platformSetupOperation.js +9 -0
- package/build/server/shared/platformSetupOperation.js.map +1 -0
- package/build/server/shared/providerCatalog.d.ts +6 -2
- package/build/server/shared/providerCatalog.d.ts.map +1 -1
- package/build/server/shared/providerCatalog.js +15 -1
- package/build/server/shared/providerCatalog.js.map +1 -1
- package/build/server/shared/providerCatalogData.d.ts +38 -22
- package/build/server/shared/providerCatalogData.d.ts.map +1 -1
- package/build/server/shared/providerCatalogData.js +31 -10
- package/build/server/shared/providerCatalogData.js.map +1 -1
- package/build/server/shared/providerCatalogInstances.d.ts.map +1 -1
- package/build/server/shared/providerCatalogInstances.js +6 -0
- package/build/server/shared/providerCatalogInstances.js.map +1 -1
- package/build/server/shared/providerModelLabelRegistry.d.ts +29 -0
- package/build/server/shared/providerModelLabelRegistry.d.ts.map +1 -0
- package/build/server/shared/providerModelLabelRegistry.js +49 -0
- package/build/server/shared/providerModelLabelRegistry.js.map +1 -0
- package/build/server/shared/providerSelection.d.ts.map +1 -1
- package/build/server/shared/providerSelection.js +10 -13
- package/build/server/shared/providerSelection.js.map +1 -1
- package/build/server/shared/runtimeSetup.d.ts +17 -4
- package/build/server/shared/runtimeSetup.d.ts.map +1 -1
- package/build/server/shared/runtimeStatusPresentation.js +1 -1
- package/build/server/shared/runtimeStatusPresentation.js.map +1 -1
- package/package.json +23 -1
- package/packages/app-sdk/browser.d.ts +51 -0
- package/packages/app-sdk/browser.js +48 -0
- package/packages/app-sdk/package.d.ts +14 -0
- package/packages/app-sdk/package.js +131 -0
- package/packages/app-sdk/package.json +7 -0
- package/scripts/README.md +73 -26
- package/scripts/build-desktop-installer.mjs +15 -0
- package/scripts/build-test-ui.mjs +1 -1
- package/scripts/bundle-server.mjs +23 -10
- package/scripts/linux/build-desktop-package.sh +6 -6
- package/scripts/linux/install-antigravity.sh +0 -0
- package/scripts/linux/install-devin.sh +0 -0
- package/scripts/linux/install-meta-cli.sh +8 -0
- package/scripts/linux/node-cli-common.sh +2 -75
- package/scripts/linux/provider-cli-common.sh +103 -30
- package/scripts/linux/sync-agent-skills.sh +27 -5
- package/scripts/linux/test-linux-package-smoke.sh +4 -3
- package/scripts/linux/upgrade-cli-tools.sh +1 -1
- package/scripts/macos/build-desktop-package.sh +5 -5
- package/scripts/macos/install-antigravity.sh +0 -0
- package/scripts/macos/install-devin.sh +0 -0
- package/scripts/macos/install-meta-cli.sh +8 -0
- package/scripts/macos/node-cli-common.sh +2 -75
- package/scripts/macos/provider-cli-common.sh +103 -30
- package/scripts/macos/sync-agent-skills.sh +27 -5
- package/scripts/macos/test-macos-package-smoke.sh +4 -3
- package/scripts/macos/upgrade-cli-tools.sh +1 -1
- package/scripts/package-desktop.mjs +15 -2
- package/scripts/testing/check-usage-app.mts +266 -0
- package/scripts/testing/usage-app-smoke-electron.cjs +10 -0
- package/scripts/testing/usage-app-smoke-renderer.tsx +8 -0
- package/scripts/verify-desktop-app-bundle.mjs +108 -0
- package/scripts/windows/Build-DesktopPackage.ps1 +9 -6
- package/scripts/windows/Check-WindowsSetupReadiness.ps1 +14 -443
- package/scripts/windows/{Install-Aider.ps1 → Install-MetaCli.ps1} +180 -92
- package/scripts/windows/Install-Ollama.ps1 +4 -1
- package/scripts/windows/Remove-MergedBranches.ps1 +229 -0
- package/scripts/windows/Sync-AgentSkills.ps1 +29 -6
- package/scripts/windows/Test-WindowsInstallerSmoke.ps1 +2 -1
- package/build/desktop/updateNotifications.d.ts +0 -64
- package/build/desktop/updateNotifications.d.ts.map +0 -1
- package/build/desktop/updateNotifications.js +0 -143
- package/build/desktop/updateNotifications.js.map +0 -1
- package/build/renderer/assets/App-C57f4p8k.js +0 -2
- package/build/renderer/assets/App-CPqGDXVi.js +0 -1
- package/build/renderer/assets/App-DGwkRFZl.css +0 -1
- package/build/renderer/assets/WorkspaceAppRoutes-DYg2vnjz.js +0 -1
- package/build/renderer/assets/app-DVN9Ghrk.js +0 -43
- package/build/renderer/assets/app-XnXwkcD2.css +0 -1
- package/build/renderer/assets/conversationSidebarRecentEntries-XZVCnMLw.js +0 -6
- package/scripts/linux/install-aider.sh +0 -8
- package/scripts/macos/install-aider.sh +0 -8
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type AppPin } from '#cats-app-package';
|
|
2
|
+
import type { CatsAppManifestV1 } from '../../shared/catsAppManifest.js';
|
|
3
|
+
export declare function validateRendererPackage(bytes: Uint8Array, pin: Pick<AppPin, 'id' | 'version' | 'sha256'>): {
|
|
4
|
+
manifest: CatsAppManifestV1;
|
|
5
|
+
files: {
|
|
6
|
+
path: string;
|
|
7
|
+
data: Buffer;
|
|
8
|
+
}[];
|
|
9
|
+
sha256: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function installRendererPackage(options: {
|
|
12
|
+
chatStatePath: string;
|
|
13
|
+
bytes: Uint8Array;
|
|
14
|
+
pin: Pick<AppPin, 'id' | 'version' | 'sha256'>;
|
|
15
|
+
source: 'desktop-bundle' | 'local-package';
|
|
16
|
+
enable?: boolean;
|
|
17
|
+
}): Promise<import("../../shared/catsAppManifest.js").CatsInstalledAppRecord>;
|
|
18
|
+
export declare function installBundledApps(chatStatePath: string, lockPath: string): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=packageInstaller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageInstaller.d.ts","sourceRoot":"","sources":["../../../../src/platform/apps/packageInstaller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsG,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEpJ,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAIzE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;;;;;;;EAUxG;AAID,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IACzF,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC9D,6EA2CA;AAED,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/F"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, readFile, rename, writeFile, lstat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { APP_SDK_VERSION, PLATFORM_VERSION, decodeAppPackage, parseAppLock, resolveAppLock, supportsVersion } from '#cats-app-package';
|
|
4
|
+
import { parseCatsAppManifestV1 } from '../../shared/catsAppValidation.js';
|
|
5
|
+
import { resolveCatsAppPackageInstallDir, resolveCatsAppStoragePathsFromChatState } from './paths.js';
|
|
6
|
+
import { FileCatsAppRegistry } from './registry.js';
|
|
7
|
+
export function validateRendererPackage(bytes, pin) {
|
|
8
|
+
const decoded = decodeAppPackage(bytes, pin);
|
|
9
|
+
const result = parseCatsAppManifestV1(decoded.manifest);
|
|
10
|
+
if (!result.ok)
|
|
11
|
+
throw new Error(result.issues.map((issue) => issue.message).join(' '));
|
|
12
|
+
const manifest = result.manifest;
|
|
13
|
+
if (manifest.category !== 'user-app' || ['install', 'validate'].includes(manifest.id))
|
|
14
|
+
throw new Error('Only utility user-app packages are supported.');
|
|
15
|
+
if (!supportsVersion(PLATFORM_VERSION, manifest.compatibility.catsPlatform)
|
|
16
|
+
|| !supportsVersion(APP_SDK_VERSION, manifest.compatibility.appSdk))
|
|
17
|
+
throw new Error('Incompatible platform or App SDK version.');
|
|
18
|
+
if (manifest.permissions.some((permission) => !['ui.route', 'ui.lobby', 'runtime.telemetry.read', 'runtime.telemetry.refresh'].includes(permission)))
|
|
19
|
+
throw new Error('This package requests capabilities not supported by the renderer host.');
|
|
20
|
+
return { ...decoded, manifest };
|
|
21
|
+
}
|
|
22
|
+
const installQueues = new Map();
|
|
23
|
+
export async function installRendererPackage(options) {
|
|
24
|
+
const paths = resolveCatsAppStoragePathsFromChatState(options.chatStatePath);
|
|
25
|
+
const key = paths.registryPath.toLowerCase();
|
|
26
|
+
const pending = (installQueues.get(key) ?? Promise.resolve()).catch(() => { }).then(async () => {
|
|
27
|
+
const decoded = validateRendererPackage(options.bytes, options.pin);
|
|
28
|
+
const registry = new FileCatsAppRegistry({ registryPath: paths.registryPath });
|
|
29
|
+
const previous = (await registry.readState()).apps.find((app) => app.id === decoded.manifest.id);
|
|
30
|
+
// Desktop updates respect an explicit disable/uninstall. The owner's local install is explicit.
|
|
31
|
+
if (options.source === 'desktop-bundle' && previous?.installState === 'uninstalled')
|
|
32
|
+
return previous;
|
|
33
|
+
const target = resolveCatsAppPackageInstallDir(paths, decoded.manifest.id, decoded.manifest.version);
|
|
34
|
+
const manifest = {
|
|
35
|
+
...decoded.manifest,
|
|
36
|
+
trustTier: options.source === 'desktop-bundle' ? 'system' : 'local-user',
|
|
37
|
+
};
|
|
38
|
+
await mkdir(path.dirname(target), { recursive: true });
|
|
39
|
+
let exists = false;
|
|
40
|
+
try {
|
|
41
|
+
const targetStat = await lstat(target);
|
|
42
|
+
if (!targetStat.isDirectory() || targetStat.isSymbolicLink())
|
|
43
|
+
throw new Error('Unsafe package install directory.');
|
|
44
|
+
exists = true;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error.code !== 'ENOENT')
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
if (exists) {
|
|
51
|
+
const installed = JSON.parse(await readFile(path.join(target, '.package.json'), 'utf8'));
|
|
52
|
+
if (installed.sha256 !== decoded.sha256)
|
|
53
|
+
throw new Error('The same app version already exists with a different digest. Publish a new version.');
|
|
54
|
+
// Re-check the immutable archive on every activation, not just its metadata file.
|
|
55
|
+
const archive = await readFile(path.join(target, 'payload.catsapp'));
|
|
56
|
+
decodeAppPackage(archive, options.pin);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// No executable hooks or extraction of arbitrary paths. Keep failed staging recoverable.
|
|
60
|
+
const stage = await mkdtemp(path.join(path.dirname(target), '.staging-'));
|
|
61
|
+
await writeFile(path.join(stage, 'payload.catsapp'), options.bytes, { flag: 'wx' });
|
|
62
|
+
await writeFile(path.join(stage, 'cats.app.json'), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
63
|
+
await writeFile(path.join(stage, '.package.json'), `${JSON.stringify({ sha256: decoded.sha256, source: options.source })}\n`);
|
|
64
|
+
await rename(stage, target);
|
|
65
|
+
}
|
|
66
|
+
const enabled = options.source === 'desktop-bundle' && previous
|
|
67
|
+
? previous.enabled && previous.installState === 'enabled' : options.enable === true;
|
|
68
|
+
return registry.installApp({ manifest, packagePath: target, packageSha256: decoded.sha256,
|
|
69
|
+
packageSource: options.source, enabled, installState: enabled ? 'enabled' : 'disabled' });
|
|
70
|
+
});
|
|
71
|
+
installQueues.set(key, pending);
|
|
72
|
+
try {
|
|
73
|
+
return await pending;
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
if (installQueues.get(key) === pending)
|
|
77
|
+
installQueues.delete(key);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function installBundledApps(chatStatePath, lockPath) {
|
|
81
|
+
const selection = parseAppLock(JSON.parse(await readFile(lockPath, 'utf8')));
|
|
82
|
+
if (selection.apps.some((app) => app.artifact !== `${app.id}-${app.version}.catsapp`)) {
|
|
83
|
+
throw new Error('A Desktop bundle must use adjacent local archives; network/path traversal inputs are forbidden at startup.');
|
|
84
|
+
}
|
|
85
|
+
const apps = await resolveAppLock(lockPath);
|
|
86
|
+
// Validate the entire selection before changing active registry entries.
|
|
87
|
+
for (const app of apps)
|
|
88
|
+
validateRendererPackage(app.bytes, app);
|
|
89
|
+
for (const app of apps)
|
|
90
|
+
await installRendererPackage({ chatStatePath, bytes: app.bytes, pin: app, source: 'desktop-bundle', enable: true });
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=packageInstaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageInstaller.js","sourceRoot":"","sources":["../../../../src/platform/apps/packageInstaller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAe,MAAM,mBAAmB,CAAC;AACpJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,OAAO,EAAE,+BAA+B,EAAE,uCAAuC,EAAE,MAAM,YAAY,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,UAAU,uBAAuB,CAAC,KAAiB,EAAE,GAA8C;IACvG,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IAAI,QAAQ,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACxJ,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC;WACtE,CAAC,eAAe,CAAC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IACpI,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,wBAAwB,EAAE,2BAA2B,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IAChP,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,aAAa,GAAG,IAAI,GAAG,EAA4B,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAG5C;IACC,MAAM,KAAK,GAAG,uCAAuC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAC5F,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjG,gGAAgG;QAChG,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,IAAI,QAAQ,EAAE,YAAY,KAAK,aAAa;YAAE,OAAO,QAAQ,CAAC;QACrG,MAAM,MAAM,GAAG,+BAA+B,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrG,MAAM,QAAQ,GAAsB;YAClC,GAAG,OAAO,CAAC,QAAQ;YACnB,SAAS,EAAE,OAAO,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;SACzE,CAAC;QACF,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACnH,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QAAC,CAAC;QACxF,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;YAChH,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;YAChJ,kFAAkF;YAClF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;YACrE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,yFAAyF;YACzF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC;YAC1E,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACpF,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;YAC9H,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,gBAAgB,IAAI,QAAQ;YAC7D,CAAC,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;QACtF,OAAO,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,MAAM;YACvF,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC;QAAC,OAAO,MAAM,OAAO,CAAC;IAAC,CAAC;YACrB,CAAC;QAAC,IAAI,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,OAAO;YAAE,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;AAChF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,aAAqB,EAAE,QAAgB;IAC9E,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,UAAU,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;IAChI,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,yEAAyE;IACzE,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAChE,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,MAAM,sBAAsB,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9I,CAAC"}
|
|
@@ -8,6 +8,8 @@ export interface CatsAppRegistryInstallInput {
|
|
|
8
8
|
packagePath: string;
|
|
9
9
|
installState?: CatsAppInstallState;
|
|
10
10
|
enabled?: boolean;
|
|
11
|
+
packageSha256?: string;
|
|
12
|
+
packageSource?: 'desktop-bundle' | 'local-package';
|
|
11
13
|
}
|
|
12
14
|
export interface CatsAppRegistryUpdateStateInput {
|
|
13
15
|
installState: CatsAppInstallState;
|
|
@@ -29,8 +31,12 @@ export declare class FileCatsAppRegistry {
|
|
|
29
31
|
listInstalledApps(): Promise<CatsInstalledAppRecord[]>;
|
|
30
32
|
getInstalledApp(appId: string): Promise<CatsInstalledAppRecord | null>;
|
|
31
33
|
installApp(input: CatsAppRegistryInstallInput): Promise<CatsInstalledAppRecord>;
|
|
34
|
+
private installAppUnlocked;
|
|
32
35
|
updateAppState(appId: string, input: CatsAppRegistryUpdateStateInput): Promise<CatsInstalledAppRecord>;
|
|
36
|
+
private updateAppStateUnlocked;
|
|
33
37
|
uninstallApp(appId: string, options?: CatsAppRegistryUninstallOptions): Promise<CatsInstalledAppRecord | null>;
|
|
38
|
+
private uninstallAppUnlocked;
|
|
34
39
|
private writeState;
|
|
40
|
+
private serialize;
|
|
35
41
|
}
|
|
36
42
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/platform/apps/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,sBAAsB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/platform/apps/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,sBAAsB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAAC;CACpD;AAED,MAAM,WAAW,+BAA+B;IAC9C,YAAY,EAAE,mBAAmB,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAiDD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,OAAO,EAAE,0BAA0B;IAKzC,SAAS,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAW1C,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAOtD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAMtE,UAAU,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAIvE,kBAAkB;IA2B1B,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,+BAA+B,GACrC,OAAO,CAAC,sBAAsB,CAAC;YAIpB,sBAAsB;IAgB9B,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;YAI3B,oBAAoB;YAwBpB,UAAU;YAOV,SAAS;CAQxB"}
|
|
@@ -39,6 +39,7 @@ function parseRegistryState(raw) {
|
|
|
39
39
|
function enabledForState(state) {
|
|
40
40
|
return state === 'enabled';
|
|
41
41
|
}
|
|
42
|
+
const registryWrites = new Map();
|
|
42
43
|
export class FileCatsAppRegistry {
|
|
43
44
|
registryPath;
|
|
44
45
|
now;
|
|
@@ -69,6 +70,9 @@ export class FileCatsAppRegistry {
|
|
|
69
70
|
return matched ? cloneRecord(matched) : null;
|
|
70
71
|
}
|
|
71
72
|
async installApp(input) {
|
|
73
|
+
return this.serialize(() => this.installAppUnlocked(input));
|
|
74
|
+
}
|
|
75
|
+
async installAppUnlocked(input) {
|
|
72
76
|
const state = await this.readState();
|
|
73
77
|
const now = this.now().toISOString();
|
|
74
78
|
const installState = input.installState ?? 'installed';
|
|
@@ -81,6 +85,7 @@ export class FileCatsAppRegistry {
|
|
|
81
85
|
installedAt: now,
|
|
82
86
|
updatedAt: now,
|
|
83
87
|
lastError: null,
|
|
88
|
+
...(input.packageSha256 ? { packageSha256: input.packageSha256, packageSource: input.packageSource } : {}),
|
|
84
89
|
};
|
|
85
90
|
const existingIndex = state.apps.findIndex((record) => record.id === nextRecord.id);
|
|
86
91
|
if (existingIndex >= 0) {
|
|
@@ -95,6 +100,9 @@ export class FileCatsAppRegistry {
|
|
|
95
100
|
return cloneRecord(nextRecord);
|
|
96
101
|
}
|
|
97
102
|
async updateAppState(appId, input) {
|
|
103
|
+
return this.serialize(() => this.updateAppStateUnlocked(appId, input));
|
|
104
|
+
}
|
|
105
|
+
async updateAppStateUnlocked(appId, input) {
|
|
98
106
|
const state = await this.readState();
|
|
99
107
|
const record = state.apps.find((entry) => entry.id === appId);
|
|
100
108
|
if (!record) {
|
|
@@ -110,6 +118,9 @@ export class FileCatsAppRegistry {
|
|
|
110
118
|
return cloneRecord(record);
|
|
111
119
|
}
|
|
112
120
|
async uninstallApp(appId, options = {}) {
|
|
121
|
+
return this.serialize(() => this.uninstallAppUnlocked(appId, options));
|
|
122
|
+
}
|
|
123
|
+
async uninstallAppUnlocked(appId, options) {
|
|
113
124
|
const state = await this.readState();
|
|
114
125
|
const existingIndex = state.apps.findIndex((record) => record.id === appId);
|
|
115
126
|
if (existingIndex < 0) {
|
|
@@ -138,6 +149,19 @@ export class FileCatsAppRegistry {
|
|
|
138
149
|
await writeFile(tempPath, `${JSON.stringify(cloneState(state), null, 2)}\n`, 'utf8');
|
|
139
150
|
await rename(tempPath, this.registryPath);
|
|
140
151
|
}
|
|
152
|
+
async serialize(operation) {
|
|
153
|
+
const key = path.resolve(this.registryPath).toLowerCase();
|
|
154
|
+
const previous = registryWrites.get(key) ?? Promise.resolve();
|
|
155
|
+
const current = previous.catch(() => { }).then(operation);
|
|
156
|
+
registryWrites.set(key, current);
|
|
157
|
+
try {
|
|
158
|
+
return await current;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
if (registryWrites.get(key) === current)
|
|
162
|
+
registryWrites.delete(key);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
141
165
|
}
|
|
142
166
|
function isNodeError(error) {
|
|
143
167
|
return error instanceof Error && 'code' in error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/platform/apps/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../../src/platform/apps/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../../src/platform/apps/renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,wBAAsB,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5G"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { decodeAppPackage, readBrowserSdk, MAX_PACKAGE_BYTES } from '#cats-app-package';
|
|
4
|
+
export async function readAppRenderer(record) {
|
|
5
|
+
if (!record.packageSha256 || !record.packageSource)
|
|
6
|
+
throw new Error('This app has no verified renderer package. Install a .catsapp artifact.');
|
|
7
|
+
const archivePath = path.join(record.packagePath, 'payload.catsapp');
|
|
8
|
+
if ((await stat(archivePath)).size > MAX_PACKAGE_BYTES)
|
|
9
|
+
throw new Error('App package exceeds size limit.');
|
|
10
|
+
const decoded = decodeAppPackage(await readFile(archivePath), {
|
|
11
|
+
id: record.id, version: record.manifest.version, sha256: record.packageSha256,
|
|
12
|
+
});
|
|
13
|
+
const html = decoded.files.find((file) => file.path === record.manifest.entrypoints?.renderer)?.data.toString('utf8');
|
|
14
|
+
if (!html || !/<head\s*>/i.test(html))
|
|
15
|
+
throw new Error('App renderer must contain an explicit <head>.');
|
|
16
|
+
return { html, sdk: await readBrowserSdk() };
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../../src/platform/apps/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGxF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA8B;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;IAC/I,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IACrE,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3G,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,EAAE;QAC5D,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa;KAC9E,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtH,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACxG,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,cAAc,EAAE,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Short-lived, single-use, purpose-bound step-up capability.
|
|
3
|
+
*
|
|
4
|
+
* ADR-111 section 3 rejects both a renderer-only password modal and a broad
|
|
5
|
+
* `recentlyAuthenticatedAt` timestamp on the session: the first is not an
|
|
6
|
+
* authorization boundary at all, and the second can authorize several
|
|
7
|
+
* unrelated sensitive actions. A grant is therefore bound to one account, one
|
|
8
|
+
* browser session, and one purpose, and is consumed on the first attempt that
|
|
9
|
+
* presents it — whether or not the rest of that attempt succeeds.
|
|
10
|
+
*
|
|
11
|
+
* Grants live in memory only. They are five-minute capabilities that should
|
|
12
|
+
* die with the process, so they are never written to the auth-state file.
|
|
13
|
+
*/
|
|
14
|
+
export declare const PLATFORM_AUTH_ACTION_GRANT_TTL_MS: number;
|
|
15
|
+
export declare const PLATFORM_AUTH_ACTION_GRANT_TOKEN_BYTES = 32;
|
|
16
|
+
export declare const MAX_PENDING_PLATFORM_AUTH_ACTION_GRANTS = 32;
|
|
17
|
+
export declare const PLATFORM_AUTH_ACTION_HEADER = "x-cats-auth-action";
|
|
18
|
+
export declare const PLATFORM_AUTH_ACTION_GRANT_PURPOSES: readonly ["link_google", "unlink_google"];
|
|
19
|
+
export type PlatformAuthActionGrantPurpose = (typeof PLATFORM_AUTH_ACTION_GRANT_PURPOSES)[number];
|
|
20
|
+
export declare function isPlatformAuthActionGrantPurpose(value: unknown): value is PlatformAuthActionGrantPurpose;
|
|
21
|
+
export interface PlatformAuthActionGrantIssueInput {
|
|
22
|
+
accountId: string;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
purpose: PlatformAuthActionGrantPurpose;
|
|
25
|
+
sessionSecret: string;
|
|
26
|
+
ttlMs?: number;
|
|
27
|
+
now?: Date;
|
|
28
|
+
}
|
|
29
|
+
export interface PlatformAuthActionGrantIssueResult {
|
|
30
|
+
token: string;
|
|
31
|
+
expiresAt: string;
|
|
32
|
+
}
|
|
33
|
+
export interface PlatformAuthActionGrantConsumeInput {
|
|
34
|
+
token: string;
|
|
35
|
+
accountId: string;
|
|
36
|
+
sessionId: string;
|
|
37
|
+
purpose: PlatformAuthActionGrantPurpose;
|
|
38
|
+
sessionSecret: string;
|
|
39
|
+
now?: Date;
|
|
40
|
+
}
|
|
41
|
+
export type PlatformAuthActionGrantRejectionReason = 'missing_token' | 'unknown_or_expired' | 'purpose_mismatch' | 'account_mismatch' | 'session_mismatch';
|
|
42
|
+
export type PlatformAuthActionGrantConsumeOutcome = {
|
|
43
|
+
ok: true;
|
|
44
|
+
purpose: PlatformAuthActionGrantPurpose;
|
|
45
|
+
} | {
|
|
46
|
+
ok: false;
|
|
47
|
+
reason: PlatformAuthActionGrantRejectionReason;
|
|
48
|
+
};
|
|
49
|
+
export interface PlatformAuthActionGrantStore {
|
|
50
|
+
issue(input: PlatformAuthActionGrantIssueInput): PlatformAuthActionGrantIssueResult;
|
|
51
|
+
consume(input: PlatformAuthActionGrantConsumeInput): PlatformAuthActionGrantConsumeOutcome;
|
|
52
|
+
revokeForSession(sessionId: string): void;
|
|
53
|
+
}
|
|
54
|
+
export declare class MemoryPlatformAuthActionGrantStore implements PlatformAuthActionGrantStore {
|
|
55
|
+
private readonly grants;
|
|
56
|
+
issue(input: PlatformAuthActionGrantIssueInput): PlatformAuthActionGrantIssueResult;
|
|
57
|
+
consume(input: PlatformAuthActionGrantConsumeInput): PlatformAuthActionGrantConsumeOutcome;
|
|
58
|
+
revokeForSession(sessionId: string): void;
|
|
59
|
+
private prune;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=actionGrant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionGrant.d.ts","sourceRoot":"","sources":["../../../../src/platform/auth/actionGrant.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,iCAAiC,QAAgB,CAAC;AAC/D,eAAO,MAAM,sCAAsC,KAAK,CAAC;AACzD,eAAO,MAAM,uCAAuC,KAAK,CAAC;AAC1D,eAAO,MAAM,2BAA2B,uBAAuB,CAAC;AAEhE,eAAO,MAAM,mCAAmC,2CAGtC,CAAC;AAEX,MAAM,MAAM,8BAA8B,GACxC,CAAC,OAAO,mCAAmC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,8BAA8B,CAGzC;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,8BAA8B,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kCAAkC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mCAAmC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,8BAA8B,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,MAAM,sCAAsC,GAC9C,eAAe,GACf,oBAAoB,GACpB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,qCAAqC,GAC7C;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,8BAA8B,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sCAAsC,CAAA;CAAE,CAAC;AAElE,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,KAAK,EAAE,iCAAiC,GAAG,kCAAkC,CAAC;IACpF,OAAO,CAAC,KAAK,EAAE,mCAAmC,GAAG,qCAAqC,CAAC;IAC3F,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAWD,qBAAa,kCAAmC,YAAW,4BAA4B;IACrF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoD;IAE3E,KAAK,CAAC,KAAK,EAAE,iCAAiC,GAAG,kCAAkC;IAsCnF,OAAO,CAAC,KAAK,EAAE,mCAAmC,GAAG,qCAAqC;IA8B1F,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQzC,OAAO,CAAC,KAAK;CAQd"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { hashSessionToken } from './session.js';
|
|
3
|
+
/**
|
|
4
|
+
* Short-lived, single-use, purpose-bound step-up capability.
|
|
5
|
+
*
|
|
6
|
+
* ADR-111 section 3 rejects both a renderer-only password modal and a broad
|
|
7
|
+
* `recentlyAuthenticatedAt` timestamp on the session: the first is not an
|
|
8
|
+
* authorization boundary at all, and the second can authorize several
|
|
9
|
+
* unrelated sensitive actions. A grant is therefore bound to one account, one
|
|
10
|
+
* browser session, and one purpose, and is consumed on the first attempt that
|
|
11
|
+
* presents it — whether or not the rest of that attempt succeeds.
|
|
12
|
+
*
|
|
13
|
+
* Grants live in memory only. They are five-minute capabilities that should
|
|
14
|
+
* die with the process, so they are never written to the auth-state file.
|
|
15
|
+
*/
|
|
16
|
+
export const PLATFORM_AUTH_ACTION_GRANT_TTL_MS = 5 * 60 * 1000;
|
|
17
|
+
export const PLATFORM_AUTH_ACTION_GRANT_TOKEN_BYTES = 32;
|
|
18
|
+
export const MAX_PENDING_PLATFORM_AUTH_ACTION_GRANTS = 32;
|
|
19
|
+
export const PLATFORM_AUTH_ACTION_HEADER = 'x-cats-auth-action';
|
|
20
|
+
export const PLATFORM_AUTH_ACTION_GRANT_PURPOSES = [
|
|
21
|
+
'link_google',
|
|
22
|
+
'unlink_google',
|
|
23
|
+
];
|
|
24
|
+
export function isPlatformAuthActionGrantPurpose(value) {
|
|
25
|
+
return typeof value === 'string'
|
|
26
|
+
&& PLATFORM_AUTH_ACTION_GRANT_PURPOSES.includes(value);
|
|
27
|
+
}
|
|
28
|
+
export class MemoryPlatformAuthActionGrantStore {
|
|
29
|
+
grants = new Map();
|
|
30
|
+
issue(input) {
|
|
31
|
+
const accountId = input.accountId.trim();
|
|
32
|
+
const sessionId = input.sessionId.trim();
|
|
33
|
+
if (!accountId || !sessionId) {
|
|
34
|
+
throw new Error('Action grant account and session ids are required.');
|
|
35
|
+
}
|
|
36
|
+
const now = input.now ?? new Date();
|
|
37
|
+
this.prune(now);
|
|
38
|
+
const ttlMs = input.ttlMs ?? PLATFORM_AUTH_ACTION_GRANT_TTL_MS;
|
|
39
|
+
const token = randomBytes(PLATFORM_AUTH_ACTION_GRANT_TOKEN_BYTES).toString('base64url');
|
|
40
|
+
const tokenHash = hashSessionToken(token, input.sessionSecret);
|
|
41
|
+
const expiresAt = new Date(now.getTime() + ttlMs).toISOString();
|
|
42
|
+
// A caller that keeps requesting grants without spending them must not be
|
|
43
|
+
// able to grow this map without bound. Evicting the oldest entry keeps the
|
|
44
|
+
// most recent step-up usable, which is the one the operator just performed.
|
|
45
|
+
if (this.grants.size >= MAX_PENDING_PLATFORM_AUTH_ACTION_GRANTS) {
|
|
46
|
+
const oldest = [...this.grants.entries()].sort((left, right) => Date.parse(left[1].createdAt) - Date.parse(right[1].createdAt))[0];
|
|
47
|
+
if (oldest) {
|
|
48
|
+
this.grants.delete(oldest[0]);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.grants.set(tokenHash, {
|
|
52
|
+
tokenHash,
|
|
53
|
+
accountId,
|
|
54
|
+
sessionId,
|
|
55
|
+
purpose: input.purpose,
|
|
56
|
+
createdAt: now.toISOString(),
|
|
57
|
+
expiresAt,
|
|
58
|
+
});
|
|
59
|
+
return { token, expiresAt };
|
|
60
|
+
}
|
|
61
|
+
consume(input) {
|
|
62
|
+
const token = input.token.trim();
|
|
63
|
+
if (!token) {
|
|
64
|
+
return { ok: false, reason: 'missing_token' };
|
|
65
|
+
}
|
|
66
|
+
const now = input.now ?? new Date();
|
|
67
|
+
this.prune(now);
|
|
68
|
+
const tokenHash = hashSessionToken(token, input.sessionSecret);
|
|
69
|
+
const stored = this.grants.get(tokenHash) ?? null;
|
|
70
|
+
if (!stored || !matchesTokenHash(stored.tokenHash, tokenHash)) {
|
|
71
|
+
return { ok: false, reason: 'unknown_or_expired' };
|
|
72
|
+
}
|
|
73
|
+
// SPEC-113 requirement 22: the grant is spent on the first matching attempt
|
|
74
|
+
// even when a later check in that same attempt fails.
|
|
75
|
+
this.grants.delete(tokenHash);
|
|
76
|
+
if (stored.purpose !== input.purpose) {
|
|
77
|
+
return { ok: false, reason: 'purpose_mismatch' };
|
|
78
|
+
}
|
|
79
|
+
if (stored.accountId !== input.accountId) {
|
|
80
|
+
return { ok: false, reason: 'account_mismatch' };
|
|
81
|
+
}
|
|
82
|
+
if (stored.sessionId !== input.sessionId) {
|
|
83
|
+
return { ok: false, reason: 'session_mismatch' };
|
|
84
|
+
}
|
|
85
|
+
return { ok: true, purpose: stored.purpose };
|
|
86
|
+
}
|
|
87
|
+
revokeForSession(sessionId) {
|
|
88
|
+
for (const [tokenHash, grant] of this.grants) {
|
|
89
|
+
if (grant.sessionId === sessionId) {
|
|
90
|
+
this.grants.delete(tokenHash);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
prune(now) {
|
|
95
|
+
const nowMs = now.getTime();
|
|
96
|
+
for (const [tokenHash, grant] of this.grants) {
|
|
97
|
+
if (Date.parse(grant.expiresAt) <= nowMs) {
|
|
98
|
+
this.grants.delete(tokenHash);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function matchesTokenHash(storedHash, candidateHash) {
|
|
104
|
+
const stored = Buffer.from(storedHash, 'utf8');
|
|
105
|
+
const candidate = Buffer.from(candidateHash, 'utf8');
|
|
106
|
+
return stored.length === candidate.length && timingSafeEqual(stored, candidate);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=actionGrant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionGrant.js","sourceRoot":"","sources":["../../../../src/platform/auth/actionGrant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Admin credential rules for first-admin setup and repair bootstrap.
|
|
3
|
+
*
|
|
4
|
+
* ADR-111 fixes one promotion-period password policy for both paths: 8 to 256
|
|
5
|
+
* Unicode code points inclusive, with no composition rules. Length is counted
|
|
6
|
+
* in code points, not UTF-16 code units, so an emoji or other astral character
|
|
7
|
+
* counts once rather than twice.
|
|
8
|
+
*/
|
|
9
|
+
export declare const PLATFORM_ADMIN_PASSWORD_MIN_CODE_POINTS = 8;
|
|
10
|
+
export declare const PLATFORM_ADMIN_PASSWORD_MAX_CODE_POINTS = 256;
|
|
11
|
+
export type PlatformAdminCredentialRejectionReason = 'identifier_required' | 'password_required' | 'password_too_short' | 'password_too_long';
|
|
12
|
+
export interface PlatformAdminCredentials {
|
|
13
|
+
identifier: string;
|
|
14
|
+
password: string;
|
|
15
|
+
}
|
|
16
|
+
export type PlatformAdminCredentialValidation = {
|
|
17
|
+
ok: true;
|
|
18
|
+
credentials: PlatformAdminCredentials;
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
reason: PlatformAdminCredentialRejectionReason;
|
|
22
|
+
};
|
|
23
|
+
export declare class PlatformAdminCredentialError extends Error {
|
|
24
|
+
readonly reason: PlatformAdminCredentialRejectionReason;
|
|
25
|
+
constructor(reason: PlatformAdminCredentialRejectionReason);
|
|
26
|
+
}
|
|
27
|
+
export declare function countUnicodeCodePoints(value: string): number;
|
|
28
|
+
export declare function validatePlatformAdminCredentials(input: {
|
|
29
|
+
identifier: unknown;
|
|
30
|
+
password: unknown;
|
|
31
|
+
}): PlatformAdminCredentialValidation;
|
|
32
|
+
export declare function assertPlatformAdminCredentials(input: {
|
|
33
|
+
identifier: unknown;
|
|
34
|
+
password: unknown;
|
|
35
|
+
}): PlatformAdminCredentials;
|
|
36
|
+
export declare function describePlatformAdminCredentialRejection(reason: PlatformAdminCredentialRejectionReason): string;
|
|
37
|
+
//# sourceMappingURL=adminCredentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adminCredentials.d.ts","sourceRoot":"","sources":["../../../../src/platform/auth/adminCredentials.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,uCAAuC,IAAI,CAAC;AACzD,eAAO,MAAM,uCAAuC,MAAM,CAAC;AAE3D,MAAM,MAAM,sCAAsC,GAC9C,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,mBAAmB,CAAC;AAExB,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iCAAiC,GACzC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,WAAW,EAAE,wBAAwB,CAAA;CAAE,GACnD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,sCAAsC,CAAA;CAAE,CAAC;AAElE,qBAAa,4BAA6B,SAAQ,KAAK;aACzB,MAAM,EAAE,sCAAsC;gBAA9C,MAAM,EAAE,sCAAsC;CAI3E;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE;IACtD,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,iCAAiC,CAoBpC;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB,GAAG,wBAAwB,CAM3B;AAED,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,sCAAsC,GAC7C,MAAM,CAeR"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Admin credential rules for first-admin setup and repair bootstrap.
|
|
3
|
+
*
|
|
4
|
+
* ADR-111 fixes one promotion-period password policy for both paths: 8 to 256
|
|
5
|
+
* Unicode code points inclusive, with no composition rules. Length is counted
|
|
6
|
+
* in code points, not UTF-16 code units, so an emoji or other astral character
|
|
7
|
+
* counts once rather than twice.
|
|
8
|
+
*/
|
|
9
|
+
export const PLATFORM_ADMIN_PASSWORD_MIN_CODE_POINTS = 8;
|
|
10
|
+
export const PLATFORM_ADMIN_PASSWORD_MAX_CODE_POINTS = 256;
|
|
11
|
+
export class PlatformAdminCredentialError extends Error {
|
|
12
|
+
reason;
|
|
13
|
+
constructor(reason) {
|
|
14
|
+
super(describePlatformAdminCredentialRejection(reason));
|
|
15
|
+
this.reason = reason;
|
|
16
|
+
this.name = 'PlatformAdminCredentialError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function countUnicodeCodePoints(value) {
|
|
20
|
+
let count = 0;
|
|
21
|
+
for (const _codePoint of value) {
|
|
22
|
+
count += 1;
|
|
23
|
+
}
|
|
24
|
+
return count;
|
|
25
|
+
}
|
|
26
|
+
export function validatePlatformAdminCredentials(input) {
|
|
27
|
+
const identifier = typeof input.identifier === 'string' ? input.identifier.trim() : '';
|
|
28
|
+
if (!identifier) {
|
|
29
|
+
return { ok: false, reason: 'identifier_required' };
|
|
30
|
+
}
|
|
31
|
+
const password = typeof input.password === 'string' ? input.password : '';
|
|
32
|
+
if (!password) {
|
|
33
|
+
return { ok: false, reason: 'password_required' };
|
|
34
|
+
}
|
|
35
|
+
const codePoints = countUnicodeCodePoints(password);
|
|
36
|
+
if (codePoints < PLATFORM_ADMIN_PASSWORD_MIN_CODE_POINTS) {
|
|
37
|
+
return { ok: false, reason: 'password_too_short' };
|
|
38
|
+
}
|
|
39
|
+
if (codePoints > PLATFORM_ADMIN_PASSWORD_MAX_CODE_POINTS) {
|
|
40
|
+
return { ok: false, reason: 'password_too_long' };
|
|
41
|
+
}
|
|
42
|
+
return { ok: true, credentials: { identifier, password } };
|
|
43
|
+
}
|
|
44
|
+
export function assertPlatformAdminCredentials(input) {
|
|
45
|
+
const validation = validatePlatformAdminCredentials(input);
|
|
46
|
+
if (!validation.ok) {
|
|
47
|
+
throw new PlatformAdminCredentialError(validation.reason);
|
|
48
|
+
}
|
|
49
|
+
return validation.credentials;
|
|
50
|
+
}
|
|
51
|
+
export function describePlatformAdminCredentialRejection(reason) {
|
|
52
|
+
switch (reason) {
|
|
53
|
+
case 'identifier_required':
|
|
54
|
+
return 'Admin identifier is required.';
|
|
55
|
+
case 'password_required':
|
|
56
|
+
return 'Admin password is required.';
|
|
57
|
+
case 'password_too_short':
|
|
58
|
+
return `Admin password must contain at least ${PLATFORM_ADMIN_PASSWORD_MIN_CODE_POINTS} characters.`;
|
|
59
|
+
case 'password_too_long':
|
|
60
|
+
return `Admin password must contain at most ${PLATFORM_ADMIN_PASSWORD_MAX_CODE_POINTS} characters.`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=adminCredentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adminCredentials.js","sourceRoot":"","sources":["../../../../src/platform/auth/adminCredentials.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,uCAAuC,GAAG,GAAG,CAAC;AAiB3D,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACzB;IAA5B,YAA4B,MAA8C;QACxE,KAAK,CAAC,wCAAwC,CAAC,MAAM,CAAC,CAAC,CAAC;QAD9B,WAAM,GAAN,MAAM,CAAwC;QAExE,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAGhD;IACC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,UAAU,GAAG,uCAAuC,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,UAAU,GAAG,uCAAuC,EAAE,CAAC;QACzD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,KAG9C;IACC,MAAM,UAAU,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,UAAU,CAAC,WAAW,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,wCAAwC,CACtD,MAA8C;IAE9C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,qBAAqB;YACxB,OAAO,+BAA+B,CAAC;QACzC,KAAK,mBAAmB;YACtB,OAAO,6BAA6B,CAAC;QACvC,KAAK,oBAAoB;YACvB,OAAO,wCACL,uCACF,cAAc,CAAC;QACjB,KAAK,mBAAmB;YACtB,OAAO,uCACL,uCACF,cAAc,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { type BrowserSessionIssueResult } from './session.js';
|
|
2
2
|
import type { PlatformAccountRecord, PlatformAuthState, PlatformIdentityRecord, PlatformMembershipRecord } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Raised when first-admin creation loses the uniqueness recheck that runs
|
|
5
|
+
* inside the serialized auth-state mutation. Callers map this to a conflict
|
|
6
|
+
* response instead of creating a second Account.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PlatformFirstAdminExistsError extends Error {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* SPEC-113 requirement 5: the "no Admin exists" check must run inside the same
|
|
13
|
+
* serialized mutation that persists the new records. A prior setup-status read
|
|
14
|
+
* is not concurrency control.
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasExistingPlatformAdmin(state: PlatformAuthState): boolean;
|
|
3
17
|
export interface CreateFirstAdminLocalInput {
|
|
4
18
|
state: PlatformAuthState;
|
|
5
19
|
displayName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../../src/platform/auth/bootstrap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../../src/platform/auth/bootstrap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;;CAKvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAK1E;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,QAAQ,EAAE,sBAAsB,CAAC;IACjC,UAAU,EAAE,wBAAwB,CAAC;IACrC,OAAO,EAAE,yBAAyB,CAAC;CACpC;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,0BAA0B,GAChC,OAAO,CAAC,2BAA2B,CAAC,CA8DtC;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAMrE"}
|