windmill-components 1.695.0 → 1.698.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 (157) 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/AppConnectInner.svelte +38 -5
  74. package/package/components/CompareWorkspaces.svelte +142 -486
  75. package/package/components/Editor.svelte +5 -4
  76. package/package/components/Editor.svelte.d.ts +1 -0
  77. package/package/components/FilterSearchbar.svelte +3 -1
  78. package/package/components/FilterSearchbar.svelte.d.ts +1 -0
  79. package/package/components/ForkWorkspaceBanner.svelte +16 -0
  80. package/package/components/LogViewer.svelte +51 -60
  81. package/package/components/OnBehalfOfSelector.svelte +10 -7
  82. package/package/components/ResourceEditor.svelte +198 -311
  83. package/package/components/ResourceEditor.svelte.d.ts +3 -3
  84. package/package/components/ResourceEditorDrawer.svelte +17 -6
  85. package/package/components/ResourceForm.svelte +235 -0
  86. package/package/components/ResourceForm.svelte.d.ts +25 -0
  87. package/package/components/RunsPage.svelte +1 -0
  88. package/package/components/ScriptBuilder.svelte +1 -0
  89. package/package/components/ScriptEditor.svelte +10 -3
  90. package/package/components/ScriptEditor.svelte.d.ts +1 -0
  91. package/package/components/TaggedTextInput.svelte +4 -1
  92. package/package/components/TaggedTextInput.svelte.d.ts +2 -0
  93. package/package/components/VariableEditor.svelte +177 -199
  94. package/package/components/VariableEditor.svelte.d.ts +1 -2
  95. package/package/components/VariableForm.svelte +133 -0
  96. package/package/components/VariableForm.svelte.d.ts +22 -0
  97. package/package/components/WsSpecificVersions.svelte +39 -0
  98. package/package/components/WsSpecificVersions.svelte.d.ts +9 -0
  99. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -1
  100. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +1 -1
  101. package/package/components/common/table/AppRow.svelte +2 -1
  102. package/package/components/common/table/AppRow.svelte.d.ts +1 -0
  103. package/package/components/common/table/FlowRow.svelte +2 -1
  104. package/package/components/common/table/FlowRow.svelte.d.ts +1 -0
  105. package/package/components/common/table/RawAppRow.svelte +2 -1
  106. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -0
  107. package/package/components/common/table/Row.svelte +11 -3
  108. package/package/components/common/table/Row.svelte.d.ts +2 -1
  109. package/package/components/common/table/RowIcon.svelte +18 -2
  110. package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
  111. package/package/components/common/table/ScriptRow.svelte +2 -1
  112. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -0
  113. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  114. package/package/components/copilot/autocomplete/Autocompletor.js +5 -2
  115. package/package/components/copilot/autocomplete/request.d.ts +1 -0
  116. package/package/components/copilot/autocomplete/request.js +1 -1
  117. package/package/components/copilot/chat/AIChatManager.svelte.js +14 -4
  118. package/package/components/copilot/chat/AiChatLayout.svelte +2 -0
  119. package/package/components/copilot/chat/ContextManager.svelte.d.ts +1 -0
  120. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte +129 -0
  121. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte.d.ts +4 -0
  122. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +14 -6
  123. package/package/components/copilot/chat/ToolMessageActions.svelte +73 -0
  124. package/package/components/copilot/chat/ToolMessageActions.svelte.d.ts +7 -0
  125. package/package/components/copilot/chat/createdResourceActions.svelte.d.ts +6 -0
  126. package/package/components/copilot/chat/createdResourceActions.svelte.js +29 -0
  127. package/package/components/copilot/chat/script/core.d.ts +6 -2
  128. package/package/components/copilot/chat/script/core.js +13 -7
  129. package/package/components/copilot/chat/script/wacPrompt.test.d.ts +1 -0
  130. package/package/components/copilot/chat/script/wacPrompt.test.js +25 -0
  131. package/package/components/copilot/chat/shared.d.ts +12 -0
  132. package/package/components/copilot/chat/shared.test.js +23 -2
  133. package/package/components/copilot/chat/workspaceTools.js +34 -4
  134. package/package/components/flows/content/ScriptEditorDrawer.svelte +1 -0
  135. package/package/components/graph/wacToFlow.js +1 -1
  136. package/package/components/graph/wacToFlow.test.d.ts +1 -0
  137. package/package/components/graph/wacToFlow.test.js +17 -0
  138. package/package/components/home/Item.svelte +5 -1
  139. package/package/components/home/Item.svelte.d.ts +1 -0
  140. package/package/components/home/ItemsList.svelte +260 -3
  141. package/package/components/instanceSettings/SecretBackendConfig.svelte +457 -88
  142. package/package/components/runs/useJobsLoader.svelte.js +5 -11
  143. package/package/components/sidebar/WorkspaceMenu.svelte +19 -5
  144. package/package/externalDomain.d.ts +2 -0
  145. package/package/externalDomain.js +16 -0
  146. package/package/gen/core/OpenAPI.js +1 -1
  147. package/package/gen/types.gen.d.ts +0 -112
  148. package/package/hubPaths.json +2 -2
  149. package/package/system_prompts/index.d.ts +1 -1
  150. package/package/system_prompts/index.js +22 -3
  151. package/package/system_prompts/prompts.d.ts +2 -2
  152. package/package/system_prompts/prompts.js +6 -3
  153. package/package/utils_deployable.d.ts +162 -638
  154. package/package/utils_deployable.js +75 -143
  155. package/package/utils_workspace_deploy.d.ts +10 -4
  156. package/package/utils_workspace_deploy.js +167 -42
  157. package/package.json +7 -3
