windmill-components 1.665.0 → 1.677.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.
Files changed (254) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/components/AddUser.svelte +67 -34
  74. package/package/components/AppConnectInner.svelte +9 -1
  75. package/package/components/ArgInfo.svelte +9 -1
  76. package/package/components/ArgInput.svelte +21 -1
  77. package/package/components/CompareWorkspaces.svelte +11 -2
  78. package/package/components/DedicatedWorkersSelector.svelte +262 -247
  79. package/package/components/DefaultTagsInner.svelte +40 -2
  80. package/package/components/DeployWorkspace.svelte +13 -0
  81. package/package/components/DiffEditor.svelte +44 -1
  82. package/package/components/EditableSchemaForm.svelte +5 -2
  83. package/package/components/EditableSchemaForm.svelte.d.ts +1 -0
  84. package/package/components/Editor.svelte +5 -1
  85. package/package/components/EditorBar.svelte +12 -3
  86. package/package/components/FilterSearchbar.svelte +26 -2
  87. package/package/components/FlowBuilder.svelte +6 -3
  88. package/package/components/FlowGraphDiffViewer.svelte +16 -17
  89. package/package/components/FlowGraphViewer.svelte +20 -6
  90. package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
  91. package/package/components/FlowGraphViewerStep.svelte +14 -32
  92. package/package/components/FlowMetadata.svelte +4 -1
  93. package/package/components/FlowPreviewContent.svelte +2 -0
  94. package/package/components/FlowStatusWaitingForEvents.svelte +25 -4
  95. package/package/components/HighlightCode.svelte +3 -0
  96. package/package/components/InstanceSetting.svelte +9 -25
  97. package/package/components/InstanceSettings.svelte +16 -0
  98. package/package/components/LabelsInput.svelte +149 -0
  99. package/package/components/LabelsInput.svelte.d.ts +8 -0
  100. package/package/components/Login.svelte +6 -1
  101. package/package/components/ObjectStoreConfigSettings.svelte +273 -1
  102. package/package/components/OktaSetting.svelte +6 -5
  103. package/package/components/Password.svelte +74 -20
  104. package/package/components/Password.svelte.d.ts +1 -0
  105. package/package/components/PasswordArgInput.svelte +2 -2
  106. package/package/components/PasswordArgInput.svelte.d.ts +1 -0
  107. package/package/components/Path.svelte +8 -10
  108. package/package/components/PathNameAutocomplete.svelte +308 -0
  109. package/package/components/PathNameAutocomplete.svelte.d.ts +27 -0
  110. package/package/components/PowerShellCommonParams.svelte +84 -0
  111. package/package/components/PowerShellCommonParams.svelte.d.ts +6 -0
  112. package/package/components/Range.svelte +8 -3
  113. package/package/components/ResourceEditor.svelte +6 -2
  114. package/package/components/RunForm.svelte +71 -7
  115. package/package/components/RunForm.svelte.d.ts +2 -1
  116. package/package/components/ScriptBuilder.svelte +7 -3
  117. package/package/components/ScriptEditor.svelte +221 -187
  118. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  119. package/package/components/ScriptSchema.svelte +1 -1
  120. package/package/components/StringTypeNarrowing.svelte +1 -1
  121. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  122. package/package/components/SummaryPathDisplay.svelte +32 -10
  123. package/package/components/SummaryPathDisplay.svelte.d.ts +2 -1
  124. package/package/components/VariableEditor.svelte +9 -2
  125. package/package/components/WorkerGroup.svelte +47 -2
  126. package/package/components/apps/editor/DeploymentHistory.svelte +112 -13
  127. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +135 -35
  128. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +3 -1
  129. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +11 -35
  130. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.d.ts +10 -0
  131. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.js +14 -0
  132. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.d.ts +1 -0
  133. package/package/components/apps/editor/settingsPanel/mainInput/runnableSelectorUtils.test.js +34 -0
  134. package/package/components/assets/AssetButtons.svelte +21 -25
  135. package/package/components/assets/AssetsUsageDrawer.svelte +7 -9
  136. package/package/components/common/fileUpload/FileUpload.svelte +6 -2
  137. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  138. package/package/components/common/table/AppRow.svelte +18 -0
  139. package/package/components/common/table/FlowRow.svelte +18 -0
  140. package/package/components/common/table/ScriptRow.svelte +18 -0
  141. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -3
  142. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  143. package/package/components/copilot/chat/flow/openFlowZod.js +3 -3
  144. package/package/components/custom_ui.d.ts +2 -0
  145. package/package/components/details/DetailPageHeader.svelte +2 -2
  146. package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
  147. package/package/components/flows/agentToolUtils.d.ts +5 -0
  148. package/package/components/flows/agentToolUtils.js +49 -0
  149. package/package/components/flows/agentToolUtils.test.d.ts +1 -0
  150. package/package/components/flows/agentToolUtils.test.js +55 -0
  151. package/package/components/flows/content/FlowInput.svelte +2 -0
  152. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  153. package/package/components/flows/content/FlowLoop.svelte +5 -12
  154. package/package/components/flows/content/FlowModuleScript.svelte +5 -3
  155. package/package/components/flows/content/FlowPathViewer.svelte +2 -2
  156. package/package/components/flows/content/FlowPathViewer.svelte.d.ts +1 -0
  157. package/package/components/flows/content/FlowSettings.svelte +2 -0
  158. package/package/components/flows/content/FlowWhileLoop.svelte +5 -12
  159. package/package/components/flows/flowInfers.js +8 -3
  160. package/package/components/flows/map/FlowModuleSchemaMap.svelte +49 -9
  161. package/package/components/flows/pickers/PickHubScriptQuick.svelte +5 -3
  162. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
  163. package/package/components/flows/scheduleUtils.js +2 -1
  164. package/package/components/graph/FlowGraphV2.svelte +13 -1
  165. package/package/components/graph/WacDiagram.svelte +96 -0
  166. package/package/components/graph/WacDiagram.svelte.d.ts +7 -0
  167. package/package/components/graph/noteEditor.svelte.d.ts +1 -1
  168. package/package/components/graph/noteEditor.svelte.js +12 -1
  169. package/package/components/graph/noteUtils.svelte.d.ts +1 -1
  170. package/package/components/graph/noteUtils.svelte.js +9 -2
  171. package/package/components/graph/renderers/edges/WacEdge.svelte +41 -0
  172. package/package/components/graph/renderers/edges/WacEdge.svelte.d.ts +4 -0
  173. package/package/components/graph/renderers/nodes/WacControlNode.svelte +51 -0
  174. package/package/components/graph/renderers/nodes/WacControlNode.svelte.d.ts +9 -0
  175. package/package/components/graph/renderers/nodes/WacStepNode.svelte +35 -0
  176. package/package/components/graph/renderers/nodes/WacStepNode.svelte.d.ts +9 -0
  177. package/package/components/graph/wacDagLayout.d.ts +10 -0
  178. package/package/components/graph/wacDagLayout.js +120 -0
  179. package/package/components/graph/wacToFlow.js +1 -1
  180. package/package/components/home/ItemsList.svelte +28 -4
  181. package/package/components/icons/RIcon.svelte +32 -0
  182. package/package/components/icons/RIcon.svelte.d.ts +7 -0
  183. package/package/components/instanceSettings/DbHealth.svelte +723 -0
  184. package/package/components/instanceSettings/DbHealth.svelte.d.ts +3 -0
  185. package/package/components/instanceSettings/SecretBackendConfig.svelte +343 -304
  186. package/package/components/instanceSettings/SmtpSettings.svelte +8 -0
  187. package/package/components/instanceSettings.js +14 -5
  188. package/package/components/mcp/McpScopeSelector.svelte +82 -16
  189. package/package/components/moveRenameManager.d.ts +1 -0
  190. package/package/components/moveRenameManager.js +7 -4
  191. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +14 -1
  192. package/package/components/raw_apps/rawAppPolicy.js +3 -2
  193. package/package/components/raw_apps/utils.test.d.ts +1 -0
  194. package/package/components/raw_apps/utils.test.js +38 -0
  195. package/package/components/recording/ScriptRecordingReplay.svelte +0 -1
  196. package/package/components/resources/resourcesFilter.d.ts +15 -2
  197. package/package/components/resources/resourcesFilter.js +11 -2
  198. package/package/components/runs/JobDetailFieldConfig.js +5 -3
  199. package/package/components/runs/JobDetailHeader.svelte +5 -2
  200. package/package/components/runs/JobRunsPreview.svelte +1 -0
  201. package/package/components/runs/RunBadges.svelte +7 -4
  202. package/package/components/runs/RunRow.svelte +7 -7
  203. package/package/components/schedules/schedulesFilter.d.ts +15 -2
  204. package/package/components/schedules/schedulesFilter.js +11 -2
  205. package/package/components/schema/EditableSchemaWrapper.svelte +6 -8
  206. package/package/components/schema/PropertyEditor.svelte +22 -1
  207. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -0
  208. package/package/components/schema/editable_schema_wrapper.d.ts +1 -0
  209. package/package/components/secretArgUtils.d.ts +7 -0
  210. package/package/components/secretArgUtils.js +45 -0
  211. package/package/components/settings/WorkspaceUserSettings.svelte +359 -286
  212. package/package/components/sidebar/OperatorMenu.svelte +215 -197
  213. package/package/components/triggers/CaptureWrapper.svelte +1 -1
  214. package/package/components/triggers/TriggerFilters.svelte +17 -5
  215. package/package/components/triggers/TriggerFilters.svelte.d.ts +2 -1
  216. package/package/components/triggers/kafka/KafkaCapture.svelte +6 -2
  217. package/package/components/triggers/kafka/KafkaCapture.svelte.d.ts +1 -1
  218. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +5 -1
  219. package/package/components/triggers/kafka/utils.js +1 -0
  220. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +6 -0
  221. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +87 -1
  222. package/package/components/triggers/websocket/utils.js +2 -0
  223. package/package/components/variables/variablesFilter.d.ts +15 -2
  224. package/package/components/variables/variablesFilter.js +11 -2
  225. package/package/components/worker_group.js +1 -0
  226. package/package/components/workspaceSettings/DucklakeSettings.svelte +33 -41
  227. package/package/consts.d.ts +1 -0
  228. package/package/consts.js +1 -0
  229. package/package/editorLangUtils.d.ts +1 -1
  230. package/package/editorLangUtils.js +2 -0
  231. package/package/forLater.js +4 -0
  232. package/package/gen/core/OpenAPI.js +1 -1
  233. package/package/gen/schemas.gen.d.ts +94 -294
  234. package/package/gen/schemas.gen.js +94 -294
  235. package/package/gen/services.gen.d.ts +5 -121
  236. package/package/gen/services.gen.js +5 -237
  237. package/package/gen/types.gen.d.ts +91 -715
  238. package/package/hubPaths.json +6 -3
  239. package/package/infer.d.ts +55 -0
  240. package/package/infer.js +131 -0
  241. package/package/infer.svelte.js +2 -0
  242. package/package/mcpEndpointTools.js +213 -22
  243. package/package/script_helpers.d.ts +3 -0
  244. package/package/script_helpers.js +26 -0
  245. package/package/scripts.d.ts +2 -1
  246. package/package/scripts.js +15 -3
  247. package/package/stores.d.ts +2 -0
  248. package/package/system_prompts/prompts.d.ts +6 -5
  249. package/package/system_prompts/prompts.js +188 -29
  250. package/package/user.js +5 -1
  251. package/package/utils.js +21 -0
  252. package/package/utils_deployable.d.ts +7 -0
  253. package/package/utils_workspace_deploy.js +36 -8
  254. package/package.json +6 -5
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { ScriptService, FlowService, WorkspaceService, WorkspaceDependenciesService } from '../gen';
1
+ <script lang="ts">import { ScriptService, FlowService, WorkspaceService, ConfigService } from '../gen';
2
2
  import { Check, X, RefreshCcw, ChevronDown, ChevronRight, CodeXml, ExternalLink, TriangleAlert, Layers } from 'lucide-svelte';
