windmill-components 1.537.1 → 1.542.4

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 (273) hide show
  1. package/package/components/AIProviderPicker.svelte +181 -0
  2. package/package/components/AIProviderPicker.svelte.d.ts +15 -0
  3. package/package/components/ArgInfo.svelte +2 -2
  4. package/package/components/ArgInput.svelte +35 -9
  5. package/package/components/ArgInput.svelte.d.ts +3 -3
  6. package/package/components/AssignableTagsInner.svelte +89 -3
  7. package/package/components/ConcurrentJobsChart.svelte +36 -48
  8. package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
  9. package/package/components/CustomPopover.svelte.d.ts +1 -1
  10. package/package/components/DropdownSelect.svelte +26 -0
  11. package/package/components/DropdownSelect.svelte.d.ts +11 -0
  12. package/package/components/DropdownV2Inner.svelte +1 -1
  13. package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
  14. package/package/components/DynamicInput.svelte.d.ts +11 -0
  15. package/package/components/EditableSchemaForm.svelte +119 -95
  16. package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
  17. package/package/components/Editor.svelte +86 -93
  18. package/package/components/Editor.svelte.d.ts +4 -3
  19. package/package/components/EditorBar.svelte +2 -5
  20. package/package/components/FlowBuilder.svelte +3 -3
  21. package/package/components/FlowLogRow.svelte +64 -0
  22. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  23. package/package/components/FlowLogViewer.svelte +406 -373
  24. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  25. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  26. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  27. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  28. package/package/components/FlowStatusViewerInner.svelte +34 -3
  29. package/package/components/FolderPicker.svelte +1 -1
  30. package/package/components/InputTransformForm.svelte +20 -10
  31. package/package/components/JobArgs.svelte +1 -1
  32. package/package/components/JobLoader.svelte.d.ts +1 -1
  33. package/package/components/JobStatus.svelte +2 -0
  34. package/package/components/LogSnippetViewer.svelte +3 -3
  35. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  36. package/package/components/LogViewer.svelte +87 -71
  37. package/package/components/LogViewer.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +7 -1
  39. package/package/components/Path.svelte.d.ts +1 -1
  40. package/package/components/PrefixedInput.svelte +120 -0
  41. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  42. package/package/components/QueuePosition.svelte +81 -0
  43. package/package/components/QueuePosition.svelte.d.ts +8 -0
  44. package/package/components/ResourceNarrowing.svelte +13 -0
  45. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  46. package/package/components/ResourceTypePicker.svelte +49 -74
  47. package/package/components/RunChart.svelte +74 -89
  48. package/package/components/RunChart.svelte.d.ts +10 -22
  49. package/package/components/S3FilePicker.svelte +1 -1
  50. package/package/components/SchemaForm.svelte.d.ts +2 -2
  51. package/package/components/ScriptBuilder.svelte +2 -1
  52. package/package/components/ScriptEditor.svelte +4 -3
  53. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  54. package/package/components/ServiceLogsInner.svelte +1 -1
  55. package/package/components/ShareModal.svelte.d.ts +1 -1
  56. package/package/components/SimpleEditor.svelte +4 -67
  57. package/package/components/StringTypeNarrowing.svelte +5 -10
  58. package/package/components/TemplateEditor.svelte +2 -16
  59. package/package/components/TimeAgo.svelte +1 -1
  60. package/package/components/TimeAgo.svelte.d.ts +1 -0
  61. package/package/components/Toggle.svelte +2 -1
  62. package/package/components/Toggle.svelte.d.ts +2 -1
  63. package/package/components/WorkerRepl.svelte +1 -1
  64. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  65. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  66. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  68. package/package/components/apps/components/display/table/utils.js +36 -5
  69. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  70. package/package/components/apps/editor/AppEditor.svelte +4 -3
  71. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  72. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  73. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  74. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  75. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  78. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
  79. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  80. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  81. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  82. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  83. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  84. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  85. package/package/components/common/OnChange.svelte.d.ts +11 -4
  86. package/package/components/common/badge/Badge.svelte +9 -2
  87. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  88. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  89. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  90. package/package/components/common/drawer/Disposable.svelte +9 -11
  91. package/package/components/common/drawer/Drawer.svelte +3 -4
  92. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  93. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  94. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  95. package/package/components/common/tabs/TabContent.svelte +2 -7
  96. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  97. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  98. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  99. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  100. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  101. package/package/components/copilot/MetadataGen.svelte +1 -1
  102. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
  103. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  104. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  105. package/package/components/copilot/chat/anthropic.js +208 -0
  106. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  107. package/package/components/copilot/chat/api/apiTools.js +10 -7
  108. package/package/components/copilot/chat/api/core.d.ts +1 -1
  109. package/package/components/copilot/chat/api/core.js +7 -2
  110. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  111. package/package/components/copilot/chat/ask/core.js +7 -2
  112. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  113. package/package/components/copilot/chat/flow/core.js +14 -4
  114. package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
  115. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  116. package/package/components/copilot/chat/navigator/core.js +7 -2
  117. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  118. package/package/components/copilot/chat/script/core.d.ts +5 -4
  119. package/package/components/copilot/chat/script/core.js +131 -19
  120. package/package/components/copilot/chat/shared.d.ts +7 -7
  121. package/package/components/copilot/lib.d.ts +29 -8
  122. package/package/components/copilot/lib.js +199 -24
  123. package/package/components/flows/content/FlowInput.svelte +5 -5
  124. package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
  125. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  126. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  127. package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
  128. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  129. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  130. package/package/components/flows/content/FlowRetries.svelte +108 -3
  131. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  132. package/package/components/flows/flowInfers.js +8 -35
  133. package/package/components/flows/flowStore.d.ts +45 -1
  134. package/package/components/flows/flowStore.js +1 -1
  135. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  136. package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
  137. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  138. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  139. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  140. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  141. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  142. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  143. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  144. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  145. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  146. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  147. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  148. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  149. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  150. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  151. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  152. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  153. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  154. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  155. package/package/components/home/ItemsList.svelte +17 -13
  156. package/package/components/home/TreeView.svelte +21 -27
  157. package/package/components/home/TreeView.svelte.d.ts +2 -29
  158. package/package/components/home/TreeViewRoot.svelte +11 -23
  159. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  160. package/package/components/icons/GitIcon.svelte +10 -2
  161. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  162. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  163. package/package/components/meltComponents/Popover.svelte +23 -3
  164. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  165. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  166. package/package/components/monacoLanguagesOptions.js +109 -0
  167. package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
  168. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  169. package/package/components/propertyPicker/utils.js +14 -7
  170. package/package/components/runs/JobRunsPreview.svelte +212 -177
  171. package/package/components/runs/JobsLoader.svelte +2 -2
  172. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  173. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  174. package/package/components/runs/RunBadges.svelte +100 -0
  175. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  176. package/package/components/runs/RunLabels.svelte +86 -0
  177. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  178. package/package/components/runs/RunOption.svelte +20 -0
  179. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  180. package/package/components/runs/RunRow.svelte +239 -151
  181. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  182. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  183. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  184. package/package/components/runs/RunsFilter.svelte +369 -243
  185. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  186. package/package/components/runs/RunsQueue.svelte +96 -25
  187. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  188. package/package/components/runs/RunsTable.svelte +62 -71
  189. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  190. package/package/components/runs/runs-grid.css +95 -0
  191. package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
  192. package/package/components/schema/FlowPropertyEditor.svelte +197 -206
  193. package/package/components/schema/PropertyEditor.svelte +33 -35
  194. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
  195. package/package/components/search/GlobalSearchModal.svelte +8 -1
  196. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  197. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  198. package/package/components/select/Select.svelte +2 -1
  199. package/package/components/select/Select.svelte.d.ts +25 -13
  200. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  201. package/package/components/settings/TokenDisplay.svelte +1 -1
  202. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  203. package/package/components/sidebar/SidebarContent.svelte +48 -2
  204. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  205. package/package/components/toast.js +6 -3
  206. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  207. package/package/components/triggers/CaptureWrapper.svelte +19 -3
  208. package/package/components/triggers/TriggerLabel.svelte +8 -0
  209. package/package/components/triggers/TriggerTokens.svelte +1 -1
  210. package/package/components/triggers/TriggersEditor.svelte +9 -5
  211. package/package/components/triggers/TriggersTable.svelte +2 -2
  212. package/package/components/triggers/TriggersWrapper.svelte +16 -5
  213. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  214. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  215. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  216. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  217. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  218. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  219. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  220. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  221. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  222. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  223. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  224. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  225. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  226. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  227. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  228. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  229. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  230. package/package/components/triggers/email/utils.d.ts +4 -0
  231. package/package/components/triggers/email/utils.js +52 -0
  232. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  233. package/package/components/triggers/http/utils.js +1 -1
  234. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  235. package/package/components/triggers/triggers.svelte.js +24 -2
  236. package/package/components/triggers/utils.js +19 -5
  237. package/package/components/triggers.d.ts +1 -1
  238. package/package/components/triggers.js +2 -0
  239. package/package/components/wizards/AgGridWizard.svelte +85 -80
  240. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  241. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  242. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  243. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  244. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  245. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  246. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  247. package/package/gen/core/OpenAPI.js +1 -1
  248. package/package/gen/schemas.gen.d.ts +142 -3
  249. package/package/gen/schemas.gen.js +144 -3
  250. package/package/gen/services.gen.d.ts +129 -1
  251. package/package/gen/services.gen.js +267 -1
  252. package/package/gen/types.gen.d.ts +434 -8
  253. package/package/hubPaths.json +4 -2
  254. package/package/infer.js +1 -1
  255. package/package/keyboardChain.d.ts +5 -0
  256. package/package/keyboardChain.js +40 -0
  257. package/package/services/JobManager.js +2 -2
  258. package/package/stores.d.ts +3 -1
  259. package/package/stores.js +8 -5
  260. package/package/utils/workspaceHierarchy.d.ts +27 -0
  261. package/package/utils/workspaceHierarchy.js +101 -0
  262. package/package/utils.d.ts +6 -3
  263. package/package/utils.js +30 -15
  264. package/package/workspace_settings.js +2 -3
  265. package/package.json +9 -11
  266. package/package/components/DynSelect.svelte.d.ts +0 -11
  267. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  268. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  269. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  270. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  271. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  272. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  273. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -15,7 +15,7 @@ import WorkflowTimeline from '../WorkflowTimeline.svelte';
