@cats-inc/cats-platform 0.1.21 → 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 +3 -7
- 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 +114 -34
- package/build/desktop/bootstrapPage.js.map +1 -1
- package/build/desktop/cliInventoryProbe.d.ts +5 -2
- package/build/desktop/cliInventoryProbe.d.ts.map +1 -1
- package/build/desktop/cliInventoryProbe.js +14 -11
- 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 +10 -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 +144 -249
- 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 +14 -33
- 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/updateDialog.d.ts +27 -1
- package/build/desktop/updateDialog.d.ts.map +1 -1
- package/build/desktop/updateDialog.js +85 -5
- package/build/desktop/updateDialog.js.map +1 -1
- package/build/renderer/assets/{ActiveSessionPermissionChip-DImsuR9T.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-DKOSn0o_.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-DCIId0eY.js → useDraftSessionChips-D9BX6X92.js} +1 -1
- package/build/renderer/index.html +2 -2
- 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/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 +7 -1
- package/build/server/app/server/authGatePolicy.js.map +1 -1
- package/build/server/app/server/contracts.d.ts +15 -0
- 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 +42 -1
- 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.map +1 -1
- package/build/server/app/server/platformSetupRoutes.js +1 -13
- 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 +30 -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 +4 -2
- 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 +21 -0
- package/build/server/config.d.ts.map +1 -1
- package/build/server/config.js +12 -0
- 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 +37 -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 +2 -1
- 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/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 -0
- 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 +23 -8
- 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 -0
- 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 +13 -0
- package/build/server/runtime/client.d.ts.map +1 -1
- package/build/server/runtime/client.js +39 -0
- 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 +198 -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 +197 -3
- package/build/server/shared/i18n/catalogs/zh-TW.js.map +1 -1
- package/build/server/shared/i18n/index.d.ts +192 -0
- package/build/server/shared/i18n/index.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.d.ts +192 -0
- package/build/server/shared/i18n/messageKeys.d.ts.map +1 -1
- package/build/server/shared/i18n/messageKeys.js +192 -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 +5 -2
- package/build/server/shared/providerCatalog.d.ts.map +1 -1
- package/build/server/shared/providerCatalog.js +6 -0
- package/build/server/shared/providerCatalog.js.map +1 -1
- package/build/server/shared/providerCatalogData.d.ts +28 -22
- package/build/server/shared/providerCatalogData.d.ts.map +1 -1
- package/build/server/shared/providerCatalogData.js +22 -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 +3 -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 +43 -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/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/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/{Install-Aider.ps1 → Install-MetaCli.ps1} +180 -92
- package/scripts/windows/Install-Ollama.ps1 +4 -1
- 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-BfOvMP2m.js +0 -1
- package/build/renderer/assets/App-DGwkRFZl.css +0 -1
- package/build/renderer/assets/App-DWd7I3Z2.js +0 -2
- package/build/renderer/assets/WorkspaceAppRoutes-CrbTA9En.js +0 -1
- package/build/renderer/assets/app-BTww3Hl4.js +0 -43
- package/build/renderer/assets/app-CPxWQwLA.css +0 -1
- package/build/renderer/assets/conversationSidebarRecentEntries-QuaOPxCb.js +0 -6
- package/scripts/linux/install-aider.sh +0 -8
- package/scripts/macos/install-aider.sh +0 -8
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable transport delivery outbox (SPEC-114 FR-32..FR-33, FR-42..FR-47).
|
|
3
|
+
*
|
|
4
|
+
* This is a narrow, replaceable platform interface rather than a new Core
|
|
5
|
+
* record family (ADR-112 section 1). Production supplies a transport state
|
|
6
|
+
* store; isolated tests may keep using the in-memory form.
|
|
7
|
+
*
|
|
8
|
+
* Three invariants earn this module its existence:
|
|
9
|
+
*
|
|
10
|
+
* 1. one `idempotencyKey` sends at most one external message, across duplicate
|
|
11
|
+
* callbacks, retries, and process restarts;
|
|
12
|
+
* 2. messages for one work item are sent in causal order;
|
|
13
|
+
* 3. a routine progress message that lost its race against a newer decision or
|
|
14
|
+
* terminal message is dropped rather than delivered late.
|
|
15
|
+
*/
|
|
16
|
+
/** Purposes that must never be suppressed by a newer message. */
|
|
17
|
+
const PRIORITY_PURPOSES = new Set([
|
|
18
|
+
'decision',
|
|
19
|
+
'result',
|
|
20
|
+
'publish_result',
|
|
21
|
+
]);
|
|
22
|
+
/** Purposes that are routine and may be coalesced away when stale. */
|
|
23
|
+
const ROUTINE_PURPOSES = new Set([
|
|
24
|
+
'progress',
|
|
25
|
+
]);
|
|
26
|
+
function isTerminalState(state) {
|
|
27
|
+
return state === 'sent' || state === 'ambiguous';
|
|
28
|
+
}
|
|
29
|
+
export function createTransportWorkOutbox(options) {
|
|
30
|
+
const now = options.now ?? (() => new Date());
|
|
31
|
+
const telemetry = options.telemetry;
|
|
32
|
+
const rows = new Map();
|
|
33
|
+
const sequenceByWorkItem = new Map();
|
|
34
|
+
const inFlight = new Map();
|
|
35
|
+
const recoveredRows = [
|
|
36
|
+
...(options.store?.listDeliveries() ?? []),
|
|
37
|
+
...(options.initialRows ?? []),
|
|
38
|
+
];
|
|
39
|
+
for (const recovered of recoveredRows) {
|
|
40
|
+
// A process that died while `send` was in flight cannot know whether the
|
|
41
|
+
// transport accepted the message. Preserve that uncertainty; never turn it
|
|
42
|
+
// into an automatic duplicate after restart.
|
|
43
|
+
const wasInterrupted = recovered.state === 'sending';
|
|
44
|
+
const row = wasInterrupted
|
|
45
|
+
? {
|
|
46
|
+
...recovered,
|
|
47
|
+
state: 'ambiguous',
|
|
48
|
+
lastErrorCode: recovered.lastErrorCode ?? 'interrupted_send',
|
|
49
|
+
updatedAt: now().toISOString(),
|
|
50
|
+
}
|
|
51
|
+
: { ...recovered };
|
|
52
|
+
rows.set(row.idempotencyKey, row);
|
|
53
|
+
if (wasInterrupted) {
|
|
54
|
+
options.store?.putDelivery(row);
|
|
55
|
+
}
|
|
56
|
+
const highest = sequenceByWorkItem.get(row.workItemId) ?? 0;
|
|
57
|
+
sequenceByWorkItem.set(row.workItemId, Math.max(highest, row.sequence));
|
|
58
|
+
}
|
|
59
|
+
function put(row) {
|
|
60
|
+
rows.set(row.idempotencyKey, row);
|
|
61
|
+
options.store?.putDelivery(row);
|
|
62
|
+
}
|
|
63
|
+
function nextSequence(workItemId) {
|
|
64
|
+
const next = (sequenceByWorkItem.get(workItemId) ?? 0) + 1;
|
|
65
|
+
sequenceByWorkItem.set(workItemId, next);
|
|
66
|
+
return next;
|
|
67
|
+
}
|
|
68
|
+
function listRows(workItemId) {
|
|
69
|
+
return [...rows.values()]
|
|
70
|
+
.filter((row) => row.workItemId === workItemId)
|
|
71
|
+
.sort((left, right) => left.sequence - right.sequence);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* A routine progress row is stale once a priority row with a higher sequence
|
|
75
|
+
* exists, whether or not that row has been sent yet. Waiting for the newer
|
|
76
|
+
* row to send first would let a slow decision message unblock an obsolete
|
|
77
|
+
* progress message behind it.
|
|
78
|
+
*/
|
|
79
|
+
function isStaleRoutine(row) {
|
|
80
|
+
if (!ROUTINE_PURPOSES.has(row.purpose)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return listRows(row.workItemId).some((candidate) => candidate.sequence > row.sequence
|
|
84
|
+
&& (PRIORITY_PURPOSES.has(candidate.purpose) || candidate.purpose === 'progress'));
|
|
85
|
+
}
|
|
86
|
+
async function flushRow(row) {
|
|
87
|
+
if (row.state === 'sent') {
|
|
88
|
+
telemetry?.record('dedupe_hit', 'update');
|
|
89
|
+
return { outcome: 'already_sent', row };
|
|
90
|
+
}
|
|
91
|
+
if (row.state === 'ambiguous') {
|
|
92
|
+
return { outcome: 'ambiguous', row };
|
|
93
|
+
}
|
|
94
|
+
if (isStaleRoutine(row)) {
|
|
95
|
+
const suppressed = {
|
|
96
|
+
...row,
|
|
97
|
+
state: 'failed',
|
|
98
|
+
lastErrorCode: 'suppressed_stale',
|
|
99
|
+
updatedAt: now().toISOString(),
|
|
100
|
+
};
|
|
101
|
+
put(suppressed);
|
|
102
|
+
return { outcome: 'suppressed_stale', row: suppressed };
|
|
103
|
+
}
|
|
104
|
+
const sending = {
|
|
105
|
+
...row,
|
|
106
|
+
state: 'sending',
|
|
107
|
+
attemptCount: row.attemptCount + 1,
|
|
108
|
+
updatedAt: now().toISOString(),
|
|
109
|
+
};
|
|
110
|
+
put(sending);
|
|
111
|
+
let result;
|
|
112
|
+
try {
|
|
113
|
+
result = await options.send(sending);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
result = {
|
|
117
|
+
ok: false,
|
|
118
|
+
externalMessageRef: null,
|
|
119
|
+
errorCode: error instanceof Error ? error.name : 'send_threw',
|
|
120
|
+
ambiguous: true,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (sending.attemptCount > 1) {
|
|
124
|
+
telemetry?.record('outbox_retry', 'attempt');
|
|
125
|
+
}
|
|
126
|
+
if (result.ok) {
|
|
127
|
+
telemetry?.record('delivery_receipt', 'sent');
|
|
128
|
+
const sent = {
|
|
129
|
+
...sending,
|
|
130
|
+
state: 'sent',
|
|
131
|
+
externalMessageRef: result.externalMessageRef,
|
|
132
|
+
lastErrorCode: null,
|
|
133
|
+
updatedAt: now().toISOString(),
|
|
134
|
+
sentAt: now().toISOString(),
|
|
135
|
+
};
|
|
136
|
+
put(sent);
|
|
137
|
+
return { outcome: 'sent', row: sent };
|
|
138
|
+
}
|
|
139
|
+
// Ambiguity is terminal for automatic recovery. Only an explicit owner
|
|
140
|
+
// retry may move it back to pending, because the message may be on the wire.
|
|
141
|
+
const failed = {
|
|
142
|
+
...sending,
|
|
143
|
+
state: result.ambiguous === true ? 'ambiguous' : 'failed',
|
|
144
|
+
lastErrorCode: result.errorCode ?? 'send_failed',
|
|
145
|
+
updatedAt: now().toISOString(),
|
|
146
|
+
};
|
|
147
|
+
put(failed);
|
|
148
|
+
telemetry?.record('delivery_receipt', result.ambiguous === true ? 'ambiguous' : 'failed');
|
|
149
|
+
return { outcome: result.ambiguous === true ? 'ambiguous' : 'failed', row: failed };
|
|
150
|
+
}
|
|
151
|
+
function flushOne(idempotencyKey) {
|
|
152
|
+
const active = inFlight.get(idempotencyKey);
|
|
153
|
+
if (active) {
|
|
154
|
+
return active;
|
|
155
|
+
}
|
|
156
|
+
const row = rows.get(idempotencyKey);
|
|
157
|
+
if (!row) {
|
|
158
|
+
return Promise.reject(new Error(`Unknown transport work delivery key: ${idempotencyKey}`));
|
|
159
|
+
}
|
|
160
|
+
const started = flushRow(row).finally(() => {
|
|
161
|
+
if (inFlight.get(idempotencyKey) === started) {
|
|
162
|
+
inFlight.delete(idempotencyKey);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
inFlight.set(idempotencyKey, started);
|
|
166
|
+
return started;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
enqueue(input) {
|
|
170
|
+
const existing = rows.get(input.idempotencyKey);
|
|
171
|
+
if (existing) {
|
|
172
|
+
return existing;
|
|
173
|
+
}
|
|
174
|
+
const timestamp = now().toISOString();
|
|
175
|
+
const row = {
|
|
176
|
+
version: 1,
|
|
177
|
+
idempotencyKey: input.idempotencyKey,
|
|
178
|
+
bindingId: input.bindingId,
|
|
179
|
+
externalConversationRef: input.externalConversationRef,
|
|
180
|
+
workItemId: input.workItemId,
|
|
181
|
+
taskId: input.taskId ?? null,
|
|
182
|
+
runId: input.runId ?? null,
|
|
183
|
+
purpose: input.purpose,
|
|
184
|
+
payload: input.payload,
|
|
185
|
+
state: 'pending',
|
|
186
|
+
externalMessageRef: null,
|
|
187
|
+
attemptCount: 0,
|
|
188
|
+
lastErrorCode: null,
|
|
189
|
+
sequence: nextSequence(input.workItemId),
|
|
190
|
+
createdAt: timestamp,
|
|
191
|
+
updatedAt: timestamp,
|
|
192
|
+
sentAt: null,
|
|
193
|
+
};
|
|
194
|
+
put(row);
|
|
195
|
+
return row;
|
|
196
|
+
},
|
|
197
|
+
flush(idempotencyKey) {
|
|
198
|
+
return flushOne(idempotencyKey);
|
|
199
|
+
},
|
|
200
|
+
async retry(idempotencyKey) {
|
|
201
|
+
const active = inFlight.get(idempotencyKey);
|
|
202
|
+
if (active) {
|
|
203
|
+
return active;
|
|
204
|
+
}
|
|
205
|
+
const row = rows.get(idempotencyKey);
|
|
206
|
+
if (!row) {
|
|
207
|
+
throw new Error(`Unknown transport work delivery key: ${idempotencyKey}`);
|
|
208
|
+
}
|
|
209
|
+
if (row.state === 'sent') {
|
|
210
|
+
return { outcome: 'already_sent', row };
|
|
211
|
+
}
|
|
212
|
+
const pending = {
|
|
213
|
+
...row,
|
|
214
|
+
state: 'pending',
|
|
215
|
+
updatedAt: now().toISOString(),
|
|
216
|
+
};
|
|
217
|
+
put(pending);
|
|
218
|
+
return flushOne(idempotencyKey);
|
|
219
|
+
},
|
|
220
|
+
async flushWorkItem(workItemId) {
|
|
221
|
+
const results = [];
|
|
222
|
+
// Sequential on purpose: causal ordering per work item is a requirement,
|
|
223
|
+
// not an implementation detail (FR-33).
|
|
224
|
+
for (const row of listRows(workItemId)) {
|
|
225
|
+
if (isTerminalState(row.state)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
results.push(await flushOne(row.idempotencyKey));
|
|
229
|
+
}
|
|
230
|
+
return results;
|
|
231
|
+
},
|
|
232
|
+
async recoverPending() {
|
|
233
|
+
const results = [];
|
|
234
|
+
const pending = [...rows.values()]
|
|
235
|
+
.filter((row) => row.state === 'pending')
|
|
236
|
+
.sort((left, right) => left.createdAt.localeCompare(right.createdAt)
|
|
237
|
+
|| left.sequence - right.sequence);
|
|
238
|
+
for (const row of pending) {
|
|
239
|
+
results.push(await flushOne(row.idempotencyKey));
|
|
240
|
+
}
|
|
241
|
+
return results;
|
|
242
|
+
},
|
|
243
|
+
get(idempotencyKey) {
|
|
244
|
+
return rows.get(idempotencyKey) ?? null;
|
|
245
|
+
},
|
|
246
|
+
list(workItemId) {
|
|
247
|
+
return listRows(workItemId);
|
|
248
|
+
},
|
|
249
|
+
hasDeliveredResult(workItemId) {
|
|
250
|
+
return listRows(workItemId).some((row) => row.state === 'sent'
|
|
251
|
+
&& (row.purpose === 'result' || row.purpose === 'publish_result'));
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Stable idempotency key for one outbound message.
|
|
257
|
+
*
|
|
258
|
+
* Every input is either an authoritative id or an owner-visible revision, so
|
|
259
|
+
* the same logical message recomputes the same key after a restart.
|
|
260
|
+
*/
|
|
261
|
+
export function buildTransportWorkDeliveryKey(input) {
|
|
262
|
+
return [
|
|
263
|
+
'twd',
|
|
264
|
+
input.bindingId,
|
|
265
|
+
input.workItemId,
|
|
266
|
+
input.purpose,
|
|
267
|
+
input.discriminator,
|
|
268
|
+
].join(':');
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=outbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The permission envelope a transport-originated run executes under
|
|
3
|
+
* (SPEC-114 FR-4, PLAN-105 Phase 1 / gate G1).
|
|
4
|
+
*
|
|
5
|
+
* This replaces the placeholder that treated "a workspace path is configured"
|
|
6
|
+
* as the whole permission model. Two things were wrong with it, and the second
|
|
7
|
+
* one mattered more than the first:
|
|
8
|
+
*
|
|
9
|
+
* 1. The configured path was never checked against reality. An operator could
|
|
10
|
+
* name a directory that does not exist, or claim a plain folder is a repo,
|
|
11
|
+
* and the run only discovered it deep inside a provider turn.
|
|
12
|
+
*
|
|
13
|
+
* 2. It granted `broad_write`, which classifies as externally-visible,
|
|
14
|
+
* destructive, and expensive tools. That silently contradicted the design's
|
|
15
|
+
* own rule that execution authorization must not clear a publish gate: the
|
|
16
|
+
* provider could have pushed or deployed through its own tools while Cats
|
|
17
|
+
* still believed publication was waiting on an owner approval.
|
|
18
|
+
*
|
|
19
|
+
* So the envelope here is capped at `narrow_write` — local workspace state — for
|
|
20
|
+
* every delivery mode. External effects (push, pull request, preview deploy)
|
|
21
|
+
* never travel on provider tools; they run through the gated delivery API after
|
|
22
|
+
* an approval, carrying that approval's id. A mode with bigger side effects
|
|
23
|
+
* needs a *gate*, not a wider grant.
|
|
24
|
+
*/
|
|
25
|
+
import type { CoreDeliveryMode } from '../../../core/types.js';
|
|
26
|
+
import type { SupervisionToolScope } from '../../supervision/contracts.js';
|
|
27
|
+
/** What the runtime actually observed about the configured workspace. */
|
|
28
|
+
export interface TransportWorkWorkspaceCapability {
|
|
29
|
+
/** The runtime could inspect the path at all. */
|
|
30
|
+
reachable: boolean;
|
|
31
|
+
/** The path is a git repository. */
|
|
32
|
+
repository: boolean;
|
|
33
|
+
/** Whether the repository has no staged, modified, or untracked files. */
|
|
34
|
+
clean: boolean | null;
|
|
35
|
+
/** HEAD observed before admission; later commit evidence is bound to it. */
|
|
36
|
+
headOid: string | null;
|
|
37
|
+
}
|
|
38
|
+
export declare const TRANSPORT_WORK_PERMISSION_REASONS: readonly ["workspace_not_configured", "workspace_unreachable", "workspace_not_a_repository", "workspace_not_clean"];
|
|
39
|
+
export type TransportWorkPermissionReason = (typeof TRANSPORT_WORK_PERMISSION_REASONS)[number];
|
|
40
|
+
export interface TransportWorkPermissionEnvelope {
|
|
41
|
+
/** Granted to the supervision boundary. Never wider than `narrow_write`. */
|
|
42
|
+
toolScope: SupervisionToolScope;
|
|
43
|
+
sufficient: boolean;
|
|
44
|
+
reasons: TransportWorkPermissionReason[];
|
|
45
|
+
}
|
|
46
|
+
export interface TransportWorkPermissionEnvelopeInput {
|
|
47
|
+
workspacePath: string | null;
|
|
48
|
+
/**
|
|
49
|
+
* The runtime's observation, or `null` when it could not be obtained — an
|
|
50
|
+
* unreachable runtime is reported as an unusable workspace rather than
|
|
51
|
+
* optimistically assumed usable.
|
|
52
|
+
*/
|
|
53
|
+
workspace: TransportWorkWorkspaceCapability | null;
|
|
54
|
+
deliveryMode: CoreDeliveryMode | null;
|
|
55
|
+
}
|
|
56
|
+
export declare function resolveTransportWorkPermissionEnvelope(input: TransportWorkPermissionEnvelopeInput): TransportWorkPermissionEnvelope;
|
|
57
|
+
//# sourceMappingURL=permissionEnvelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionEnvelope.d.ts","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/permissionEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,yEAAyE;AACzE,MAAM,WAAW,gCAAgC;IAC/C,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,iCAAiC,qHAKpC,CAAC;AAEX,MAAM,MAAM,6BAA6B,GACvC,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,MAAM,WAAW,+BAA+B;IAC9C,4EAA4E;IAC5E,SAAS,EAAE,oBAAoB,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,6BAA6B,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,oCAAoC;IACnD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,SAAS,EAAE,gCAAgC,GAAG,IAAI,CAAC;IACnD,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC;AAaD,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,oCAAoC,GAC1C,+BAA+B,CAgCjC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The permission envelope a transport-originated run executes under
|
|
3
|
+
* (SPEC-114 FR-4, PLAN-105 Phase 1 / gate G1).
|
|
4
|
+
*
|
|
5
|
+
* This replaces the placeholder that treated "a workspace path is configured"
|
|
6
|
+
* as the whole permission model. Two things were wrong with it, and the second
|
|
7
|
+
* one mattered more than the first:
|
|
8
|
+
*
|
|
9
|
+
* 1. The configured path was never checked against reality. An operator could
|
|
10
|
+
* name a directory that does not exist, or claim a plain folder is a repo,
|
|
11
|
+
* and the run only discovered it deep inside a provider turn.
|
|
12
|
+
*
|
|
13
|
+
* 2. It granted `broad_write`, which classifies as externally-visible,
|
|
14
|
+
* destructive, and expensive tools. That silently contradicted the design's
|
|
15
|
+
* own rule that execution authorization must not clear a publish gate: the
|
|
16
|
+
* provider could have pushed or deployed through its own tools while Cats
|
|
17
|
+
* still believed publication was waiting on an owner approval.
|
|
18
|
+
*
|
|
19
|
+
* So the envelope here is capped at `narrow_write` — local workspace state — for
|
|
20
|
+
* every delivery mode. External effects (push, pull request, preview deploy)
|
|
21
|
+
* never travel on provider tools; they run through the gated delivery API after
|
|
22
|
+
* an approval, carrying that approval's id. A mode with bigger side effects
|
|
23
|
+
* needs a *gate*, not a wider grant.
|
|
24
|
+
*/
|
|
25
|
+
export const TRANSPORT_WORK_PERMISSION_REASONS = [
|
|
26
|
+
'workspace_not_configured',
|
|
27
|
+
'workspace_unreachable',
|
|
28
|
+
'workspace_not_a_repository',
|
|
29
|
+
'workspace_not_clean',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Delivery modes whose evidence is a commit, and which therefore cannot run
|
|
33
|
+
* against a directory that is not a repository.
|
|
34
|
+
*/
|
|
35
|
+
const REPO_BACKED_MODES = new Set([
|
|
36
|
+
'commit_only',
|
|
37
|
+
'push_branch',
|
|
38
|
+
'pr_with_checks',
|
|
39
|
+
'deploy_preview',
|
|
40
|
+
]);
|
|
41
|
+
export function resolveTransportWorkPermissionEnvelope(input) {
|
|
42
|
+
if (input.workspacePath === null) {
|
|
43
|
+
return { toolScope: 'none', sufficient: false, reasons: ['workspace_not_configured'] };
|
|
44
|
+
}
|
|
45
|
+
if (input.workspace === null || !input.workspace.reachable) {
|
|
46
|
+
// A path we cannot inspect is a path we must not hand write tools for.
|
|
47
|
+
return { toolScope: 'none', sufficient: false, reasons: ['workspace_unreachable'] };
|
|
48
|
+
}
|
|
49
|
+
if (input.deliveryMode !== null
|
|
50
|
+
&& REPO_BACKED_MODES.has(input.deliveryMode)
|
|
51
|
+
&& !input.workspace.repository) {
|
|
52
|
+
// Readable, so the run could still be inspected, but it can never produce
|
|
53
|
+
// the commit this mode's completion evidence requires.
|
|
54
|
+
return {
|
|
55
|
+
toolScope: 'read_only',
|
|
56
|
+
sufficient: false,
|
|
57
|
+
reasons: ['workspace_not_a_repository'],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (input.deliveryMode !== null
|
|
61
|
+
&& REPO_BACKED_MODES.has(input.deliveryMode)
|
|
62
|
+
&& input.workspace.clean !== true) {
|
|
63
|
+
// The runtime commit endpoint cannot distinguish changes created by this
|
|
64
|
+
// run from files that were already present. Never let transport work claim
|
|
65
|
+
// ownership of an operator's dirty worktree.
|
|
66
|
+
return {
|
|
67
|
+
toolScope: 'read_only',
|
|
68
|
+
sufficient: false,
|
|
69
|
+
reasons: ['workspace_not_clean'],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { toolScope: 'narrow_write', sufficient: true, reasons: [] };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=permissionEnvelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionEnvelope.js","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/permissionEnvelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAiBH,MAAM,CAAC,MAAM,iCAAiC,GAAG;IAC/C,0BAA0B;IAC1B,uBAAuB;IACvB,4BAA4B;IAC5B,qBAAqB;CACb,CAAC;AAuBX;;;GAGG;AACH,MAAM,iBAAiB,GAAkC,IAAI,GAAG,CAAC;IAC/D,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,UAAU,sCAAsC,CACpD,KAA2C;IAE3C,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,0BAA0B,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QAC3D,uEAAuE;QACvE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;WAC1B,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;WACzC,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACjC,0EAA0E;QAC1E,uDAAuD;QACvD,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,CAAC,4BAA4B,CAAC;SACxC,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;WAC1B,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC;WACzC,KAAK,CAAC,SAAS,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACpC,yEAAyE;QACzE,2EAA2E;QAC3E,6CAA6C;QAC7C,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,CAAC,qBAAqB,CAAC;SACjC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between a transport and the golden path (ADR-112 section 4).
|
|
3
|
+
*
|
|
4
|
+
* The transport hands over raw external facts and learns only whether the
|
|
5
|
+
* update was consumed. Everything the product owns — readiness, scope,
|
|
6
|
+
* authorization, policy, outbound copy — stays behind this interface, which is
|
|
7
|
+
* why `platform/` can define it without importing any product.
|
|
8
|
+
*
|
|
9
|
+
* Outbound messages are *not* returned from these calls. The product enqueues
|
|
10
|
+
* them on its own durable outbox, so a transport that crashes between "command
|
|
11
|
+
* handled" and "reply sent" recovers by flushing the outbox rather than by
|
|
12
|
+
* replaying the command.
|
|
13
|
+
*/
|
|
14
|
+
export interface TransportWorkCommandInput {
|
|
15
|
+
bindingId: string;
|
|
16
|
+
conversationId: string;
|
|
17
|
+
/** Opaque reference to the external user that sent the request. */
|
|
18
|
+
externalUserRef: string;
|
|
19
|
+
/** Opaque reference to the external chat. Also the delivery destination. */
|
|
20
|
+
externalConversationRef: string;
|
|
21
|
+
externalUpdateRef: string;
|
|
22
|
+
externalMessageRef: string | null;
|
|
23
|
+
goal: string;
|
|
24
|
+
locale: string | null;
|
|
25
|
+
}
|
|
26
|
+
export interface TransportWorkCallbackInput {
|
|
27
|
+
callbackData: string;
|
|
28
|
+
bindingId: string;
|
|
29
|
+
conversationId: string;
|
|
30
|
+
externalUserRef: string;
|
|
31
|
+
externalConversationRef: string;
|
|
32
|
+
/** The external callback id. Distinguishes owner events, never scopes. */
|
|
33
|
+
ownerEventRef: string;
|
|
34
|
+
locale: string | null;
|
|
35
|
+
}
|
|
36
|
+
export interface TransportWorkRefusalInput {
|
|
37
|
+
bindingId: string;
|
|
38
|
+
conversationId: string;
|
|
39
|
+
externalConversationRef: string;
|
|
40
|
+
externalUpdateRef: string;
|
|
41
|
+
reasonKey: string;
|
|
42
|
+
locale: string | null;
|
|
43
|
+
}
|
|
44
|
+
export type TransportWorkHandledOutcome = 'accepted' | 'not_ready' | 'admitted' | 'already_admitted' | 'cancelled' | 'published' | 'publish_denied' | 'publish_blocked' | 'retried' | 'resumed' | 'rejected' | 'refused';
|
|
45
|
+
export interface TransportWorkHandledResult {
|
|
46
|
+
handled: boolean;
|
|
47
|
+
outcome: TransportWorkHandledOutcome;
|
|
48
|
+
workItemId: string | null;
|
|
49
|
+
/** Rejection reason code when `outcome` is `rejected`; for diagnostics. */
|
|
50
|
+
rejection: string | null;
|
|
51
|
+
}
|
|
52
|
+
export interface TransportWorkGoldenPathPort {
|
|
53
|
+
/** True when this callback belongs to the golden path and nothing else. */
|
|
54
|
+
ownsCallback(callbackData: string): boolean;
|
|
55
|
+
handleWorkCommand(input: TransportWorkCommandInput): Promise<TransportWorkHandledResult>;
|
|
56
|
+
handleActionCallback(input: TransportWorkCallbackInput): Promise<TransportWorkHandledResult>;
|
|
57
|
+
/** Explains an input the first slice cannot ingest, e.g. a bare attachment. */
|
|
58
|
+
refuse(input: TransportWorkRefusalInput): Promise<TransportWorkHandledResult>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,MAAM,2BAA2B,GACnC,UAAU,GACV,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,WAAW,GACX,WAAW,GACX,gBAAgB,GAChB,iBAAiB,GACjB,SAAS,GACT,SAAS,GACT,UAAU,GACV,SAAS,CAAC;AAEd,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,2BAA2B,CAAC;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,2EAA2E;IAC3E,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,2EAA2E;IAC3E,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,iBAAiB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzF,oBAAoB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC7F,+EAA+E;IAC/E,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC/E"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam between a transport and the golden path (ADR-112 section 4).
|
|
3
|
+
*
|
|
4
|
+
* The transport hands over raw external facts and learns only whether the
|
|
5
|
+
* update was consumed. Everything the product owns — readiness, scope,
|
|
6
|
+
* authorization, policy, outbound copy — stays behind this interface, which is
|
|
7
|
+
* why `platform/` can define it without importing any product.
|
|
8
|
+
*
|
|
9
|
+
* Outbound messages are *not* returned from these calls. The product enqueues
|
|
10
|
+
* them on its own durable outbox, so a transport that crashes between "command
|
|
11
|
+
* handled" and "reply sent" recovers by flushing the outbox rather than by
|
|
12
|
+
* replaying the command.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned scope proposals (SPEC-114 FR-15..FR-19).
|
|
3
|
+
*
|
|
4
|
+
* The digest is the load-bearing part. An owner confirms a specific block of
|
|
5
|
+
* text; binding the authorization to a hash of exactly the execution-relevant
|
|
6
|
+
* fields is what makes "Start work" mean "run *that*" rather than "run whatever
|
|
7
|
+
* the work item says now".
|
|
8
|
+
*/
|
|
9
|
+
import type { CoreDeliveryGate, CoreDeliveryMode } from '../../../core/types.js';
|
|
10
|
+
import type { TransportWorkProposalV1 } from './contracts.js';
|
|
11
|
+
export interface BuildTransportWorkProposalInput {
|
|
12
|
+
revision: number;
|
|
13
|
+
goal: string;
|
|
14
|
+
targetLabel: string;
|
|
15
|
+
projectId: string | null;
|
|
16
|
+
workspacePath: string | null;
|
|
17
|
+
acceptanceCriteria: readonly string[];
|
|
18
|
+
deliveryMode: CoreDeliveryMode;
|
|
19
|
+
deliveryGates: readonly CoreDeliveryGate[];
|
|
20
|
+
sideEffects: readonly string[];
|
|
21
|
+
openQuestion: string | null;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
}
|
|
24
|
+
export declare function buildTransportWorkProposalDigest(input: BuildTransportWorkProposalInput): string;
|
|
25
|
+
export declare function buildTransportWorkProposal(input: BuildTransportWorkProposalInput): TransportWorkProposalV1;
|
|
26
|
+
/**
|
|
27
|
+
* True when a new proposal changes what would execute, which is the trigger for
|
|
28
|
+
* bumping the revision and invalidating outstanding action tokens (FR-17).
|
|
29
|
+
*/
|
|
30
|
+
export declare function isTransportWorkProposalMateriallyChanged(previous: TransportWorkProposalV1 | null, next: TransportWorkProposalV1): boolean;
|
|
31
|
+
//# sourceMappingURL=proposal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal.d.ts","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/proposal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC3C,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,IAAI,CAAC;CACjB;AAsBD,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,+BAA+B,GACrC,MAAM,CAKR;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,uBAAuB,CAgBzB;AAED;;;GAGG;AACH,wBAAgB,wCAAwC,CACtD,QAAQ,EAAE,uBAAuB,GAAG,IAAI,EACxC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAET"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Versioned scope proposals (SPEC-114 FR-15..FR-19).
|
|
3
|
+
*
|
|
4
|
+
* The digest is the load-bearing part. An owner confirms a specific block of
|
|
5
|
+
* text; binding the authorization to a hash of exactly the execution-relevant
|
|
6
|
+
* fields is what makes "Start work" mean "run *that*" rather than "run whatever
|
|
7
|
+
* the work item says now".
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'node:crypto';
|
|
10
|
+
/**
|
|
11
|
+
* Fields that change what actually executes.
|
|
12
|
+
*
|
|
13
|
+
* `createdAt` and `openQuestion` are excluded on purpose: re-rendering the same
|
|
14
|
+
* scope at a later time, or resolving a question without changing the plan,
|
|
15
|
+
* must not invalidate a confirmation the owner already saw.
|
|
16
|
+
*/
|
|
17
|
+
function buildDigestSource(input) {
|
|
18
|
+
return JSON.stringify([
|
|
19
|
+
input.goal.trim(),
|
|
20
|
+
input.targetLabel.trim(),
|
|
21
|
+
input.projectId,
|
|
22
|
+
input.workspacePath,
|
|
23
|
+
[...input.acceptanceCriteria].map((criterion) => criterion.trim()),
|
|
24
|
+
input.deliveryMode,
|
|
25
|
+
[...input.deliveryGates].sort(),
|
|
26
|
+
[...input.sideEffects].map((effect) => effect.trim()).sort(),
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
export function buildTransportWorkProposalDigest(input) {
|
|
30
|
+
return createHash('sha256')
|
|
31
|
+
.update(buildDigestSource(input))
|
|
32
|
+
.digest('hex')
|
|
33
|
+
.slice(0, 32);
|
|
34
|
+
}
|
|
35
|
+
export function buildTransportWorkProposal(input) {
|
|
36
|
+
return {
|
|
37
|
+
version: 1,
|
|
38
|
+
revision: input.revision,
|
|
39
|
+
digest: buildTransportWorkProposalDigest(input),
|
|
40
|
+
goal: input.goal.trim(),
|
|
41
|
+
targetLabel: input.targetLabel.trim(),
|
|
42
|
+
projectId: input.projectId,
|
|
43
|
+
workspacePath: input.workspacePath,
|
|
44
|
+
acceptanceCriteria: [...input.acceptanceCriteria].map((criterion) => criterion.trim()),
|
|
45
|
+
deliveryMode: input.deliveryMode,
|
|
46
|
+
deliveryGates: [...input.deliveryGates],
|
|
47
|
+
sideEffects: [...input.sideEffects],
|
|
48
|
+
openQuestion: input.openQuestion,
|
|
49
|
+
createdAt: input.createdAt.toISOString(),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* True when a new proposal changes what would execute, which is the trigger for
|
|
54
|
+
* bumping the revision and invalidating outstanding action tokens (FR-17).
|
|
55
|
+
*/
|
|
56
|
+
export function isTransportWorkProposalMateriallyChanged(previous, next) {
|
|
57
|
+
return previous === null || previous.digest !== next.digest;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=proposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposal.js","sourceRoot":"","sources":["../../../../../src/platform/transports/work-delivery/proposal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmBzC;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,KAAsC;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;QACxB,KAAK,CAAC,SAAS;QACf,KAAK,CAAC,aAAa;QACnB,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAClE,KAAK,CAAC,YAAY;QAClB,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;QAC/B,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KAC7D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,KAAsC;IAEtC,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAChC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAsC;IAEtC,OAAO;QACL,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,gCAAgC,CAAC,KAAK,CAAC;QAC/C,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QACvB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE;QACrC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,kBAAkB,EAAE,CAAC,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtF,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,aAAa,EAAE,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;QACvC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;QACnC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;KACzC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wCAAwC,CACtD,QAAwC,EACxC,IAA6B;IAE7B,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;AAC9D,CAAC"}
|