3
3
  import { Button } from './common';
4
4
  import Select from './select/Select.svelte';
@@ -16,8 +16,8 @@ let loading = $state(false);
16
16
  let workspaces = $state([]);
17
17
  let workspacesLoading = $state(true);
18
18
  let selectorExpanded = $state(false);
19
- // Set of existing workspace dependency names for the current workspace (for validation)
20
- let existingDeps = $state(new Set());
19
+ // Map of dep name set of workspaces that have it (for cross-workspace validation)
20
+ let existingDeps = $state(new Map());
21
21
  let selectedTagsInfo = $state(new SvelteMap());
22
22
  // Languages that support dedicated workers
23
23
  const DEDICATED_WORKER_LANGUAGES = ['python3', 'bun', 'bunnative', 'deno'];
@@ -53,52 +53,52 @@ async function loadSelectedTagsInfo(tags) {
53
53
  const currentRunnables = untrack(() => runnables);
54
54
  const currentExistingDeps = untrack(() => existingDeps);
55
55
  const newInfo = new SvelteMap();
56
- // Collect workspaces that need dep info fetched
57
- const workspacesNeedingDeps = new Set();
58
- for (const tag of tags) {
59
- const existing = currentInfo.get(tag);
60
- const existingRunnable = currentRunnables.find((r) => r.tag === tag);
61
- // If we don't have workspaceDeps cached, we need to fetch for this workspace
62
- if (!existing?.workspaceDeps && !existingRunnable?.workspaceDeps) {
63
- const parsed = parseTag(tag);
64
- if (parsed?.type === 'script') {
65
- workspacesNeedingDeps.add(parsed.workspace);
56
+ // Fetch dep info only when not disabled (requires devops role)
57
+ let needsFetch = !disabled && currentExistingDeps.size === 0;
58
+ if (!needsFetch && !disabled) {
59
+ for (const tag of tags) {
60
+ const existing = currentInfo.get(tag);
61
+ const existingRunnable = currentRunnables.find((r) => r.tag === tag);
62
+ if (!existing?.workspaceDeps && !existingRunnable?.workspaceDeps) {
63
+ const parsed = parseTag(tag);
64
+ if (parsed?.type === 'script') {
65
+ needsFetch = true;
66
+ break;
67
+ }
66
68
  }
67
69
  }
68
70
  }
69
- // Fetch workspace dep info for workspaces that need it
71
+ // Fetch dep info across all workspaces (requires devops role)
70
72
  const depsPerWorkspace = new Map();
71
- if (workspacesNeedingDeps.size > 0 || currentExistingDeps.size === 0) {
72
- await Promise.all(Array.from(workspacesNeedingDeps).map(async (ws) => {
73
- try {
74
- const [dedicatedDeps, wsDeps] = await Promise.all([
75
- ScriptService.listDedicatedWithDeps({ workspace: ws }).catch(() => []),
76
- WorkspaceDependenciesService.listWorkspaceDependencies({
77
- workspace: ws
78
- }).catch(() => [])
79
- ]);
80
- const depsMap = new Map();
81
- for (const d of dedicatedDeps) {
82
- if (d.workspace_dep_names.length > 0) {
83
- depsMap.set(d.path, {
84
- deps: d.workspace_dep_names,
85
- language: d.language
86
- });
87
- }
88
- }
89
- depsPerWorkspace.set(ws, depsMap);
90
- // Merge into existingDeps
91
- for (const d of wsDeps) {
92
- if (!d.archived && d.name) {
93
- currentExistingDeps.add(d.name);
94
- }
73
+ if (needsFetch) {
74
+ const [allDedicatedDeps, allWsDeps] = await Promise.all([
75
+ ConfigService.listAllDedicatedWithDeps().catch(() => []),
76
+ ConfigService.listAllWorkspaceDependencies().catch(() => [])
77
+ ]);
78
+ for (const d of allDedicatedDeps) {
79
+ if (d.workspace_dep_names.length > 0) {
80
+ let wsMap = depsPerWorkspace.get(d.workspace_id);
81
+ if (!wsMap) {
82
+ wsMap = new Map();
83
+ depsPerWorkspace.set(d.workspace_id, wsMap);
95
84
  }
85
+ wsMap.set(d.path, {
86
+ deps: d.workspace_dep_names,
87
+ language: d.language
88
+ });
96
89
  }
97
- catch {
98
- // ignore
90
+ }
91
+ for (const d of allWsDeps) {
92
+ if (d.name) {
93
+ let wsSet = currentExistingDeps.get(d.name);
94
+ if (!wsSet) {
95
+ wsSet = new Set();
96
+ currentExistingDeps.set(d.name, wsSet);
97
+ }
98
+ wsSet.add(d.workspace_id);
99
99
  }
100
- }));
101
- existingDeps = new Set(currentExistingDeps);
100
+ }
101
+ existingDeps = new Map(currentExistingDeps);
102
102
  }
103
103
  try {
104
104
  await Promise.all(tags.map(async (tag) => {
@@ -137,6 +137,16 @@ async function loadSelectedTagsInfo(tags) {
137
137
  const parsed = parseTag(tag);
138
138
  if (!parsed)
139
139
  return;
140
+ if (disabled) {
141
+ // Read-only: just show path info, skip API calls
142
+ newInfo.set(tag, {
143
+ tag,
144
+ workspace: parsed.workspace,
145
+ type: parsed.type,
146
+ path: parsed.path
147
+ });
148
+ return;
149
+ }
140
150
  if (parsed.type === 'script') {
141
151
  const depInfo = depsPerWorkspace.get(parsed.workspace)?.get(parsed.path);
142
152
  let scriptLang = depInfo?.language;
@@ -308,7 +318,7 @@ async function loadRunnables(workspaceId) {
308
318
  try {
309
319
  loading = true;
310
320
  runnables = [];
311
- const [scripts, flows, dedicatedDeps, wsDeps] = await Promise.all([
321
+ const [scripts, flows, dedicatedDeps, allWsDeps] = await Promise.all([
312
322
  ScriptService.listScripts({
313
323
  workspace: workspaceId,
314
324
  dedicatedWorker: true
@@ -317,18 +327,28 @@ async function loadRunnables(workspaceId) {
317
327
  workspace: workspaceId,
318
328
  dedicatedWorker: true
319
329
  }),
320
- ScriptService.listDedicatedWithDeps({
321
- workspace: workspaceId
322
- }).catch(() => []),
323
- WorkspaceDependenciesService.listWorkspaceDependencies({
324
- workspace: workspaceId
325
- }).catch(() => [])
330
+ disabled
331
+ ? Promise.resolve([])
332
+ : ScriptService.listDedicatedWithDeps({
333
+ workspace: workspaceId
334
+ }).catch(() => []),
335
+ disabled
336
+ ? Promise.resolve([])
337
+ : ConfigService.listAllWorkspaceDependencies().catch(() => [])
326
338
  ]);
327
- // Track existing workspace dep names for validation
328
- existingDeps = new Set(wsDeps
329
- .filter((d) => !d.archived)
330
- .map((d) => d.name)
331
- .filter((n) => !!n));
339
+ // Track existing workspace dep names with their workspaces for validation
340
+ const newDeps = new Map();
341
+ for (const d of allWsDeps) {
342
+ if (d.name) {
343
+ let wsSet = newDeps.get(d.name);
344
+ if (!wsSet) {
345
+ wsSet = new Set();
346
+ newDeps.set(d.name, wsSet);
347
+ }
348
+ wsSet.add(d.workspace_id);
349
+ }
350
+ }
351
+ existingDeps = newDeps;
332
352
  // Build a map from path -> workspace dep names
333
353
  const depsMap = new Map();
334
354
  for (const d of dedicatedDeps) {
@@ -399,7 +419,11 @@ function deselectAll() {
399
419
  updateSelectedTags();
400
420
  }
401
421
  function updateSelectedTags() {
402
- selectedTags = runnables.filter((r) => r.selected).map((r) => r.tag);
422
+ // Keep tags from other workspaces, update only the currently visible ones
423
+ const visibleTags = new Set(runnables.map((r) => r.tag));
424
+ const otherTags = selectedTags.filter((t) => !visibleTags.has(t));
425
+ const newVisibleTags = runnables.filter((r) => r.selected).map((r) => r.tag);
426
+ selectedTags = [...otherTags, ...newVisibleTags];
403
427
  onchange?.(selectedTags);
404
428
  }
405
429
  function removeTag(tag) {
@@ -424,13 +448,18 @@ let runnerGroups = $derived.by(() => {
424
448
  if (info?.type === 'script' && info.workspaceDeps) {
425
449
  const lang = info.language ?? runnables.find((r) => r.tag === tag)?.language ?? 'unknown';
426
450
  for (const dep of info.workspaceDeps) {
427
- const key = `${dep}:${lang}`;
451
+ const key = `${info.workspace}:${dep}:${lang}`;
428
452
  const existing = groupMap.get(key);
429
453
  if (existing) {
430
454
  existing.tags.push(tag);
431
455
  }
432
456
  else {
433
- groupMap.set(key, { depName: dep, language: lang, tags: [tag] });
457
+ groupMap.set(key, {
458
+ workspace: info.workspace,
459
+ depName: dep,
460
+ language: lang,
461
+ tags: [tag]
462
+ });
434
463
  }
435
464
  }
436
465
  }
@@ -452,16 +481,28 @@ let tagRunnerGroup = $derived.by(() => {
452
481
  let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(tag)));
453
482
  </script>
454
483
 
455
- {#snippet depBadge(dep: string)}
456
- {#if existingDeps.has(dep)}
457
- <Badge color="indigo" small href="/workspace_settings?tab=dependencies">
484
+ {#snippet depBadge(dep: string, workspace: string | undefined)}
485
+ {@const depWorkspaces = existingDeps.get(dep)}
486
+ {@const existsInWorkspace = depWorkspaces?.has(workspace ?? '')}
487
+ {@const existsElsewhere = depWorkspaces && depWorkspaces.size > 0 && !existsInWorkspace}
488
+ {#if existsInWorkspace}
489
+ <Badge color="indigo" small href="/workspace_settings?tab=dependencies&workspace={workspace}">
458
490
  {dep}
459
491
  <ExternalLink class="h-2.5 w-2.5" />
460
492
  </Badge>
493
+ {:else if existsElsewhere}
494
+ <Tooltip small>
495
+ Workspace dependency '{dep}' exists in {[...(depWorkspaces ?? [])].join(', ')} but not in '{workspace}'.
496
+ Each workspace needs its own dependency.
497
+ </Tooltip>
498
+ <Badge color="yellow" small>
499
+ <TriangleAlert class="h-2.5 w-2.5" />
500
+ {dep} (not in {workspace})
501
+ </Badge>
461
502
  {:else}
462
503
  <Tooltip small>
463
- Workspace dependency '{dep}' not found. Create it in workspace settings to enable shared
464
- runners.
504
+ Workspace dependency '{dep}' not found in any workspace. Create it in workspace settings to
505
+ enable shared runners.
465
506
  </Tooltip>
466
507
  <Badge color="yellow" small>
467
508
  <TriangleAlert class="h-2.5 w-2.5" />
@@ -470,10 +511,15 @@ let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(t
470
511
  {/if}
471
512
  {/snippet}
472
513
 
473
- {#snippet tagRow(tag: string, info: SelectedTagInfo | undefined)}
514
+ {#snippet tagRow(tag: string, info: SelectedTagInfo | undefined, standalone: boolean)}
515
+ {@const hasChevron = info?.type === 'flow' && info.runners && info.runners.length > 0}
474
516
  <div>
475
- <div class="flex items-center">
476
- {#if info?.type === 'flow' && info.runners && info.runners.length > 0}
517
+ <div
518
+ class="flex items-center {standalone
519
+ ? (hasChevron ? 'pr-3' : 'px-3') + ' py-1.5 bg-surface-secondary'
520
+ : ''}"
521
+ >
522
+ {#if hasChevron}
477
523
  <button
478
524
  class="p-2 hover:bg-surface-hover transition-colors"
479
525
  onclick={(e) => {
@@ -487,10 +533,10 @@ let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(t
487
533
  <ChevronRight class="h-3 w-3 text-tertiary" />
488
534
  {/if}
489
535
  </button>
490
- {:else}
536
+ {:else if !standalone}
491
537
  <div class="w-7"></div>
492
538
  {/if}
493
- <div class="flex-1 flex items-center gap-2 px-2 py-1.5 min-w-0">
539
+ <div class="flex-1 flex items-center gap-2 {standalone ? '' : 'px-2 py-1.5'} min-w-0">
494
540
  {#if info}
495
541
  {#if info.type === 'flow'}
496
542
  <BarsStaggered size={14} class="flex-shrink-0 text-secondary" />
@@ -503,10 +549,10 @@ let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(t
503
549
  {#if !tagRunnerGroup.has(tag)}
504
550
  {#if info.workspaceDeps}
505
551
  {#each info.workspaceDeps as dep}
506
- {@render depBadge(dep)}
552
+ {@render depBadge(dep, info?.workspace)}
507
553
  {/each}
508
554
  {/if}
509
- {#if info.type === 'flow' && info.runners}
555
+ {#if info.type === 'flow' && info.runners && info.runners.length > 0}
510
556
  <Badge color="indigo" small>
511
557
  {info.runners.length} runner{info.runners.length !== 1 ? 's' : ''}
512
558
  </Badge>
@@ -554,19 +600,19 @@ let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(t
554
600
  <div class="flex flex-col gap-2">
555
601
  <div class="border rounded-md bg-surface divide-y">
556
602
  <!-- Shared runner groups -->
557
- {#each runnerGroups as group (`${group.depName}:${group.language}`)}
603
+ {#each runnerGroups as group (`${group.workspace}:${group.depName}:${group.language}`)}
558
604
  <div>
559
605
  <div class="flex items-center gap-2 px-3 py-1.5 bg-surface-secondary border-b">
560
606
  <Layers size={12} class="flex-shrink-0 text-secondary" />
561
607
  <span class="text-xs font-medium text-emphasis">Shared runner</span>
562
608
  <span class="flex-1"></span>
563
- {@render depBadge(group.depName)}
609
+ {@render depBadge(group.depName, group.workspace)}
564
610
  <Badge color="gray" small>{group.language}</Badge>
565
611
  </div>
566
612
  <div class="divide-y">
567
613
  {#each group.tags as tag (tag)}
568
614
  {@const info = selectedTagsInfo.get(tag)}
569
- {@render tagRow(tag, info)}
615
+ {@render tagRow(tag, info, false)}
570
616
  {/each}
571
617
  </div>
572
618
  </div>
@@ -575,199 +621,168 @@ let standaloneTags = $derived(selectedTags.filter((tag) => !tagRunnerGroup.has(t
575
621
  <!-- Standalone scripts/flows -->
576
622
  {#each standaloneTags as tag (tag)}
577
623
  {@const info = selectedTagsInfo.get(tag)}
578
- <div class="flex items-center gap-2 px-3 py-1.5 bg-surface-secondary min-w-0">
579
- {#if info?.type === 'flow'}
580
- <BarsStaggered size={12} class="flex-shrink-0 text-secondary" />
581
- {:else}
582
- <CodeXml size={12} class="flex-shrink-0 text-secondary" />
583
- {/if}
584
- <span class="text-xs truncate min-w-0">{info?.path ?? tag}</span>
585
- <span class="text-xs text-tertiary flex-shrink-0">({info?.workspace ?? ''})</span>
586
- <span class="flex-1"></span>
587
- {#if info?.workspaceDeps}
588
- {#each info.workspaceDeps as dep}
589
- {@render depBadge(dep)}
590
- {/each}
591
- {/if}
592
- {#if info?.type === 'flow' && info.runners}
593
- <Badge color="indigo" small>
594
- {info.runners.length} runner{info.runners.length !== 1 ? 's' : ''}
595
- </Badge>
596
- {:else if info?.language}
597
- <Badge color="gray" small>{info.language}</Badge>
598
- {/if}
599
- {#if !disabled}
600
- <button
601
- class="hover:text-red-500 transition-colors flex-shrink-0"
602
- onclick={(e) => {
603
- e.stopPropagation()
604
- removeTag(tag)
605
- }}
606
- >
607
- <X class="h-3 w-3" />
608
- </button>
609
- {/if}
610
- </div>
624
+ {@render tagRow(tag, info, true)}
611
625
  {/each}
612
626
  </div>
613
627
  </div>
614
628
  {/if}
615
629
 
616
- <!-- Collapsible selector section -->
617
- <div class="border rounded-md">
618
- <button
619
- class="w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-surface-hover transition-colors"
620
- onclick={() => (selectorExpanded = !selectorExpanded)}
621
- {disabled}
622
- >
630
+ <!-- Collapsible selector section (hidden for read-only users) -->
631
+ {#if !disabled}
632
+ <div class="border rounded-md">
633
+ <button
634
+ class="w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-surface-hover transition-colors"
635
+ onclick={() => (selectorExpanded = !selectorExpanded)}
636
+ >
637
+ {#if selectorExpanded}
638
+ <ChevronDown class="h-4 w-4 text-secondary" />
639
+ {:else}
640
+ <ChevronRight class="h-4 w-4 text-secondary" />
641
+ {/if}
642
+ <span class="text-sm">
643
+ {selectedTags.length > 0 ? 'Add more scripts/flows' : 'Select scripts/flows'}
644
+ </span>
645
+ </button>
646
+
623
647
  {#if selectorExpanded}
624
- <ChevronDown class="h-4 w-4 text-secondary" />
625
- {:else}
626
- <ChevronRight class="h-4 w-4 text-secondary" />
627
- {/if}
628
- <span class="text-sm">
629
- {selectedTags.length > 0 ? 'Add more scripts/flows' : 'Select scripts/flows'}
630
- </span>
631
- </button>
648
+ <div class="border-t px-3 py-3 flex flex-col gap-3">
649
+ <!-- Workspace selector -->
650
+ <div class="flex flex-col gap-1">
651
+ <span class="text-xs text-secondary">Workspace</span>
652
+ <Select
653
+ bind:value={selectedWorkspace}
654
+ items={workspaces.map((w) => ({ value: w.id, label: `${w.name} (${w.id})` }))}
655
+ placeholder="Select workspace..."
656
+ disabled={disabled || workspacesLoading}
657
+ />
658
+ </div>
632
659
 
633
- {#if selectorExpanded}
634
- <div class="border-t px-3 py-3 flex flex-col gap-3">
635
- <!-- Workspace selector -->
636
- <div class="flex flex-col gap-1">
637
- <span class="text-xs text-secondary">Workspace</span>
638
- <Select
639
- bind:value={selectedWorkspace}
640
- items={workspaces.map((w) => ({ value: w.id, label: `${w.name} (${w.id})` }))}
641
- placeholder="Select workspace..."
642
- disabled={disabled || workspacesLoading}
643
- />
644
- </div>
660
+ <!-- Scripts/flows list -->
661
+ {#if selectedWorkspace}
662
+ <div class="flex flex-col gap-2">
663
+ <div class="flex items-center justify-between">
664
+ <span class="text-xs text-secondary"
665
+ >Scripts/flows with dedicated worker enabled</span
666
+ >
667
+ {#if !loading && runnables.length > 0}
668
+ <div class="flex gap-1">
669
+ <Button size="xs2" color="light" on:click={selectAll} {disabled}>All</Button>
670
+ <Button size="xs2" color="light" on:click={deselectAll} {disabled}>None</Button>
671
+ <Button
672
+ size="xs2"
673
+ color="light"
674
+ iconOnly
675
+ startIcon={{ icon: RefreshCcw }}
676
+ on:click={() => selectedWorkspace && loadRunnables(selectedWorkspace)}
677
+ {disabled}
678
+ />
679
+ </div>
680
+ {/if}
681
+ </div>
645
682
 
646
- <!-- Scripts/flows list -->
647
- {#if selectedWorkspace}
648
- <div class="flex flex-col gap-2">
649
- <div class="flex items-center justify-between">
650
- <span class="text-xs text-secondary">Scripts/flows with dedicated worker enabled</span
651
- >
652
- {#if !loading && runnables.length > 0}
653
- <div class="flex gap-1">
654
- <Button size="xs2" color="light" on:click={selectAll} {disabled}>All</Button>
655
- <Button size="xs2" color="light" on:click={deselectAll} {disabled}>None</Button>
656
- <Button
657
- size="xs2"
658
- color="light"
659
- iconOnly
660
- startIcon={{ icon: RefreshCcw }}
661
- on:click={() => selectedWorkspace && loadRunnables(selectedWorkspace)}
662
- {disabled}
663
- />
683
+ {#if loading}
684
+ <div class="flex items-center justify-center py-4">
685
+ <RefreshCcw class="animate-spin h-4 w-4 text-secondary" />
686
+ <span class="ml-2 text-xs text-secondary">Loading...</span>
664
687
  </div>
665
- {/if}
666
- </div>
667
-
668
- {#if loading}
669
- <div class="flex items-center justify-center py-4">
670
- <RefreshCcw class="animate-spin h-4 w-4 text-secondary" />
671
- <span class="ml-2 text-xs text-secondary">Loading...</span>
672
- </div>
673
- {:else if runnables.length === 0}
674
- <div class="text-xs text-tertiary py-3 text-center">
675
- No scripts or flows with dedicated worker enabled found.
676
- </div>
677
- {:else}
678
- <div class="border rounded-md divide-y max-h-64 overflow-y-auto bg-surface">
679
- {#each runnables as runnable (runnable.tag)}
680
- <div>
681
- <div class="flex items-center">
682
- {#if runnable.type === 'flow' && runnable.runners && runnable.runners.length > 0}
688
+ {:else if runnables.length === 0}
689
+ <div class="text-xs text-tertiary py-3 text-center">
690
+ No scripts or flows with dedicated worker enabled found.
691
+ </div>
692
+ {:else}
693
+ <div class="border rounded-md divide-y max-h-64 overflow-y-auto bg-surface">
694
+ {#each runnables as runnable (runnable.tag)}
695
+ <div>
696
+ <div class="flex items-center">
697
+ {#if runnable.type === 'flow' && runnable.runners && runnable.runners.length > 0}
698
+ <button
699
+ class="p-2 hover:bg-surface-hover transition-colors"
700
+ onclick={(e) => {
701
+ e.stopPropagation()
702
+ toggleExpanded(runnable)
703
+ }}
704
+ {disabled}
705
+ >
706
+ {#if runnable.expanded}
707
+ <ChevronDown class="h-3 w-3 text-tertiary" />
708
+ {:else}
709
+ <ChevronRight class="h-3 w-3 text-tertiary" />
710
+ {/if}
711
+ </button>
712
+ {/if}
683
713
  <button
684
- class="p-2 hover:bg-surface-hover transition-colors"
714
+ class="flex-1 flex items-center gap-2 px-2 py-1.5 hover:bg-surface-hover transition-colors text-left min-w-0"
685
715
  onclick={(e) => {
686
716
  e.stopPropagation()
687
- toggleExpanded(runnable)
717
+ if (!disabled) toggleRunnable(runnable)
688
718
  }}
689
719
  {disabled}
690
720
  >
691
- {#if runnable.expanded}
692
- <ChevronDown class="h-3 w-3 text-tertiary" />
693
- {:else}
694
- <ChevronRight class="h-3 w-3 text-tertiary" />
721
+ <div
722
+ class="w-4 h-4 border rounded flex items-center justify-center flex-shrink-0"
723
+ class:bg-blue-500={runnable.selected}
724
+ class:border-blue-500={runnable.selected}
725
+ >
726
+ {#if runnable.selected}
727
+ <Check class="h-3 w-3 text-white" />
728
+ {/if}
729
+ </div>
730
+ <span class="flex-1 text-xs truncate min-w-0">{runnable.displayName}</span
731
+ >
732
+ {#if runnable.type === 'flow' && runnable.runners}
733
+ <span class="text-xs text-tertiary flex-shrink-0">
734
+ {runnable.runners.length}
735
+ </span>
736
+ {/if}
737
+ {#if runnable.workspaceDeps}
738
+ {#each runnable.workspaceDeps as dep}
739
+ {@render depBadge(dep, selectedWorkspace)}
740
+ {/each}
695
741
  {/if}
742
+ <Badge color={runnable.type === 'flow' ? 'indigo' : 'gray'} small>
743
+ {runnable.type === 'flow' ? 'flow' : runnable.language}
744
+ </Badge>
696
745
  </button>
697
- {:else}
698
- <div class="w-7"></div>
699
- {/if}
700
- <button
701
- class="flex-1 flex items-center gap-2 px-2 py-1.5 hover:bg-surface-hover transition-colors text-left min-w-0"
702
- onclick={(e) => {
703
- e.stopPropagation()
704
- if (!disabled) toggleRunnable(runnable)
705
- }}
706
- {disabled}
707
- >
708
- <div
709
- class="w-4 h-4 border rounded flex items-center justify-center flex-shrink-0"
710
- class:bg-blue-500={runnable.selected}
711
- class:border-blue-500={runnable.selected}
712
- >
713
- {#if runnable.selected}
714
- <Check class="h-3 w-3 text-white" />
746
+ </div>
747
+
748
+ {#if runnable.type === 'flow' && runnable.expanded && runnable.runners}
749
+ <div class="bg-surface-secondary border-t">
750
+ {#if runnable.runners.length === 0}
751
+ <div class="px-9 py-1.5 text-xs text-tertiary italic">
752
+ No eligible steps (python3/bun/bunnative/deno)
753
+ </div>
754
+ {:else}
755
+ {#each runnable.runners as runner (runner.stepId)}
756
+ <div
757
+ class="flex items-center gap-2 px-9 py-1 text-xs border-t first:border-t-0 min-w-0"
758
+ >
759
+ <span class="font-mono text-tertiary flex-shrink-0"
760
+ >{runner.stepId}</span
761
+ >
762
+ {#if runner.stepSummary}
763
+ <span class="text-secondary truncate flex-1 min-w-0">
764
+ {runner.stepSummary}
765
+ </span>
766
+ {/if}
767
+ <Badge color="gray" small>
768
+ {runner.isInline ? runner.language : runner.scriptPath}
769
+ </Badge>
770
+ </div>
771
+ {/each}
715
772
  {/if}
716
773
  </div>
717
- <span class="flex-1 text-xs truncate min-w-0">{runnable.displayName}</span>
718
- {#if runnable.type === 'flow' && runnable.runners}
719
- <span class="text-xs text-tertiary flex-shrink-0">
720
- {runnable.runners.length}
721
- </span>
722
- {/if}
723
- {#if runnable.workspaceDeps}
724
- {#each runnable.workspaceDeps as dep}
725
- {@render depBadge(dep)}
726
- {/each}
727
- {/if}
728
- <Badge color={runnable.type === 'flow' ? 'indigo' : 'gray'} small>
729
- {runnable.type === 'flow' ? 'flow' : runnable.language}
730
- </Badge>
731
- </button>
774
+ {/if}
732
775
  </div>
733
-
734
- {#if runnable.type === 'flow' && runnable.expanded && runnable.runners}
735
- <div class="bg-surface-secondary border-t">
736
- {#if runnable.runners.length === 0}
737
- <div class="px-9 py-1.5 text-xs text-tertiary italic">
738
- No eligible steps (python3/bun/bunnative/deno)
739
- </div>
740
- {:else}
741
- {#each runnable.runners as runner (runner.stepId)}
742
- <div
743
- class="flex items-center gap-2 px-9 py-1 text-xs border-t first:border-t-0 min-w-0"
744
- >
745
- <span class="font-mono text-tertiary flex-shrink-0"
746
- >{runner.stepId}</span
747
- >
748
- {#if runner.stepSummary}
749
- <span class="text-secondary truncate flex-1 min-w-0">
750
- {runner.stepSummary}
751
- </span>
752
- {/if}
753
- <Badge color="gray" small>
754
- {runner.isInline ? runner.language : runner.scriptPath}
755
- </Badge>
756
- </div>
757
- {/each}
758
- {/if}
759
- </div>
760
- {/if}
761
- </div>
762
- {/each}
763
- </div>
764
- <div class="text-xs text-tertiary">
765
- {selectedCount} selected
766
- </div>
767
- {/if}
768
- </div>
769
- {/if}
770
- </div>
771
- {/if}
772
- </div>
776
+ {/each}
777
+ </div>
778
+ <div class="text-xs text-tertiary">
779
+ {selectedCount} selected
780
+ </div>
781
+ {/if}
782
+ </div>
783
+ {/if}
784
+ </div>
785
+ {/if}
786
+ </div>
787
+ {/if}
773
788
  </div>