@@ -42,7 +42,8 @@ let vaultDisabled = $derived(!$enterpriseLicense);
42
42
  function setBackendType(type) {
43
43
  if (!type)
44
44
  return;
45
- if ((type === 'HashiCorpVault' || type === 'AzureKeyVault' || type === 'AwsSecretsManager') && vaultDisabled)
45
+ if ((type === 'HashiCorpVault' || type === 'AzureKeyVault' || type === 'AwsSecretsManager') &&
46
+ vaultDisabled)
46
47
  return;
47
48
  if (type === 'Database') {
48
49
  $values['secret_backend'] = { type: 'Database' };
@@ -80,13 +81,23 @@ function setBackendType(type) {
80
81
  }
81
82
  }
82
83
  function setAuthMethod(method) {
83
- if (!method || !$values['secret_backend'] || $values['secret_backend'].type !== 'HashiCorpVault')
84
+ if (!method ||
85
+ !$values['secret_backend'] ||
86
+ $values['secret_backend'].type !== 'HashiCorpVault')
84
87
  return;
85
88
  if (method === 'token') {
86
- $values['secret_backend'] = { ...$values['secret_backend'], jwt_role: null, token: $values['secret_backend'].token ?? '' };
89
+ $values['secret_backend'] = {
90
+ ...$values['secret_backend'],
91
+ jwt_role: null,
92
+ token: $values['secret_backend'].token ?? ''
93
+ };
87
94
  }
88
95
  else if (method === 'jwt') {
89
- $values['secret_backend'] = { ...$values['secret_backend'], token: null, jwt_role: $values['secret_backend'].jwt_role ?? 'windmill-secrets' };
96
+ $values['secret_backend'] = {
97
+ ...$values['secret_backend'],
98
+ token: null,
99
+ jwt_role: $values['secret_backend'].jwt_role ?? 'windmill-secrets'
100
+ };
90
101
  }
91
102
  }
92
103
  function getVaultSettings() {
@@ -138,7 +149,9 @@ async function migrateSecretsToDatabase() {
138
149
  return;
139
150
  migratingToDatabase = true;
140
151
  try {
141
- const report = await SettingService.migrateSecretsToDatabase({ requestBody: getVaultSettings() });
152
+ const report = await SettingService.migrateSecretsToDatabase({
153
+ requestBody: getVaultSettings()
154
+ });
142
155
  if (report.failed_count > 0)
143
156
  sendUserToast(`Migration: ${report.migrated_count}/${report.total_secrets} migrated, ${report.failed_count} failed`, true);
144
157
  else
@@ -190,7 +203,9 @@ async function migrateSecretsToAzureKv() {
190
203
  return;
191
204
  migratingToAzureKv = true;
192
205
  try {
193
- const report = await SettingService.migrateSecretsToAzureKv({ requestBody: getAzureKvSettings() });
206
+ const report = await SettingService.migrateSecretsToAzureKv({
207
+ requestBody: getAzureKvSettings()
208
+ });
194
209
  if (report.failed_count > 0)
195
210
  sendUserToast(`Migration: ${report.migrated_count}/${report.total_secrets} migrated, ${report.failed_count} failed`, true);
196
211
  else
@@ -209,7 +224,9 @@ async function migrateSecretsFromAzureKv() {
209
224
  return;
210
225
  migratingFromAzureKv = true;
211
226
  try {
212
- const report = await SettingService.migrateSecretsFromAzureKv({ requestBody: getAzureKvSettings() });
227
+ const report = await SettingService.migrateSecretsFromAzureKv({
228
+ requestBody: getAzureKvSettings()
229
+ });
213
230
  if (report.failed_count > 0)
214
231
  sendUserToast(`Migration: ${report.migrated_count}/${report.total_secrets} migrated, ${report.failed_count} failed`, true);
215
232
  else
@@ -228,8 +245,7 @@ function isAzureKvConfigValid() {
228
245
  return false;
229
246
  return ($values['secret_backend'].vault_url?.trim() !== '' &&
230
247
  $values['secret_backend'].tenant_id?.trim() !== '' &&
231
- $values['secret_backend'].client_id?.trim() !== '' &&
232
- (!!$values['secret_backend'].client_secret?.trim() || !!$values['secret_backend'].token?.trim()));
248
+ $values['secret_backend'].client_id?.trim() !== '');
233
249
  }
234
250
  function getAwsSmSettings() {
235
251
  return {
@@ -279,7 +295,9 @@ async function migrateSecretsFromAwsSm() {
279
295
  return;
280
296
  migratingFromAwsSm = true;
281
297
  try {
282
- const report = await SettingService.migrateSecretsFromAwsSm({ requestBody: getAwsSmSettings() });
298
+ const report = await SettingService.migrateSecretsFromAwsSm({
299
+ requestBody: getAwsSmSettings()
300
+ });
283
301
  if (report.failed_count > 0)
284
302
  sendUserToast(`Migration: ${report.migrated_count}/${report.total_secrets} migrated, ${report.failed_count} failed`, true);
285
303
  else
@@ -305,10 +323,39 @@ let baseUrl = $derived($values['base_url'] ?? 'https://your-windmill-instance.co
305
323
  <div class="flex flex-col gap-2 mt-1">
306
324
  <ToggleButtonGroup selected={selectedType} onSelected={(v) => setBackendType(v)}>
307
325
  {#snippet children({ item: toggleButton })}
308
- <ToggleButton value="Database" label="Database" tooltip="Store secrets encrypted in the database (default)" item={toggleButton} />
309
- <ToggleButton value="HashiCorpVault" label="HashiCorp Vault (Beta)" tooltip={vaultDisabled ? 'Requires Enterprise Edition' : 'Store secrets in HashiCorp Vault'} item={toggleButton} disabled={vaultDisabled} />
310
- <ToggleButton value="AzureKeyVault" label="Azure Key Vault" tooltip={vaultDisabled ? 'Requires Enterprise Edition' : 'Store secrets in Azure Key Vault'} item={toggleButton} disabled={vaultDisabled} />
311
- <ToggleButton value="AwsSecretsManager" label="AWS Secrets Manager (Beta)" tooltip={vaultDisabled ? 'Requires Enterprise Edition' : 'Store secrets in AWS Secrets Manager'} item={toggleButton} disabled={vaultDisabled} />
326
+ <ToggleButton
327
+ value="Database"
328
+ label="Database"
329
+ tooltip="Store secrets encrypted in the database (default)"
330
+ item={toggleButton}
331
+ />
332
+ <ToggleButton
333
+ value="HashiCorpVault"
334
+ label="HashiCorp Vault (Beta)"
335
+ tooltip={vaultDisabled
336
+ ? 'Requires Enterprise Edition'
337
+ : 'Store secrets in HashiCorp Vault'}
338
+ item={toggleButton}
339
+ disabled={vaultDisabled}
340
+ />
341
+ <ToggleButton
342
+ value="AzureKeyVault"
343
+ label="Azure Key Vault"
344
+ tooltip={vaultDisabled
345
+ ? 'Requires Enterprise Edition'
346
+ : 'Store secrets in Azure Key Vault'}
347
+ item={toggleButton}
348
+ disabled={vaultDisabled}
349
+ />
350
+ <ToggleButton
351
+ value="AwsSecretsManager"
352
+ label="AWS Secrets Manager (Beta)"
353
+ tooltip={vaultDisabled
354
+ ? 'Requires Enterprise Edition'
355
+ : 'Store secrets in AWS Secrets Manager'}
356
+ item={toggleButton}
357
+ disabled={vaultDisabled}
358
+ />
312
359
  {/snippet}
313
360
  </ToggleButtonGroup>
314
361
  {#if vaultDisabled}
@@ -323,7 +370,10 @@ let baseUrl = $derived($values['base_url'] ?? 'https://your-windmill-instance.co
323
370
  <Database class="text-primary" size={20} />
324
371
  <div>
325
372
  <p class="text-sm font-medium text-emphasis">Database Storage (Default)</p>
326
- <p class="text-xs text-secondary">Secrets are encrypted using workspace-specific keys and stored in the PostgreSQL database.</p>
373
+ <p class="text-xs text-secondary"
374
+ >Secrets are encrypted using workspace-specific keys and stored in the PostgreSQL
375
+ database.</p
376
+ >
327
377
  </div>
328
378
  </div>
329
379
  {:else if selectedType === 'HashiCorpVault'}
@@ -331,46 +381,101 @@ let baseUrl = $derived($values['base_url'] ?? 'https://your-windmill-instance.co
331
381
  <div class="flex items-center gap-2 mb-4">
332
382
  <Lock class="text-primary" size={20} />
333
383
  <div>
334
- <p class="text-sm font-medium text-emphasis">HashiCorp Vault Configuration <span class="ml-2 px-1.5 py-0.5 text-2xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 rounded">Beta</span></p>
335
- <p class="text-xs text-secondary">Store secrets in an external HashiCorp Vault instance.</p>
384
+ <p class="text-sm font-medium text-emphasis"
385
+ >HashiCorp Vault Configuration <span
386
+ class="ml-2 px-1.5 py-0.5 text-2xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 rounded"
387
+ >Beta</span
388
+ ></p
389
+ >
390
+ <p class="text-xs text-secondary"
391
+ >Store secrets in an external HashiCorp Vault instance.</p
392
+ >
336
393
  </div>
337
394
  </div>
338
395
  <div class="grid grid-cols-1 gap-4">
339
396
  <div class="flex flex-col gap-1">
340
- <label for="vault_address" class="block text-xs font-semibold text-emphasis">Vault Address</label>
341
- <TextInput inputProps={{ type: 'text', id: 'vault_address', placeholder: 'https://vault.company.com:8200', disabled }} bind:value={$values['secret_backend'].address} />
397
+ <label for="vault_address" class="block text-xs font-semibold text-emphasis"
398
+ >Vault Address</label
399
+ >
400
+ <TextInput
401
+ inputProps={{
402
+ type: 'text',
403
+ id: 'vault_address',
404
+ placeholder: 'https://vault.company.com:8200',
405
+ disabled
406
+ }}
407
+ bind:value={$values['secret_backend'].address}
408
+ />
342
409
  </div>
343
410
  <div class="flex flex-col gap-1">
344
- <label for="vault_mount_path" class="block text-xs font-semibold text-emphasis">KV Mount Path</label>
411
+ <label for="vault_mount_path" class="block text-xs font-semibold text-emphasis"
412
+ >KV Mount Path</label
413
+ >
345
414
  <span class="text-2xs text-secondary">The KV v2 secrets engine mount path in Vault</span>
346
- <TextInput inputProps={{ type: 'text', id: 'vault_mount_path', placeholder: 'windmill', disabled }} bind:value={$values['secret_backend'].mount_path} />
415
+ <TextInput
416
+ inputProps={{ type: 'text', id: 'vault_mount_path', placeholder: 'windmill', disabled }}
417
+ bind:value={$values['secret_backend'].mount_path}
418
+ />
347
419
  </div>
348
420
  <div class="flex flex-col gap-2">
349
421
  <span class="block text-xs font-semibold text-emphasis">Authentication Method</span>
350
422
  <ToggleButtonGroup selected={authMethod} onSelected={(v) => setAuthMethod(v)}>
351
423
  {#snippet children({ item: toggleButton })}
352
- <ToggleButton value="jwt" label="JWT Auth" tooltip="Authenticate using Windmill-signed JWTs" item={toggleButton} {disabled} />
353
- <ToggleButton value="token" label="Static Token" tooltip="Use a static Vault token" item={toggleButton} {disabled} />
424
+ <ToggleButton
425
+ value="jwt"
426
+ label="JWT Auth"
427
+ tooltip="Authenticate using Windmill-signed JWTs"
428
+ item={toggleButton}
429
+ {disabled}
430
+ />
431
+ <ToggleButton
432
+ value="token"
433
+ label="Static Token"
434
+ tooltip="Use a static Vault token"
435
+ item={toggleButton}
436
+ {disabled}
437
+ />
354
438
  {/snippet}
355
439
  </ToggleButtonGroup>
356
440
  </div>
357
441
  {#if authMethod === 'token'}
358
442
  <div class="flex flex-col gap-1 p-3 bg-surface-secondary rounded-lg">
359
- <label for="vault_token" class="block text-xs font-semibold text-emphasis">Vault Token</label>
360
- <span class="text-2xs text-secondary">Static token. Recommended only for testing/development.</span>
443
+ <label for="vault_token" class="block text-xs font-semibold text-emphasis"
444
+ >Vault Token</label
445
+ >
446
+ <span class="text-2xs text-secondary"
447
+ >Static token. Recommended only for testing/development.</span
448
+ >
361
449
  <Password bind:password={$values['secret_backend'].token} small {disabled} />
362
450
  </div>
363
451
  {:else}
364
452
  <div class="flex flex-col gap-2 p-3 bg-surface-secondary rounded-lg">
365
- <label for="vault_jwt_role" class="block text-xs font-semibold text-emphasis">JWT Auth Role</label>
366
- <span class="text-2xs text-secondary">The JWT authentication role configured in Vault.</span>
367
- <TextInput inputProps={{ type: 'text', id: 'vault_jwt_role', placeholder: 'windmill-secrets', disabled }} bind:value={$values['secret_backend'].jwt_role} />
453
+ <label for="vault_jwt_role" class="block text-xs font-semibold text-emphasis"
454
+ >JWT Auth Role</label
455
+ >
456
+ <span class="text-2xs text-secondary"
457
+ >The JWT authentication role configured in Vault.</span
458
+ >
459
+ <TextInput
460
+ inputProps={{
461
+ type: 'text',
462
+ id: 'vault_jwt_role',
463
+ placeholder: 'windmill-secrets',
464
+ disabled
465
+ }}
466
+ bind:value={$values['secret_backend'].jwt_role}
467
+ />
368
468
  <details class="mt-2">
369
- <summary class="text-xs font-medium text-secondary cursor-pointer hover:text-primary">Vault JWT Setup Instructions</summary>
469
+ <summary class="text-xs font-medium text-secondary cursor-pointer hover:text-primary"
470
+ >Vault JWT Setup Instructions</summary
471
+ >
370
472
  <div class="mt-2 p-2 bg-surface rounded text-2xs text-secondary space-y-2">
371
473
  <p>Configure Vault to accept JWTs from Windmill:</p>
372
- <div class="bg-gray-100 dark:bg-gray-800 p-2 rounded font-mono text-2xs overflow-x-auto">
373
- <pre># Enable JWT auth method
474
+ <div
475
+ class="bg-gray-100 dark:bg-gray-800 p-2 rounded font-mono text-2xs overflow-x-auto"
476
+ >
477
+ <pre
478
+ ># Enable JWT auth method
374
479
  vault auth enable jwt
375
480
 
376
481
  # Configure JWT auth with Windmill's JWKS endpoint
@@ -394,37 +499,82 @@ vault write auth/jwt/role/windmill-secrets \
394
499
  bound_audiences="{baseUrl}" \
395
500
  user_claim="email" \
396
501
  policies="windmill-secrets" \
397
- ttl="1h"</pre>
502
+ ttl="1h"</pre
503
+ >
398
504
  </div>
399
505
  </div>
400
506
  </details>
401
507
  </div>
402
508
  {/if}
403
509
  <div class="flex flex-col gap-1">
404
- <label for="vault_namespace" class="block text-xs font-semibold text-emphasis">Namespace (optional)</label>
510
+ <label for="vault_namespace" class="block text-xs font-semibold text-emphasis"
511
+ >Namespace (optional)</label
512
+ >
405
513
  <span class="text-2xs text-secondary">Vault Enterprise namespace</span>
406
- <TextInput inputProps={{ type: 'text', id: 'vault_namespace', placeholder: 'admin/my-namespace', disabled }} bind:value={$values['secret_backend'].namespace} />
514
+ <TextInput
515
+ inputProps={{
516
+ type: 'text',
517
+ id: 'vault_namespace',
518
+ placeholder: 'admin/my-namespace',
519
+ disabled
520
+ }}
521
+ bind:value={$values['secret_backend'].namespace}
522
+ />
407
523
  </div>
408
524
  <div class="flex flex-col gap-1">
409
- <Toggle id="vault_skip_ssl_verify" {disabled} bind:checked={$values['secret_backend'].skip_ssl_verify} size="xs" options={{ right: 'Skip TLS certificate verification' }} />
410
- <span class="text-2xs text-secondary">Disables TLS verification when connecting to Vault. Only enable for self-signed certificates in development.</span>
525
+ <Toggle
526
+ id="vault_skip_ssl_verify"
527
+ {disabled}
528
+ bind:checked={$values['secret_backend'].skip_ssl_verify}
529
+ size="xs"
530
+ options={{ right: 'Skip TLS certificate verification' }}
531
+ />
532
+ <span class="text-2xs text-secondary"
533
+ >Disables TLS verification when connecting to Vault. Only enable for self-signed
534
+ certificates in development.</span
535
+ >
411
536
  </div>
412
537
  </div>
413
538
  <div class="flex flex-col gap-4 pt-4 border-t">
414
- <Button unifiedSize="md" variant="accent" onclick={testVaultConnection} disabled={disabled || !isVaultConfigValid() || testingConnection} loading={testingConnection} startIcon={{ icon: Server }}>Test Connection</Button>
539
+ <Button
540
+ unifiedSize="md"
541
+ variant="accent"
542
+ onclick={testVaultConnection}
543
+ disabled={disabled || !isVaultConfigValid() || testingConnection}
544
+ loading={testingConnection}
545
+ startIcon={{ icon: Server }}>Test Connection</Button
546
+ >
415
547
  <div class="flex flex-col gap-4 pt-4 border-t">
416
548
  <span class="block text-xs font-semibold text-emphasis">Secret Migration</span>
417
- <span class="text-2xs text-secondary">Original values are NOT deleted to allow for rollback.</span>
549
+ <span class="text-2xs text-secondary"
550
+ >Original values are NOT deleted to allow for rollback.</span
551
+ >
418
552
  <div class="flex gap-4">
419
553
  <div class="flex-1 p-3 border rounded-lg">
420
- <div class="flex items-center gap-2 mb-2"><Database size={16} /><ArrowRight size={16} /><Lock size={16} /></div>
554
+ <div class="flex items-center gap-2 mb-2"
555
+ ><Database size={16} /><ArrowRight size={16} /><Lock size={16} /></div
556
+ >
421
557
  <p class="text-xs font-medium mb-2">Database → Vault</p>
422
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateToVaultModalOpen = true)} disabled={disabled || !isVaultConfigValid() || migratingToVault} startIcon={{ icon: ArrowRight }}>Migrate to Vault</Button>
558
+ <Button
559
+ unifiedSize="sm"
560
+ variant="default"
561
+ onclick={() => (migrateToVaultModalOpen = true)}
562
+ disabled={disabled || !isVaultConfigValid() || migratingToVault}
563
+ startIcon={{ icon: ArrowRight }}>Migrate to Vault</Button
564
+ >
423
565
  </div>
424
566
  <div class="flex-1 p-3 border rounded-lg">
425
- <div class="flex items-center gap-2 mb-2"><Lock size={16} /><ArrowLeft size={16} /><Database size={16} /></div>
567
+ <div class="flex items-center gap-2 mb-2"
568
+ ><Lock size={16} /><ArrowLeft size={16} /><Database size={16} /></div
569
+ >
426
570
  <p class="text-xs font-medium mb-2">Vault → Database</p>
427
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateToDatabaseModalOpen = true)} disabled={disabled || !isVaultConfigValid() || migratingToDatabase} startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button>
571
+ <Button
572
+ unifiedSize="sm"
573
+ variant="default"
574
+ onclick={() => (migrateToDatabaseModalOpen = true)}
575
+ disabled={disabled || !isVaultConfigValid() || migratingToDatabase}
576
+ startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button
577
+ >
428
578
  </div>
429
579
  </div>
430
580
  </div>
@@ -441,42 +591,109 @@ vault write auth/jwt/role/windmill-secrets \
441
591
  </div>
442
592
  <div class="grid grid-cols-1 gap-4">
443
593
  <div class="flex flex-col gap-1">
444
- <label for="azure_vault_url" class="block text-xs font-semibold text-emphasis">Vault URL</label>
445
- <TextInput inputProps={{ type: 'text', id: 'azure_vault_url', placeholder: 'https://my-vault.vault.azure.net', disabled }} bind:value={$values['secret_backend'].vault_url} />
594
+ <label for="azure_vault_url" class="block text-xs font-semibold text-emphasis"
595
+ >Vault URL</label
596
+ >
597
+ <TextInput
598
+ inputProps={{
599
+ type: 'text',
600
+ id: 'azure_vault_url',
601
+ placeholder: 'https://my-vault.vault.azure.net',
602
+ disabled
603
+ }}
604
+ bind:value={$values['secret_backend'].vault_url}
605
+ />
446
606
  </div>
447
607
  <div class="flex flex-col gap-1">
448
- <label for="azure_tenant_id" class="block text-xs font-semibold text-emphasis">Tenant ID</label>
449
- <TextInput inputProps={{ type: 'text', id: 'azure_tenant_id', placeholder: '00000000-0000-0000-0000-000000000000', disabled }} bind:value={$values['secret_backend'].tenant_id} />
608
+ <label for="azure_tenant_id" class="block text-xs font-semibold text-emphasis"
609
+ >Tenant ID</label
610
+ >
611
+ <TextInput
612
+ inputProps={{
613
+ type: 'text',
614
+ id: 'azure_tenant_id',
615
+ placeholder: '00000000-0000-0000-0000-000000000000',
616
+ disabled
617
+ }}
618
+ bind:value={$values['secret_backend'].tenant_id}
619
+ />
450
620
  </div>
451
621
  <div class="flex flex-col gap-1">
452
- <label for="azure_client_id" class="block text-xs font-semibold text-emphasis">Client ID</label>
453
- <TextInput inputProps={{ type: 'text', id: 'azure_client_id', placeholder: '00000000-0000-0000-0000-000000000000', disabled }} bind:value={$values['secret_backend'].client_id} />
622
+ <label for="azure_client_id" class="block text-xs font-semibold text-emphasis"
623
+ >Client ID</label
624
+ >
625
+ <TextInput
626
+ inputProps={{
627
+ type: 'text',
628
+ id: 'azure_client_id',
629
+ placeholder: '00000000-0000-0000-0000-000000000000',
630
+ disabled
631
+ }}
632
+ bind:value={$values['secret_backend'].client_id}
633
+ />
454
634
  </div>
455
635
  <div class="flex flex-col gap-1 p-3 bg-surface-secondary rounded-lg">
456
- <label for="azure_client_secret" class="block text-xs font-semibold text-emphasis">Client Secret</label>
636
+ <label for="azure_client_secret" class="block text-xs font-semibold text-emphasis"
637
+ >Client Secret <span class="text-2xs font-normal text-secondary">(optional)</span
638
+ ></label
639
+ >
640
+ <span class="text-2xs text-secondary"
641
+ >Leave blank to use Azure Workload Identity. Requires
642
+ <code>AZURE_FEDERATED_TOKEN_FILE</code> on the Windmill process (auto-injected on AKS by
643
+ the workload-identity webhook; set manually on other Kubernetes clusters).</span
644
+ >
457
645
  <Password bind:password={$values['secret_backend'].client_secret} small {disabled} />
458
646
  </div>
459
647
  <div class="flex flex-col gap-1 p-3 bg-surface-secondary rounded-lg">
460
- <label for="azure_token" class="block text-xs font-semibold text-emphasis">Token (optional)</label>
461
- <span class="text-2xs text-secondary">Static Bearer token for testing. If provided, OAuth2 is skipped.</span>
648
+ <label for="azure_token" class="block text-xs font-semibold text-emphasis"
649
+ >Token (optional)</label
650
+ >
651
+ <span class="text-2xs text-secondary"
652
+ >Static Bearer token for testing. If provided, OAuth2 is skipped.</span
653
+ >
462
654
  <Password bind:password={$values['secret_backend'].token} small {disabled} />
463
655
  </div>
464
656
  </div>
465
657
  <div class="flex flex-col gap-4 pt-4 border-t">
466
- <Button unifiedSize="md" variant="accent" onclick={testAzureKvConnection} disabled={disabled || !isAzureKvConfigValid() || testingAzureKvConnection} loading={testingAzureKvConnection} startIcon={{ icon: Server }}>Test Connection</Button>
658
+ <Button
659
+ unifiedSize="md"
660
+ variant="accent"
661
+ onclick={testAzureKvConnection}
662
+ disabled={disabled || !isAzureKvConfigValid() || testingAzureKvConnection}
663
+ loading={testingAzureKvConnection}
664
+ startIcon={{ icon: Server }}>Test Connection</Button
665
+ >
467
666
  <div class="flex flex-col gap-4 pt-4 border-t">
468
667
  <span class="block text-xs font-semibold text-emphasis">Secret Migration</span>
469
- <span class="text-2xs text-secondary">Original values are NOT deleted to allow for rollback.</span>
668
+ <span class="text-2xs text-secondary"
669
+ >Original values are NOT deleted to allow for rollback.</span
670
+ >
470
671
  <div class="flex gap-4">
471
672
  <div class="flex-1 p-3 border rounded-lg">
472
- <div class="flex items-center gap-2 mb-2"><Database size={16} /><ArrowRight size={16} /><Cloud size={16} /></div>
673
+ <div class="flex items-center gap-2 mb-2"
674
+ ><Database size={16} /><ArrowRight size={16} /><Cloud size={16} /></div
675
+ >
473
676
  <p class="text-xs font-medium mb-2">Database → Azure Key Vault</p>
474
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateToAzureKvModalOpen = true)} disabled={disabled || !isAzureKvConfigValid() || migratingToAzureKv} startIcon={{ icon: ArrowRight }}>Migrate to Azure KV</Button>
677
+ <Button
678
+ unifiedSize="sm"
679
+ variant="default"
680
+ onclick={() => (migrateToAzureKvModalOpen = true)}
681
+ disabled={disabled || !isAzureKvConfigValid() || migratingToAzureKv}
682
+ startIcon={{ icon: ArrowRight }}>Migrate to Azure KV</Button
683
+ >
475
684
  </div>
476
685
  <div class="flex-1 p-3 border rounded-lg">
477
- <div class="flex items-center gap-2 mb-2"><Cloud size={16} /><ArrowLeft size={16} /><Database size={16} /></div>
686
+ <div class="flex items-center gap-2 mb-2"
687
+ ><Cloud size={16} /><ArrowLeft size={16} /><Database size={16} /></div
688
+ >
478
689
  <p class="text-xs font-medium mb-2">Azure Key Vault → Database</p>
479
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateFromAzureKvModalOpen = true)} disabled={disabled || !isAzureKvConfigValid() || migratingFromAzureKv} startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button>
690
+ <Button
691
+ unifiedSize="sm"
692
+ variant="default"
693
+ onclick={() => (migrateFromAzureKvModalOpen = true)}
694
+ disabled={disabled || !isAzureKvConfigValid() || migratingFromAzureKv}
695
+ startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button
696
+ >
480
697
  </div>
481
698
  </div>
482
699
  </div>
@@ -487,50 +704,118 @@ vault write auth/jwt/role/windmill-secrets \
487
704
  <div class="flex items-center gap-2 mb-4">
488
705
  <Cloud class="text-primary" size={20} />
489
706
  <div>
490
- <p class="text-sm font-medium text-emphasis">AWS Secrets Manager Configuration <span class="ml-2 px-1.5 py-0.5 text-2xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 rounded">Beta</span></p>
707
+ <p class="text-sm font-medium text-emphasis"
708
+ >AWS Secrets Manager Configuration <span
709
+ class="ml-2 px-1.5 py-0.5 text-2xs font-medium bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-200 rounded"
710
+ >Beta</span
711
+ ></p
712
+ >
491
713
  <p class="text-xs text-secondary">Store secrets in AWS Secrets Manager.</p>
492
714
  </div>
493
715
  </div>
494
716
  <div class="grid grid-cols-1 gap-4">
495
717
  <div class="flex flex-col gap-1">
496
- <label for="aws_sm_region" class="block text-xs font-semibold text-emphasis">Region</label>
497
- <TextInput inputProps={{ type: 'text', id: 'aws_sm_region', placeholder: 'us-east-1', disabled }} bind:value={$values['secret_backend'].region} />
718
+ <label for="aws_sm_region" class="block text-xs font-semibold text-emphasis">Region</label
719
+ >
720
+ <TextInput
721
+ inputProps={{ type: 'text', id: 'aws_sm_region', placeholder: 'us-east-1', disabled }}
722
+ bind:value={$values['secret_backend'].region}
723
+ />
498
724
  </div>
499
725
  <div class="flex flex-col gap-1">
500
- <label for="aws_sm_access_key_id" class="block text-xs font-semibold text-emphasis">Access Key ID (optional)</label>
501
- <span class="text-2xs text-secondary">If not provided, the default AWS credential chain is used (env vars, instance profile, EKS pod identity)</span>
502
- <TextInput inputProps={{ type: 'text', id: 'aws_sm_access_key_id', placeholder: 'AKIA...', disabled }} bind:value={$values['secret_backend'].access_key_id} />
726
+ <label for="aws_sm_access_key_id" class="block text-xs font-semibold text-emphasis"
727
+ >Access Key ID (optional)</label
728
+ >
729
+ <span class="text-2xs text-secondary"
730
+ >If not provided, the default AWS credential chain is used (env vars, instance profile,
731
+ EKS pod identity)</span
732
+ >
733
+ <TextInput
734
+ inputProps={{
735
+ type: 'text',
736
+ id: 'aws_sm_access_key_id',
737
+ placeholder: 'AKIA...',
738
+ disabled
739
+ }}
740
+ bind:value={$values['secret_backend'].access_key_id}
741
+ />
503
742
  </div>
504
743
  <div class="flex flex-col gap-1 p-3 bg-surface-secondary rounded-lg">
505
- <label for="aws_sm_secret_access_key" class="block text-xs font-semibold text-emphasis">Secret Access Key (optional)</label>
744
+ <label for="aws_sm_secret_access_key" class="block text-xs font-semibold text-emphasis"
745
+ >Secret Access Key (optional)</label
746
+ >
506
747
  <Password bind:password={$values['secret_backend'].secret_access_key} small {disabled} />
507
748
  </div>
508
749
  <div class="flex flex-col gap-1">
509
- <label for="aws_sm_prefix" class="block text-xs font-semibold text-emphasis">Secret Name Prefix (optional)</label>
510
- <span class="text-2xs text-secondary">Prefix for secret names in AWS Secrets Manager (default: windmill/)</span>
511
- <TextInput inputProps={{ type: 'text', id: 'aws_sm_prefix', placeholder: 'windmill/', disabled }} bind:value={$values['secret_backend'].prefix} />
750
+ <label for="aws_sm_prefix" class="block text-xs font-semibold text-emphasis"
751
+ >Secret Name Prefix (optional)</label
752
+ >
753
+ <span class="text-2xs text-secondary"
754
+ >Prefix for secret names in AWS Secrets Manager (default: windmill/)</span
755
+ >
756
+ <TextInput
757
+ inputProps={{ type: 'text', id: 'aws_sm_prefix', placeholder: 'windmill/', disabled }}
758
+ bind:value={$values['secret_backend'].prefix}
759
+ />
512
760
  </div>
513
761
  <div class="flex flex-col gap-1">
514
- <label for="aws_sm_endpoint_url" class="block text-xs font-semibold text-emphasis">Endpoint URL (optional)</label>
515
- <span class="text-2xs text-secondary">Custom endpoint for LocalStack or other compatible services</span>
516
- <TextInput inputProps={{ type: 'text', id: 'aws_sm_endpoint_url', placeholder: 'http://localhost:4566', disabled }} bind:value={$values['secret_backend'].endpoint_url} />
762
+ <label for="aws_sm_endpoint_url" class="block text-xs font-semibold text-emphasis"
763
+ >Endpoint URL (optional)</label
764
+ >
765
+ <span class="text-2xs text-secondary"
766
+ >Custom endpoint for LocalStack or other compatible services</span
767
+ >
768
+ <TextInput
769
+ inputProps={{
770
+ type: 'text',
771
+ id: 'aws_sm_endpoint_url',
772
+ placeholder: 'http://localhost:4566',
773
+ disabled
774
+ }}
775
+ bind:value={$values['secret_backend'].endpoint_url}
776
+ />
517
777
  </div>
518
778
  </div>
519
779
  <div class="flex flex-col gap-4 pt-4 border-t">
520
- <Button unifiedSize="md" variant="accent" onclick={testAwsSmConnection} disabled={disabled || !isAwsSmConfigValid() || testingAwsSmConnection} loading={testingAwsSmConnection} startIcon={{ icon: Server }}>Test Connection</Button>
780
+ <Button
781
+ unifiedSize="md"
782
+ variant="accent"
783
+ onclick={testAwsSmConnection}
784
+ disabled={disabled || !isAwsSmConfigValid() || testingAwsSmConnection}
785
+ loading={testingAwsSmConnection}
786
+ startIcon={{ icon: Server }}>Test Connection</Button
787
+ >
521
788
  <div class="flex flex-col gap-4 pt-4 border-t">
522
789
  <span class="block text-xs font-semibold text-emphasis">Secret Migration</span>
523
- <span class="text-2xs text-secondary">Original values are NOT deleted to allow for rollback.</span>
790
+ <span class="text-2xs text-secondary"
791
+ >Original values are NOT deleted to allow for rollback.</span
792
+ >
524
793
  <div class="flex gap-4">
525
794
  <div class="flex-1 p-3 border rounded-lg">
526
- <div class="flex items-center gap-2 mb-2"><Database size={16} /><ArrowRight size={16} /><Cloud size={16} /></div>
795
+ <div class="flex items-center gap-2 mb-2"
796
+ ><Database size={16} /><ArrowRight size={16} /><Cloud size={16} /></div
797
+ >
527
798
  <p class="text-xs font-medium mb-2">Database → AWS Secrets Manager</p>
528
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateToAwsSmModalOpen = true)} disabled={disabled || !isAwsSmConfigValid() || migratingToAwsSm} startIcon={{ icon: ArrowRight }}>Migrate to AWS SM</Button>
799
+ <Button
800
+ unifiedSize="sm"
801
+ variant="default"
802
+ onclick={() => (migrateToAwsSmModalOpen = true)}
803
+ disabled={disabled || !isAwsSmConfigValid() || migratingToAwsSm}
804
+ startIcon={{ icon: ArrowRight }}>Migrate to AWS SM</Button
805
+ >
529
806
  </div>
530
807
  <div class="flex-1 p-3 border rounded-lg">
531
- <div class="flex items-center gap-2 mb-2"><Cloud size={16} /><ArrowLeft size={16} /><Database size={16} /></div>
808
+ <div class="flex items-center gap-2 mb-2"
809
+ ><Cloud size={16} /><ArrowLeft size={16} /><Database size={16} /></div
810
+ >
532
811
  <p class="text-xs font-medium mb-2">AWS Secrets Manager → Database</p>
533
- <Button unifiedSize="sm" variant="default" onclick={() => (migrateFromAwsSmModalOpen = true)} disabled={disabled || !isAwsSmConfigValid() || migratingFromAwsSm} startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button>
812
+ <Button
813
+ unifiedSize="sm"
814
+ variant="default"
815
+ onclick={() => (migrateFromAwsSmModalOpen = true)}
816
+ disabled={disabled || !isAwsSmConfigValid() || migratingFromAwsSm}
817
+ startIcon={{ icon: ArrowLeft }}>Migrate to Database</Button
818
+ >
534
819
  </div>
535
820
  </div>
536
821
  </div>
@@ -539,21 +824,105 @@ vault write auth/jwt/role/windmill-secrets \
539
824
  {/if}
540
825
  </div>
541
826
 
542
- <ConfirmationModal title="Migrate to AWS Secrets Manager" confirmationText="Migrate" open={migrateToAwsSmModalOpen} loading={migratingToAwsSm} type="reload" onCanceled={() => { migrateToAwsSmModalOpen = false }} onConfirmed={migrateSecretsToAwsSm}>
543
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets from the database to AWS Secrets Manager.</p><p class="text-yellow-600 dark:text-yellow-400 text-sm">Database values are NOT deleted automatically.</p></div>{/snippet}
827
+ <ConfirmationModal
828
+ title="Migrate to AWS Secrets Manager"
829
+ confirmationText="Migrate"
830
+ open={migrateToAwsSmModalOpen}
831
+ loading={migratingToAwsSm}
832
+ type="reload"
833
+ onCanceled={() => {
834
+ migrateToAwsSmModalOpen = false
835
+ }}
836
+ onConfirmed={migrateSecretsToAwsSm}
837
+ >
838
+ {#snippet children()}<div class="flex flex-col gap-2"
839
+ ><p>This will copy all secrets from the database to AWS Secrets Manager.</p><p
840
+ class="text-yellow-600 dark:text-yellow-400 text-sm"
841
+ >Database values are NOT deleted automatically.</p
842
+ ></div
843
+ >{/snippet}
544
844
  </ConfirmationModal>
545
- <ConfirmationModal title="Migrate to Database" confirmationText="Migrate" open={migrateFromAwsSmModalOpen} loading={migratingFromAwsSm} type="reload" onCanceled={() => { migrateFromAwsSmModalOpen = false }} onConfirmed={migrateSecretsFromAwsSm}>
546
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets from AWS Secrets Manager back to the database.</p><p class="text-yellow-600 dark:text-yellow-400 text-sm">AWS Secrets Manager values are NOT deleted automatically.</p></div>{/snippet}
845
+ <ConfirmationModal
846
+ title="Migrate to Database"
847
+ confirmationText="Migrate"
848
+ open={migrateFromAwsSmModalOpen}
849
+ loading={migratingFromAwsSm}
850
+ type="reload"
851
+ onCanceled={() => {
852
+ migrateFromAwsSmModalOpen = false
853
+ }}
854
+ onConfirmed={migrateSecretsFromAwsSm}
855
+ >
856
+ {#snippet children()}<div class="flex flex-col gap-2"
857
+ ><p>This will copy all secrets from AWS Secrets Manager back to the database.</p><p
858
+ class="text-yellow-600 dark:text-yellow-400 text-sm"
859
+ >AWS Secrets Manager values are NOT deleted automatically.</p
860
+ ></div
861
+ >{/snippet}
547
862
  </ConfirmationModal>
548
- <ConfirmationModal title="Migrate to Azure Key Vault" confirmationText="Migrate" open={migrateToAzureKvModalOpen} loading={migratingToAzureKv} type="reload" onCanceled={() => { migrateToAzureKvModalOpen = false }} onConfirmed={migrateSecretsToAzureKv}>
549
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets to Azure Key Vault.</p><p class="text-yellow-600 dark:text-yellow-400 text-sm">Database values are NOT deleted automatically.</p></div>{/snippet}
863
+ <ConfirmationModal
864
+ title="Migrate to Azure Key Vault"
865
+ confirmationText="Migrate"
866
+ open={migrateToAzureKvModalOpen}
867
+ loading={migratingToAzureKv}
868
+ type="reload"
869
+ onCanceled={() => {
870
+ migrateToAzureKvModalOpen = false
871
+ }}
872
+ onConfirmed={migrateSecretsToAzureKv}
873
+ >
874
+ {#snippet children()}<div class="flex flex-col gap-2"
875
+ ><p>This will copy all secrets to Azure Key Vault.</p><p
876
+ class="text-yellow-600 dark:text-yellow-400 text-sm"
877
+ >Database values are NOT deleted automatically.</p
878
+ ></div
879
+ >{/snippet}
550
880
  </ConfirmationModal>
551
- <ConfirmationModal title="Migrate to Database" confirmationText="Migrate" open={migrateFromAzureKvModalOpen} loading={migratingFromAzureKv} type="reload" onCanceled={() => { migrateFromAzureKvModalOpen = false }} onConfirmed={migrateSecretsFromAzureKv}>
552
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets from Azure Key Vault back to the database.</p></div>{/snippet}
881
+ <ConfirmationModal
882
+ title="Migrate to Database"
883
+ confirmationText="Migrate"
884
+ open={migrateFromAzureKvModalOpen}
885
+ loading={migratingFromAzureKv}
886
+ type="reload"
887
+ onCanceled={() => {
888
+ migrateFromAzureKvModalOpen = false
889
+ }}
890
+ onConfirmed={migrateSecretsFromAzureKv}
891
+ >
892
+ {#snippet children()}<div class="flex flex-col gap-2"
893
+ ><p>This will copy all secrets from Azure Key Vault back to the database.</p></div
894
+ >{/snippet}
553
895
  </ConfirmationModal>
554
- <ConfirmationModal title="Migrate to Vault" confirmationText="Migrate" open={migrateToVaultModalOpen} loading={migratingToVault} type="reload" onCanceled={() => { migrateToVaultModalOpen = false }} onConfirmed={migrateSecretsToVault}>
555
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets to HashiCorp Vault.</p><p class="text-yellow-600 dark:text-yellow-400 text-sm">Database values are NOT deleted automatically.</p></div>{/snippet}
896
+ <ConfirmationModal
897
+ title="Migrate to Vault"
898
+ confirmationText="Migrate"
899
+ open={migrateToVaultModalOpen}
900
+ loading={migratingToVault}
901
+ type="reload"
902
+ onCanceled={() => {
903
+ migrateToVaultModalOpen = false
904
+ }}
905
+ onConfirmed={migrateSecretsToVault}
906
+ >
907
+ {#snippet children()}<div class="flex flex-col gap-2"
908
+ ><p>This will copy all secrets to HashiCorp Vault.</p><p
909
+ class="text-yellow-600 dark:text-yellow-400 text-sm"
910
+ >Database values are NOT deleted automatically.</p
911
+ ></div
912
+ >{/snippet}
556
913
  </ConfirmationModal>
557
- <ConfirmationModal title="Migrate to Database" confirmationText="Migrate" open={migrateToDatabaseModalOpen} loading={migratingToDatabase} type="reload" onCanceled={() => { migrateToDatabaseModalOpen = false }} onConfirmed={migrateSecretsToDatabase}>
558
- {#snippet children()}<div class="flex flex-col gap-2"><p>This will copy all secrets from Vault back to the database.</p></div>{/snippet}
914
+ <ConfirmationModal
915
+ title="Migrate to Database"
916
+ confirmationText="Migrate"
917
+ open={migrateToDatabaseModalOpen}
918
+ loading={migratingToDatabase}
919
+ type="reload"
920
+ onCanceled={() => {
921
+ migrateToDatabaseModalOpen = false
922
+ }}
923
+ onConfirmed={migrateSecretsToDatabase}
924
+ >
925
+ {#snippet children()}<div class="flex flex-col gap-2"
926
+ ><p>This will copy all secrets from Vault back to the database.</p></div
927
+ >{/snippet}
559
928
  </ConfirmationModal>