15
15
  import Popover from '../Popover.svelte';
16
16
  import { isFlowPreview, isScriptPreview, truncateRev } from '../../utils';
17
17
  import { createEventDispatcher, setContext, untrack } from 'svelte';
18
- import { ListFilter } from 'lucide-svelte';
18
+ import { ListFilter, LoaderCircle } from 'lucide-svelte';
19
19
  import FlowAssetsHandler, { initFlowGraphAssetsCtx } from '../flows/FlowAssetsHandler.svelte';
20
20
  import JobAssetsViewer from '../assets/JobAssetsViewer.svelte';
21
21
  let { id, blankLink = false, workspace } = $props();
@@ -55,199 +55,234 @@ $effect(() => {
55
55
  job?.id && lastJobId !== job.id && untrack(() => job && getConcurrencyKey(job));
56
56
  });
57
57
  let jobLoader = $state(undefined);
58
+ // Set all tabs content to the same height to prevent layout jumps
59
+ let tabsHeight = $state({
60
+ codeHeight: 0,
61
+ logsHeight: 0,
62
+ assetsHeight: 0,
63
+ resultHeight: 0
64
+ });
65
+ let minTabHeight = $derived(Math.max(tabsHeight.codeHeight, tabsHeight.logsHeight, tabsHeight.assetsHeight, tabsHeight.resultHeight));
66
+ let jobIsLoading = $state(false);
58
67
  </script>
