@nvent-addon/app 0.4.5 → 0.5.1

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 (153) hide show
  1. package/dist/module.d.mts +19 -1
  2. package/dist/module.mjs +20 -8
  3. package/dist/runtime/app/components/{nhealth/component-router.d.vue.ts → ComponentRouter.d.vue.ts} +1 -5
  4. package/dist/runtime/app/components/{nhealth/component-router.vue.d.ts → ComponentRouter.vue.d.ts} +1 -5
  5. package/dist/runtime/app/components/{nhealth/component-shell.d.vue.ts → ComponentShell.d.vue.ts} +4 -9
  6. package/dist/runtime/app/components/ComponentShell.vue +87 -0
  7. package/dist/runtime/app/components/{nhealth/component-shell.vue.d.ts → ComponentShell.vue.d.ts} +4 -9
  8. package/dist/runtime/app/components/ConfirmDialog.d.vue.ts +1 -6
  9. package/dist/runtime/app/components/ConfirmDialog.vue.d.ts +1 -6
  10. package/dist/runtime/app/components/ListItem.d.vue.ts +3 -6
  11. package/dist/runtime/app/components/ListItem.vue.d.ts +3 -6
  12. package/dist/runtime/app/components/LiveIndicator.d.vue.ts +7 -0
  13. package/dist/runtime/app/components/LiveIndicator.vue +30 -0
  14. package/dist/runtime/app/components/LiveIndicator.vue.d.ts +7 -0
  15. package/dist/runtime/app/components/{QueueConfigDetails.d.vue.ts → QueueConfiguration.d.vue.ts} +1 -10
  16. package/dist/runtime/app/components/QueueConfiguration.vue +387 -0
  17. package/dist/runtime/app/components/{QueueConfigDetails.vue.d.ts → QueueConfiguration.vue.d.ts} +1 -10
  18. package/dist/runtime/app/components/StatCard.d.vue.ts +9 -0
  19. package/dist/runtime/app/components/StatCard.vue +57 -0
  20. package/dist/runtime/app/components/StatCard.vue.d.ts +9 -0
  21. package/dist/runtime/app/components/TimelineList.vue +67 -0
  22. package/dist/runtime/app/components/flow/AwaitNode.d.vue.ts +18 -0
  23. package/dist/runtime/app/components/flow/AwaitNode.vue +91 -0
  24. package/dist/runtime/app/components/flow/AwaitNode.vue.d.ts +18 -0
  25. package/dist/runtime/app/components/{FlowDiagram.d.vue.ts → flow/Diagram.d.vue.ts} +12 -1
  26. package/dist/runtime/app/components/{FlowDiagram.vue → flow/Diagram.vue} +92 -11
  27. package/dist/runtime/app/components/{FlowDiagram.vue.d.ts → flow/Diagram.vue.d.ts} +12 -1
  28. package/dist/runtime/app/components/{FlowRunOverview.d.vue.ts → flow/RunOverview.d.vue.ts} +3 -0
  29. package/dist/runtime/app/components/{FlowRunOverview.vue → flow/RunOverview.vue} +94 -8
  30. package/dist/runtime/app/components/{FlowRunOverview.vue.d.ts → flow/RunOverview.vue.d.ts} +3 -0
  31. package/dist/runtime/app/components/{FlowRunStatusBadge.d.vue.ts → flow/RunStatusBadge.d.vue.ts} +2 -8
  32. package/dist/runtime/app/components/{FlowRunStatusBadge.vue → flow/RunStatusBadge.vue} +8 -1
  33. package/dist/runtime/app/components/{FlowRunStatusBadge.vue.d.ts → flow/RunStatusBadge.vue.d.ts} +2 -8
  34. package/dist/runtime/app/components/{FlowRunTimeline.vue → flow/RunTimeline.vue} +1 -1
  35. package/dist/runtime/app/components/{FlowStepSelector.d.vue.ts → flow/StepSelector.d.vue.ts} +1 -0
  36. package/dist/runtime/app/components/flow/StepSelector.vue +553 -0
  37. package/dist/runtime/app/components/{FlowStepSelector.vue.d.ts → flow/StepSelector.vue.d.ts} +1 -0
  38. package/dist/runtime/app/components/trigger/BasicInfoCard.d.vue.ts +33 -0
  39. package/dist/runtime/app/components/trigger/BasicInfoCard.vue +168 -0
  40. package/dist/runtime/app/components/trigger/BasicInfoCard.vue.d.ts +33 -0
  41. package/dist/runtime/app/components/{FlowSchedulesList.d.vue.ts → trigger/DangerZone.d.vue.ts} +4 -6
  42. package/dist/runtime/app/components/trigger/DangerZone.vue +46 -0
  43. package/dist/runtime/app/components/{FlowSchedulesList.vue.d.ts → trigger/DangerZone.vue.d.ts} +4 -6
  44. package/dist/runtime/app/components/trigger/EditHeader.d.vue.ts +15 -0
  45. package/dist/runtime/app/components/trigger/EditHeader.vue +55 -0
  46. package/dist/runtime/app/components/trigger/EditHeader.vue.d.ts +15 -0
  47. package/dist/runtime/app/components/trigger/EventConfig.d.vue.ts +24 -0
  48. package/dist/runtime/app/components/trigger/EventConfig.vue +68 -0
  49. package/dist/runtime/app/components/trigger/EventConfig.vue.d.ts +24 -0
  50. package/dist/runtime/app/components/trigger/FlowSubscriptions.d.vue.ts +14 -0
  51. package/dist/runtime/app/components/trigger/FlowSubscriptions.vue +128 -0
  52. package/dist/runtime/app/components/trigger/FlowSubscriptions.vue.d.ts +14 -0
  53. package/dist/runtime/app/components/trigger/ScheduleConfig.d.vue.ts +27 -0
  54. package/dist/runtime/app/components/trigger/ScheduleConfig.vue +375 -0
  55. package/dist/runtime/app/components/trigger/ScheduleConfig.vue.d.ts +27 -0
  56. package/dist/runtime/app/components/{FlowScheduleDialog.d.vue.ts → trigger/StatusConfig.d.vue.ts} +6 -6
  57. package/dist/runtime/app/components/trigger/StatusConfig.vue +78 -0
  58. package/dist/runtime/app/components/{FlowScheduleDialog.vue.d.ts → trigger/StatusConfig.vue.d.ts} +6 -6
  59. package/dist/runtime/app/components/trigger/WebhookConfig.d.vue.ts +30 -0
  60. package/dist/runtime/app/components/trigger/WebhookConfig.vue +97 -0
  61. package/dist/runtime/app/components/trigger/WebhookConfig.vue.d.ts +30 -0
  62. package/dist/runtime/app/composables/useAnalyzedFlows.d.ts +5 -0
  63. package/dist/runtime/app/composables/useAnalyzedFlows.js +15 -1
  64. package/dist/runtime/app/composables/useComponentRouter.d.ts +8 -0
  65. package/dist/runtime/app/composables/useComponentRouter.js +10 -2
  66. package/dist/runtime/app/composables/useFlowRunsInfinite.d.ts +1 -1
  67. package/dist/runtime/app/composables/useFlowState.js +65 -0
  68. package/dist/runtime/app/composables/useFlowWebSocket.d.ts +11 -2
  69. package/dist/runtime/app/composables/useFlowWebSocket.js +181 -65
  70. package/dist/runtime/app/composables/useQueueJobs.d.ts +12 -1
  71. package/dist/runtime/app/composables/useQueueJobs.js +13 -7
  72. package/dist/runtime/app/composables/useTrigger.d.ts +137 -0
  73. package/dist/runtime/app/composables/useTrigger.js +116 -0
  74. package/dist/runtime/app/composables/useTriggerWebSocket.d.ts +35 -0
  75. package/dist/runtime/app/composables/useTriggerWebSocket.js +333 -0
  76. package/dist/runtime/app/pages/dashboard.d.vue.ts +3 -0
  77. package/dist/runtime/app/pages/dashboard.vue +738 -0
  78. package/dist/runtime/app/pages/dashboard.vue.d.ts +3 -0
  79. package/dist/runtime/app/pages/flows/[name].d.vue.ts +3 -0
  80. package/dist/runtime/app/pages/flows/[name].vue +680 -0
  81. package/dist/runtime/app/pages/flows/[name].vue.d.ts +3 -0
  82. package/dist/runtime/app/pages/flows/index.vue +321 -620
  83. package/dist/runtime/app/pages/index.vue +39 -9
  84. package/dist/runtime/app/pages/queues/index.vue +202 -194
  85. package/dist/runtime/app/pages/queues/jobs.vue +534 -207
  86. package/dist/runtime/app/pages/settings/scheduler.d.vue.ts +3 -0
  87. package/dist/runtime/app/pages/settings/scheduler.vue +310 -0
  88. package/dist/runtime/app/pages/settings/scheduler.vue.d.ts +3 -0
  89. package/dist/runtime/app/pages/triggers/[name]/edit.d.vue.ts +3 -0
  90. package/dist/runtime/app/pages/triggers/[name]/edit.vue +429 -0
  91. package/dist/runtime/app/pages/triggers/[name]/edit.vue.d.ts +3 -0
  92. package/dist/runtime/app/pages/triggers/[name].d.vue.ts +3 -0
  93. package/dist/runtime/app/pages/triggers/[name].vue +898 -0
  94. package/dist/runtime/app/pages/triggers/[name].vue.d.ts +3 -0
  95. package/dist/runtime/app/pages/triggers/index.d.vue.ts +3 -0
  96. package/dist/runtime/app/pages/triggers/index.vue +528 -0
  97. package/dist/runtime/app/pages/triggers/index.vue.d.ts +3 -0
  98. package/dist/runtime/app/pages/triggers/new.d.vue.ts +3 -0
  99. package/dist/runtime/app/pages/triggers/new.vue +610 -0
  100. package/dist/runtime/app/pages/triggers/new.vue.d.ts +3 -0
  101. package/dist/runtime/server/api/_flows/[name]/clear-history.delete.d.ts +10 -0
  102. package/dist/runtime/server/api/_flows/[name]/clear-history.delete.js +49 -0
  103. package/dist/runtime/server/api/_flows/[name]/runs/[runId]/cancel.post.d.ts +2 -0
  104. package/dist/runtime/server/api/_flows/[name]/runs/[runId]/cancel.post.js +21 -0
  105. package/dist/runtime/server/api/_flows/[name]/runs.get.d.ts +17 -0
  106. package/dist/runtime/server/api/_flows/[name]/runs.get.js +64 -0
  107. package/dist/runtime/server/api/_flows/[name]/start.post.d.ts +2 -0
  108. package/dist/runtime/server/api/_flows/[name]/start.post.js +9 -0
  109. package/dist/runtime/server/api/_flows/index.get.d.ts +7 -0
  110. package/dist/runtime/server/api/_flows/index.get.js +5 -0
  111. package/dist/runtime/server/api/_flows/recent-runs.get.d.ts +15 -0
  112. package/dist/runtime/server/api/_flows/recent-runs.get.js +67 -0
  113. package/dist/runtime/server/api/_flows/ws.d.ts +80 -0
  114. package/dist/runtime/server/api/_flows/ws.js +309 -0
  115. package/dist/runtime/server/api/_queues/[name]/job/[id].get.d.ts +2 -0
  116. package/dist/runtime/server/api/_queues/[name]/job/[id].get.js +14 -0
  117. package/dist/runtime/server/api/_queues/[name]/job/index.get.d.ts +2 -0
  118. package/dist/runtime/server/api/_queues/[name]/job/index.get.js +39 -0
  119. package/dist/runtime/server/api/_queues/index.get.d.ts +2 -0
  120. package/dist/runtime/server/api/_queues/index.get.js +106 -0
  121. package/dist/runtime/server/api/_queues/ws.d.ts +48 -0
  122. package/dist/runtime/server/api/_queues/ws.js +215 -0
  123. package/dist/runtime/server/api/_scheduler/jobs.get.d.ts +19 -0
  124. package/dist/runtime/server/api/_scheduler/jobs.get.js +36 -0
  125. package/dist/runtime/server/api/_triggers/[name]/events.get.d.ts +6 -0
  126. package/dist/runtime/server/api/_triggers/[name]/events.get.js +43 -0
  127. package/dist/runtime/server/api/_triggers/[name]/index.get.d.ts +6 -0
  128. package/dist/runtime/server/api/_triggers/[name]/index.get.js +76 -0
  129. package/dist/runtime/server/api/_triggers/[name].delete.d.ts +7 -0
  130. package/dist/runtime/server/api/_triggers/[name].delete.js +37 -0
  131. package/dist/runtime/server/api/_triggers/[name].patch.d.ts +7 -0
  132. package/dist/runtime/server/api/_triggers/[name].patch.js +117 -0
  133. package/dist/runtime/server/api/_triggers/index.get.d.ts +6 -0
  134. package/dist/runtime/server/api/_triggers/index.get.js +44 -0
  135. package/dist/runtime/server/api/_triggers/index.post.d.ts +7 -0
  136. package/dist/runtime/server/api/_triggers/index.post.js +124 -0
  137. package/dist/runtime/server/api/_triggers/stats.get.d.ts +6 -0
  138. package/dist/runtime/server/api/_triggers/stats.get.js +41 -0
  139. package/dist/runtime/server/api/_triggers/ws.d.ts +74 -0
  140. package/dist/runtime/server/api/_triggers/ws.js +315 -0
  141. package/dist/runtime/server/tsconfig.json +7 -0
  142. package/package.json +8 -8
  143. package/dist/runtime/app/components/FlowScheduleDialog.vue +0 -226
  144. package/dist/runtime/app/components/FlowSchedulesList.vue +0 -99
  145. package/dist/runtime/app/components/FlowStepSelector.vue +0 -238
  146. package/dist/runtime/app/components/QueueConfigDetails.vue +0 -412
  147. package/dist/runtime/app/components/nhealth/component-shell.vue +0 -89
  148. /package/dist/runtime/app/components/{nhealth/component-router.vue → ComponentRouter.vue} +0 -0
  149. /package/dist/runtime/app/components/{FlowNodeCard.d.vue.ts → flow/NodeCard.d.vue.ts} +0 -0
  150. /package/dist/runtime/app/components/{FlowNodeCard.vue → flow/NodeCard.vue} +0 -0
  151. /package/dist/runtime/app/components/{FlowNodeCard.vue.d.ts → flow/NodeCard.vue.d.ts} +0 -0
  152. /package/dist/runtime/app/components/{FlowRunTimeline.d.vue.ts → flow/RunTimeline.d.vue.ts} +0 -0
  153. /package/dist/runtime/app/components/{FlowRunTimeline.vue.d.ts → flow/RunTimeline.vue.d.ts} +0 -0
