windmill-components 1.677.0 → 1.687.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/components/AppConnectInner.svelte +6 -0
- package/package/components/CiTestResults.svelte +64 -0
- package/package/components/CiTestResults.svelte.d.ts +7 -0
- package/package/components/CompareWorkspaces.svelte +626 -418
- package/package/components/DBManager.svelte +35 -4
- package/package/components/DBManager.svelte.d.ts +2 -0
- package/package/components/DBManagerContent.svelte +3 -1
- package/package/components/DBManagerContent.svelte.d.ts +3 -0
- package/package/components/DBManagerDrawer.svelte +145 -3
- package/package/components/DBTableEditor.svelte +14 -4
- package/package/components/DatatablePicker.svelte +2 -5
- package/package/components/DatatableSchemaDiff.svelte +531 -0
- package/package/components/DatatableSchemaDiff.svelte.d.ts +29 -0
- package/package/components/DedicatedWorkersSelector.svelte +4 -2
- package/package/components/DefaultTagsInner.svelte +42 -2
- package/package/components/DeployWorkspaceDrawer.svelte +1 -1
- package/package/components/Dev.svelte +20 -3
- package/package/components/Editor.svelte +1 -1
- package/package/components/EditorBar.svelte +1 -1
- package/package/components/EditorBar.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewerInner.svelte +269 -220
- package/package/components/FlowTimeline.svelte +1 -1
- package/package/components/FolderEditor.svelte +189 -4
- package/package/components/ForkWorkspaceBanner.svelte +82 -11
- package/package/components/GlobalUserOffboardingModal.svelte +293 -0
- package/package/components/GlobalUserOffboardingModal.svelte.d.ts +10 -0
- package/package/components/InstanceSettings.svelte +22 -3
- package/package/components/Login.svelte +22 -10
- package/package/components/ModuleTest.svelte +2 -1
- package/package/components/NoMainFuncBadge.svelte +1 -1
- package/package/components/OffboardItemsBox.svelte +56 -0
- package/package/components/OffboardItemsBox.svelte.d.ts +12 -0
- package/package/components/OffboardReassignControls.svelte +47 -0
- package/package/components/OffboardReassignControls.svelte.d.ts +20 -0
- package/package/components/OffboardWorkspaceSection.svelte +110 -0
- package/package/components/OffboardWorkspaceSection.svelte.d.ts +24 -0
- package/package/components/OnBehalfOfSelector.svelte +21 -3
- package/package/components/OnBehalfOfSelector.svelte.d.ts +7 -0
- package/package/components/QueueAlerts.svelte +10 -10
- package/package/components/ResourcePicker.svelte +2 -2
- package/package/components/ScriptBuilder.svelte +52 -11
- package/package/components/ScriptEditor.svelte +1 -3
- package/package/components/ScriptEditor.svelte.d.ts +1 -1
- package/package/components/ShareModal.svelte +236 -98
- package/package/components/SuperadminSettingsInner.svelte +362 -315
- package/package/components/UserOffboardingModal.svelte +238 -0
- package/package/components/UserOffboardingModal.svelte.d.ts +10 -0
- package/package/components/WorkspaceDeployLayout.svelte +3 -3
- package/package/components/WorkspaceDeployLayout.svelte.d.ts +1 -0
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +4 -2
- package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +12 -0
- package/package/components/assets/AssetsDropdownButton.svelte +1 -1
- package/package/components/common/confirmationModal/ConfirmationModal.svelte +1 -1
- package/package/components/common/table/AppRow.svelte +3 -3
- package/package/components/common/table/FlowRow.svelte +3 -3
- package/package/components/common/table/RawAppRow.svelte +4 -4
- package/package/components/common/table/Row.svelte +6 -2
- package/package/components/common/table/ScriptRow.svelte +11 -3
- package/package/components/copilot/chat/AIChatManager.svelte.js +2 -2
- package/package/components/copilot/chat/anthropic.d.ts +7 -1
- package/package/components/copilot/chat/anthropic.js +5 -2
- package/package/components/copilot/chat/app/core.js +129 -1
- package/package/components/copilot/chat/app/core.test.js +192 -0
- package/package/components/copilot/chat/chatLoop.d.ts +3 -0
- package/package/components/copilot/chat/chatLoop.js +13 -5
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +55 -76
- package/package/components/copilot/chat/flow/core.d.ts +13 -3
- package/package/components/copilot/chat/flow/core.js +467 -116
- package/package/components/copilot/chat/flow/helperUtils.d.ts +19 -0
- package/package/components/copilot/chat/flow/helperUtils.js +68 -0
- package/package/components/copilot/chat/flow/helperUtils.test.js +116 -0
- package/package/components/copilot/chat/flow/inlineScriptsUtils.d.ts +5 -24
- package/package/components/copilot/chat/flow/inlineScriptsUtils.js +30 -55
- package/package/components/copilot/chat/flow/utils.test.js +59 -0
- package/package/components/copilot/chat/openai-responses.d.ts +7 -1
- package/package/components/copilot/chat/openai-responses.js +5 -2
- package/package/components/copilot/chat/shared.d.ts +1 -2
- package/package/components/copilot/chat/shared.js +94 -52
- package/package/components/copilot/chat/tokenUsage.d.ts +23 -0
- package/package/components/copilot/chat/tokenUsage.js +42 -0
- package/package/components/copilot/lib.d.ts +5 -1
- package/package/components/copilot/lib.js +21 -5
- package/package/components/deploymentRequest/DeploymentRequestPanel.svelte +337 -0
- package/package/components/deploymentRequest/DeploymentRequestPanel.svelte.d.ts +15 -0
- package/package/components/details/CopyableCodeBlock.svelte +18 -8
- package/package/components/details/CopyableCodeBlock.svelte.d.ts +1 -0
- package/package/components/flows/FlowAssetsHandler.svelte +19 -21
- package/package/components/flows/agentToolTree.d.ts +17 -0
- package/package/components/flows/agentToolTree.js +114 -0
- package/package/components/flows/agentToolTree.test.d.ts +1 -0
- package/package/components/flows/agentToolTree.test.js +86 -0
- package/package/components/flows/agentToolUtils.d.ts +0 -5
- package/package/components/flows/agentToolUtils.js +0 -49
- package/package/components/flows/content/FlowLoop.svelte +7 -4
- package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +15 -7
- package/package/components/flows/content/FlowSettings.svelte +29 -0
- package/package/components/flows/dfs.d.ts +6 -2
- package/package/components/flows/dfs.js +19 -11
- package/package/components/flows/flowDeleteController.d.ts +32 -0
- package/package/components/flows/flowDeleteController.js +54 -0
- package/package/components/flows/flowDeleteController.test.d.ts +1 -0
- package/package/components/flows/flowDeleteController.test.js +121 -0
- package/package/components/flows/flowDeleteUtils.d.ts +48 -0
- package/package/components/flows/flowDeleteUtils.js +150 -0
- package/package/components/flows/flowDeleteUtils.test.d.ts +1 -0
- package/package/components/flows/flowDeleteUtils.test.js +131 -0
- package/package/components/flows/flowDiff.d.ts +2 -47
- package/package/components/flows/flowDiff.js +16 -293
- package/package/components/flows/flowDiff.testUtils.d.ts +8 -0
- package/package/components/flows/flowDiff.testUtils.js +26 -0
- package/package/components/flows/flowDiffManager.svelte.js +20 -75
- package/package/components/flows/flowDiffManager.svelte.test.js +103 -2
- package/package/components/flows/flowExplorer.d.ts +4 -0
- package/package/components/flows/flowExplorer.js +7 -30
- package/package/components/flows/flowState.d.ts +1 -0
- package/package/components/flows/flowStateUtils.svelte.js +6 -1
- package/package/components/flows/flowStore.svelte.d.ts +1 -1
- package/package/components/flows/flowTree.d.ts +91 -0
- package/package/components/flows/flowTree.js +326 -0
- package/package/components/flows/flowTree.test.d.ts +1 -0
- package/package/components/flows/flowTree.test.js +236 -0
- package/package/components/flows/map/FlowJobsMenu.svelte +36 -30
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +70 -227
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +0 -2
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +2 -2
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
- package/package/components/flows/previousResults.js +13 -41
- package/package/components/flows/previousResults.test.d.ts +1 -0
- package/package/components/flows/previousResults.test.js +65 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +2 -1
- package/package/components/flows/propPicker/OutputPickerInner.svelte +41 -4
- package/package/components/flows/propPicker/StepHistory.svelte +9 -1
- package/package/components/git_sync/GitSyncContext.svelte.js +11 -5
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +2 -29
- package/package/components/git_sync/PullWorkspaceModal.svelte +6 -7
- package/package/components/graph/FlowGraphV2.svelte +2 -2
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/groupedModulesProxy.svelte.d.ts +10 -0
- package/package/components/graph/groupedModulesProxy.svelte.js +17 -1
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +5 -2
- package/package/components/home/HomeConnectDrawer.svelte +125 -0
- package/package/components/home/HomeConnectDrawer.svelte.d.ts +5 -0
- package/package/components/icons/GithubIcon.svelte +4 -4
- package/package/components/icons/GithubIcon.svelte.d.ts +5 -2
- package/package/components/instanceSettings/ExternalJwtTokens.svelte +85 -0
- package/package/components/instanceSettings/ExternalJwtTokens.svelte.d.ts +12 -0
- package/package/components/instanceSettings/GhesAppSettings.svelte +17 -0
- package/package/components/instanceSettings/IndexerMemorySettings.svelte +56 -29
- package/package/components/instanceSettings/SecretBackendConfig.svelte +9 -2
- package/package/components/instanceSettings.d.ts +1 -0
- package/package/components/instanceSettings.js +42 -8
- package/package/components/offboarding-utils.d.ts +11 -0
- package/package/components/offboarding-utils.js +100 -0
- package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -1
- package/package/components/raw_apps/RawAppEditor.svelte +27 -0
- package/package/components/raw_apps/RawAppEditorHeader.svelte +6 -1
- package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +1 -0
- package/package/components/raw_apps/RawAppYamlEditor.svelte +81 -0
- package/package/components/raw_apps/RawAppYamlEditor.svelte.d.ts +20 -0
- package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/script_builder.d.ts +1 -1
- package/package/components/select/Select.svelte +2 -1
- package/package/components/select/Select.svelte.d.ts +1 -0
- package/package/components/settings/CreateToken.svelte +113 -64
- package/package/components/settings/CreateToken.svelte.d.ts +3 -0
- package/package/components/settings/WorkspaceUserSettings.svelte +34 -28
- package/package/components/sidebar/SidebarContent.svelte +58 -2
- package/package/components/sidebar/WorkspaceMenu.svelte +8 -4
- package/package/components/triggers/AddTriggersButton.svelte +11 -0
- package/package/components/triggers/PermissionedAsLine.svelte +37 -3
- package/package/components/triggers/PermissionedAsLine.svelte.d.ts +6 -0
- package/package/components/triggers/TriggersEditor.svelte +5 -1
- package/package/components/triggers/TriggersWrapper.svelte +10 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/http/RouteEditorConfigSection.svelte +15 -7
- package/package/components/triggers/http/RouteEditorInner.svelte +14 -14
- package/package/components/triggers/http/RoutesGenerator.svelte +6 -1
- package/package/components/triggers/http/RoutesPanel.svelte +1 -1
- package/package/components/triggers/http/utils.d.ts +1 -1
- package/package/components/triggers/http/utils.js +2 -2
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +1 -1
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/native/NativeTriggerEditor.svelte +3 -0
- package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte +118 -0
- package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte.d.ts +17 -0
- package/package/components/triggers/native/utils.js +14 -0
- package/package/components/triggers/nats/NatsTriggerEditor.svelte.d.ts +4 -3
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +4 -3
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +13 -11
- package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +4 -3
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +13 -11
- package/package/components/triggers/triggers.svelte.js +1 -0
- package/package/components/triggers/utils.js +27 -6
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +13 -11
- package/package/components/triggers.d.ts +1 -1
- package/package/components/useFolderDefaultPermissionedAs.svelte.d.ts +13 -0
- package/package/components/useFolderDefaultPermissionedAs.svelte.js +63 -0
- package/package/components/workspaceSettings/CreateWorkspace.svelte +16 -677
- package/package/components/workspaceSettings/CreateWorkspaceInner.svelte +604 -0
- package/package/components/workspaceSettings/CreateWorkspaceInner.svelte.d.ts +7 -0
- package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +27 -25
- package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +46 -8
- package/package/components/workspaceSettings/DataTableSettings.svelte +27 -22
- package/package/components/workspaceSettings/DucklakeSettings.svelte +1 -1
- package/package/components/workspaceSettings/ForkDatatableSection.svelte +228 -0
- package/package/components/workspaceSettings/ForkDatatableSection.svelte.d.ts +28 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +8 -2
- package/package/components/workspaceSettings/RulesetEditor.svelte +27 -2
- package/package/components/workspaceSettings/VolumeStorageSettings.svelte +1 -1
- package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +17 -1
- package/package/consts.d.ts +3 -0
- package/package/consts.js +10 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +1172 -164
- package/package/gen/schemas.gen.js +1168 -157
- package/package/gen/services.gen.d.ts +511 -6
- package/package/gen/services.gen.js +1023 -23
- package/package/gen/types.gen.d.ts +2278 -151
- package/package/githubApp.js +5 -1
- package/package/hubPaths.json +1 -4
- package/package/infer.js +13 -1
- package/package/infer.svelte.js +10 -1
- package/package/monaco_workers/sqlTypePlugin.worker.d.ts +10 -0
- package/package/monaco_workers/sqlTypePlugin.worker.js +39 -0
- package/package/script_helpers.d.ts +8 -2
- package/package/script_helpers.js +14 -0
- package/package/stores.d.ts +4 -0
- package/package/stores.js +1 -0
- package/package/system_prompts/prompts.d.ts +4 -3
- package/package/system_prompts/prompts.js +270 -20
- package/package/templates/ci_test_bun.ts.template +19 -0
- package/package/templates/ci_test_python.py.template +18 -0
- package/package/utils_deployable.d.ts +11 -7
- package/package/utils_workspace_deploy.d.ts +8 -8
- package/package/utils_workspace_deploy.js +86 -420
- package/package.json +4 -4
- package/package/components/copilot/chat/__tests__/app/appChat.eval.test.js +0 -153
- package/package/components/copilot/chat/__tests__/app/appEvalComparison.d.ts +0 -21
- package/package/components/copilot/chat/__tests__/app/appEvalComparison.js +0 -136
- package/package/components/copilot/chat/__tests__/app/appEvalHelpers.d.ts +0 -15
- package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +0 -107
- package/package/components/copilot/chat/__tests__/app/appEvalRunner.d.ts +0 -50
- package/package/components/copilot/chat/__tests__/app/appEvalRunner.js +0 -93
- package/package/components/copilot/chat/__tests__/app/appFixtureLoader.d.ts +0 -29
- package/package/components/copilot/chat/__tests__/app/appFixtureLoader.js +0 -134
- package/package/components/copilot/chat/__tests__/app/appResultsWriter.d.ts +0 -30
- package/package/components/copilot/chat/__tests__/app/appResultsWriter.js +0 -197
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.js +0 -9
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.js +0 -5
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.d.ts +0 -12
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.js +0 -14
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.d.ts +0 -8
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.js +0 -25
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.d.ts +0 -7
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.js +0 -5
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.d.ts +0 -8
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.js +0 -5
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.tsx +0 -26
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.tsx +0 -79
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.tsx +0 -46
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.tsx +0 -56
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.tsx +0 -59
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.d.ts +0 -16
- package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.tsx +0 -119
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.d.ts +0 -15
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.js +0 -14
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.d.ts +0 -14
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.js +0 -5
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.js +0 -41
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.d.ts +0 -15
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.js +0 -3
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.d.ts +0 -9
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.tsx +0 -51
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.d.ts +0 -8
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.tsx +0 -27
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.d.ts +0 -8
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.tsx +0 -18
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.d.ts +0 -12
- package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.tsx +0 -81
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.d.ts +0 -3
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.js +0 -3
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.d.ts +0 -3
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.js +0 -3
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/meta.json +0 -4
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.d.ts +0 -2
- package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.tsx +0 -38
- package/package/components/copilot/chat/__tests__/app/variants/baseline.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/app/variants/baseline.js +0 -10
- package/package/components/copilot/chat/__tests__/app/variants/index.d.ts +0 -3
- package/package/components/copilot/chat/__tests__/app/variants/index.js +0 -3
- package/package/components/copilot/chat/__tests__/app/variants/streamlined.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/app/variants/streamlined.js +0 -137
- package/package/components/copilot/chat/__tests__/flow/expected/test1.json +0 -134
- package/package/components/copilot/chat/__tests__/flow/expected/test2.json +0 -183
- package/package/components/copilot/chat/__tests__/flow/expected/test3.json +0 -204
- package/package/components/copilot/chat/__tests__/flow/expected/test4.json +0 -175
- package/package/components/copilot/chat/__tests__/flow/expected/test5_modify_simple.json +0 -68
- package/package/components/copilot/chat/__tests__/flow/expected/test6_modify_medium.json +0 -142
- package/package/components/copilot/chat/__tests__/flow/expected/test7_modify_complex.json +0 -136
- package/package/components/copilot/chat/__tests__/flow/flowChat.eval.test.js +0 -294
- package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.d.ts +0 -17
- package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.js +0 -49
- package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.d.ts +0 -12
- package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +0 -79
- package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.d.ts +0 -50
- package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.js +0 -102
- package/package/components/copilot/chat/__tests__/flow/initial/test5_initial.json +0 -53
- package/package/components/copilot/chat/__tests__/flow/initial/test6_initial.json +0 -68
- package/package/components/copilot/chat/__tests__/flow/initial/test7_initial.json +0 -120
- package/package/components/copilot/chat/__tests__/flow/variants/baseline.d.ts +0 -6
- package/package/components/copilot/chat/__tests__/flow/variants/baseline.js +0 -10
- package/package/components/copilot/chat/__tests__/flow/variants/index.d.ts +0 -3
- package/package/components/copilot/chat/__tests__/flow/variants/index.js +0 -3
- package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.d.ts +0 -15
- package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.js +0 -388
- package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.d.ts +0 -45
- package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.js +0 -121
- package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.d.ts +0 -28
- package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.js +0 -96
- package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.d.ts +0 -32
- package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.js +0 -130
- package/package/components/copilot/chat/__tests__/shared/baseVariants.d.ts +0 -45
- package/package/components/copilot/chat/__tests__/shared/baseVariants.js +0 -57
- package/package/components/copilot/chat/__tests__/shared/index.d.ts +0 -10
- package/package/components/copilot/chat/__tests__/shared/index.js +0 -5
- package/package/components/copilot/chat/__tests__/shared/types.d.ts +0 -105
- package/package/components/copilot/chat/__tests__/shared/types.js +0 -9
- package/package/components/copilot/chat/flow/utils.d.ts +0 -14
- package/package/components/copilot/chat/flow/utils.js +0 -108
- package/package/components/flows/agentToolUtils.test.js +0 -55
- /package/package/components/copilot/chat/{__tests__/app/appChat.eval.test.d.ts → app/core.test.d.ts} +0 -0
- /package/package/components/copilot/chat/{__tests__/flow/flowChat.eval.test.d.ts → flow/helperUtils.test.d.ts} +0 -0
- /package/package/components/{flows/agentToolUtils.test.d.ts → copilot/chat/flow/utils.test.d.ts} +0 -0
|
@@ -6,7 +6,7 @@ import Skeleton from './common/skeleton/Skeleton.svelte';
|
|
|
6
6
|
import GroupEditor from './GroupEditor.svelte';
|
|
7
7
|
import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
8
8
|
import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
|
|
9
|
-
import { Eye, Plus, Trash } from 'lucide-svelte';
|
|
9
|
+
import { ArrowDown, ArrowUp, Eye, Plus, Trash } from 'lucide-svelte';
|
|
10
10
|
import Label from './Label.svelte';
|
|
11
11
|
import { sendUserToast } from '../toast';
|
|
12
12
|
import { createEventDispatcher, untrack } from 'svelte';
|
|
@@ -14,6 +14,9 @@ import Select from './select/Select.svelte';
|
|
|
14
14
|
import { safeSelectItems } from './select/utils.svelte';
|
|
15
15
|
import TextInput from './text_input/TextInput.svelte';
|
|
16
16
|
import PermissionHistory from './PermissionHistory.svelte';
|
|
17
|
+
import { Minimatch } from 'minimatch';
|
|
18
|
+
import Tooltip from './Tooltip.svelte';
|
|
19
|
+
import CollapseLink from './CollapseLink.svelte';
|
|
17
20
|
let { name } = $props();
|
|
18
21
|
let can_write = $state(false);
|
|
19
22
|
let folder;
|
|
@@ -51,6 +54,7 @@ async function loadFolder() {
|
|
|
51
54
|
try {
|
|
52
55
|
folder = await FolderService.getFolder({ workspace: $workspaceStore, name });
|
|
53
56
|
summary = folder.summary ?? '';
|
|
57
|
+
defaultPermissionedAs = (folder.default_permissioned_as ?? []).map((r) => ({ ...r }));
|
|
54
58
|
can_write =
|
|
55
59
|
$userStore != undefined &&
|
|
56
60
|
(folder?.owners.includes('u/' + $userStore.username) ||
|
|
@@ -71,6 +75,73 @@ async function loadFolder() {
|
|
|
71
75
|
folderNotFound = true;
|
|
72
76
|
}
|
|
73
77
|
}
|
|
78
|
+
// --- default_permissioned_as rules editor ---
|
|
79
|
+
let defaultPermissionedAs = $state([]);
|
|
80
|
+
const canEditDefaults = $derived(can_write &&
|
|
81
|
+
($userStore?.is_admin ||
|
|
82
|
+
$userStore?.is_super_admin ||
|
|
83
|
+
($userStore?.groups ?? []).includes('wm_deployers')));
|
|
84
|
+
function isValidGlob(glob) {
|
|
85
|
+
if (!glob)
|
|
86
|
+
return false;
|
|
87
|
+
try {
|
|
88
|
+
new Minimatch(glob);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function isValidPermissionedAs(value) {
|
|
96
|
+
return /^[ug]\/.+/.test(value) || value.includes('@');
|
|
97
|
+
}
|
|
98
|
+
// Split a permissioned_as value like "u/alice" or "g/prod" into its kind and name.
|
|
99
|
+
function ruleKind(value) {
|
|
100
|
+
return value.startsWith('g/') ? 'group' : 'user';
|
|
101
|
+
}
|
|
102
|
+
function ruleName(value) {
|
|
103
|
+
if (value.startsWith('u/') || value.startsWith('g/'))
|
|
104
|
+
return value.slice(2);
|
|
105
|
+
return value;
|
|
106
|
+
}
|
|
107
|
+
function setRulePermissionedAs(idx, kind, name) {
|
|
108
|
+
const prefix = kind === 'user' ? 'u/' : 'g/';
|
|
109
|
+
defaultPermissionedAs[idx].permissioned_as = prefix + name;
|
|
110
|
+
}
|
|
111
|
+
const defaultRulesInvalid = $derived(defaultPermissionedAs.some((r) => !isValidGlob(r.path_glob) || !isValidPermissionedAs(r.permissioned_as)));
|
|
112
|
+
function addDefaultRule() {
|
|
113
|
+
defaultPermissionedAs = [...defaultPermissionedAs, { path_glob: '**', permissioned_as: '' }];
|
|
114
|
+
}
|
|
115
|
+
function removeDefaultRule(idx) {
|
|
116
|
+
defaultPermissionedAs = defaultPermissionedAs.filter((_, i) => i !== idx);
|
|
117
|
+
}
|
|
118
|
+
function moveDefaultRule(idx, delta) {
|
|
119
|
+
const next = [...defaultPermissionedAs];
|
|
120
|
+
const target = idx + delta;
|
|
121
|
+
if (target < 0 || target >= next.length)
|
|
122
|
+
return;
|
|
123
|
+
[next[idx], next[target]] = [next[target], next[idx]];
|
|
124
|
+
defaultPermissionedAs = next;
|
|
125
|
+
}
|
|
126
|
+
async function saveDefaultRules() {
|
|
127
|
+
if (defaultRulesInvalid) {
|
|
128
|
+
sendUserToast('Some rules have invalid globs or permissioned_as values', true);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
await FolderService.updateFolder({
|
|
133
|
+
workspace: $workspaceStore ?? '',
|
|
134
|
+
name,
|
|
135
|
+
requestBody: { default_permissioned_as: defaultPermissionedAs }
|
|
136
|
+
});
|
|
137
|
+
sendUserToast('Default permissioned_as rules updated');
|
|
138
|
+
dispatch('update');
|
|
139
|
+
loadFolder();
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
sendUserToast(e.body ?? String(e), true);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
74
145
|
function getRole(x) {
|
|
75
146
|
const viewer = x in (folder?.extra_perms ?? {});
|
|
76
147
|
const writer = viewer && (folder?.extra_perms ?? {})[x];
|
|
@@ -240,14 +311,13 @@ let reloadHistory = $state(0);
|
|
|
240
311
|
{/if}
|
|
241
312
|
{#if perms}
|
|
242
313
|
<TableCustom>
|
|
243
|
-
|
|
244
314
|
{#snippet headerRow()}
|
|
245
|
-
|
|
315
|
+
<tr>
|
|
246
316
|
<th>user/group</th>
|
|
247
317
|
<th></th>
|
|
248
318
|
<th></th>
|
|
249
319
|
</tr>
|
|
250
|
-
|
|
320
|
+
{/snippet}
|
|
251
321
|
{#snippet body()}
|
|
252
322
|
<tbody>
|
|
253
323
|
{#each perms ?? [] as { owner_name, role }}<tr>
|
|
@@ -418,6 +488,121 @@ let reloadHistory = $state(0);
|
|
|
418
488
|
</div>
|
|
419
489
|
</Label>
|
|
420
490
|
|
|
491
|
+
{#if canEditDefaults}
|
|
492
|
+
<CollapseLink text="Default permissioned as (advanced, prod only)">
|
|
493
|
+
<div class="flex flex-col gap-2">
|
|
494
|
+
<Alert type="info" title="Advanced — for prod workspaces (least privilege)" size="xs">
|
|
495
|
+
This setting is mostly relevant on <strong>production workspaces</strong> where you want
|
|
496
|
+
new items under this folder to run under a least-privilege service account rather than the
|
|
497
|
+
deploying admin's identity. When an admin or <code>wm_deployers</code> member creates a
|
|
498
|
+
trigger, schedule, app, script, or flow under this folder, the first matching rule
|
|
499
|
+
determines the default <code>permissioned_as</code>. Globs are relative to the folder root
|
|
500
|
+
(e.g. <code>jobs/**</code> matches <code>f/{name}/jobs/run_a</code>). Existing items are
|
|
501
|
+
never rewritten.
|
|
502
|
+
</Alert>
|
|
503
|
+
|
|
504
|
+
{#if defaultPermissionedAs.length > 0}
|
|
505
|
+
<TableCustom>
|
|
506
|
+
{#snippet headerRow()}
|
|
507
|
+
<tr>
|
|
508
|
+
<th>path_glob <Tooltip>Glob relative to <code>f/{name}/</code></Tooltip></th>
|
|
509
|
+
<th>permissioned as</th>
|
|
510
|
+
<th class="w-24"></th>
|
|
511
|
+
</tr>
|
|
512
|
+
{/snippet}
|
|
513
|
+
{#snippet body()}
|
|
514
|
+
<tbody>
|
|
515
|
+
{#each defaultPermissionedAs as rule, idx (idx)}
|
|
516
|
+
{@const kind = ruleKind(rule.permissioned_as)}
|
|
517
|
+
{@const itemsForKind = kind === 'user' ? usernames : groups}
|
|
518
|
+
<tr>
|
|
519
|
+
<td>
|
|
520
|
+
<TextInput
|
|
521
|
+
bind:value={rule.path_glob}
|
|
522
|
+
inputProps={{ placeholder: '**' }}
|
|
523
|
+
error={!isValidGlob(rule.path_glob)}
|
|
524
|
+
/>
|
|
525
|
+
</td>
|
|
526
|
+
<td>
|
|
527
|
+
<div class="flex items-center gap-1">
|
|
528
|
+
<ToggleButtonGroup
|
|
529
|
+
selected={kind}
|
|
530
|
+
on:selected={(e) => setRulePermissionedAs(idx, e.detail, '')}
|
|
531
|
+
>
|
|
532
|
+
{#snippet children({ item })}
|
|
533
|
+
<ToggleButton value="user" label="User" {item} size="sm" />
|
|
534
|
+
<ToggleButton value="group" label="Group" {item} size="sm" />
|
|
535
|
+
{/snippet}
|
|
536
|
+
</ToggleButtonGroup>
|
|
537
|
+
<Select
|
|
538
|
+
items={safeSelectItems(itemsForKind)}
|
|
539
|
+
bind:value={
|
|
540
|
+
() => ruleName(rule.permissioned_as),
|
|
541
|
+
(v) => setRulePermissionedAs(idx, kind, v ?? '')
|
|
542
|
+
}
|
|
543
|
+
class="grow min-w-32"
|
|
544
|
+
/>
|
|
545
|
+
</div>
|
|
546
|
+
</td>
|
|
547
|
+
<td>
|
|
548
|
+
<div class="flex items-center gap-1 justify-end">
|
|
549
|
+
<Button
|
|
550
|
+
variant="subtle"
|
|
551
|
+
unifiedSize="sm"
|
|
552
|
+
startIcon={{ icon: ArrowUp }}
|
|
553
|
+
iconOnly
|
|
554
|
+
disabled={idx === 0}
|
|
555
|
+
on:click={() => moveDefaultRule(idx, -1)}
|
|
556
|
+
/>
|
|
557
|
+
<Button
|
|
558
|
+
variant="subtle"
|
|
559
|
+
unifiedSize="sm"
|
|
560
|
+
startIcon={{ icon: ArrowDown }}
|
|
561
|
+
iconOnly
|
|
562
|
+
disabled={idx === defaultPermissionedAs.length - 1}
|
|
563
|
+
on:click={() => moveDefaultRule(idx, 1)}
|
|
564
|
+
/>
|
|
565
|
+
<Button
|
|
566
|
+
variant="subtle"
|
|
567
|
+
destructive
|
|
568
|
+
unifiedSize="sm"
|
|
569
|
+
startIcon={{ icon: Trash }}
|
|
570
|
+
iconOnly
|
|
571
|
+
on:click={() => removeDefaultRule(idx)}
|
|
572
|
+
/>
|
|
573
|
+
</div>
|
|
574
|
+
</td>
|
|
575
|
+
</tr>
|
|
576
|
+
{/each}
|
|
577
|
+
</tbody>
|
|
578
|
+
{/snippet}
|
|
579
|
+
</TableCustom>
|
|
580
|
+
{:else}
|
|
581
|
+
<div class="text-xs text-tertiary">No rules defined.</div>
|
|
582
|
+
{/if}
|
|
583
|
+
|
|
584
|
+
<div class="flex items-center gap-2">
|
|
585
|
+
<Button
|
|
586
|
+
variant="default"
|
|
587
|
+
unifiedSize="sm"
|
|
588
|
+
startIcon={{ icon: Plus }}
|
|
589
|
+
on:click={addDefaultRule}
|
|
590
|
+
>
|
|
591
|
+
Add rule
|
|
592
|
+
</Button>
|
|
593
|
+
<Button
|
|
594
|
+
variant="accent"
|
|
595
|
+
unifiedSize="sm"
|
|
596
|
+
disabled={defaultRulesInvalid}
|
|
597
|
+
on:click={saveDefaultRules}
|
|
598
|
+
>
|
|
599
|
+
Save rules
|
|
600
|
+
</Button>
|
|
601
|
+
</div>
|
|
602
|
+
</div>
|
|
603
|
+
</CollapseLink>
|
|
604
|
+
{/if}
|
|
605
|
+
|
|
421
606
|
{#if reloadHistory > 0}
|
|
422
607
|
{#key reloadHistory}
|
|
423
608
|
<PermissionHistory
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">import { workspaceStore, userWorkspaces } from '../stores';
|
|
2
|
-
import { WorkspaceService } from '../gen';
|
|
2
|
+
import { WorkspaceService, ScriptService } from '../gen';
|
|
3
3
|
import { Button } from './common';
|
|
4
|
-
import { AlertTriangle, GitFork } from 'lucide-svelte';
|
|
4
|
+
import { AlertTriangle, GitFork, CircleCheck, CircleX, Loader2 } from 'lucide-svelte';
|
|
5
5
|
import { goto } from '$app/navigation';
|
|
6
6
|
import { onMount, untrack } from 'svelte';
|
|
7
7
|
let loading = $state(false);
|
|
@@ -61,6 +61,59 @@ function openComparisonDrawer() {
|
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
+
let ciTestPassing = $state(0);
|
|
65
|
+
let ciTestFailing = $state(0);
|
|
66
|
+
let ciTestRunning = $state(0);
|
|
67
|
+
let ciTestTotal = $state(0);
|
|
68
|
+
async function fetchCiTestSummary() {
|
|
69
|
+
if (!$workspaceStore || !comparison?.diffs)
|
|
70
|
+
return;
|
|
71
|
+
const items = comparison.diffs
|
|
72
|
+
.filter((d) => d.kind === 'script' || d.kind === 'flow' || d.kind === 'resource')
|
|
73
|
+
.map((d) => ({ path: d.path, kind: d.kind }));
|
|
74
|
+
if (items.length === 0)
|
|
75
|
+
return;
|
|
76
|
+
try {
|
|
77
|
+
const batch = await ScriptService.getCiTestResultsBatch({
|
|
78
|
+
workspace: $workspaceStore,
|
|
79
|
+
requestBody: { items }
|
|
80
|
+
});
|
|
81
|
+
let passing = 0;
|
|
82
|
+
let failing = 0;
|
|
83
|
+
let running = 0;
|
|
84
|
+
let total = 0;
|
|
85
|
+
for (const results of Object.values(batch)) {
|
|
86
|
+
for (const r of results) {
|
|
87
|
+
total++;
|
|
88
|
+
if (r.status === 'success')
|
|
89
|
+
passing++;
|
|
90
|
+
else if (r.status === 'failure' || r.status === 'canceled')
|
|
91
|
+
failing++;
|
|
92
|
+
else if (r.status === 'running' || (r.job_id && !r.status))
|
|
93
|
+
running++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
ciTestPassing = passing;
|
|
97
|
+
ciTestFailing = failing;
|
|
98
|
+
ciTestRunning = running;
|
|
99
|
+
ciTestTotal = total;
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.error('Failed to fetch CI test summary:', e);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
$effect(() => {
|
|
106
|
+
if (comparison && comparison.summary.total_diffs > 0) {
|
|
107
|
+
fetchCiTestSummary();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// Poll while any CI test is still running
|
|
111
|
+
$effect(() => {
|
|
112
|
+
if (ciTestRunning <= 0)
|
|
113
|
+
return;
|
|
114
|
+
const interval = setInterval(fetchCiTestSummary, 3000);
|
|
115
|
+
return () => clearInterval(interval);
|
|
116
|
+
});
|
|
64
117
|
function forkAheadBehindMessage(changesAhead, changesBehind) {
|
|
65
118
|
let msg = [];
|
|
66
119
|
if (changesAhead > 0 || changesBehind > 0) {
|
|
@@ -162,6 +215,26 @@ function forkAheadBehindMessage(changesAhead, changesBehind) {
|
|
|
162
215
|
{/if}
|
|
163
216
|
</div>
|
|
164
217
|
|
|
218
|
+
{#if ciTestTotal > 0}
|
|
219
|
+
-
|
|
220
|
+
{#if ciTestFailing > 0}
|
|
221
|
+
<div class="flex items-center gap-1 text-red-600 dark:text-red-400">
|
|
222
|
+
<CircleX class="w-3 h-3" />
|
|
223
|
+
<span>CI: {ciTestFailing} failing</span>
|
|
224
|
+
</div>
|
|
225
|
+
{:else if ciTestRunning > 0}
|
|
226
|
+
<div class="flex items-center gap-1 text-yellow-600 dark:text-yellow-400">
|
|
227
|
+
<Loader2 class="w-3 h-3 animate-spin" />
|
|
228
|
+
<span>CI: {ciTestRunning} running</span>
|
|
229
|
+
</div>
|
|
230
|
+
{:else}
|
|
231
|
+
<div class="flex items-center gap-1 text-green-600 dark:text-green-400">
|
|
232
|
+
<CircleCheck class="w-3 h-3" />
|
|
233
|
+
<span>CI: {ciTestPassing} passing</span>
|
|
234
|
+
</div>
|
|
235
|
+
{/if}
|
|
236
|
+
{/if}
|
|
237
|
+
|
|
165
238
|
{#if comparison.summary.conflicts > 0}
|
|
166
239
|
-
|
|
167
240
|
<div class="flex items-center gap-1 text-orange-600 dark:text-orange-400">
|
|
@@ -186,15 +259,13 @@ function forkAheadBehindMessage(changesAhead, changesBehind) {
|
|
|
186
259
|
</div>
|
|
187
260
|
|
|
188
261
|
<div class="flex items-center gap-2">
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
</Button>
|
|
197
|
-
{/if}
|
|
262
|
+
<Button size="xs" color="blue" on:click={openComparisonDrawer}>
|
|
263
|
+
{#if (comparison?.summary.total_ahead ?? 0) > 0}
|
|
264
|
+
Review & Deploy Changes
|
|
265
|
+
{:else}
|
|
266
|
+
Review & Update fork
|
|
267
|
+
{/if}
|
|
268
|
+
</Button>
|
|
198
269
|
</div>
|
|
199
270
|
</div>
|
|
200
271
|
</div>
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
<script lang="ts">import { Alert, Button } from './common';
|
|
2
|
+
import { fade } from 'svelte/transition';
|
|
3
|
+
import { classNames } from '../utils';
|
|
4
|
+
import { AlertTriangle, CornerDownLeft, Loader2 } from 'lucide-svelte';
|
|
5
|
+
import { UserService, FolderService } from '../gen';
|
|
6
|
+
import { sendUserToast } from '../toast';
|
|
7
|
+
import Toggle from './Toggle.svelte';
|
|
8
|
+
import OffboardWorkspaceSection from './OffboardWorkspaceSection.svelte';
|
|
9
|
+
import { countPaths } from './offboarding-utils';
|
|
10
|
+
let { open = $bindable(), email, reassignOnly = false, onClose, onComplete } = $props();
|
|
11
|
+
let workspacePreviews = $state([]);
|
|
12
|
+
let loading = $state(false);
|
|
13
|
+
let submitting = $state(false);
|
|
14
|
+
let doReassign = $state(true);
|
|
15
|
+
let deleteUser = $state(true);
|
|
16
|
+
let conflicts = $state([]);
|
|
17
|
+
$effect(() => {
|
|
18
|
+
deleteUser = !reassignOnly;
|
|
19
|
+
});
|
|
20
|
+
let wsConfigs = $state({});
|
|
21
|
+
let workspacesWithItems = $derived(workspacePreviews.filter((wp) => countPaths(wp.preview.owned) > 0 || countPaths(wp.preview.executing_on_behalf) > 0));
|
|
22
|
+
$effect(() => {
|
|
23
|
+
if (open) {
|
|
24
|
+
loadPreview();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
async function loadPreview() {
|
|
28
|
+
loading = true;
|
|
29
|
+
conflicts = [];
|
|
30
|
+
try {
|
|
31
|
+
const result = await UserService.globalOffboardPreview({ email });
|
|
32
|
+
workspacePreviews = result.workspaces;
|
|
33
|
+
const configPromises = result.workspaces
|
|
34
|
+
.filter((wp) => countPaths(wp.preview.owned) > 0 || countPaths(wp.preview.executing_on_behalf) > 0)
|
|
35
|
+
.map(async (wp) => {
|
|
36
|
+
const [usernamesList, foldersList] = await Promise.all([
|
|
37
|
+
UserService.listUsernames({ workspace: wp.workspace_id }),
|
|
38
|
+
FolderService.listFolders({ workspace: wp.workspace_id })
|
|
39
|
+
]);
|
|
40
|
+
return {
|
|
41
|
+
workspace_id: wp.workspace_id,
|
|
42
|
+
config: {
|
|
43
|
+
targetKind: 'user',
|
|
44
|
+
selectedUser: undefined,
|
|
45
|
+
selectedFolder: undefined,
|
|
46
|
+
selectedOperator: undefined,
|
|
47
|
+
users: usernamesList
|
|
48
|
+
.filter((u) => u !== wp.username)
|
|
49
|
+
.map((u) => ({ label: u, value: u })),
|
|
50
|
+
folders: foldersList.map((f) => ({
|
|
51
|
+
label: f.name,
|
|
52
|
+
value: f.name
|
|
53
|
+
}))
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
const configs = await Promise.all(configPromises);
|
|
58
|
+
for (const { workspace_id, config } of configs) {
|
|
59
|
+
wsConfigs[workspace_id] = config;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
sendUserToast('Failed to load offboard preview', true);
|
|
64
|
+
onClose();
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
loading = false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function getReassignTo(wId) {
|
|
71
|
+
const cfg = wsConfigs[wId];
|
|
72
|
+
if (!cfg)
|
|
73
|
+
return undefined;
|
|
74
|
+
return cfg.targetKind === 'user'
|
|
75
|
+
? cfg.selectedUser
|
|
76
|
+
? `u/${cfg.selectedUser}`
|
|
77
|
+
: undefined
|
|
78
|
+
: cfg.selectedFolder
|
|
79
|
+
? `f/${cfg.selectedFolder}`
|
|
80
|
+
: undefined;
|
|
81
|
+
}
|
|
82
|
+
let canSubmit = $derived(!doReassign ||
|
|
83
|
+
workspacesWithItems.every((wp) => {
|
|
84
|
+
const target = getReassignTo(wp.workspace_id);
|
|
85
|
+
const cfg = wsConfigs[wp.workspace_id];
|
|
86
|
+
if (!target)
|
|
87
|
+
return false;
|
|
88
|
+
if (!cfg?.selectedOperator)
|
|
89
|
+
return false;
|
|
90
|
+
return true;
|
|
91
|
+
}));
|
|
92
|
+
async function submit() {
|
|
93
|
+
submitting = true;
|
|
94
|
+
conflicts = [];
|
|
95
|
+
try {
|
|
96
|
+
const reassignments = {};
|
|
97
|
+
for (const wp of workspacesWithItems) {
|
|
98
|
+
const target = getReassignTo(wp.workspace_id);
|
|
99
|
+
const cfg = wsConfigs[wp.workspace_id];
|
|
100
|
+
if (target) {
|
|
101
|
+
reassignments[wp.workspace_id] = {
|
|
102
|
+
reassign_to: target,
|
|
103
|
+
new_on_behalf_of_user: cfg?.selectedOperator
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const result = await UserService.offboardGlobalUser({
|
|
108
|
+
email,
|
|
109
|
+
requestBody: {
|
|
110
|
+
reassignments,
|
|
111
|
+
delete_user: deleteUser
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
if (result.conflicts && result.conflicts.length > 0) {
|
|
115
|
+
conflicts = result.conflicts;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
sendUserToast(deleteUser
|
|
119
|
+
? `User ${email} offboarded successfully`
|
|
120
|
+
: `Items reassigned from ${email} successfully`);
|
|
121
|
+
onComplete();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
sendUserToast(`Offboarding failed: ${e}`, true);
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
submitting = false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function fadeFast(node) {
|
|
132
|
+
return fade(node, { duration: 100 });
|
|
133
|
+
}
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
{#if open}
|
|
137
|
+
<div transition:fadeFast|local class="fixed top-0 bottom-0 left-0 right-0 z-[5000]" role="dialog">
|
|
138
|
+
<div
|
|
139
|
+
class={classNames(
|
|
140
|
+
'fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity',
|
|
141
|
+
'ease-out duration-300 opacity-100'
|
|
142
|
+
)}
|
|
143
|
+
></div>
|
|
144
|
+
|
|
145
|
+
<div class="fixed inset-0 z-10 overflow-y-auto">
|
|
146
|
+
<div class="flex min-h-full items-center justify-center p-4">
|
|
147
|
+
<div
|
|
148
|
+
class="relative transform overflow-hidden rounded-lg bg-surface px-4 pt-5 pb-4 text-left shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-2xl sm:p-6 max-h-[80vh] overflow-y-auto"
|
|
149
|
+
>
|
|
150
|
+
<div class="flex">
|
|
151
|
+
<div
|
|
152
|
+
class="flex h-12 w-12 items-center justify-center rounded-full bg-red-100 dark:bg-red-800/50"
|
|
153
|
+
>
|
|
154
|
+
<AlertTriangle class="text-red-500 dark:text-red-400" />
|
|
155
|
+
</div>
|
|
156
|
+
<div class="ml-4 text-left flex-1">
|
|
157
|
+
<h3 class="text-lg font-medium text-primary">
|
|
158
|
+
{reassignOnly ? 'Reassign user items globally' : 'Offboard user globally'}
|
|
159
|
+
</h3>
|
|
160
|
+
<p class="text-sm text-secondary mt-1">
|
|
161
|
+
{reassignOnly
|
|
162
|
+
? `Reassign items owned by ${email} across all workspaces`
|
|
163
|
+
: `Remove ${email} from instance and reassign their items`}
|
|
164
|
+
</p>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
{#if loading}
|
|
169
|
+
<div class="flex items-center justify-center py-8">
|
|
170
|
+
<Loader2 class="animate-spin" size={24} />
|
|
171
|
+
<span class="ml-2 text-sm text-secondary">Loading preview...</span>
|
|
172
|
+
</div>
|
|
173
|
+
{:else}
|
|
174
|
+
<div class="mt-4 space-y-3">
|
|
175
|
+
{#if workspacesWithItems.length === 0}
|
|
176
|
+
<p class="text-sm text-secondary">
|
|
177
|
+
This user has no owned items in any workspace.
|
|
178
|
+
</p>
|
|
179
|
+
{:else}
|
|
180
|
+
{#if !reassignOnly}
|
|
181
|
+
<Toggle
|
|
182
|
+
bind:checked={doReassign}
|
|
183
|
+
size="xs"
|
|
184
|
+
options={{ right: 'Reassign items before removing' }}
|
|
185
|
+
/>
|
|
186
|
+
{/if}
|
|
187
|
+
|
|
188
|
+
{#if doReassign}
|
|
189
|
+
{#each workspacesWithItems as wp}
|
|
190
|
+
{@const cfg = wsConfigs[wp.workspace_id]}
|
|
191
|
+
<div class="border border-border rounded-md p-3 space-y-2">
|
|
192
|
+
<div class="flex items-center justify-between">
|
|
193
|
+
<span class="text-sm font-medium text-primary">
|
|
194
|
+
{wp.workspace_id}
|
|
195
|
+
<span class="text-secondary font-normal">({wp.username})</span>
|
|
196
|
+
</span>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
{#if cfg}
|
|
200
|
+
<OffboardWorkspaceSection
|
|
201
|
+
preview={wp.preview}
|
|
202
|
+
username={wp.username}
|
|
203
|
+
{deleteUser}
|
|
204
|
+
bind:targetKind={cfg.targetKind}
|
|
205
|
+
bind:selectedUser={cfg.selectedUser}
|
|
206
|
+
bind:selectedFolder={cfg.selectedFolder}
|
|
207
|
+
bind:selectedOperator={cfg.selectedOperator}
|
|
208
|
+
users={cfg.users}
|
|
209
|
+
folders={cfg.folders}
|
|
210
|
+
size="sm"
|
|
211
|
+
csvFilename="offboard-{email}-{wp.workspace_id}.csv"
|
|
212
|
+
instanceLevel
|
|
213
|
+
/>
|
|
214
|
+
{/if}
|
|
215
|
+
</div>
|
|
216
|
+
{/each}
|
|
217
|
+
{:else}
|
|
218
|
+
<Alert type="warning" title="Items will not be reassigned">
|
|
219
|
+
<p class="text-xs">
|
|
220
|
+
All items across {workspacesWithItems.length} workspace(s) will be left as-is.
|
|
221
|
+
Triggers and runnables may stop working if the user is removed.
|
|
222
|
+
</p>
|
|
223
|
+
</Alert>
|
|
224
|
+
{/if}
|
|
225
|
+
{/if}
|
|
226
|
+
|
|
227
|
+
{#if deleteUser}
|
|
228
|
+
<Alert type="warning" title="All tokens will be deleted">
|
|
229
|
+
<p class="text-xs">
|
|
230
|
+
All tokens for {email} will be permanently deleted across all workspaces, including
|
|
231
|
+
non-workspace-scoped tokens. This may break any API calls using these credentials.
|
|
232
|
+
</p>
|
|
233
|
+
</Alert>
|
|
234
|
+
{/if}
|
|
235
|
+
|
|
236
|
+
{#if workspacePreviews.length > workspacesWithItems.length}
|
|
237
|
+
<p class="text-xs text-tertiary">
|
|
238
|
+
{workspacePreviews.length - workspacesWithItems.length} workspace(s) with no items
|
|
239
|
+
to reassign
|
|
240
|
+
</p>
|
|
241
|
+
{/if}
|
|
242
|
+
|
|
243
|
+
{#if conflicts.length > 0}
|
|
244
|
+
<Alert type="error" title="Path conflicts detected">
|
|
245
|
+
<p class="text-xs mb-1"
|
|
246
|
+
>These items already exist at the target. Rename or delete them, or choose a
|
|
247
|
+
different user/folder.</p
|
|
248
|
+
>
|
|
249
|
+
<ul class="text-xs list-disc list-inside max-h-32 overflow-y-auto">
|
|
250
|
+
{#each conflicts as conflict}
|
|
251
|
+
<li>{conflict}</li>
|
|
252
|
+
{/each}
|
|
253
|
+
</ul>
|
|
254
|
+
</Alert>
|
|
255
|
+
{/if}
|
|
256
|
+
</div>
|
|
257
|
+
{/if}
|
|
258
|
+
|
|
259
|
+
<div class="flex items-center space-x-2 flex-row-reverse space-x-reverse mt-4">
|
|
260
|
+
{#if workspacesWithItems.length > 0 || deleteUser}
|
|
261
|
+
<Button
|
|
262
|
+
disabled={submitting || !canSubmit}
|
|
263
|
+
onclick={submit}
|
|
264
|
+
variant="accent"
|
|
265
|
+
size="sm"
|
|
266
|
+
destructive
|
|
267
|
+
shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
|
|
268
|
+
>
|
|
269
|
+
{#if submitting}
|
|
270
|
+
<Loader2 class="animate-spin" />
|
|
271
|
+
{/if}
|
|
272
|
+
<span class="min-w-20">
|
|
273
|
+
{deleteUser ? 'Offboard' : 'Reassign'}
|
|
274
|
+
</span>
|
|
275
|
+
</Button>
|
|
276
|
+
{:else if !loading}
|
|
277
|
+
<Button onclick={onClose} variant="accent" size="sm">Close</Button>
|
|
278
|
+
{/if}
|
|
279
|
+
<Button
|
|
280
|
+
disabled={submitting}
|
|
281
|
+
onclick={onClose}
|
|
282
|
+
variant="default"
|
|
283
|
+
size="sm"
|
|
284
|
+
shortCut={{ key: 'Esc', hide: false, withoutModifier: true }}
|
|
285
|
+
>
|
|
286
|
+
Cancel
|
|
287
|
+
</Button>
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
</div>
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
{/if}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
email: string;
|
|
4
|
+
reassignOnly?: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
onComplete: () => void;
|
|
7
|
+
};
|
|
8
|
+
declare const GlobalUserOffboardingModal: import("svelte").Component<Props, {}, "open">;
|
|
9
|
+
type GlobalUserOffboardingModal = ReturnType<typeof GlobalUserOffboardingModal>;
|
|
10
|
+
export default GlobalUserOffboardingModal;
|