59
68
 
60
- <JobLoader workspaceOverride={workspace} bind:job={currentJob} bind:this={jobLoader} />
61
-
62
- <div class="p-4 flex flex-col gap-2 items-start h-full">
63
- {#if job}
64
- <div class="flex gap-2 flex-wrap">
65
- {#if job?.['priority']}
66
- <Badge color="red">
67
- priority: {job?.['priority']}
68
- </Badge>
69
- {/if}
70
- {#if job && 'duration_ms' in job && job.duration_ms != undefined}
71
- <DurationMs
72
- duration_ms={job.duration_ms}
73
- self_wait_time_ms={job?.self_wait_time_ms}
74
- aggregate_wait_time_ms={job?.aggregate_wait_time_ms}
75
- />
76
- {/if}
77
- {#if job?.['mem_peak']}
78
- <Badge large>
79
- Mem: {job?.['mem_peak'] ? `${(job['mem_peak'] / 1024).toPrecision(4)}MB` : 'N/A'}
80
- </Badge>
81
- {/if}
82
- {#if workspace && $workspaceStore != workspace}
83
- <Badge large>
84
- Workspace: {workspace}
85
- </Badge>
86
- {/if}
87
- {#if job.tag}
88
- <Badge large>
89
- Tag: {job.tag}
90
- </Badge>
91
- {/if}
92
- {#if job?.['labels'] && Array.isArray(job?.['labels']) && job?.['labels'].length > 0}
93
- {#each job?.['labels'] as label}
94
- <Badge baseClass="text-2xs">Label: {label}</Badge>
95
- {/each}
96
- {/if}
97
- {#if concurrencyKey}
98
- <Popover notClickable>
99
- {#snippet text()}
100
- This job has concurrency limits enabled with the key:
101
- <Button
102
- class="inline-text"
103
- size="xs2"
104
- color="light"
105
- on:click={() => {
106
- dispatch('filterByConcurrencyKey', concurrencyKey)
107
- }}
108
- >
109
- {concurrencyKey}
110
- <ListFilter class="inline-block" size={10} />
111
- </Button>
112
- {/snippet}
113
- <Badge large>Concurrency: {truncateRev(concurrencyKey, 20)}</Badge>
114
- </Popover>
115
- {/if}
116
- {#if job?.worker}
117
- <Popover notClickable>
118
- {#snippet text()}
119
- This job was run on worker:
120
- <Button
121
- class="inline-text"
122
- size="xs2"
123
- color="light"
124
- on:click={() => {
125
- dispatch('filterByWorker', job?.worker)
126
- }}
127
- >
128
- {job?.worker}
129
- <ListFilter class="inline-block" size={10} />
130
- </Button>
131
- {/snippet}
132
- <Badge large>Worker: {truncateRev(job.worker, 20)}</Badge>
133
- </Popover>
134
- {/if}
135
- </div>
136
- <a
137
- href="{base}/run/{job?.id}?workspace={job?.workspace_id}"
138
- class="flex flex-row gap-1 items-center"
139
- target={blankLink ? '_blank' : undefined}
140
- >
141
- <span class="font-semibold text-sm leading-6">ID:</span>
142
- <span class="text-sm">{job?.id ?? ''}</span>
143
- </a>
144
-
145
- <span class="font-semibold text-xs leading-6">Arguments</span>
146
-
147
- <div class="w-full">
148
- <JobArgs
149
- id={job?.id}
150
- workspace={job?.workspace_id ?? $workspaceStore ?? 'no_w'}
151
- args={job?.args}
152
- />
153
- </div>
154
-
155
- {#if job?.type === 'CompletedJob'}
156
- <span class="font-semibold text-xs leading-6">Results</span>
157
- {/if}
69
+ <JobLoader
70
+ workspaceOverride={workspace}
71
+ bind:job={currentJob}
72
+ bind:isLoading={jobIsLoading}
73
+ bind:this={jobLoader}
74
+ />
158
75
 
159
- {#if job && 'scheduled_for' in job && !job.running && job.scheduled_for && forLater(job.scheduled_for)}
160
- <div class="text-sm font-semibold text-tertiary mb-1">
161
- <div>Job is scheduled for</div>
162
- <div>{new Date(job?.['scheduled_for']).toLocaleString()}</div>
76
+ <div class="h-full overflow-y-auto">
77
+ <div class="flex flex-col gap-2 items-start p-4 pb-8 min-h-full">
78
+ {#if job}
79
+ <div class="flex gap-2 flex-wrap">
80
+ {#if job?.['priority']}
81
+ <Badge color="red">
82
+ priority: {job?.['priority']}
83
+ </Badge>
84
+ {/if}
85
+ {#if job && 'duration_ms' in job && job.duration_ms != undefined}
86
+ <DurationMs
87
+ duration_ms={job.duration_ms}
88
+ self_wait_time_ms={job?.self_wait_time_ms}
89
+ aggregate_wait_time_ms={job?.aggregate_wait_time_ms}
90
+ />
91
+ {/if}
92
+ {#if job?.['mem_peak']}
93
+ <Badge large>
94
+ Mem: {job?.['mem_peak'] ? `${(job['mem_peak'] / 1024).toPrecision(4)}MB` : 'N/A'}
95
+ </Badge>
96
+ {/if}
97
+ {#if workspace && $workspaceStore != workspace}
98
+ <Badge large>
99
+ Workspace: {workspace}
100
+ </Badge>
101
+ {/if}
102
+ {#if job.tag}
103
+ <Badge large>
104
+ Tag: {job.tag}
105
+ </Badge>
106
+ {/if}
107
+ {#if job?.['labels'] && Array.isArray(job?.['labels']) && job?.['labels'].length > 0}
108
+ {#each job?.['labels'] as label}
109
+ <Badge baseClass="text-2xs">Label: {label}</Badge>
110
+ {/each}
111
+ {/if}
112
+ {#if concurrencyKey}
113
+ <Popover notClickable>
114
+ {#snippet text()}
115
+ This job has concurrency limits enabled with the key:
116
+ <Button
117
+ class="inline-text"
118
+ size="xs2"
119
+ color="light"
120
+ on:click={() => {
121
+ dispatch('filterByConcurrencyKey', concurrencyKey)
122
+ }}
123
+ >
124
+ {concurrencyKey}
125
+ <ListFilter class="inline-block" size={10} />
126
+ </Button>
127
+ {/snippet}
128
+ <Badge large>Concurrency: {truncateRev(concurrencyKey, 20)}</Badge>
129
+ </Popover>
130
+ {/if}
131
+ {#if job?.worker}
132
+ <Popover notClickable>
133
+ {#snippet text()}
134
+ This job was run on worker:
135
+ <Button
136
+ class="inline-text"
137
+ size="xs2"
138
+ color="light"
139
+ on:click={() => {
140
+ dispatch('filterByWorker', job?.worker)
141
+ }}
142
+ >
143
+ {job?.worker}
144
+ <ListFilter class="inline-block" size={10} />
145
+ </Button>
146
+ {/snippet}
147
+ <Badge large>Worker: {truncateRev(job.worker, 20)}</Badge>
148
+ </Popover>
149
+ {/if}
163
150
  </div>
164
- {/if}
151
+ <a
152
+ href="{base}/run/{job?.id}?workspace={job?.workspace_id}"
153
+ class="flex flex-row gap-1 items-center"
154
+ target={blankLink ? '_blank' : undefined}
155
+ >
156
+ <span class="font-semibold text-sm leading-6">ID:</span>
157
+ <span class="text-sm">{job?.id ?? ''}</span>
158
+ </a>
165
159
 
166
- <div class=" w-full rounded-md min-h-full">
167
- {#if job?.workflow_as_code_status}
168
- <WorkflowTimeline
169
- flow_status={asWorkflowStatus(job.workflow_as_code_status)}
170
- flowDone={job.type == 'CompletedJob'}
160
+ <div class="w-full">
161
+ <JobArgs
162
+ id={job?.id}
163
+ workspace={job?.workspace_id ?? $workspaceStore ?? 'no_w'}
164
+ args={job?.args}
171
165
  />
166
+ </div>
167
+
168
+ {#if job && 'scheduled_for' in job && !job.running && job.scheduled_for && forLater(job.scheduled_for)}
169
+ <div class="text-sm font-semibold text-tertiary mb-1">
170
+ <div>Job is scheduled for</div>
171
+ <div>{new Date(job?.['scheduled_for']).toLocaleString()}</div>
172
+ </div>
172
173
  {/if}
173
174
 
174
- {#if job?.type === 'CompletedJob'}
175
- <Tabs bind:selected={viewTab}>
176
- <Tab size="xs" value="result">Result</Tab>
177
- <Tab size="xs" value="logs">Logs</Tab>
178
- <Tab size="xs" value="assets">Assets</Tab>
179
- {#if isScriptPreview(job?.job_kind)}
180
- <Tab size="xs" value="code">Code</Tab>
181
- {/if}
182
- </Tabs>
175
+ <div class="w-full rounded-md min-h-full">
176
+ {#if job?.workflow_as_code_status}
177
+ <WorkflowTimeline
178
+ flow_status={asWorkflowStatus(job.workflow_as_code_status)}
179
+ flowDone={job.type == 'CompletedJob'}
180
+ />
181
+ {/if}
183
182
 
184
- <Skeleton loading={!job} layout={[[5]]} />
185
- {#if job}
186
- {#if viewTab == 'result' && (job?.job_kind == 'flow' || isFlowPreview(job?.job_kind))}
187
- <div class="flex flex-col gap-2">
188
- <div class="w-full mt-10 mb-20">
189
- <FlowStatusViewer jobId={job.id} workspaceId={job.workspace_id} />
190
- </div>
183
+ {#if job?.type === 'CompletedJob'}
184
+ {#if job?.job_kind == 'flow' || isFlowPreview(job?.job_kind)}
185
+ <div class="w-full mt-8 mb-20">
186
+ <FlowStatusViewer jobId={job.id} workspaceId={job.workspace_id} wideResults
187
+ ></FlowStatusViewer>
191
188
  </div>
192
- {:else if viewTab == 'assets'}
193
- <JobAssetsViewer {job} />
194
189
  {:else}
195
- <div class="flex flex-col border rounded-md p-2 mt-2 h-full overflow-auto">
196
- {#if viewTab == 'logs'}
197
- <div class="w-full">
198
- <LogViewer
199
- jobId={job.id}
200
- duration={job?.['duration_ms']}
201
- mem={job?.['mem_peak']}
202
- isLoading={job?.['running'] == false}
203
- content={job?.logs}
204
- tag={job?.tag}
205
- />
206
- </div>
207
- {:else if viewTab == 'code'}
208
- {#if job && 'raw_code' in job && job.raw_code}
209
- <div class="text-xs">
210
- <HighlightCode lines language={job.language} code={job.raw_code} />
190
+ <Tabs bind:selected={viewTab}>
191
+ <Tab size="xs" value="result">Results</Tab>
192
+ <Tab size="xs" value="logs">Logs</Tab>
193
+ <Tab size="xs" value="assets">Assets</Tab>
194
+ {#if isScriptPreview(job?.job_kind)}
195
+ <Tab size="xs" value="code">Code</Tab>
196
+ {/if}
197
+ </Tabs>
198
+
199
+ <Skeleton loading={!job} layout={[[5]]} />
200
+ {#if job}
201
+ <div class="flex flex-col border rounded-md p-2 mt-2 overflow-auto">
202
+ {#if viewTab == 'logs'}
203
+ <div
204
+ class="w-full"
205
+ bind:clientHeight={tabsHeight.logsHeight}
206
+ style="min-height: {minTabHeight}px"
207
+ >
208
+ <LogViewer
209
+ jobId={job.id}
210
+ duration={job?.['duration_ms']}
211
+ mem={job?.['mem_peak']}
212
+ isLoading={job?.['running'] == false}
213
+ content={job?.logs}
214
+ tag={job?.tag}
215
+ />
216
+ </div>
217
+ {:else if viewTab == 'assets'}
218
+ <div
219
+ class="w-full h-full"
220
+ bind:clientHeight={tabsHeight.assetsHeight}
221
+ style="min-height: {minTabHeight}px"
222
+ >
223
+ <JobAssetsViewer {job} />
224
+ </div>
225
+ {:else if viewTab == 'code'}
226
+ <div
227
+ class="text-xs"
228
+ bind:clientHeight={tabsHeight.codeHeight}
229
+ style="min-height: {minTabHeight}px"
230
+ >
231
+ {#if job && 'raw_code' in job && job.raw_code}
232
+ <div class="text-xs">
233
+ <HighlightCode lines language={job.language} code={job.raw_code} />
234
+ </div>
235
+ {:else if job}
236
+ <span class="text-sm">No code available</span>
237
+ {:else}
238
+ <Skeleton layout={[[5]]} />
239
+ {/if}
240
+ </div>
241
+ {:else if job !== undefined && (job.result_stream || (job.type == 'CompletedJob' && job.result !== undefined))}
242
+ <div
243
+ class="w-full"
244
+ bind:clientHeight={tabsHeight.resultHeight}
245
+ style="min-height: {minTabHeight}px"
246
+ >
247
+ <DisplayResult
248
+ workspaceId={job?.workspace_id}
249
+ jobId={job?.id}
250
+ {result}
251
+ disableExpand
252
+ language={job?.language}
253
+ />
211
254
  </div>
212
255
  {:else if job}
213
- No code is available
214
- {:else}
215
- <Skeleton layout={[[5]]} />
256
+ No output is available yet
216
257
  {/if}
217
- {:else if job !== undefined && (job.result_stream || (job.type == 'CompletedJob' && job.result !== undefined))}
218
- <DisplayResult
219
- workspaceId={job?.workspace_id}
220
- jobId={job?.id}
221
- {result}
222
- disableExpand
223
- language={job?.language}
224
- />
225
- {:else if job}
226
- No output is available yet
227
- {/if}
258
+ </div>
259
+ {/if}
260
+ {/if}
261
+ {:else if job && `running` in job ? job.running : false}
262
+ {#if job?.job_kind == 'flow' || isFlowPreview(job?.job_kind)}
263
+ <div class="flex flex-col gap-2 w-full">
264
+ <FlowProgressBar {job} class="py-4" />
265
+ <FlowStatusViewer jobId={job.id} workspaceId={job.workspace_id} />
228
266
  </div>
267
+ {:else}
268
+ <div class="text-sm font-semibold text-tertiary mb-1"> Job is still running </div>
269
+ <LogViewer
270
+ jobId={job?.id}
271
+ duration={job?.['duration_ms']}
272
+ mem={job?.['mem_peak']}
273
+ content={job?.logs}
274
+ isLoading={job?.['running'] == false}
275
+ tag={job?.tag}
276
+ />
229
277
  {/if}
230
278
  {/if}
231
- {:else if job && `running` in job ? job.running : false}
232
- {#if job?.job_kind == 'flow' || isFlowPreview(job?.job_kind)}
233
- <div class="flex flex-col gap-2 w-full">
234
- <FlowProgressBar {job} class="py-4" />
235
- <FlowStatusViewer jobId={job.id} workspaceId={job.workspace_id} />
236
- </div>
237
- {:else}
238
- <div class="text-sm font-semibold text-tertiary mb-1"> Job is still running </div>
239
- <LogViewer
240
- jobId={job?.id}
241
- duration={job?.['duration_ms']}
242
- mem={job?.['mem_peak']}
243
- content={job?.logs}
244
- isLoading={job?.['running'] == false}
245
- tag={job?.tag}
246
- />
247
- {/if}
248
- {/if}
249
- </div>
250
- {/if}
279
+ </div>
280
+ {:else if jobIsLoading}
281
+ <div class="mx-auto my-auto">
282
+ <LoaderCircle size={20} class="animate-spin" />
283
+ </div>
284
+ {/if}
285
+ </div>
251
286
  </div>
252
287
  <FlowAssetsHandler
253
288
  modules={job?.raw_flow?.modules ?? []}
@@ -103,7 +103,7 @@ async function fetchJobs(startedBefore, startedAfter, startedAfterCompletedJobs,
103
103
  : undefined,
104
104
  allWorkspaces: allWorkspaces ? true : undefined,
105
105
  perPage,
106
- allowWildcards
106
+ allowWildcards: allowWildcards ? true : undefined
107
107
  });
108
108
  }
109
109
  catch (e) {
@@ -276,7 +276,7 @@ async function syncer() {
276
276
  if (isQueuedJob) {
277
277
  if (cursor > 0) {
278
278
  let inc = invCursor == 0 && jobs[invCursor].type == 'CompletedJob' ? 0 : 1;
279
- const date = new Date(jobs[invCursor + inc]?.started_at ?? jobs[invCursor + inc]?.created_at);
279
+ const date = new Date(jobs[invCursor + inc]?.created_at);
280
280
  date.setMilliseconds(date.getMilliseconds() + 1);
281
281
  ts = date.toISOString();
282
282
  }
@@ -43,6 +43,6 @@ interface Props {
43
43
  declare const JobsLoader: import("svelte").Component<Props, {
44
44
  loadExtraJobs: () => Promise<boolean>;
45
45
  loadJobs: (nMinTs: string | undefined, nMaxTs: string | undefined, reset: boolean, shouldGetCount?: boolean) => Promise<void>;
46
- }, "jobs" | "loading" | "minTs" | "maxTs" | "jobKinds" | "queue_count" | "suspended_count" | "completedJobs" | "externalJobs" | "extendedJobs">;
46
+ }, "jobs" | "loading" | "extendedJobs" | "minTs" | "maxTs" | "jobKinds" | "queue_count" | "suspended_count" | "completedJobs" | "externalJobs">;
47
47
  type JobsLoader = ReturnType<typeof JobsLoader>;
48
48
  export default JobsLoader;
@@ -1,15 +1,25 @@
1
1
  <script lang="ts">import { WorkerService } from '../../gen';
2
2
  import { AlertTriangle } from 'lucide-svelte';
3
3
  import Popover from '../Popover.svelte';
4
- import { onDestroy } from 'svelte';
4
+ import { onDestroy, untrack } from 'svelte';
5
5
  let { tag, tagLabel = undefined } = $props();
6
6
  let noWorkerWithTag = $state(false);
7
7
  let timeout = undefined;
8
8
  let visible = true;
9
+ let customTag = $derived.by(() => {
10
+ if (tag.includes('$workspace') || tag.includes('$args'))
11
+ return;
12
+ if (tag.includes('(')) {
13
+ return tag.split('(')[0];
14
+ }
15
+ return tag;
16
+ });
9
17
  async function lookForTag() {
10
18
  try {
11
- const existsWorkerWithTag = await WorkerService.existsWorkersWithTags({ tags: tag });
12
- noWorkerWithTag = !existsWorkerWithTag[tag];
19
+ if (!customTag)
20
+ return;
21
+ const existsWorkerWithTag = await WorkerService.existsWorkersWithTags({ tags: customTag });
22
+ noWorkerWithTag = !existsWorkerWithTag[customTag];
13
23
  if (noWorkerWithTag) {
14
24
  timeout = setTimeout(() => {
15
25
  if (visible) {
@@ -22,7 +32,10 @@ async function lookForTag() {
22
32
  console.error(err);
23
33
  }
24
34
  }
25
- lookForTag();
35
+ $effect(() => {
36
+ customTag;
37
+ untrack(() => lookForTag());
38
+ });
26
39
  onDestroy(() => {
27
40
  visible = false;
28
41
  if (timeout) {
@@ -35,7 +48,7 @@ onDestroy(() => {
35
48
  <Popover notClickable placement="top">
36
49
  <AlertTriangle size={16} class="text-yellow-500" />
37
50
  {#snippet text()}
38
- No worker with {tagLabel ?? 'tag'} <b>{tag}</b> is currently running.
51
+ No worker with {tagLabel ?? 'tag'} <b>{customTag}</b> is currently running.
39
52
  {/snippet}
40
53
  </Popover>
41
54
  {/if}
@@ -0,0 +1,100 @@
1
+ <script lang="ts">import Tooltip from '../meltComponents/Tooltip.svelte';
2
+ import PreprocessedArgsDisplay from './PreprocessedArgsDisplay.svelte';
3
+ import { truncateHash } from '../../utils';
4
+ import { base } from '$app/paths';
5
+ import { truncateRev } from '../../utils';
6
+ import WorkerHostname from '../WorkerHostname.svelte';
7
+ import { workspaceStore } from '../../stores';
8
+ import Badge from '../common/badge/Badge.svelte';
9
+ let { job, displayPersistentScriptDefinition, openPersistentScriptDrawer, concurrencyKey, showScriptHash = true, verySmall = false } = $props();
10
+ </script>
11
+
12
+ {#if job.script_hash && showScriptHash && job.job_kind !== 'aiagent'}
13
+ {#if job.job_kind == 'script'}
14
+ <a href="{base}/scripts/get/{job.script_hash}?workspace={$workspaceStore}"
15
+ ><Badge color="gray" {verySmall}>{truncateHash(job.script_hash)}</Badge></a
16
+ >
17
+ {:else}
18
+ <div>
19
+ <Badge color="gray" {verySmall}>{truncateHash(job.script_hash)}</Badge>
20
+ </div>
21
+ {/if}
22
+ {/if}
23
+ {#if job && 'job_kind' in job}
24
+ <div>
25
+ <Badge color="blue" {verySmall}>{job.job_kind}</Badge>
26
+ </div>
27
+ {/if}
28
+ {#if job && job.flow_status && job.job_kind === 'script'}
29
+ <PreprocessedArgsDisplay preprocessed={job.preprocessed} />
30
+ {/if}
31
+ {#if displayPersistentScriptDefinition}
32
+ <button onclick={() => openPersistentScriptDrawer?.()}>
33
+ <Badge color="red">persistent</Badge>
34
+ </button>
35
+ {/if}
36
+ {#if job && 'priority' in job}
37
+ <div>
38
+ <Badge color="blue" {verySmall}>priority: {job.priority}</Badge>
39
+ </div>
40
+ {/if}
41
+ {#if job.tag}
42
+ <!-- for related places search: ADD_NEW_LANG -->
43
+ <div>
44
+ <Badge color="indigo" {verySmall}>Tag: {job.tag}</Badge>
45
+ </div>
46
+ {/if}
47
+ {#if !job.visible_to_owner}
48
+ <div>
49
+ <Badge color="red" {verySmall}>
50
+ only visible to you
51
+ <Tooltip>
52
+ {#snippet text()}
53
+ The option to hide this run from the owner of this script or flow was activated
54
+ {/snippet}
55
+ </Tooltip>
56
+ </Badge>
57
+ </div>
58
+ {/if}
59
+ {#if job?.['labels'] && Array.isArray(job?.['labels']) && job?.['labels'].length > 0}
60
+ {#each job?.['labels'] as label}
61
+ <div>
62
+ <Badge {verySmall}>Label: {label}</Badge>
63
+ </div>
64
+ {/each}
65
+ {/if}
66
+ {#if concurrencyKey}
67
+ <div>
68
+ <Tooltip notClickable>
69
+ {#snippet text()}
70
+ This job has concurrency limits enabled with the key
71
+ <a
72
+ href={`${base}/runs/?job_kinds=all&graph=ConcurrencyChart&concurrency_key=${concurrencyKey}`}
73
+ >
74
+ {concurrencyKey}
75
+ </a>
76
+ {/snippet}
77
+ <a
78
+ href={`${base}/runs/?job_kinds=all&graph=ConcurrencyChart&concurrency_key=${concurrencyKey}`}
79
+ >
80
+ <Badge {verySmall}>Concurrency: {truncateRev(concurrencyKey, 20)}</Badge></a
81
+ >
82
+ </Tooltip>
83
+ </div>
84
+ {/if}
85
+ {#if job?.worker}
86
+ <div>
87
+ <Tooltip notClickable>
88
+ {#snippet text()}
89
+ worker:
90
+ <a href={`${base}/runs/?job_kinds=all&worker=${job?.worker}`}>
91
+ {job?.worker}
92
+ </a><br />
93
+ <WorkerHostname worker={job?.worker!} minTs={job?.['created_at']} />
94
+ {/snippet}
95
+ <a href={`${base}/runs/?job_kinds=all&worker=${job?.worker}`}>
96
+ <Badge {verySmall}>Worker: {truncateRev(job?.worker, 20)}</Badge></a
97
+ >
98
+ </Tooltip>
99
+ </div>
100
+ {/if}
@@ -0,0 +1,12 @@
1
+ import type { Job } from '../../gen';
2
+ interface Props {
3
+ job: Job;
4
+ displayPersistentScriptDefinition?: boolean;
5
+ openPersistentScriptDrawer?: () => void;
6
+ concurrencyKey?: string;
7
+ showScriptHash?: boolean;
8
+ verySmall?: boolean;
9
+ }
10
+ declare const RunBadges: import("svelte").Component<Props, {}, "">;
11
+ type RunBadges = ReturnType<typeof RunBadges>;
12
+ export default RunBadges;