@@ -0,0 +1,387 @@
1
+ <template>
2
+ <div class="space-y-6">
3
+ <!-- Queue Configuration -->
4
+ <div>
5
+ <h3 class="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-4">
6
+ Queue Configuration
7
+ </h3>
8
+ <div
9
+ v-if="!queueConfig || !hasQueueConfig"
10
+ class="text-sm text-gray-400 text-center py-8 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-800"
11
+ >
12
+ <UIcon
13
+ name="i-lucide-info"
14
+ class="w-8 h-8 mx-auto mb-2 opacity-50"
15
+ />
16
+ <p>No queue configuration defined</p>
17
+ <p class="text-xs mt-1">
18
+ Using default values
19
+ </p>
20
+ </div>
21
+ <div
22
+ v-else
23
+ class="space-y-4"
24
+ >
25
+ <!-- Queue Name -->
26
+ <div class="space-y-2">
27
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
28
+ <UIcon
29
+ name="i-lucide-tag"
30
+ class="w-4 h-4"
31
+ />
32
+ <span>Queue Name</span>
33
+ </div>
34
+ <div class="pl-6">
35
+ <div class="text-sm font-mono text-gray-900 dark:text-gray-100 bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
36
+ {{ queueConfig.name || queueName }}
37
+ </div>
38
+ </div>
39
+ </div>
40
+
41
+ <!-- Prefix -->
42
+ <div
43
+ v-if="queueConfig.prefix"
44
+ class="space-y-2"
45
+ >
46
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
47
+ <UIcon
48
+ name="i-lucide-folder"
49
+ class="w-4 h-4"
50
+ />
51
+ <span>Prefix</span>
52
+ </div>
53
+ <div class="pl-6">
54
+ <div class="text-sm font-mono text-gray-900 dark:text-gray-100 bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
55
+ {{ queueConfig.prefix }}
56
+ </div>
57
+ <p class="text-xs text-gray-500 mt-1">
58
+ Redis key prefix for this queue
59
+ </p>
60
+ </div>
61
+ </div>
62
+
63
+ <!-- Rate Limiter -->
64
+ <div
65
+ v-if="queueConfig.limiter"
66
+ class="space-y-2"
67
+ >
68
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
69
+ <UIcon
70
+ name="i-lucide-gauge"
71
+ class="w-4 h-4"
72
+ />
73
+ <span>Rate Limiter</span>
74
+ </div>
75
+ <div class="pl-6 space-y-3">
76
+ <div class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
77
+ <div class="flex items-center justify-between text-sm">
78
+ <span class="text-gray-600 dark:text-gray-400">Max Jobs</span>
79
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.limiter.max }}</span>
80
+ </div>
81
+ </div>
82
+ <div class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
83
+ <div class="flex items-center justify-between text-sm">
84
+ <span class="text-gray-600 dark:text-gray-400">Duration</span>
85
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.limiter.duration }}ms</span>
86
+ </div>
87
+ </div>
88
+ <div
89
+ v-if="queueConfig.limiter.groupKey"
90
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
91
+ >
92
+ <div class="flex items-center justify-between text-sm">
93
+ <span class="text-gray-600 dark:text-gray-400">Group Key</span>
94
+ <span class="font-medium font-mono text-gray-900 dark:text-gray-100">{{ queueConfig.limiter.groupKey }}</span>
95
+ </div>
96
+ </div>
97
+ <p class="text-xs text-gray-500">
98
+ Limits processing to {{ queueConfig.limiter.max }} jobs per {{ queueConfig.limiter.duration }}ms
99
+ </p>
100
+ </div>
101
+ </div>
102
+
103
+ <!-- Default Job Options -->
104
+ <div
105
+ v-if="queueConfig.defaultJobOptions && hasJobOptions"
106
+ class="space-y-2"
107
+ >
108
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
109
+ <UIcon
110
+ name="i-lucide-settings"
111
+ class="w-4 h-4"
112
+ />
113
+ <span>Default Job Options</span>
114
+ </div>
115
+ <div class="pl-6 space-y-3">
116
+ <div
117
+ v-if="typeof queueConfig.defaultJobOptions.attempts === 'number'"
118
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
119
+ >
120
+ <div class="flex items-center justify-between text-sm">
121
+ <span class="text-gray-600 dark:text-gray-400">Max Attempts</span>
122
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.attempts }}</span>
123
+ </div>
124
+ </div>
125
+ <div
126
+ v-if="queueConfig.defaultJobOptions.backoff"
127
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
128
+ >
129
+ <div class="text-sm space-y-1">
130
+ <div class="flex items-center justify-between">
131
+ <span class="text-gray-600 dark:text-gray-400">Backoff Type</span>
132
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.backoff.type || "exponential" }}</span>
133
+ </div>
134
+ <div
135
+ v-if="queueConfig.defaultJobOptions.backoff.delay"
136
+ class="flex items-center justify-between"
137
+ >
138
+ <span class="text-gray-600 dark:text-gray-400">Delay</span>
139
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.backoff.delay }}ms</span>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ <div
144
+ v-if="typeof queueConfig.defaultJobOptions.priority === 'number'"
145
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
146
+ >
147
+ <div class="flex items-center justify-between text-sm">
148
+ <span class="text-gray-600 dark:text-gray-400">Priority</span>
149
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.priority }}</span>
150
+ </div>
151
+ </div>
152
+ <div
153
+ v-if="typeof queueConfig.defaultJobOptions.timeout === 'number'"
154
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
155
+ >
156
+ <div class="flex items-center justify-between text-sm">
157
+ <span class="text-gray-600 dark:text-gray-400">Timeout</span>
158
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.timeout }}ms</span>
159
+ </div>
160
+ </div>
161
+ <div
162
+ v-if="typeof queueConfig.defaultJobOptions.removeOnComplete === 'boolean' || typeof queueConfig.defaultJobOptions.removeOnComplete === 'number'"
163
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
164
+ >
165
+ <div class="flex items-center justify-between text-sm">
166
+ <span class="text-gray-600 dark:text-gray-400">Remove on Complete</span>
167
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.removeOnComplete }}</span>
168
+ </div>
169
+ </div>
170
+ <div
171
+ v-if="typeof queueConfig.defaultJobOptions.removeOnFail === 'boolean' || typeof queueConfig.defaultJobOptions.removeOnFail === 'number'"
172
+ class="bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800"
173
+ >
174
+ <div class="flex items-center justify-between text-sm">
175
+ <span class="text-gray-600 dark:text-gray-400">Remove on Fail</span>
176
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ queueConfig.defaultJobOptions.removeOnFail }}</span>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ </div>
183
+
184
+ <!-- Worker Configuration -->
185
+ <div>
186
+ <h3 class="text-sm font-semibold text-gray-900 dark:text-gray-100 mb-4">
187
+ Worker Configuration
188
+ </h3>
189
+ <div
190
+ v-if="!workerConfig || !hasWorkerConfig"
191
+ class="text-sm text-gray-400 text-center py-8 bg-gray-50 dark:bg-gray-900/50 rounded-lg border border-gray-200 dark:border-gray-800"
192
+ >
193
+ <UIcon
194
+ name="i-lucide-info"
195
+ class="w-8 h-8 mx-auto mb-2 opacity-50"
196
+ />
197
+ <p>No worker configuration defined</p>
198
+ <p class="text-xs mt-1">
199
+ Using default values
200
+ </p>
201
+ </div>
202
+ <div
203
+ v-else
204
+ class="space-y-4"
205
+ >
206
+ <!-- Concurrency -->
207
+ <div
208
+ v-if="typeof workerConfig.concurrency === 'number'"
209
+ class="space-y-2"
210
+ >
211
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
212
+ <UIcon
213
+ name="i-lucide-layers"
214
+ class="w-4 h-4"
215
+ />
216
+ <span>Concurrency</span>
217
+ </div>
218
+ <div class="pl-6">
219
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
220
+ <div class="flex items-center justify-between">
221
+ <span class="text-gray-600 dark:text-gray-400">Parallel Jobs</span>
222
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ workerConfig.concurrency }}</span>
223
+ </div>
224
+ </div>
225
+ <p class="text-xs text-gray-500 mt-1">
226
+ Maximum number of jobs processed simultaneously
227
+ </p>
228
+ </div>
229
+ </div>
230
+
231
+ <!-- Lock Duration -->
232
+ <div
233
+ v-if="typeof workerConfig.lockDurationMs === 'number'"
234
+ class="space-y-2"
235
+ >
236
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
237
+ <UIcon
238
+ name="i-lucide-lock"
239
+ class="w-4 h-4"
240
+ />
241
+ <span>Lock Duration</span>
242
+ </div>
243
+ <div class="pl-6">
244
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
245
+ <div class="flex items-center justify-between">
246
+ <span class="text-gray-600 dark:text-gray-400">Duration</span>
247
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ workerConfig.lockDurationMs }}ms</span>
248
+ </div>
249
+ </div>
250
+ <p class="text-xs text-gray-500 mt-1">
251
+ Time before job lock expires and becomes available for retry
252
+ </p>
253
+ </div>
254
+ </div>
255
+
256
+ <!-- Max Stalled Count -->
257
+ <div
258
+ v-if="typeof workerConfig.maxStalledCount === 'number'"
259
+ class="space-y-2"
260
+ >
261
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
262
+ <UIcon
263
+ name="i-lucide-alert-triangle"
264
+ class="w-4 h-4"
265
+ />
266
+ <span>Max Stalled Count</span>
267
+ </div>
268
+ <div class="pl-6">
269
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
270
+ <div class="flex items-center justify-between">
271
+ <span class="text-gray-600 dark:text-gray-400">Max Retries</span>
272
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ workerConfig.maxStalledCount }}</span>
273
+ </div>
274
+ </div>
275
+ <p class="text-xs text-gray-500 mt-1">
276
+ Maximum times a job can stall before being marked as failed
277
+ </p>
278
+ </div>
279
+ </div>
280
+
281
+ <!-- Drain Delay -->
282
+ <div
283
+ v-if="typeof workerConfig.drainDelayMs === 'number'"
284
+ class="space-y-2"
285
+ >
286
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
287
+ <UIcon
288
+ name="i-lucide-timer"
289
+ class="w-4 h-4"
290
+ />
291
+ <span>Drain Delay</span>
292
+ </div>
293
+ <div class="pl-6">
294
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
295
+ <div class="flex items-center justify-between">
296
+ <span class="text-gray-600 dark:text-gray-400">Delay</span>
297
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ workerConfig.drainDelayMs }}ms</span>
298
+ </div>
299
+ </div>
300
+ <p class="text-xs text-gray-500 mt-1">
301
+ Time to wait for jobs to complete during graceful shutdown
302
+ </p>
303
+ </div>
304
+ </div>
305
+
306
+ <!-- Polling Interval -->
307
+ <div
308
+ v-if="typeof workerConfig.pollingIntervalMs === 'number'"
309
+ class="space-y-2"
310
+ >
311
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
312
+ <UIcon
313
+ name="i-lucide-refresh-cw"
314
+ class="w-4 h-4"
315
+ />
316
+ <span>Polling Interval</span>
317
+ </div>
318
+ <div class="pl-6">
319
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
320
+ <div class="flex items-center justify-between">
321
+ <span class="text-gray-600 dark:text-gray-400">Interval</span>
322
+ <span class="font-medium text-gray-900 dark:text-gray-100">{{ workerConfig.pollingIntervalMs }}ms</span>
323
+ </div>
324
+ </div>
325
+ <p class="text-xs text-gray-500 mt-1">
326
+ Frequency to check for new jobs (PGBoss compatibility)
327
+ </p>
328
+ </div>
329
+ </div>
330
+
331
+ <!-- Autorun -->
332
+ <div
333
+ v-if="typeof workerConfig.autorun === 'boolean'"
334
+ class="space-y-2"
335
+ >
336
+ <div class="flex items-center gap-2 text-sm font-medium text-gray-700 dark:text-gray-300">
337
+ <UIcon
338
+ name="i-lucide-play-circle"
339
+ class="w-4 h-4"
340
+ />
341
+ <span>Autorun</span>
342
+ </div>
343
+ <div class="pl-6">
344
+ <div class="text-sm bg-gray-50 dark:bg-gray-900 px-3 py-2 rounded border border-gray-200 dark:border-gray-800">
345
+ <div class="flex items-center justify-between">
346
+ <span class="text-gray-600 dark:text-gray-400">Enabled</span>
347
+ <UBadge
348
+ :label="workerConfig.autorun ? 'Yes' : 'No'"
349
+ :color="workerConfig.autorun ? 'success' : 'neutral'"
350
+ variant="subtle"
351
+ size="xs"
352
+ />
353
+ </div>
354
+ </div>
355
+ <p class="text-xs text-gray-500 mt-1">
356
+ Whether worker starts automatically on initialization
357
+ </p>
358
+ </div>
359
+ </div>
360
+ </div>
361
+ </div>
362
+ </div>
363
+ </template>
364
+
365
+ <script setup>
366
+ import { computed } from "#imports";
367
+ import { UIcon, UBadge } from "#components";
368
+ const props = defineProps({
369
+ queueName: { type: String, required: true },
370
+ queueConfig: { type: Object, required: false },
371
+ workerConfig: { type: Object, required: false }
372
+ });
373
+ const hasQueueConfig = computed(() => {
374
+ if (!props.queueConfig) return false;
375
+ const { name, ...rest } = props.queueConfig;
376
+ return Object.values(rest).some((v) => v !== void 0 && v !== null);
377
+ });
378
+ const hasJobOptions = computed(() => {
379
+ const opts = props.queueConfig?.defaultJobOptions;
380
+ if (!opts) return false;
381
+ return Object.values(opts).some((v) => v !== void 0 && v !== null);
382
+ });
383
+ const hasWorkerConfig = computed(() => {
384
+ if (!props.workerConfig) return false;
385
+ return Object.values(props.workerConfig).some((v) => v !== void 0 && v !== null);
386
+ });
387
+ </script>
@@ -31,15 +31,6 @@ interface Props {
31
31
  queueConfig?: QueueConfig;
32
32
  workerConfig?: WorkerConfig;
33
33
  }
34
- type __VLS_Props = Props;
35
- type __VLS_ModelProps = {
36
- 'open'?: boolean;
37
- };
38
- type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
39
- declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
40
- "update:open": (value: boolean) => any;
41
- }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
42
- "onUpdate:open"?: ((value: boolean) => any) | undefined;
43
- }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
34
+ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
44
35
  declare const _default: typeof __VLS_export;
45
36
  export default _default;
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ icon: string;
3
+ count: number | string;
4
+ label: string;
5
+ variant?: 'gray' | 'blue' | 'amber' | 'emerald' | 'red' | 'purple';
6
+ }
7
+ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div class="bg-white dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 p-4">
3
+ <div class="flex items-center gap-3">
4
+ <div
5
+ class="flex-shrink-0 w-10 h-10 rounded-lg flex items-center justify-center"
6
+ :class="iconBackgroundClass"
7
+ >
8
+ <UIcon
9
+ :name="icon"
10
+ class="w-5 h-5"
11
+ :class="iconColorClass"
12
+ />
13
+ </div>
14
+ <div class="flex-1 min-w-0">
15
+ <p class="text-2xl font-bold text-gray-900 dark:text-gray-100">
16
+ {{ count }}
17
+ </p>
18
+ <p class="text-xs text-gray-500 dark:text-gray-400">
19
+ {{ label }}
20
+ </p>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script setup>
27
+ import { computed } from "#imports";
28
+ import { UIcon } from "#components";
29
+ const props = defineProps({
30
+ icon: { type: String, required: true },
31
+ count: { type: [Number, String], required: true },
32
+ label: { type: String, required: true },
33
+ variant: { type: String, required: false, default: "gray" }
34
+ });
35
+ const iconBackgroundClass = computed(() => {
36
+ const variants = {
37
+ gray: "bg-gray-50 dark:bg-gray-800",
38
+ blue: "bg-blue-50 dark:bg-blue-950/30",
39
+ amber: "bg-amber-50 dark:bg-amber-950/30",
40
+ emerald: "bg-emerald-50 dark:bg-emerald-950/30",
41
+ red: "bg-red-50 dark:bg-red-950/30",
42
+ purple: "bg-purple-50 dark:bg-purple-950/30"
43
+ };
44
+ return variants[props.variant];
45
+ });
46
+ const iconColorClass = computed(() => {
47
+ const variants = {
48
+ gray: "text-gray-600 dark:text-gray-400",
49
+ blue: "text-blue-600 dark:text-blue-400",
50
+ amber: "text-amber-600 dark:text-amber-400",
51
+ emerald: "text-emerald-600 dark:text-emerald-400",
52
+ red: "text-red-600 dark:text-red-400",
53
+ purple: "text-purple-600 dark:text-purple-400"
54
+ };
55
+ return variants[props.variant];
56
+ });
57
+ </script>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ icon: string;
3
+ count: number | string;
4
+ label: string;
5
+ variant?: 'gray' | 'blue' | 'amber' | 'emerald' | 'red' | 'purple';
6
+ }
7
+ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
+ declare const _default: typeof __VLS_export;
9
+ export default _default;
@@ -62,6 +62,67 @@
62
62
  </div>
63
63
  </div>
64
64
 
65
+ <!-- Special rendering for await events -->
66
+ <div
67
+ v-else-if="isAwaitEvent(item.eventType)"
68
+ class="text-sm mt-2"
69
+ >
70
+ <div
71
+ v-if="item.eventData"
72
+ class="space-y-1"
73
+ >
74
+ <div
75
+ v-if="item.eventData.awaitType"
76
+ class="flex items-start gap-2"
77
+ >
78
+ <span class="text-xs text-gray-500 dark:text-gray-400 font-medium min-w-[60px] flex-shrink-0">Type:</span>
79
+ <UBadge
80
+ color="blue"
81
+ variant="subtle"
82
+ size="xs"
83
+ class="capitalize"
84
+ >
85
+ {{ item.eventData.awaitType }}
86
+ </UBadge>
87
+ </div>
88
+ <div
89
+ v-if="item.eventData.position"
90
+ class="flex items-start gap-2"
91
+ >
92
+ <span class="text-xs text-gray-500 dark:text-gray-400 font-medium min-w-[60px] flex-shrink-0">Position:</span>
93
+ <UBadge
94
+ color="neutral"
95
+ variant="subtle"
96
+ size="xs"
97
+ class="capitalize"
98
+ >
99
+ {{ item.eventData.position }}
100
+ </UBadge>
101
+ </div>
102
+ <div
103
+ v-if="item.eventData.triggerName"
104
+ class="flex items-start gap-2"
105
+ >
106
+ <span class="text-xs text-gray-500 dark:text-gray-400 font-medium min-w-[60px] flex-shrink-0">Trigger:</span>
107
+ <span class="text-xs text-gray-700 dark:text-gray-300 font-mono">{{ item.eventData.triggerName }}</span>
108
+ </div>
109
+ <div
110
+ v-if="item.eventData.triggerData"
111
+ class="flex items-start gap-2"
112
+ >
113
+ <span class="text-xs text-gray-500 dark:text-gray-400 font-medium min-w-[60px] flex-shrink-0">Data:</span>
114
+ <pre class="text-xs bg-gray-50 dark:bg-gray-800 rounded px-2 py-1 overflow-y-auto max-h-20 text-gray-700 dark:text-gray-300 font-mono flex-1 min-w-0 whitespace-pre-wrap break-words">{{ pretty(item.eventData.triggerData) }}</pre>
115
+ </div>
116
+ <div
117
+ v-if="item.eventData.duration"
118
+ class="flex items-start gap-2"
119
+ >
120
+ <span class="text-xs text-gray-500 dark:text-gray-400 font-medium min-w-[60px] flex-shrink-0">Duration:</span>
121
+ <span class="text-xs text-gray-700 dark:text-gray-300">{{ item.eventData.duration }}ms</span>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
65
126
  <!-- Special rendering for flow events -->
66
127
  <div
67
128
  v-else-if="isFlowEvent(item.eventType)"
@@ -162,6 +223,9 @@ function eventIcon(type) {
162
223
  if (type === "step.failed") return "i-lucide-alert-circle";
163
224
  if (type === "step.retry") return "i-lucide-rotate-cw";
164
225
  if (type === "step.timeout") return "i-lucide-clock";
226
+ if (type === "await.registered") return "i-lucide-timer";
227
+ if (type === "await.resolved") return "i-lucide-check-circle";
228
+ if (type === "await.timeout") return "i-lucide-clock-alert";
165
229
  if (type === "log") return "i-lucide-file-text";
166
230
  if (type === "emit") return "i-lucide-zap";
167
231
  return "i-lucide-circle-dot";
@@ -208,4 +272,7 @@ function levelColor(level) {
208
272
  function isFlowEvent(type) {
209
273
  return type?.startsWith("flow.") || type?.startsWith("step.");
210
274
  }
275
+ function isAwaitEvent(type) {
276
+ return type?.startsWith("await.");
277
+ }
211
278
  </script>
@@ -0,0 +1,18 @@
1
+ interface AwaitConfig {
2
+ type?: 'time' | 'event' | 'webhook';
3
+ delay?: number;
4
+ event?: string;
5
+ method?: string;
6
+ timeout?: number;
7
+ }
8
+ type __VLS_Props = {
9
+ data: {
10
+ label: string;
11
+ awaitType?: 'time' | 'event' | 'webhook';
12
+ awaitConfig?: AwaitConfig;
13
+ status?: 'idle' | 'waiting' | 'resolved' | 'timeout';
14
+ };
15
+ };
16
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;