@revenexx/studio-integrations 0.5.1 → 0.7.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 (171) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/README.md +48 -4
  3. package/dist/module.d.mts +17 -1
  4. package/dist/module.json +1 -1
  5. package/dist/module.mjs +10 -2
  6. package/dist/runtime/components/Integrations/CredentialCreateDialog.vue +43 -41
  7. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +123 -50
  8. package/dist/runtime/components/Integrations/CredentialRevenexxSource.vue +108 -71
  9. package/dist/runtime/components/Integrations/CredentialTypePicker.vue +12 -15
  10. package/dist/runtime/components/Integrations/DeadLettersPanel.vue +18 -17
  11. package/dist/runtime/components/Integrations/EventTypeCombobox.d.vue.ts +1 -0
  12. package/dist/runtime/components/Integrations/EventTypeCombobox.vue +7 -4
  13. package/dist/runtime/components/Integrations/EventTypeCombobox.vue.d.ts +1 -0
  14. package/dist/runtime/components/Integrations/ExpressionInput.d.vue.ts +4 -0
  15. package/dist/runtime/components/Integrations/ExpressionInput.vue +67 -37
  16. package/dist/runtime/components/Integrations/ExpressionInput.vue.d.ts +4 -0
  17. package/dist/runtime/components/Integrations/GroupFrameView.vue +30 -20
  18. package/dist/runtime/components/Integrations/Layout.vue +48 -4
  19. package/dist/runtime/components/Integrations/NodeConfigDynamicField.vue +23 -23
  20. package/dist/runtime/components/Integrations/NodeConfigDynamicSchema.vue +11 -13
  21. package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +2 -0
  22. package/dist/runtime/components/Integrations/NodeConfigField.vue +187 -93
  23. package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +2 -0
  24. package/dist/runtime/components/Integrations/NodeInspector.d.vue.ts +6 -0
  25. package/dist/runtime/components/Integrations/NodeInspector.vue +1157 -376
  26. package/dist/runtime/components/Integrations/NodeInspector.vue.d.ts +6 -0
  27. package/dist/runtime/components/Integrations/NodeLogo.d.vue.ts +12 -0
  28. package/dist/runtime/components/Integrations/NodeLogo.vue +2 -30
  29. package/dist/runtime/components/Integrations/NodeLogo.vue.d.ts +12 -0
  30. package/dist/runtime/components/Integrations/NodeMark.d.vue.ts +15 -0
  31. package/dist/runtime/components/Integrations/NodeMark.vue +79 -0
  32. package/dist/runtime/components/Integrations/NodeMark.vue.d.ts +15 -0
  33. package/dist/runtime/components/Integrations/NodeOutputSchema.d.vue.ts +21 -0
  34. package/dist/runtime/components/Integrations/NodeOutputSchema.vue +43 -0
  35. package/dist/runtime/components/Integrations/NodeOutputSchema.vue.d.ts +21 -0
  36. package/dist/runtime/components/Integrations/NodePalette.vue +122 -55
  37. package/dist/runtime/components/Integrations/QueryBuilder.vue +46 -38
  38. package/dist/runtime/components/Integrations/RunActionsMenu.vue +38 -12
  39. package/dist/runtime/components/Integrations/RunDetailPanel.vue +114 -62
  40. package/dist/runtime/components/Integrations/RunPayloadInput.vue +27 -13
  41. package/dist/runtime/components/Integrations/RunResponseModal.vue +11 -10
  42. package/dist/runtime/components/Integrations/RunsTable.d.vue.ts +0 -1
  43. package/dist/runtime/components/Integrations/RunsTable.vue +38 -16
  44. package/dist/runtime/components/Integrations/RunsTable.vue.d.ts +0 -1
  45. package/dist/runtime/components/Integrations/SftpAccountImportDialog.vue +8 -7
  46. package/dist/runtime/components/Integrations/Sidebar.vue +14 -10
  47. package/dist/runtime/components/Integrations/StickyNoteView.d.vue.ts +14 -4
  48. package/dist/runtime/components/Integrations/StickyNoteView.vue +38 -23
  49. package/dist/runtime/components/Integrations/StickyNoteView.vue.d.ts +14 -4
  50. package/dist/runtime/components/Integrations/TemplateCard.d.vue.ts +18 -0
  51. package/dist/runtime/components/Integrations/TemplateCard.vue +119 -0
  52. package/dist/runtime/components/Integrations/TemplateCard.vue.d.ts +18 -0
  53. package/dist/runtime/components/Integrations/TemplateFlowPreview.d.vue.ts +2 -2
  54. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue +16 -18
  55. package/dist/runtime/components/Integrations/TemplateFlowPreview.vue.d.ts +2 -2
  56. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue +34 -33
  57. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +52 -67
  58. package/dist/runtime/components/Integrations/WorkflowDuplicateDialog.vue +8 -7
  59. package/dist/runtime/components/Integrations/WorkflowEdgeView.d.vue.ts +18 -4
  60. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue +29 -11
  61. package/dist/runtime/components/Integrations/WorkflowEdgeView.vue.d.ts +18 -4
  62. package/dist/runtime/components/Integrations/WorkflowEditor.d.vue.ts +20 -1
  63. package/dist/runtime/components/Integrations/WorkflowEditor.vue +240 -116
  64. package/dist/runtime/components/Integrations/WorkflowEditor.vue.d.ts +20 -1
  65. package/dist/runtime/components/Integrations/WorkflowHistoryPanel.vue +28 -43
  66. package/dist/runtime/components/Integrations/WorkflowIconPicker.d.vue.ts +19 -1
  67. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue +17 -7
  68. package/dist/runtime/components/Integrations/WorkflowIconPicker.vue.d.ts +19 -1
  69. package/dist/runtime/components/Integrations/WorkflowNodeView.d.vue.ts +4 -0
  70. package/dist/runtime/components/Integrations/WorkflowNodeView.vue +198 -56
  71. package/dist/runtime/components/Integrations/WorkflowNodeView.vue.d.ts +4 -0
  72. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +56 -59
  73. package/dist/runtime/components/Integrations/WorkflowSettingsDialog.vue +28 -21
  74. package/dist/runtime/components/Integrations/WorkflowTagsInput.d.vue.ts +1 -0
  75. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue +15 -9
  76. package/dist/runtime/components/Integrations/WorkflowTagsInput.vue.d.ts +1 -0
  77. package/dist/runtime/components/Integrations/WorkflowTriggerView.vue +15 -10
  78. package/dist/runtime/components/Integrations/WorkflowVariablesDialog.vue +50 -36
  79. package/dist/runtime/components/Integrations/WorkflowsTable.vue +126 -48
  80. package/dist/runtime/composables/integrationsApi.js +4 -2
  81. package/dist/runtime/composables/useCredentialTypes.js +8 -6
  82. package/dist/runtime/composables/useIntegrationsAudit.js +4 -3
  83. package/dist/runtime/composables/useIntegrationsCredentials.js +10 -8
  84. package/dist/runtime/composables/useIntegrationsDeadLetters.js +7 -6
  85. package/dist/runtime/composables/useIntegrationsFocus.d.ts +12 -0
  86. package/dist/runtime/composables/useIntegrationsLocale.d.ts +26 -0
  87. package/dist/runtime/composables/useIntegrationsLocale.js +8 -0
  88. package/dist/runtime/composables/useIntegrationsNodes.js +7 -5
  89. package/dist/runtime/composables/useIntegrationsRealtime.d.ts +149 -0
  90. package/dist/runtime/composables/useIntegrationsRealtime.js +80 -0
  91. package/dist/runtime/composables/useIntegrationsRevisions.js +9 -7
  92. package/dist/runtime/composables/useIntegrationsRuns.d.ts +1 -1
  93. package/dist/runtime/composables/useIntegrationsRuns.js +14 -7
  94. package/dist/runtime/composables/useIntegrationsSchedules.d.ts +4 -0
  95. package/dist/runtime/composables/useIntegrationsSchedules.js +10 -3
  96. package/dist/runtime/composables/useIntegrationsSecrets.js +14 -9
  97. package/dist/runtime/composables/useIntegrationsT.d.ts +35 -0
  98. package/dist/runtime/composables/useIntegrationsT.js +9 -0
  99. package/dist/runtime/composables/useIntegrationsTemplates.d.ts +3 -3
  100. package/dist/runtime/composables/useIntegrationsTemplates.js +28 -16
  101. package/dist/runtime/composables/useIntegrationsTriggers.js +10 -8
  102. package/dist/runtime/composables/useIntegrationsWorkflows.js +13 -7
  103. package/dist/runtime/composables/useLoadGate.d.ts +17 -0
  104. package/dist/runtime/composables/useLoadGate.js +8 -0
  105. package/dist/runtime/composables/useNodeConfigResolve.js +2 -1
  106. package/dist/runtime/data/branchReorder.d.ts +37 -0
  107. package/dist/runtime/data/branchReorder.js +71 -0
  108. package/dist/runtime/data/handleId.d.ts +23 -0
  109. package/dist/runtime/data/handleId.js +6 -0
  110. package/dist/runtime/data/integrationNodeCatalog.d.ts +41 -0
  111. package/dist/runtime/data/integrationNodeCatalog.js +14 -0
  112. package/dist/runtime/data/integrationTemplates.d.ts +48 -0
  113. package/dist/runtime/data/integrationTemplates.js +21 -0
  114. package/dist/runtime/data/integrationWorkflowSamples.js +1 -1
  115. package/dist/runtime/data/nodeIcons.d.ts +2 -0
  116. package/dist/runtime/data/nodeIcons.js +73 -0
  117. package/dist/runtime/data/nodeInputData.d.ts +16 -4
  118. package/dist/runtime/data/nodeInputData.js +4 -0
  119. package/dist/runtime/data/payloadForm.d.ts +9 -2
  120. package/dist/runtime/data/payloadForm.js +29 -4
  121. package/dist/runtime/data/portTone.d.ts +17 -0
  122. package/dist/runtime/data/portTone.js +7 -0
  123. package/dist/runtime/data/webhookAuth.d.ts +18 -0
  124. package/dist/runtime/data/webhookAuth.js +19 -0
  125. package/dist/runtime/data/workflowIconCatalog.js +4 -6
  126. package/dist/runtime/i18n/messages/de.json +1207 -0
  127. package/dist/runtime/i18n/messages/en.json +1207 -0
  128. package/dist/runtime/i18n/translate.d.ts +83 -0
  129. package/dist/runtime/i18n/translate.js +41 -0
  130. package/dist/runtime/pages/integrations/audit.vue +140 -37
  131. package/dist/runtime/pages/integrations/credentials/oauth-complete.vue +9 -6
  132. package/dist/runtime/pages/integrations/credentials.vue +180 -64
  133. package/dist/runtime/pages/integrations/index.vue +91 -92
  134. package/dist/runtime/pages/integrations/runs.vue +33 -21
  135. package/dist/runtime/pages/integrations/schedules.vue +88 -23
  136. package/dist/runtime/pages/integrations/secrets.vue +57 -35
  137. package/dist/runtime/pages/integrations/templates/[slug].vue +119 -88
  138. package/dist/runtime/pages/integrations/templates/index.vue +82 -103
  139. package/dist/runtime/pages/integrations/workflows/[id].vue +344 -91
  140. package/dist/runtime/pages/integrations/workflows/index.vue +23 -5
  141. package/dist/runtime/plugins/locale.d.ts +10 -0
  142. package/dist/runtime/plugins/locale.js +6 -0
  143. package/dist/runtime/plugins/realtime.client.d.ts +32 -0
  144. package/dist/runtime/plugins/realtime.client.js +4 -0
  145. package/dist/runtime/types/integrations.d.ts +65 -6
  146. package/dist/runtime/utils/apiError.d.ts +47 -0
  147. package/dist/runtime/utils/apiError.js +32 -0
  148. package/dist/runtime/utils/cockpitSources.d.ts +153 -0
  149. package/dist/runtime/utils/cockpitSources.js +14 -0
  150. package/dist/runtime/utils/credentialState.d.ts +24 -1
  151. package/dist/runtime/utils/credentialState.js +26 -11
  152. package/dist/runtime/utils/loadGate.d.ts +61 -0
  153. package/dist/runtime/utils/loadGate.js +22 -0
  154. package/dist/runtime/utils/localize.d.ts +46 -4
  155. package/dist/runtime/utils/localize.js +34 -7
  156. package/dist/runtime/utils/notify.d.ts +59 -0
  157. package/dist/runtime/utils/notify.js +21 -0
  158. package/dist/runtime/utils/pollBudget.d.ts +72 -0
  159. package/dist/runtime/utils/pollBudget.js +17 -0
  160. package/dist/runtime/utils/revenexxCredentialSource.d.ts +26 -0
  161. package/dist/runtime/utils/revenexxCredentialSource.js +8 -0
  162. package/dist/runtime/utils/schedule.d.ts +116 -0
  163. package/dist/runtime/utils/schedule.js +219 -0
  164. package/dist/runtime/utils/statusStyle.d.ts +26 -2
  165. package/dist/runtime/utils/statusStyle.js +9 -1
  166. package/dist/runtime/utils/validationFindings.d.ts +101 -0
  167. package/dist/runtime/utils/validationFindings.js +54 -0
  168. package/dist/runtime/utils/whenIdle.d.ts +42 -0
  169. package/dist/runtime/utils/whenIdle.js +12 -0
  170. package/dist/types.d.mts +2 -6
  171. package/package.json +10 -3
@@ -0,0 +1,1207 @@
1
+ {
2
+ "integration.audit.action.copy": "copy",
3
+ "integration.audit.action.create": "create",
4
+ "integration.audit.action.delete": "delete",
5
+ "integration.audit.action.loadMore": "Load more",
6
+ "integration.audit.action.runFailed": "run failed",
7
+ "integration.audit.action.runFinished": "run finished",
8
+ "integration.audit.action.runStarted": "run started",
9
+ "integration.audit.action.update": "update",
10
+ "integration.audit.actor.system": "system",
11
+ "integration.audit.detail.detailsHeading": "Details",
12
+ "integration.audit.detail.id": "ID",
13
+ "integration.audit.detail.tenant": "Tenant",
14
+ "integration.audit.head.title": "Audit Log · Integration Studio",
15
+ "integration.audit.header.description": "Who changed what, and when. Append-only, per-tenant — credentials, secrets, workflows, triggers and runs.",
16
+ "integration.audit.header.title": "Audit Log",
17
+ "integration.audit.panel.close.aria": "Close entry details",
18
+ "integration.audit.panel.dismiss.aria": "Dismiss entry details",
19
+ "integration.audit.panel.title.aria": "Audit entry details",
20
+ "integration.audit.resourceType.credential": "credential",
21
+ "integration.audit.resourceType.secret": "secret",
22
+ "integration.audit.resourceType.trigger": "trigger",
23
+ "integration.audit.resourceType.workflow": "workflow",
24
+ "integration.audit.resourceType.workflowRun": "workflow run",
25
+ "integration.audit.search.placeholder": "Search action, resource, actor…",
26
+ "integration.audit.state.empty": "No audit entries match.",
27
+ "integration.audit.table.column.action": "Action",
28
+ "integration.audit.table.column.actor": "Actor",
29
+ "integration.audit.table.column.resource": "Resource",
30
+ "integration.audit.table.column.when": "When",
31
+ "integration.audit.toast.copied": "Copied",
32
+ "integration.canvas.badge.trigger": "Trigger",
33
+ "integration.canvas.color.amber": "Amber",
34
+ "integration.canvas.color.blue": "Blue",
35
+ "integration.canvas.color.gray": "Grey",
36
+ "integration.canvas.color.green": "Green",
37
+ "integration.canvas.color.orange": "Orange",
38
+ "integration.canvas.color.rose": "Rose",
39
+ "integration.canvas.color.violet": "Violet",
40
+ "integration.canvas.contextMenu.header.selectionCount": "{n} node selected | {n} nodes selected",
41
+ "integration.canvas.contextMenu.item.addNode": "Add node…",
42
+ "integration.canvas.contextMenu.item.addSticky": "Add sticky",
43
+ "integration.canvas.contextMenu.item.clearSelection": "Clear selection",
44
+ "integration.canvas.contextMenu.item.copy": "Copy",
45
+ "integration.canvas.contextMenu.item.copyNodes": "Copy {n} node | Copy {n} nodes",
46
+ "integration.canvas.contextMenu.item.deleteNodes": "Delete {n} node | Delete {n} nodes",
47
+ "integration.canvas.contextMenu.item.duplicate": "Duplicate",
48
+ "integration.canvas.contextMenu.item.duplicateNodes": "Duplicate {n} node | Duplicate {n} nodes",
49
+ "integration.canvas.contextMenu.item.fitView": "Fit view",
50
+ "integration.canvas.contextMenu.item.groupNodes": "Group {n} node | Group {n} nodes",
51
+ "integration.canvas.contextMenu.item.open": "Open",
52
+ "integration.canvas.contextMenu.item.paste": "Paste",
53
+ "integration.canvas.contextMenu.item.rename": "Rename",
54
+ "integration.canvas.contextMenu.item.runWorkflow": "Run workflow",
55
+ "integration.canvas.contextMenu.item.selectAll": "Select all",
56
+ "integration.canvas.contextMenu.item.tidyUp": "Tidy up",
57
+ "integration.canvas.edge.action.delete": "Delete this connection",
58
+ "integration.canvas.edge.action.insertNode": "Insert a node into this connection",
59
+ "integration.canvas.eventCombobox.loading": "Loading event catalogue…",
60
+ "integration.canvas.group.action.collapse": "Collapse group",
61
+ "integration.canvas.group.action.expand": "Expand group",
62
+ "integration.canvas.group.action.removeFrame": "Remove group frame",
63
+ "integration.canvas.group.action.resize": "Resize group",
64
+ "integration.canvas.group.action.ungroup": "Ungroup (keep the nodes)",
65
+ "integration.canvas.group.defaultLabel": "Group",
66
+ "integration.canvas.group.input.nameAria": "Group name",
67
+ "integration.canvas.group.memberCount": "{n} node | {n} nodes",
68
+ "integration.canvas.node.action.configure": "Configure",
69
+ "integration.canvas.node.action.deleteAria": "Delete node",
70
+ "integration.canvas.node.action.duplicate": "Duplicate",
71
+ "integration.canvas.node.action.duplicateAria": "Duplicate node",
72
+ "integration.canvas.node.badge.invalidConfig": "Config incomplete — {n} setting still needs fixing: {fields} | Config incomplete — {n} settings still need fixing: {fields}",
73
+ "integration.canvas.node.handle.input": "Input",
74
+ "integration.canvas.node.meta.versionTitle": "Version {version}",
75
+ "integration.canvas.node.note.heading": "Note",
76
+ "integration.canvas.node.port.outputFallback": "out",
77
+ "integration.canvas.node.port.resolving": "Ports",
78
+ "integration.canvas.palette.action.back": "Back",
79
+ "integration.canvas.palette.footer.hint": "Drag onto the canvas — or click to insert.",
80
+ "integration.canvas.palette.group.core": "Core",
81
+ "integration.canvas.palette.group.integrations": "Integrations",
82
+ "integration.canvas.palette.group.triggers": "Triggers",
83
+ "integration.canvas.palette.search.ariaAll": "Search all nodes",
84
+ "integration.canvas.palette.search.ariaGroup": "Search in {group}",
85
+ "integration.canvas.palette.search.empty": "Nothing matches “{query}”.",
86
+ "integration.canvas.palette.search.placeholderAll": "Search all nodes…",
87
+ "integration.canvas.palette.search.placeholderGroup": "Search in {group}…",
88
+ "integration.canvas.palette.title.addNode": "Add node",
89
+ "integration.canvas.palette.version.selectAria": "Version to insert for {name}",
90
+ "integration.canvas.sticky.action.delete": "Delete note",
91
+ "integration.canvas.sticky.action.resize": "Resize",
92
+ "integration.canvas.sticky.state.emptyHint": "Double-click to edit",
93
+ "integration.canvas.sticky.textarea.aria": "Note text",
94
+ "integration.canvas.sticky.textarea.placeholder": "Write a note… (# heading, **bold**, *italic*, `code`, [link](https://…), - list)",
95
+ "integration.canvas.trigger.action.deleteAria": "Delete trigger",
96
+ "integration.canvas.trigger.badge.inactive": "Inactive",
97
+ "integration.canvas.trigger.subtitle.noEvent": "no event set",
98
+ "integration.canvas.trigger.subtitle.noSchedule": "no schedule set",
99
+ "integration.canvas.trigger.subtitle.onDemand": "On demand",
100
+ "integration.canvas.trigger.subtitle.onEvent": "on {event}",
101
+ "integration.common.action.cancel": "Cancel",
102
+ "integration.common.action.close": "Close",
103
+ "integration.common.action.confirm": "Confirm",
104
+ "integration.common.action.copy": "Copy",
105
+ "integration.common.action.delete": "Delete",
106
+ "integration.common.action.paste": "Paste",
107
+ "integration.common.action.refresh": "Refresh",
108
+ "integration.common.action.retry": "Try again",
109
+ "integration.common.action.save": "Save",
110
+ "integration.common.action.seeAll": "See all",
111
+ "integration.common.action.viewAll": "View all",
112
+ "integration.common.error.notSignedIn": "Not signed in.",
113
+ "integration.common.error.requestFailed": "Integrations request failed",
114
+ "integration.common.label.file": "File",
115
+ "integration.common.list.and": "and",
116
+ "integration.common.state.deleting": "Deleting…",
117
+ "integration.common.state.loading": "Loading…",
118
+ "integration.common.state.saving": "Saving…",
119
+ "integration.common.time.daysAgo": "{n}d ago",
120
+ "integration.common.time.hoursAgo": "{n}h ago",
121
+ "integration.common.time.justNow": "just now",
122
+ "integration.common.time.minutesAgo": "{n}m ago",
123
+ "integration.common.time.secondsAgo": "{n}s ago",
124
+ "integration.common.triggerType.event": "Event",
125
+ "integration.common.triggerType.manual": "Manual",
126
+ "integration.common.triggerType.schedule": "Schedule",
127
+ "integration.common.triggerType.webhook": "Webhook",
128
+ "integration.credentials.createDialog.action.changeType": "Change type",
129
+ "integration.credentials.createDialog.description": "Create a credential for this node without leaving the editor.",
130
+ "integration.credentials.createDialog.error.create": "Could not create credential.",
131
+ "integration.credentials.createDialog.field.name.placeholder": "e.g. Production key",
132
+ "integration.credentials.createDialog.noTypeAvailable": "No credential type available for this field.",
133
+ "integration.credentials.detail.action.deleteCredential": "Delete credential",
134
+ "integration.credentials.detail.action.reconnect": "Reconnect",
135
+ "integration.credentials.detail.dangerZone.description": "Deleting this credential breaks any workflow that references it until it's re-bound.",
136
+ "integration.credentials.detail.dangerZone.title": "Danger zone",
137
+ "integration.credentials.detail.field.authKind": "Auth kind",
138
+ "integration.credentials.detail.field.created": "Created",
139
+ "integration.credentials.detail.field.id": "Credential ID",
140
+ "integration.credentials.detail.field.lastTested": "Last tested",
141
+ "integration.credentials.detail.field.type": "Type",
142
+ "integration.credentials.detail.field.typeSlug": "Type slug",
143
+ "integration.credentials.detail.field.updated": "Updated",
144
+ "integration.credentials.detail.field.version": "Version",
145
+ "integration.credentials.detail.state.untestedHint": "Run a test to verify these credentials actually connect.",
146
+ "integration.credentials.detail.tab.credentials": "Credentials",
147
+ "integration.credentials.detail.tab.details": "Details",
148
+ "integration.credentials.error.delete": "Could not delete credential.",
149
+ "integration.credentials.error.loadFailed": "Could not load credentials.",
150
+ "integration.credentials.error.loadTypes": "Could not load credential types.",
151
+ "integration.credentials.error.noAuthorizeUrl": "No authorize URL returned.",
152
+ "integration.credentials.error.oauthConnect": "Could not start OAuth connect.",
153
+ "integration.credentials.error.save": "Could not save credential.",
154
+ "integration.credentials.error.testFailed": "Connection test failed.",
155
+ "integration.credentials.list.action.delete.aria": "Delete {name}",
156
+ "integration.credentials.list.action.new": "New credential",
157
+ "integration.credentials.list.action.reconnect": "Reconnect",
158
+ "integration.credentials.list.action.reconnect.aria": "Reconnect {name}",
159
+ "integration.credentials.list.dialog.action.back": "Back",
160
+ "integration.credentials.list.dialog.description.create": "Pick a type and fill in its access data.",
161
+ "integration.credentials.list.dialog.description.edit": "Update the credential. Leave secret fields blank to keep the current value.",
162
+ "integration.credentials.list.dialog.field.name.placeholder": "e.g. Production SMTP",
163
+ "integration.credentials.list.empty": "No credentials yet — hit “{action}” to connect your first system.",
164
+ "integration.credentials.list.head.title": "Credentials · Revenexx Cockpit",
165
+ "integration.credentials.list.header.description": "Typed, testable access data for the systems your workflows talk to — one per connection.",
166
+ "integration.credentials.list.header.title": "Credentials",
167
+ "integration.credentials.list.search.placeholder": "Search credentials…",
168
+ "integration.credentials.list.table.column.connected": "Connected",
169
+ "integration.credentials.list.table.column.created": "Created",
170
+ "integration.credentials.list.table.column.name": "Name",
171
+ "integration.credentials.list.table.column.status": "Status",
172
+ "integration.credentials.list.table.column.system": "System",
173
+ "integration.credentials.list.table.column.updated": "Updated",
174
+ "integration.credentials.oauthComplete.hint.closing": "Done — closing…",
175
+ "integration.credentials.oauthComplete.hint.open": "You can close this window.",
176
+ "integration.credentials.oauthComplete.title": "Connection complete",
177
+ "integration.credentials.revenexxSource.action.create": "Create",
178
+ "integration.credentials.revenexxSource.action.createApiKey": "Create new API key",
179
+ "integration.credentials.revenexxSource.action.new": "New",
180
+ "integration.credentials.revenexxSource.createDialog.description.api": "A full-access key is minted for {tenant} and copied straight into this credential.",
181
+ "integration.credentials.revenexxSource.createDialog.description.sftp": "Reserves a new SFTP account for {tenant} and fills its login here.",
182
+ "integration.credentials.revenexxSource.createDialog.description.smtp": "Creates a new SMTP credential and fills its login here.",
183
+ "integration.credentials.revenexxSource.createDialog.field.label": "Label",
184
+ "integration.credentials.revenexxSource.createDialog.field.name": "Name",
185
+ "integration.credentials.revenexxSource.createDialog.field.placeholder.default": "e.g. Production",
186
+ "integration.credentials.revenexxSource.createDialog.field.placeholder.sftp": "e.g. imports",
187
+ "integration.credentials.revenexxSource.error.accountProvisioning": "Account still provisioning — try again in a moment.",
188
+ "integration.credentials.revenexxSource.error.createApiKey": "Could not create the API key.",
189
+ "integration.credentials.revenexxSource.error.createSftp": "Could not create the SFTP account.",
190
+ "integration.credentials.revenexxSource.error.createSmtp": "Could not create the mail credential.",
191
+ "integration.credentials.revenexxSource.error.loadResources": "Could not load revenexx resources.",
192
+ "integration.credentials.revenexxSource.error.mailCredentialGone": "That mail credential is no longer there.",
193
+ "integration.credentials.revenexxSource.error.mailCredentialNotReturned": "The mail credential was not returned — pick it from the list once it appears.",
194
+ "integration.credentials.revenexxSource.error.noTenant": "No tenant selected.",
195
+ "integration.credentials.revenexxSource.error.provisioningFailed": "Provisioning failed.",
196
+ "integration.credentials.revenexxSource.error.readMailCredential": "Could not read the mail credential.",
197
+ "integration.credentials.revenexxSource.error.readSftpPassword": "Could not read the SFTP password.",
198
+ "integration.credentials.revenexxSource.error.stillProvisioning": "Still provisioning — pick it from the list once it turns active.",
199
+ "integration.credentials.revenexxSource.field.market.label": "Market",
200
+ "integration.credentials.revenexxSource.field.market.placeholder": "Select market",
201
+ "integration.credentials.revenexxSource.field.resource.mailLabel": "Mail credential",
202
+ "integration.credentials.revenexxSource.field.resource.placeholder": "Select one",
203
+ "integration.credentials.revenexxSource.field.resource.sftpLabel": "SFTP account",
204
+ "integration.credentials.revenexxSource.field.tenant.label": "Tenant",
205
+ "integration.credentials.revenexxSource.field.tenant.placeholder": "Select tenant",
206
+ "integration.credentials.revenexxSource.hint.available": "Reuse an existing revenexx resource instead of typing access data by hand.",
207
+ "integration.credentials.revenexxSource.hint.unavailable": "Not available here — the managed revenexx resources live in the cockpit. Enter the access data by hand instead.",
208
+ "integration.credentials.revenexxSource.market.global": "Global (tenant baseline)",
209
+ "integration.credentials.revenexxSource.new.api": "New API key",
210
+ "integration.credentials.revenexxSource.new.fallback": "New",
211
+ "integration.credentials.revenexxSource.new.sftp": "New SFTP account",
212
+ "integration.credentials.revenexxSource.new.smtp": "New mail credential",
213
+ "integration.credentials.revenexxSource.status.copying": "Copying access data…",
214
+ "integration.credentials.revenexxSource.status.keyForGlobal": "Key for {tenant} · global",
215
+ "integration.credentials.revenexxSource.status.keyForMarket": "Key for {tenant} · {market}",
216
+ "integration.credentials.revenexxSource.status.provisioning": "Provisioning the account…",
217
+ "integration.credentials.revenexxSource.status.using": "Using {value}",
218
+ "integration.credentials.revenexxSource.switch.api": "Use revenexx API Keys",
219
+ "integration.credentials.revenexxSource.switch.sftp": "Use revenexx SFTP Servers",
220
+ "integration.credentials.revenexxSource.switch.smtp": "Use revenexx Mail Servers",
221
+ "integration.credentials.revenexxSource.toast.apiKeyCreated": "API key created",
222
+ "integration.credentials.revenexxSource.toast.sftpCreated": "SFTP account created",
223
+ "integration.credentials.revenexxSource.toast.smtpCreated": "Mail credential created",
224
+ "integration.credentials.sftpImport.badge.active": "Active",
225
+ "integration.credentials.sftpImport.description": "Creates an SFTP credential from a managed platform account — host, username and password are copied once. Later password changes must be re-imported.",
226
+ "integration.credentials.sftpImport.empty": "No active platform SFTP accounts. Create one under Integration Studio → SFTP first.",
227
+ "integration.credentials.sftpImport.error.importFailed": "Import failed.",
228
+ "integration.credentials.sftpImport.error.readPassword": "Could not read the account password.",
229
+ "integration.credentials.sftpImport.title": "Import platform SFTP account",
230
+ "integration.credentials.shared.action.testConnection": "Connect",
231
+ "integration.credentials.shared.authKind.apiKey": "API Key",
232
+ "integration.credentials.shared.authKind.basicAuth": "Basic Auth",
233
+ "integration.credentials.shared.authKind.oauth2": "OAuth2",
234
+ "integration.credentials.shared.authKind.secret": "Secret",
235
+ "integration.credentials.shared.authKind.static": "Static",
236
+ "integration.credentials.shared.confirm.delete.body": "will be removed. Workflows that reference it will fail until they are re-bound to another credential.",
237
+ "integration.credentials.shared.confirm.delete.title": "Delete credential?",
238
+ "integration.credentials.shared.dialog.title.create": "New credential",
239
+ "integration.credentials.shared.dialog.title.edit": "Edit credential",
240
+ "integration.credentials.shared.field.name.label": "Name",
241
+ "integration.credentials.shared.field.secret.placeholder": "Leave blank to keep current",
242
+ "integration.credentials.shared.field.select.placeholder": "Pick one",
243
+ "integration.credentials.shared.oauthHint": "After saving, a window opens to connect with the provider.",
244
+ "integration.credentials.shared.test.failed": "Connection failed.",
245
+ "integration.credentials.shared.test.ok": "Connection ok.",
246
+ "integration.credentials.state.connected": "Connected",
247
+ "integration.credentials.state.failed": "Failed",
248
+ "integration.credentials.state.needsReconnect": "Needs reconnect",
249
+ "integration.credentials.state.untested": "Not Connected",
250
+ "integration.credentials.toast.connected": "Connected",
251
+ "integration.credentials.toast.created": "Credential created",
252
+ "integration.credentials.toast.deleted": "Credential deleted",
253
+ "integration.credentials.toast.updated": "Credential updated",
254
+ "integration.credentials.typePicker.empty": "No credential type matches “{query}”.",
255
+ "integration.credentials.typePicker.search.aria": "Search for an app",
256
+ "integration.credentials.typePicker.search.placeholder": "Search for an app…",
257
+ "integration.dashboard.action.browseTemplates": "Browse templates",
258
+ "integration.dashboard.action.newWorkflow": "New workflow",
259
+ "integration.dashboard.attention.failed": "Failed.",
260
+ "integration.dashboard.attention.healthy": "All workflows healthy.",
261
+ "integration.dashboard.attention.missedRuns": "{n} missed run | {n} missed runs",
262
+ "integration.dashboard.attention.missedRuns.hint": "Triggers fired while their workflow couldn't run — review & replay.",
263
+ "integration.dashboard.attention.title": "Needs attention",
264
+ "integration.dashboard.head.title": "Dashboard · Integration Studio",
265
+ "integration.dashboard.header.description": "Everything that connects Revenue Cloud to the outside world.",
266
+ "integration.dashboard.header.title": "Dashboard",
267
+ "integration.dashboard.kpi.activeWorkflows.label": "Active workflows",
268
+ "integration.dashboard.kpi.activeWorkflows.sub": "{n} paused or draft | {n} paused or drafts",
269
+ "integration.dashboard.kpi.aria.group": "Key figures",
270
+ "integration.dashboard.kpi.missedRuns.label": "Missed runs",
271
+ "integration.dashboard.kpi.missedRuns.sub": "trigger firings without a run",
272
+ "integration.dashboard.kpi.runningNow.label": "Running now",
273
+ "integration.dashboard.kpi.runningNow.sub": "live executions in flight",
274
+ "integration.dashboard.kpi.scheduled.label": "Scheduled",
275
+ "integration.dashboard.kpi.scheduled.sub": "scheduled triggers active",
276
+ "integration.dashboard.runs.empty": "No runs yet.",
277
+ "integration.dashboard.runs.title": "Latest executions",
278
+ "integration.dashboard.surface.events.hint": "Live platform events that workflows subscribe to.",
279
+ "integration.dashboard.surface.events.label": "Event Stream",
280
+ "integration.dashboard.surface.io.hint": "Profiles that move catalogue and entity data in and out.",
281
+ "integration.dashboard.surface.io.label": "Import & Export",
282
+ "integration.dashboard.surface.sftp.hint": "Managed SFTP endpoints for file-based exchange.",
283
+ "integration.dashboard.surface.sftp.label": "SFTP Server",
284
+ "integration.dashboard.surface.webhooks.hint": "Inbound HTTP endpoints that trigger workflows.",
285
+ "integration.dashboard.surface.webhooks.label": "Webhooks",
286
+ "integration.dashboard.templates.empty": "No templates registered yet.",
287
+ "integration.dashboard.templates.title": "Start from a template",
288
+ "integration.deadLetters.action.discard": "Discard",
289
+ "integration.deadLetters.action.replay": "Replay",
290
+ "integration.deadLetters.error.load": "Could not load missed runs.",
291
+ "integration.deadLetters.list.description": "Triggers that fired while their workflow couldn't run (bundle building or failed). Replay starts a fresh run from the captured payload.",
292
+ "integration.deadLetters.pagination.newer": "← Newer",
293
+ "integration.deadLetters.pagination.older": "Older →",
294
+ "integration.deadLetters.pagination.summary": "Page {page} / {lastPage} · {total} total",
295
+ "integration.deadLetters.panel.description": "Triggers that fired while this workflow couldn't run (bundle building or failed). Replay starts a fresh run from the captured payload.",
296
+ "integration.deadLetters.panel.title": "Missed runs",
297
+ "integration.deadLetters.reason.fallback": "No reason recorded.",
298
+ "integration.deadLetters.state.empty": "No missed runs. Every trigger firing made it into a run.",
299
+ "integration.deadLetters.tabs.missed.label": "Missed runs",
300
+ "integration.deadLetters.toast.discard.done": "Discarded",
301
+ "integration.deadLetters.toast.discard.error": "Could not discard.",
302
+ "integration.deadLetters.toast.replay.done": "Replayed",
303
+ "integration.deadLetters.toast.replay.error": "Could not replay.",
304
+ "integration.deadLetters.toast.replay.started": "Replayed — started run #{id}",
305
+ "integration.editor.action.activate.label": "Activate",
306
+ "integration.editor.action.activate.title": "Activate this workflow",
307
+ "integration.editor.action.activate.title.invalid": "Fix {n} node setting before activating | Fix {n} node settings before activating",
308
+ "integration.editor.action.backToWorkflow": "Back to Workflow",
309
+ "integration.editor.action.discard.label": "Cancel",
310
+ "integration.editor.action.discard.title": "Discard unsaved changes",
311
+ "integration.editor.action.duplicate.label": "Duplicate",
312
+ "integration.editor.action.duplicate.title": "Duplicate this workflow",
313
+ "integration.editor.action.pause.label": "Pause",
314
+ "integration.editor.action.pause.title": "Pause this workflow",
315
+ "integration.editor.action.retry": "Retry",
316
+ "integration.editor.action.save.label": "Save",
317
+ "integration.editor.action.save.saving": "Saving…",
318
+ "integration.editor.activate.error.generic": "Could not change the workflow status.",
319
+ "integration.editor.activate.error.needsFixing": "Can’t activate — {n} setting still needs fixing (see the banner above). | Can’t activate — {n} settings still need fixing (see the banner above).",
320
+ "integration.editor.activate.error.validationIssues": "Can’t activate — {n} validation issue to fix. | Can’t activate — {n} validation issues to fix.",
321
+ "integration.editor.appearance.error.generic": "Could not save the appearance.",
322
+ "integration.editor.appearance.toast.saved": "Appearance saved",
323
+ "integration.editor.breadcrumb.runNumber": "Run #{id}",
324
+ "integration.editor.breadcrumb.runs": "Runs",
325
+ "integration.editor.breadcrumb.workflows": "Workflows",
326
+ "integration.editor.build.chip.building": "Building bundle…",
327
+ "integration.editor.build.chip.queued": "Build queued…",
328
+ "integration.editor.build.notice.building": "The workflow bundle is still building — runs are unavailable until it is ready.",
329
+ "integration.editor.build.notice.failed": "The workflow bundle failed to build. Save the workflow again to retry the build.",
330
+ "integration.editor.build.notice.failedWithError": "The workflow bundle failed to build: {error} Save the workflow again to retry the build.",
331
+ "integration.editor.build.notice.pending": "The workflow bundle build is queued — runs are unavailable until it is ready.",
332
+ "integration.editor.build.toast.failed": "The workflow bundle failed to build — the run was not started.",
333
+ "integration.editor.build.toast.timeout": "The bundle build is taking unusually long — try the run again once it is ready.",
334
+ "integration.editor.build.tooltip.failed": "The workflow bundle failed to build.",
335
+ "integration.editor.clipboard.error.empty": "Clipboard does not contain nodes",
336
+ "integration.editor.clipboard.error.read": "Could not read the clipboard",
337
+ "integration.editor.clipboard.error.write": "Could not write to the clipboard",
338
+ "integration.editor.clipboard.toast.copied": "Node copied | {n} nodes copied",
339
+ "integration.editor.deactivate.dialog.cancel": "Cancel",
340
+ "integration.editor.deactivate.dialog.confirm": "Save as paused",
341
+ "integration.editor.deactivate.dialog.description.paused": "paused",
342
+ "integration.editor.deactivate.dialog.description.post": "to keep your changes, then fix them and activate again — or cancel to discard this save.",
343
+ "integration.editor.deactivate.dialog.description.pre": "These node settings must be valid while the workflow is active. Save it as",
344
+ "integration.editor.deactivate.dialog.title": "Can’t keep this workflow active",
345
+ "integration.editor.deactivate.toast.savedPaused": "Saved as paused — fix the highlighted settings, then activate again.",
346
+ "integration.editor.dropGhost.label": "Drop to add",
347
+ "integration.editor.emptyState.hint": "Drag a trigger and an action from the panel on the left.",
348
+ "integration.editor.emptyState.title": "Empty canvas",
349
+ "integration.editor.event.toast.noneReceived": "No {topic} event received yet.",
350
+ "integration.editor.executionMode.async.hint": "Runs are always queued; the trigger returns immediately.",
351
+ "integration.editor.executionMode.async.label": "Async only",
352
+ "integration.editor.executionMode.async.short": "Async",
353
+ "integration.editor.executionMode.callerDecides.hint": "The caller chooses sync or async per run.",
354
+ "integration.editor.executionMode.callerDecides.label": "Caller decides",
355
+ "integration.editor.executionMode.error.generic": "Could not update the execution mode.",
356
+ "integration.editor.executionMode.sync.hint": "Runs block until they finish and return the result inline.",
357
+ "integration.editor.executionMode.sync.label": "Sync only",
358
+ "integration.editor.executionMode.sync.short": "Sync",
359
+ "integration.editor.group.defaultLabel": "Group {n}",
360
+ "integration.editor.head.title": "{name} · Revenexx Cockpit",
361
+ "integration.editor.head.untitled": "Workflow",
362
+ "integration.editor.header.executionMode.title": "Execution mode: {mode}",
363
+ "integration.editor.minimap.action.bottomLeft": "Bottom left",
364
+ "integration.editor.minimap.action.bottomRight": "Bottom right",
365
+ "integration.editor.minimap.action.collapse.title": "Collapse the minimap",
366
+ "integration.editor.minimap.action.expand.title": "Expand the minimap",
367
+ "integration.editor.minimap.action.placement.title": "Minimap placement",
368
+ "integration.editor.minimap.action.topLeft": "Top left",
369
+ "integration.editor.minimap.action.topRight": "Top right",
370
+ "integration.editor.minimap.title": "Map",
371
+ "integration.editor.mode.word.async": "async",
372
+ "integration.editor.mode.word.sync": "sync",
373
+ "integration.editor.palette.action.collapse.title": "Collapse the palette",
374
+ "integration.editor.palette.action.dockLeft": "Dock left",
375
+ "integration.editor.palette.action.dockRight": "Dock right",
376
+ "integration.editor.palette.action.expand.title": "Expand the node palette",
377
+ "integration.editor.palette.action.placement.title": "Palette placement",
378
+ "integration.editor.palette.title": "Add node",
379
+ "integration.editor.panel.action.collapse": "Collapse",
380
+ "integration.editor.panel.action.floatHere": "Float here",
381
+ "integration.editor.payload.error.invalidJson": "Trigger payload is not valid JSON.",
382
+ "integration.editor.quickConnect.toast": "Pick a node — it will be added right there, already connected.",
383
+ "integration.editor.reauth.action.fix": "fix in Credentials",
384
+ "integration.editor.reauth.banner": "{n} credential used here needs reconnecting | {n} credentials used here need reconnecting",
385
+ "integration.editor.retry.error.generic": "Could not retry the run.",
386
+ "integration.editor.retry.toast.requested": "Retry requested",
387
+ "integration.editor.retry.toast.started": "Started run #{id}",
388
+ "integration.editor.run.button": "Run",
389
+ "integration.editor.run.error.couldNotStart": "Could not start the run.",
390
+ "integration.editor.run.error.loadOpenRun": "Could not load the run.",
391
+ "integration.editor.run.error.refusedForSettings": "Can’t run — {summary}{where}",
392
+ "integration.editor.run.error.syncFailed": "Sync run failed",
393
+ "integration.editor.run.error.syncTimeout": "Sync run timed out",
394
+ "integration.editor.run.loading": "Loading run…",
395
+ "integration.editor.run.waitingForBuild": "Waiting for build…",
396
+ "integration.editor.runPayload.action.latestEvent": "Latest real event",
397
+ "integration.editor.runPayload.action.latestEvent.title": "Insert the latest received event of this topic",
398
+ "integration.editor.runPayload.action.run": "Run ({mode})",
399
+ "integration.editor.runPayload.action.sampleEvent": "Sample event",
400
+ "integration.editor.runPayload.action.sampleEvent.titleAvailable": "Insert the catalogue sample payload",
401
+ "integration.editor.runPayload.action.sampleEvent.titleUnavailable": "The event catalogue has no sample for this topic.",
402
+ "integration.editor.runPayload.dialog.description": "Starts a manual run with this trigger payload. The result lands on the Runs tab.",
403
+ "integration.editor.runPayload.dialog.title": "Run with payload",
404
+ "integration.editor.runPayload.prefill.label": "Prefill",
405
+ "integration.editor.runView.details": "Details",
406
+ "integration.editor.runView.replay": "Replay",
407
+ "integration.editor.runView.timeline": "Timeline",
408
+ "integration.editor.runs.empty": "No runs yet — hit Run in the editor.",
409
+ "integration.editor.runs.error.load": "Could not load runs.",
410
+ "integration.editor.runs.pagination.count": "{n} run | {n} runs",
411
+ "integration.editor.runs.pagination.newer": "← Newer",
412
+ "integration.editor.runs.pagination.older": "Older →",
413
+ "integration.editor.runs.pagination.page": "Page {page} / {lastPage}",
414
+ "integration.editor.save.error.generic": "Save failed.",
415
+ "integration.editor.splice.error.terminal": "{name} ends the run and cannot be inserted into a connection.",
416
+ "integration.editor.splice.toast": "Pick a node from the palette — it will be inserted into the connection.",
417
+ "integration.editor.state.loading": "Loading…",
418
+ "integration.editor.status.unsavedChanges": "Unsaved changes",
419
+ "integration.editor.sticky.starterContent": "## I'm a note\n**Double-click** to edit me. **Bold**, *italic*, `code`, [links](https://revenexx.com) and\n- lists work",
420
+ "integration.editor.tab.deadLetters": "Missed runs",
421
+ "integration.editor.tab.editor": "Editor",
422
+ "integration.editor.tab.history": "History",
423
+ "integration.editor.tab.runs": "Runs",
424
+ "integration.editor.toast.duplicated": "Duplicated as “{name}”",
425
+ "integration.editor.tool.addGroup.label": "Group",
426
+ "integration.editor.tool.addGroup.tooltip": "Add group frame — nodes dropped inside join it",
427
+ "integration.editor.tool.addSticky.label": "Note",
428
+ "integration.editor.tool.addSticky.tooltip": "Add sticky note",
429
+ "integration.editor.tool.fitView.label": "Fit",
430
+ "integration.editor.tool.fitView.tooltip": "Fit view",
431
+ "integration.editor.tool.hand": "Hand (pan)",
432
+ "integration.editor.tool.run.tooltip": "Run workflow",
433
+ "integration.editor.tool.run.tooltipWaiting": "The bundle is still building — the run starts when it is ready",
434
+ "integration.editor.tool.select": "Select",
435
+ "integration.editor.tool.settings.label": "Settings",
436
+ "integration.editor.tool.settings.tooltip": "Workflow settings",
437
+ "integration.editor.tool.tidyUp": "Tidy up",
438
+ "integration.editor.tool.variables.label": "Variables",
439
+ "integration.editor.tool.variables.tooltip": "Workflow variables",
440
+ "integration.editor.tool.zoomIn": "Zoom in",
441
+ "integration.editor.tool.zoomLevel.aria": "Zoom level {pct}",
442
+ "integration.editor.tool.zoomLevel.inputAria": "Zoom level in percent",
443
+ "integration.editor.tool.zoomLevel.tooltip": "Zoom level, 0 resets to 100%",
444
+ "integration.editor.tool.zoomOut": "Zoom out",
445
+ "integration.editor.validation.banner.more": "…and {n} more — open a node to fix its config.",
446
+ "integration.editor.validation.banner.title": "This workflow can’t be activated yet — {summary}:",
447
+ "integration.editor.validation.node.ariaFix": "Fix {n} setting in {label} | Fix {n} settings in {label}",
448
+ "integration.history.action.loadMore": "Load older revisions",
449
+ "integration.history.action.restore": "Restore",
450
+ "integration.history.badge.active": "Active",
451
+ "integration.history.badge.activeHint": "Triggers are armed; this revision is what runs.",
452
+ "integration.history.badge.current": "Current",
453
+ "integration.history.badge.paused": "Paused",
454
+ "integration.history.badge.pausedHint": "Workflow is paused; activating runs this revision.",
455
+ "integration.history.confirm.restore": "Restore revision {revision}? The current version is archived first, then the workflow is rebuilt from this snapshot.",
456
+ "integration.history.heading.description": "Every save archives the previous revision; the newest one is what runs while the workflow is active.",
457
+ "integration.history.heading.title": "Version history",
458
+ "integration.history.list.revisionLabel": "Revision {revision}",
459
+ "integration.history.preview.title.current": "Current version · revision {revision}",
460
+ "integration.history.preview.title.revision": "Revision {revision} (read-only)",
461
+ "integration.history.state.empty": "No archived revisions yet — save a change to create the first snapshot.",
462
+ "integration.history.toast.loadRevisionFailed": "Could not load the revision.",
463
+ "integration.history.toast.restoreFailed": "Could not restore the revision.",
464
+ "integration.history.toast.restored": "Revision {revision} restored",
465
+ "integration.nav.action.hide": "Hide navigation",
466
+ "integration.nav.action.hide.title": "Hide the studio navigation and give the canvas its width — remembered for next time",
467
+ "integration.nav.action.show": "Show navigation",
468
+ "integration.nav.action.show.title": "Show the studio navigation beside the canvas — remembered for next time",
469
+ "integration.nav.item.audit": "Audit Log",
470
+ "integration.nav.item.credentials": "Credentials",
471
+ "integration.nav.item.dashboard": "Dashboard",
472
+ "integration.nav.item.runs": "Runs",
473
+ "integration.nav.item.schedules": "Schedules",
474
+ "integration.nav.item.secrets": "Secrets",
475
+ "integration.nav.item.templates": "Templates",
476
+ "integration.nav.item.workflows": "Workflows",
477
+ "integration.nav.section.integrations": "Integrations",
478
+ "integration.nav.title": "Integration Studio",
479
+ "integration.nodeConfig.action.addRow": "Add row",
480
+ "integration.nodeConfig.array.removeItemAria": "Remove item {n} of {label}",
481
+ "integration.nodeConfig.array.subFieldAria": "{label} of item {n}",
482
+ "integration.nodeConfig.credential.action.importSftp": "Import existing Revenue Cloud SFTP account",
483
+ "integration.nodeConfig.credential.action.new": "New credential",
484
+ "integration.nodeConfig.credential.empty": "No credentials yet.",
485
+ "integration.nodeConfig.credential.placeholder": "Pick a credential",
486
+ "integration.nodeConfig.credential.state.failed": "Last test failed: {message}",
487
+ "integration.nodeConfig.credential.state.needsReauth": "This credential needs reconnect.",
488
+ "integration.nodeConfig.credential.trigger.bound": "{label}: {name}, {state}",
489
+ "integration.nodeConfig.credential.trigger.unknown": "{label}: {unknown}",
490
+ "integration.nodeConfig.credential.unknown": "Unknown credential — pick again",
491
+ "integration.nodeConfig.dynamicField.currentNotResolved": "current value not in resolved options",
492
+ "integration.nodeConfig.dynamicField.empty": "no options available",
493
+ "integration.nodeConfig.dynamicField.emptyFiltered": "no options match the filter",
494
+ "integration.nodeConfig.dynamicField.gated": "Set {keys} first",
495
+ "integration.nodeConfig.dynamicField.multiselect.filterAria": "Filter the options for {label}",
496
+ "integration.nodeConfig.dynamicField.multiselect.filterPlaceholder": "Filter options",
497
+ "integration.nodeConfig.dynamicField.noMatch": "nothing matches \"{query}\"",
498
+ "integration.nodeConfig.dynamicField.notInList": "{value} (not in list)",
499
+ "integration.nodeConfig.dynamicField.reloading": "reloading…",
500
+ "integration.nodeConfig.dynamicField.resolving": "resolving options…",
501
+ "integration.nodeConfig.dynamicField.searching": "searching…",
502
+ "integration.nodeConfig.dynamicSchema.depthCapped": "nested dynamic-schema is not expanded further",
503
+ "integration.nodeConfig.dynamicSchema.empty": "No fields resolved.",
504
+ "integration.nodeConfig.dynamicSchema.fieldCollision": "resolved field '{key}' collides with a static config field — skipped",
505
+ "integration.nodeConfig.dynamicSchema.reloading": "reloading fields…",
506
+ "integration.nodeConfig.dynamicSchema.resolving": "Resolving fields…",
507
+ "integration.nodeConfig.expression.badge.title": "Accepts ${{ … }} expressions",
508
+ "integration.nodeConfig.expression.insertTitle": "Insert expression",
509
+ "integration.nodeConfig.expression.picker.empty": "Nothing matches “{query}”.",
510
+ "integration.nodeConfig.expression.picker.filterAria": "Filter available data",
511
+ "integration.nodeConfig.expression.picker.filterPlaceholder": "Filter…",
512
+ "integration.nodeConfig.expression.pill.inputPath": "Input · {rest}",
513
+ "integration.nodeConfig.expression.pill.inputPayload": "Input payload",
514
+ "integration.nodeConfig.expression.pill.triggerPath": "Trigger · {rest}",
515
+ "integration.nodeConfig.expression.pill.triggerPayload": "Trigger payload",
516
+ "integration.nodeConfig.expression.pill.variable": "Variable · {path}",
517
+ "integration.nodeConfig.expression.preview.missTitle": "Parts of this expression have no sample data yet",
518
+ "integration.nodeConfig.expression.suggestion.heading.input": "INPUT",
519
+ "integration.nodeConfig.expression.suggestion.heading.nodeOutputs": "NODE OUTPUTS",
520
+ "integration.nodeConfig.expression.suggestion.heading.variables": "VARIABLES",
521
+ "integration.nodeConfig.expression.suggestion.inputPayload": "input payload",
522
+ "integration.nodeConfig.expression.toggle.off": "Back to the regular control (clears the expression)",
523
+ "integration.nodeConfig.expression.toggle.on": "Map this value from a previous step instead",
524
+ "integration.nodeConfig.field.requiredMark": "Required",
525
+ "integration.nodeConfig.hint.charMax": "up to {max} characters",
526
+ "integration.nodeConfig.hint.charMin": "at least {min} characters",
527
+ "integration.nodeConfig.hint.charRange": "{min}–{max} characters",
528
+ "integration.nodeConfig.json.invalid": "Not valid JSON yet — the value is kept once it parses.",
529
+ "integration.nodeConfig.object.row.keyAria": "{label} — key of row {n}",
530
+ "integration.nodeConfig.object.row.keyPlaceholder": "key",
531
+ "integration.nodeConfig.object.row.removeAria": "Remove row {n} of {label}",
532
+ "integration.nodeConfig.object.row.valueAria": "{label} — value of row {n}",
533
+ "integration.nodeConfig.object.row.valuePlaceholder": "value",
534
+ "integration.nodeConfig.object.toggle.fields": "Fields",
535
+ "integration.nodeConfig.object.toggle.fieldsTitle": "Edit as key/value rows",
536
+ "integration.nodeConfig.object.toggle.json": "JSON",
537
+ "integration.nodeConfig.object.toggle.jsonTitle": "Edit as raw JSON",
538
+ "integration.nodeConfig.queryBuilder.action.addFilter": "Add filter",
539
+ "integration.nodeConfig.queryBuilder.json.notArray": "Must be a JSON array of query strings.",
540
+ "integration.nodeConfig.queryBuilder.jsonAria": "Filters as JSON",
541
+ "integration.nodeConfig.queryBuilder.method.between": "between",
542
+ "integration.nodeConfig.queryBuilder.method.contains": "contains",
543
+ "integration.nodeConfig.queryBuilder.method.endsWith": "ends with",
544
+ "integration.nodeConfig.queryBuilder.method.equal": "equals",
545
+ "integration.nodeConfig.queryBuilder.method.greaterThan": "greater than",
546
+ "integration.nodeConfig.queryBuilder.method.greaterThanEqual": "greater than or equal",
547
+ "integration.nodeConfig.queryBuilder.method.isNotNull": "is not empty",
548
+ "integration.nodeConfig.queryBuilder.method.isNull": "is empty",
549
+ "integration.nodeConfig.queryBuilder.method.lessThan": "less than",
550
+ "integration.nodeConfig.queryBuilder.method.lessThanEqual": "less than or equal",
551
+ "integration.nodeConfig.queryBuilder.method.limit": "limit",
552
+ "integration.nodeConfig.queryBuilder.method.notEqual": "does not equal",
553
+ "integration.nodeConfig.queryBuilder.method.offset": "offset",
554
+ "integration.nodeConfig.queryBuilder.method.orderAsc": "order ascending",
555
+ "integration.nodeConfig.queryBuilder.method.orderDesc": "order descending",
556
+ "integration.nodeConfig.queryBuilder.method.search": "search",
557
+ "integration.nodeConfig.queryBuilder.method.startsWith": "starts with",
558
+ "integration.nodeConfig.queryBuilder.mode.builder": "Builder",
559
+ "integration.nodeConfig.queryBuilder.row.comparisonAria": "Filter {n} — comparison",
560
+ "integration.nodeConfig.queryBuilder.row.fieldAria": "Filter {n} — field",
561
+ "integration.nodeConfig.queryBuilder.row.fieldPlaceholder": "field",
562
+ "integration.nodeConfig.queryBuilder.row.rawTextAria": "Filter {n} — raw text",
563
+ "integration.nodeConfig.queryBuilder.row.rawTextTitle": "This entry is not in the builder vocabulary; edit it as text or in the JSON view.",
564
+ "integration.nodeConfig.queryBuilder.row.removeAria": "Remove filter {n}",
565
+ "integration.nodeConfig.queryBuilder.row.valueAria": "Filter {n} — value",
566
+ "integration.nodeConfig.queryBuilder.row.valueListPlaceholder": "value, value, …",
567
+ "integration.nodeConfig.queryBuilder.row.valuePlaceholder": "value",
568
+ "integration.nodeConfig.resolve.action.retry": "RETRY",
569
+ "integration.nodeConfig.resolve.error.building": "Node bundle still building.",
570
+ "integration.nodeConfig.resolve.error.generic": "Resolve failed",
571
+ "integration.nodeConfig.secretRef.placeholder": "Pick a secret",
572
+ "integration.nodeConfig.select.placeholder": "Pick one",
573
+ "integration.nodeConfig.validation.max": "Must be ≤ {max}",
574
+ "integration.nodeConfig.validation.maxLength": "Must be at most {max} characters",
575
+ "integration.nodeConfig.validation.min": "Must be ≥ {min}",
576
+ "integration.nodeConfig.validation.minLength": "Must be at least {min} characters",
577
+ "integration.nodeConfig.validation.pattern": "Does not match the required format",
578
+ "integration.nodeInspector.footer.removeFromWorkflow": "Remove from workflow",
579
+ "integration.nodeInspector.footer.unsavedChanges": "Unsaved changes",
580
+ "integration.nodeInspector.header.groupNode": "Node",
581
+ "integration.nodeInspector.header.groupTrigger": "Trigger",
582
+ "integration.nodeInspector.header.inputData": "Input data",
583
+ "integration.nodeInspector.header.nameAria": "Node name",
584
+ "integration.nodeInspector.header.nextStep": "Next step (saves changes)",
585
+ "integration.nodeInspector.header.previousStep": "Previous step (saves changes)",
586
+ "integration.nodeInspector.header.whatThisDoes": "What this node does",
587
+ "integration.nodeInspector.input.description": "Available data. Click a value to insert it into the focused field, or drag it onto one.",
588
+ "integration.nodeInspector.input.noUpstreamForTrigger": "Triggers start the workflow, so there is no upstream data. Workflow variables are available everywhere.",
589
+ "integration.nodeInspector.input.nodes.empty": "No upstream nodes yet. Connect a node into this one to reference its output here.",
590
+ "integration.nodeInspector.input.nodes.heading": "Nodes",
591
+ "integration.nodeInspector.input.nodes.indirectBadge": "upstream",
592
+ "integration.nodeInspector.input.nodes.indirectTitle": "Not directly connected; reachable further upstream",
593
+ "integration.nodeInspector.input.runData.clear": "Clear run data",
594
+ "integration.nodeInspector.input.runData.empty": "No runs yet. Run the workflow once to sample real values.",
595
+ "integration.nodeInspector.input.runData.from": "Values from run #{id}",
596
+ "integration.nodeInspector.input.runData.loadFailed": "Could not load run data.",
597
+ "integration.nodeInspector.input.runData.loading": "Loading run data…",
598
+ "integration.nodeInspector.input.runData.use": "Use last run data",
599
+ "integration.nodeInspector.input.search.empty": "Nothing matches \"{query}\". Clear the search to see all available data.",
600
+ "integration.nodeInspector.input.searchAria": "Search data",
601
+ "integration.nodeInspector.input.title": "Input",
602
+ "integration.nodeInspector.input.trigger.heading": "Trigger",
603
+ "integration.nodeInspector.input.trigger.hint": "The payload the run started with. Append a path for a single value, e.g. trigger.payload.orderId.",
604
+ "integration.nodeInspector.input.variables.empty": "No workflow variables defined.",
605
+ "integration.nodeInspector.input.variables.heading": "Variables",
606
+ "integration.nodeInspector.note.addLabel": "Add note",
607
+ "integration.nodeInspector.note.label": "Note",
608
+ "integration.nodeInspector.note.placeholder": "Why this node is here…",
609
+ "integration.nodeInspector.output.description": "What downstream nodes receive from this one. Declared by the node type; filled with real values once the step has run.",
610
+ "integration.nodeInspector.output.pin.editAction": "Edit pinned sample",
611
+ "integration.nodeInspector.output.pin.editorAria": "Pinned sample output",
612
+ "integration.nodeInspector.output.pin.hint": "A pinned sample stands in for run data while you map downstream fields.",
613
+ "integration.nodeInspector.output.pin.invalidJson": "Not valid JSON.",
614
+ "integration.nodeInspector.output.pin.invalidShape": "Must be an object mapping ports to payloads, e.g. { \"default\": { … } }.",
615
+ "integration.nodeInspector.output.pin.pinAction": "Pin sample output",
616
+ "integration.nodeInspector.output.pin.saveAction": "Pin",
617
+ "integration.nodeInspector.output.pin.unpinAction": "Unpin",
618
+ "integration.nodeInspector.output.realValues.heading": "Real values",
619
+ "integration.nodeInspector.output.schema.noFields": "No declared fields",
620
+ "integration.nodeInspector.output.schema.noOutputs": "This node declares no outputs.",
621
+ "integration.nodeInspector.output.schema.sampledSuffix": "; sampled:",
622
+ "integration.nodeInspector.output.test.action": "Test step",
623
+ "integration.nodeInspector.output.test.editInput": "Edit input",
624
+ "integration.nodeInspector.output.test.hideInput": "Hide input",
625
+ "integration.nodeInspector.output.test.inputAria": "Test input",
626
+ "integration.nodeInspector.output.test.inputInvalidJson": "Test input is not valid JSON.",
627
+ "integration.nodeInspector.output.test.inputNotObject": "Test input must be a JSON object.",
628
+ "integration.nodeInspector.output.test.runFailed": "Test run failed.",
629
+ "integration.nodeInspector.output.test.runHint": "Runs this step alone, against the draft config — the workflow is not started.",
630
+ "integration.nodeInspector.output.test.runTitle": "Runs this node once with the current draft config",
631
+ "integration.nodeInspector.output.test.running": "Testing…",
632
+ "integration.nodeInspector.output.view.json": "JSON",
633
+ "integration.nodeInspector.output.view.schema": "Schema",
634
+ "integration.nodeInspector.parameters.allOnSettingsTab": "All of this node's options live on the Settings tab.",
635
+ "integration.nodeInspector.parameters.copyTitle": "Copy this node's config as JSON",
636
+ "integration.nodeInspector.parameters.heading": "Configuration",
637
+ "integration.nodeInspector.parameters.noConfiguration": "This node has no configuration.",
638
+ "integration.nodeInspector.parameters.optional.hide": "Hide {n} optional setting | Hide {n} optional settings",
639
+ "integration.nodeInspector.parameters.optional.show": "Show {n} optional setting | Show {n} optional settings",
640
+ "integration.nodeInspector.parameters.pasteTitle": "Replace this node's config from a JSON object in the clipboard",
641
+ "integration.nodeInspector.schedule.cron.label": "Cron expression",
642
+ "integration.nodeInspector.schedule.day.friday": "Fridays",
643
+ "integration.nodeInspector.schedule.day.friday.short": "Fr",
644
+ "integration.nodeInspector.schedule.day.monday": "Mondays",
645
+ "integration.nodeInspector.schedule.day.monday.short": "Mo",
646
+ "integration.nodeInspector.schedule.day.saturday": "Saturdays",
647
+ "integration.nodeInspector.schedule.day.saturday.short": "Sa",
648
+ "integration.nodeInspector.schedule.day.sunday": "Sundays",
649
+ "integration.nodeInspector.schedule.day.sunday.short": "Su",
650
+ "integration.nodeInspector.schedule.day.thursday": "Thursdays",
651
+ "integration.nodeInspector.schedule.day.thursday.short": "Th",
652
+ "integration.nodeInspector.schedule.day.tuesday": "Tuesdays",
653
+ "integration.nodeInspector.schedule.day.tuesday.short": "Tu",
654
+ "integration.nodeInspector.schedule.day.wednesday": "Wednesdays",
655
+ "integration.nodeInspector.schedule.day.wednesday.short": "We",
656
+ "integration.nodeInspector.schedule.dayOfMonth.label": "Day of month",
657
+ "integration.nodeInspector.schedule.days.label": "Days",
658
+ "integration.nodeInspector.schedule.frequency.advanced": "Advanced (cron)",
659
+ "integration.nodeInspector.schedule.frequency.daily": "Every day",
660
+ "integration.nodeInspector.schedule.frequency.hourly": "Every hour",
661
+ "integration.nodeInspector.schedule.frequency.hours": "Every few hours",
662
+ "integration.nodeInspector.schedule.frequency.label": "Frequency",
663
+ "integration.nodeInspector.schedule.frequency.minutes": "Every few minutes",
664
+ "integration.nodeInspector.schedule.frequency.monthly": "Every month",
665
+ "integration.nodeInspector.schedule.frequency.times": "Several times a day",
666
+ "integration.nodeInspector.schedule.frequency.weekly": "Every week",
667
+ "integration.nodeInspector.schedule.hourInterval.option": "Every {n} hours",
668
+ "integration.nodeInspector.schedule.hours.label": "Hours",
669
+ "integration.nodeInspector.schedule.interval.label": "Interval",
670
+ "integration.nodeInspector.schedule.minuteInterval.option": "Every minute | Every {n} minutes",
671
+ "integration.nodeInspector.schedule.minutePast.label": "Minutes past the hour",
672
+ "integration.nodeInspector.schedule.monthlySkipHint": "Months without this day are skipped.",
673
+ "integration.nodeInspector.schedule.noneSet": "No schedule set — pick a frequency, or write an expression.",
674
+ "integration.nodeInspector.schedule.time.label": "Time",
675
+ "integration.nodeInspector.schedule.whenItFiresAria": "When it fires",
676
+ "integration.nodeInspector.schedule.writtenAsExpression": "This schedule is written as an expression these settings cannot show. It runs exactly as written.",
677
+ "integration.nodeInspector.settings.engine.heading": "How the engine runs this step",
678
+ "integration.nodeInspector.settings.engine.hint": "The same settings on every node type, applied by the engine around whatever the node does.",
679
+ "integration.nodeInspector.settings.onError.fail": "Fail the run",
680
+ "integration.nodeInspector.settings.onError.hint": "Applies after the retry policy is exhausted. A Stop and Error node always fails the run.",
681
+ "integration.nodeInspector.settings.onError.label": "On error",
682
+ "integration.nodeInspector.settings.onError.route": "Route to error output",
683
+ "integration.nodeInspector.settings.ownOptions.heading": "Options of this node",
684
+ "integration.nodeInspector.settings.ownOptions.hint": "Settings this node type defines for itself.",
685
+ "integration.nodeInspector.settings.retry.backoffSeconds": "Backoff seconds",
686
+ "integration.nodeInspector.settings.retry.hint": "Re-run this node automatically when an attempt fails.",
687
+ "integration.nodeInspector.settings.retry.label": "Retry on failure",
688
+ "integration.nodeInspector.settings.retry.maxAttempts": "Max attempts",
689
+ "integration.nodeInspector.settings.retry.strategy": "Strategy",
690
+ "integration.nodeInspector.settings.retry.strategyExponential": "exponential backoff",
691
+ "integration.nodeInspector.settings.retry.strategyLinear": "linear backoff",
692
+ "integration.nodeInspector.settings.timeout.hint": "Seconds per attempt before the engine cancels the node. Empty uses the default (10 minutes); maximum 2 hours.",
693
+ "integration.nodeInspector.settings.timeout.label": "Timeout",
694
+ "integration.nodeInspector.tab.output": "Output",
695
+ "integration.nodeInspector.tab.parameters": "Parameters",
696
+ "integration.nodeInspector.tab.settings": "Settings",
697
+ "integration.nodeInspector.toast.clipboardInvalidJson": "Clipboard is not valid JSON",
698
+ "integration.nodeInspector.toast.clipboardNotConfigObject": "Clipboard is not a JSON config object",
699
+ "integration.nodeInspector.toast.clipboardReadFailed": "Could not read the clipboard",
700
+ "integration.nodeInspector.toast.configCopied": "Config copied",
701
+ "integration.nodeInspector.toast.configCopyFailed": "Could not copy config",
702
+ "integration.nodeInspector.toast.configPasted": "Config pasted",
703
+ "integration.nodeInspector.toast.expressionCopied": "Expression copied. Click into a field first to insert it directly.",
704
+ "integration.nodeInspector.toast.rotateFailed": "Could not rotate the secret.",
705
+ "integration.nodeInspector.toast.rotateNoSecret": "The endpoint did not return a secret.",
706
+ "integration.nodeInspector.toast.samplePinned": "Sample output pinned",
707
+ "integration.nodeInspector.toast.secretCopied": "Secret copied",
708
+ "integration.nodeInspector.toast.secretCopyFailed": "Could not copy the secret",
709
+ "integration.nodeInspector.toast.testRunFinished": "Test run finished",
710
+ "integration.nodeInspector.toast.webhookUrlCopied": "Webhook URL copied",
711
+ "integration.nodeInspector.toast.webhookUrlCopyFailed": "Could not copy the URL",
712
+ "integration.nodeInspector.trigger.active.hint": "A run needs at least one active trigger.",
713
+ "integration.nodeInspector.trigger.active.label": "Active",
714
+ "integration.nodeInspector.trigger.event.hint.intro": "Runs whenever this platform event fires (e.g.",
715
+ "integration.nodeInspector.trigger.event.hint.mid": "). The event payload is available to the workflow as",
716
+ "integration.nodeInspector.trigger.event.label": "Event",
717
+ "integration.nodeInspector.trigger.event.sample.empty": "No sample payload in the event catalogue for this topic.",
718
+ "integration.nodeInspector.trigger.event.sample.heading": "Sample payload",
719
+ "integration.nodeInspector.trigger.event.sample.hint": "From the event catalogue — the shape this event delivers as",
720
+ "integration.nodeInspector.trigger.manual.action.addField": "Add field",
721
+ "integration.nodeInspector.trigger.manual.field.keyAria": "Key of payload field {n}",
722
+ "integration.nodeInspector.trigger.manual.field.keyPlaceholder": "key (e.g. orderId or import.file)",
723
+ "integration.nodeInspector.trigger.manual.field.kindAria": "Kind of payload field {n}",
724
+ "integration.nodeInspector.trigger.manual.field.labelAria": "Label of payload field {n}",
725
+ "integration.nodeInspector.trigger.manual.field.labelPlaceholder": "Label shown in the Run dialog",
726
+ "integration.nodeInspector.trigger.manual.field.removeAria": "Remove payload field {n}",
727
+ "integration.nodeInspector.trigger.manual.heading": "Run payload fields",
728
+ "integration.nodeInspector.trigger.manual.hint.intro": "What the Run dialog asks for when this workflow is started by hand. Each field lands in",
729
+ "integration.nodeInspector.trigger.manual.hint.mid": "; a File field becomes a manual upload. Fields referenced by nodes via",
730
+ "integration.nodeInspector.trigger.manual.hint.outro": "are added automatically.",
731
+ "integration.nodeInspector.trigger.manual.kind.file": "File",
732
+ "integration.nodeInspector.trigger.manual.kind.text": "Text",
733
+ "integration.nodeInspector.trigger.placeholder": "{type} trigger",
734
+ "integration.nodeInspector.trigger.type.event": "Event",
735
+ "integration.nodeInspector.trigger.type.manual": "Manual",
736
+ "integration.nodeInspector.trigger.type.schedule": "Schedule",
737
+ "integration.nodeInspector.trigger.type.webhook": "Webhook",
738
+ "integration.nodeInspector.trigger.webhook.header.hint": "The header carrying the endpoint secret (e.g. X-Api-Key). Empty uses X-Webhook-Token.",
739
+ "integration.nodeInspector.trigger.webhook.header.label": "Header name",
740
+ "integration.nodeInspector.trigger.webhook.method.label": "Method",
741
+ "integration.nodeInspector.trigger.webhook.protection.basic": "Basic auth",
742
+ "integration.nodeInspector.trigger.webhook.protection.bearer": "Bearer token",
743
+ "integration.nodeInspector.trigger.webhook.protection.hint": "Verified by the webhook ingress before the workflow runs.",
744
+ "integration.nodeInspector.trigger.webhook.protection.label": "Protection",
745
+ "integration.nodeInspector.trigger.webhook.protection.none": "None (capture everything)",
746
+ "integration.nodeInspector.trigger.webhook.protection.token": "API key / token header",
747
+ "integration.nodeInspector.trigger.webhook.public.hint": "Saving provisions a public URL on the webhook ingress (with its own endpoint secret) — for external systems without a platform token.",
748
+ "integration.nodeInspector.trigger.webhook.public.label": "Public endpoint",
749
+ "integration.nodeInspector.trigger.webhook.rotate.action": "Rotate endpoint secret",
750
+ "integration.nodeInspector.trigger.webhook.rotate.busy": "Rotating…",
751
+ "integration.nodeInspector.trigger.webhook.rotate.copyTitle": "Copy secret",
752
+ "integration.nodeInspector.trigger.webhook.rotate.dialogHint": "Copy it now — it is shown only this once. Give it to the calling system ({where}).",
753
+ "integration.nodeInspector.trigger.webhook.rotate.dialogTitle": "New endpoint secret",
754
+ "integration.nodeInspector.trigger.webhook.rotate.hint": "Issues a new secret (shown once); the previous one keeps working briefly.",
755
+ "integration.nodeInspector.trigger.webhook.rotate.whereBasic": "as the Basic-auth password",
756
+ "integration.nodeInspector.trigger.webhook.rotate.whereBearer": "as the Bearer token",
757
+ "integration.nodeInspector.trigger.webhook.rotate.whereHeader": "in the token header",
758
+ "integration.nodeInspector.trigger.webhook.url.copyTitle": "Copy URL",
759
+ "integration.nodeInspector.trigger.webhook.url.label": "Webhook URL",
760
+ "integration.nodeInspector.trigger.webhook.url.privateHint": "Authenticated endpoint: callers need a platform API token (Bearer). Enable the public endpoint for external systems.",
761
+ "integration.nodeInspector.trigger.webhook.url.publicHint": "Public ingress endpoint — callers authenticate with the endpoint secret issued when the trigger was exposed.",
762
+ "integration.nodeInspector.trigger.webhook.username.hint": "Optional — pins the Basic-auth username. The password is the endpoint secret.",
763
+ "integration.nodeInspector.trigger.webhook.username.label": "Username",
764
+ "integration.nodeInspector.trigger.webhook.username.placeholder": "Any username",
765
+ "integration.nodes.category.action": "Actions",
766
+ "integration.nodes.category.control": "Control flow",
767
+ "integration.nodes.category.io": "I/O",
768
+ "integration.nodes.category.transform": "Transforms",
769
+ "integration.nodes.category.trigger": "Triggers",
770
+ "integration.nodes.error.loadFailed": "Could not load nodes.",
771
+ "integration.replay.badge.live": "Live",
772
+ "integration.replay.badge.snapshot": "Snapshot",
773
+ "integration.replay.canvas.pickRun": "Pick a run",
774
+ "integration.replay.canvas.runLabel": "Run #{id}",
775
+ "integration.replay.debug.emptyHint": "The active step's status, timings and payloads land here while the replay walks the run.",
776
+ "integration.replay.debug.field.attempt": "Attempt",
777
+ "integration.replay.debug.field.branch": "Branch",
778
+ "integration.replay.debug.field.completed": "Completed",
779
+ "integration.replay.debug.field.config": "Config",
780
+ "integration.replay.debug.field.duration": "Duration",
781
+ "integration.replay.debug.field.error": "Error",
782
+ "integration.replay.debug.field.input": "Input",
783
+ "integration.replay.debug.field.output": "Output",
784
+ "integration.replay.debug.field.started": "Started",
785
+ "integration.replay.debug.noStepSelected": "No step selected",
786
+ "integration.replay.debug.stepCounter": "Step {current} / {total}",
787
+ "integration.replay.debug.titleFallback": "Debug",
788
+ "integration.replay.error.loadStepsFailed": "Could not load the run steps.",
789
+ "integration.replay.runsList.description": "Click through the executions to replay them on the canvas.",
790
+ "integration.replay.runsList.empty": "No runs yet — trigger one from the editor's Run button.",
791
+ "integration.replay.runsList.heading": "Runs",
792
+ "integration.replay.runsList.loadMore": "Load older runs",
793
+ "integration.replay.state.noSteps": "No steps recorded for this run.",
794
+ "integration.replay.state.pickRunHint": "Pick a run on the right to replay it.",
795
+ "integration.replay.toast.loadRunsFailed": "Could not load the runs.",
796
+ "integration.replay.transport.action.next": "Next",
797
+ "integration.replay.transport.action.pause": "Pause",
798
+ "integration.replay.transport.action.play": "Play",
799
+ "integration.replay.transport.action.prev": "Prev",
800
+ "integration.replay.transport.scrubberAria": "Replay step",
801
+ "integration.replay.transport.stepCounter": "Step {current}/{total}",
802
+ "integration.revisions.error.loadFailed": "Could not load the revision history.",
803
+ "integration.runs.action.back": "Back",
804
+ "integration.runs.action.cancel": "Cancel run",
805
+ "integration.runs.action.resume": "Resume",
806
+ "integration.runs.action.retry": "Retry",
807
+ "integration.runs.action.terminate": "Terminate",
808
+ "integration.runs.confirm.cancel": "Cancel this run?",
809
+ "integration.runs.confirm.resume": "Resume this run?",
810
+ "integration.runs.confirm.retry": "Retry this run?",
811
+ "integration.runs.confirm.terminate": "Terminate this run?",
812
+ "integration.runs.detail.error.details.expired": "History is no longer available (retention expired and no snapshot).",
813
+ "integration.runs.detail.error.details.generic": "Could not load Temporal details.",
814
+ "integration.runs.detail.error.details.unavailable": "Temporal is currently unavailable.",
815
+ "integration.runs.detail.error.history.cursorInvalid": "Pagination cursor invalidated — reset.",
816
+ "integration.runs.detail.error.history.expired": "History is no longer available.",
817
+ "integration.runs.detail.error.history.generic": "Could not load history.",
818
+ "integration.runs.detail.error.stack.generic": "Could not load stack trace.",
819
+ "integration.runs.detail.error.stack.notRunning": "Workflow is no longer running.",
820
+ "integration.runs.detail.error.stack.unavailable": "Temporal unavailable.",
821
+ "integration.runs.detail.error.stack.unknown": "Unknown to Temporal.",
822
+ "integration.runs.detail.error.steps.expired": "Execution history is no longer available.",
823
+ "integration.runs.detail.error.steps.generic": "Could not load steps.",
824
+ "integration.runs.detail.field.completed": "Completed",
825
+ "integration.runs.detail.field.historyLength": "History Length",
826
+ "integration.runs.detail.field.runId": "Run ID",
827
+ "integration.runs.detail.field.started": "Started",
828
+ "integration.runs.detail.field.status": "Status",
829
+ "integration.runs.detail.field.taskQueue": "Task Queue",
830
+ "integration.runs.detail.field.workflow": "Workflow",
831
+ "integration.runs.detail.field.workflowType": "Workflow Type",
832
+ "integration.runs.detail.history.empty": "No history events.",
833
+ "integration.runs.detail.history.loading": "Loading history…",
834
+ "integration.runs.detail.history.title": "History",
835
+ "integration.runs.detail.notHandedOff": "Run has not been handed off to Temporal yet.",
836
+ "integration.runs.detail.result.title": "Result",
837
+ "integration.runs.detail.stackTrace.action.load": "Load",
838
+ "integration.runs.detail.stackTrace.action.reload": "↻ Reload",
839
+ "integration.runs.detail.stackTrace.hint": "Load to query the running worker for its current call stack.",
840
+ "integration.runs.detail.stackTrace.loading": "Querying worker…",
841
+ "integration.runs.detail.stackTrace.title": "Stack Trace",
842
+ "integration.runs.detail.steps.action.hidePayloads": "Hide payloads",
843
+ "integration.runs.detail.steps.action.showPayloads": "Show payloads",
844
+ "integration.runs.detail.steps.attemptLabel": "attempt",
845
+ "integration.runs.detail.steps.branchLabel": "branch",
846
+ "integration.runs.detail.steps.empty": "No steps projected yet.",
847
+ "integration.runs.detail.steps.field.input": "Input",
848
+ "integration.runs.detail.steps.field.output": "Output",
849
+ "integration.runs.detail.steps.loading": "Loading steps…",
850
+ "integration.runs.detail.steps.payloadHint": "Enable “Show payloads” to load this step's input and output.",
851
+ "integration.runs.detail.steps.title": "Steps",
852
+ "integration.runs.detail.timeline.label.activity": "Activity",
853
+ "integration.runs.detail.timeline.label.timer": "Timer",
854
+ "integration.runs.detail.timeline.label.workflow": "Workflow",
855
+ "integration.runs.detail.timeline.label.workflowTask": "Workflow task",
856
+ "integration.runs.error.cancel": "Could not cancel the run.",
857
+ "integration.runs.error.loadFailed": "Could not load runs.",
858
+ "integration.runs.error.resume": "Could not resume the run.",
859
+ "integration.runs.error.retry": "Could not retry the run.",
860
+ "integration.runs.error.terminate": "Could not terminate the run.",
861
+ "integration.runs.list.head.title": "Runs · Integration Studio",
862
+ "integration.runs.list.header.description": "Execution history across every workflow — sourced from Temporal.",
863
+ "integration.runs.list.header.title": "Runs",
864
+ "integration.runs.menu.aria.actions": "Actions for run #{id}",
865
+ "integration.runs.menu.cancel": "Cancel run",
866
+ "integration.runs.menu.replay": "Replay",
867
+ "integration.runs.menu.resume": "Resume",
868
+ "integration.runs.menu.retry": "Retry",
869
+ "integration.runs.menu.terminate": "Terminate",
870
+ "integration.runs.menu.viewDetails": "View details",
871
+ "integration.runs.notice.requested": "{action} requested.",
872
+ "integration.runs.notice.started": "Started run #{id}.",
873
+ "integration.runs.payload.expertToggle.label": "Expert (JSON)",
874
+ "integration.runs.payload.extrasNote": "Additional payload keys from the expert view are kept: {keys}",
875
+ "integration.runs.payload.file.dropHint": "Drop a file here or click to choose",
876
+ "integration.runs.payload.file.remove.aria": "Remove the file for {field}",
877
+ "integration.runs.payload.file.remove.title": "Remove file",
878
+ "integration.runs.payload.file.tooLarge": "Large file — payloads beyond ~25 MB can exceed the workflow bus limits. Prefer the SFTP or IO routes for big files.",
879
+ "integration.runs.payload.label.form": "Trigger payload",
880
+ "integration.runs.payload.label.json": "Trigger payload (JSON)",
881
+ "integration.runs.payload.parseError": "The JSON does not parse — fix it before switching back to the form.",
882
+ "integration.runs.response.action.viewRun": "View run",
883
+ "integration.runs.response.action.viewRunWithId": "View run #{id}",
884
+ "integration.runs.response.async.started": "Run started and is executing in the background.",
885
+ "integration.runs.response.async.startedWithId": "Run #{id} started and is executing in the background.",
886
+ "integration.runs.response.description.async": "Queued for background execution",
887
+ "integration.runs.response.description.sync": "Synchronous run result",
888
+ "integration.runs.response.empty": "No response.",
889
+ "integration.runs.response.loading.async": "Starting…",
890
+ "integration.runs.response.loading.sync": "Running…",
891
+ "integration.runs.response.title.async": "Run started",
892
+ "integration.runs.response.title.sync": "Run response",
893
+ "integration.runs.status.cancelled": "cancelled",
894
+ "integration.runs.status.failed": "failed",
895
+ "integration.runs.status.queued": "queued",
896
+ "integration.runs.status.running": "running",
897
+ "integration.runs.status.succeeded": "succeeded",
898
+ "integration.runs.table.column.duration": "Duration",
899
+ "integration.runs.table.column.id": "ID",
900
+ "integration.runs.table.column.started": "Started",
901
+ "integration.runs.table.column.status": "Status",
902
+ "integration.runs.table.column.trigger": "Trigger",
903
+ "integration.runs.table.column.workflow": "Workflow",
904
+ "integration.runs.table.empty": "No runs yet — kick off a workflow to populate this view.",
905
+ "integration.runs.table.search.placeholder": "Search runs…",
906
+ "integration.runs.tabs.runs.label": "Runs",
907
+ "integration.runs.toast.action.requested": "{action} requested",
908
+ "integration.runs.toast.action.started": "Started run #{id}",
909
+ "integration.runs.toast.terminate.confirm": "Terminate run #{id}?",
910
+ "integration.schedules.cell.cronExpression.aria": "Cron expression",
911
+ "integration.schedules.cell.customSchedule": "Custom schedule",
912
+ "integration.schedules.cell.noSchedule": "No schedule set",
913
+ "integration.schedules.cell.whenItFires.aria": "When it fires",
914
+ "integration.schedules.cron.dailyAt": "Daily at {time}",
915
+ "integration.schedules.cron.day.daily": "Daily",
916
+ "integration.schedules.cron.day.weekdays": "Weekdays",
917
+ "integration.schedules.cron.day.weekends": "Weekends",
918
+ "integration.schedules.cron.everyMinute": "Every minute",
919
+ "integration.schedules.cron.everyNHoursAt": "Every {n} hours at :{minute}",
920
+ "integration.schedules.cron.everyNHoursOnTheHour": "Every {n} hours, on the hour",
921
+ "integration.schedules.cron.everyNMinutes": "Every {n} minutes",
922
+ "integration.schedules.cron.hourlyAt": "Hourly at :{minute}",
923
+ "integration.schedules.cron.hourlyOnTheHour": "Hourly, on the hour",
924
+ "integration.schedules.cron.monthlyAt": "Monthly on the {ordinal}, at {time}",
925
+ "integration.schedules.cron.namedTimes": "{days} at {times}",
926
+ "integration.schedules.cron.spanAllDay": "Hourly from {from} to {to}",
927
+ "integration.schedules.cron.spanWithDays": "{days}, hourly from {from} to {to}",
928
+ "integration.schedules.cron.weekday.friday": "Fridays",
929
+ "integration.schedules.cron.weekday.monday": "Mondays",
930
+ "integration.schedules.cron.weekday.saturday": "Saturdays",
931
+ "integration.schedules.cron.weekday.sunday": "Sundays",
932
+ "integration.schedules.cron.weekday.thursday": "Thursdays",
933
+ "integration.schedules.cron.weekday.tuesday": "Tuesdays",
934
+ "integration.schedules.cron.weekday.wednesday": "Wednesdays",
935
+ "integration.schedules.cron.weeklyAt": "{days} at {time}",
936
+ "integration.schedules.head.title": "Schedules · Integration Studio",
937
+ "integration.schedules.header.description": "Every scheduled trigger across your workflows. Click a row to open the workflow.",
938
+ "integration.schedules.header.title": "Schedules",
939
+ "integration.schedules.search.placeholder": "Search by workflow, schedule, timezone…",
940
+ "integration.schedules.stat.active": "active",
941
+ "integration.schedules.state.empty": "No schedules yet. Add a schedule trigger to any workflow.",
942
+ "integration.schedules.status.live": "live",
943
+ "integration.schedules.status.paused": "paused",
944
+ "integration.schedules.table.column.lastRun": "Last run",
945
+ "integration.schedules.table.column.nextRun": "Next run",
946
+ "integration.schedules.table.column.status": "Status",
947
+ "integration.schedules.table.column.timezone": "Timezone",
948
+ "integration.schedules.table.column.when": "When",
949
+ "integration.schedules.table.column.workflow": "Workflow",
950
+ "integration.schedules.time.inHours": "in {n}h",
951
+ "integration.schedules.time.inLessThanMinute": "in <1m",
952
+ "integration.schedules.time.inMinutes": "in {n}m",
953
+ "integration.secrets.action.new": "New secret",
954
+ "integration.secrets.cell.actions.aria": "Actions for {key}",
955
+ "integration.secrets.cell.created.aria": "Created for {key}: {date}",
956
+ "integration.secrets.cell.masked": "Value masked — write-only",
957
+ "integration.secrets.cell.updated.aria": "Updated for {key}: {date}",
958
+ "integration.secrets.dialog.create.description": "Once stored, the value is encrypted with AES-256-GCM and never echoed back. You can overwrite it later, but to read it you have to know it.",
959
+ "integration.secrets.dialog.create.title": "Create a secret",
960
+ "integration.secrets.dialog.delete.body": "will be permanently removed. Workflows that reference it will break the next time they run.",
961
+ "integration.secrets.dialog.delete.title": "Delete secret?",
962
+ "integration.secrets.error.invalidKey": "Key must match ^[A-Z0-9_]+$",
963
+ "integration.secrets.error.loadFailed": "Could not load secrets.",
964
+ "integration.secrets.error.valueRequired": "Value is required.",
965
+ "integration.secrets.form.error.invalidKey": "Key must match ^[A-Z0-9_]+$ (uppercase letters, digits, underscores).",
966
+ "integration.secrets.form.key.label": "Key",
967
+ "integration.secrets.form.key.patternLabel": "Pattern:",
968
+ "integration.secrets.form.value.hide": "Hide value",
969
+ "integration.secrets.form.value.label": "Value",
970
+ "integration.secrets.form.value.show": "Show value",
971
+ "integration.secrets.head.title": "Secrets · Revenexx Cockpit",
972
+ "integration.secrets.header.description": "Per-tenant encrypted key/value store. Values are encrypted at rest and never returned by the API.",
973
+ "integration.secrets.header.title": "Secrets",
974
+ "integration.secrets.menu.label": "Actions",
975
+ "integration.secrets.search.placeholder": "Search keys…",
976
+ "integration.secrets.state.empty": "No secrets yet.",
977
+ "integration.secrets.table.column.created": "Created",
978
+ "integration.secrets.table.column.key": "Key",
979
+ "integration.secrets.table.column.updated": "Updated",
980
+ "integration.shell.action.skipToContent": "Skip to content",
981
+ "integration.templates.card.state.loadingFlow": "Loading the flow",
982
+ "integration.templates.card.trigger.event": "Event-driven",
983
+ "integration.templates.card.trigger.schedule": "Scheduled",
984
+ "integration.templates.category.commerce": "Commerce",
985
+ "integration.templates.category.enrichment": "Enrichment",
986
+ "integration.templates.category.finance": "Finance",
987
+ "integration.templates.category.fulfilment": "Fulfilment",
988
+ "integration.templates.category.notification": "Notification",
989
+ "integration.templates.category.reporting": "Reporting",
990
+ "integration.templates.category.sales": "Sales",
991
+ "integration.templates.category.sync": "Sync",
992
+ "integration.templates.detail.about.title": "About this template",
993
+ "integration.templates.detail.action.useTemplate": "Use template",
994
+ "integration.templates.detail.breadcrumb.templates": "Templates",
995
+ "integration.templates.detail.credentials.connectFirst": "Connect first",
996
+ "integration.templates.detail.credentials.manageLink": "Manage credentials",
997
+ "integration.templates.detail.credentials.readyCount": "{n} ready",
998
+ "integration.templates.detail.credentials.title": "Credentials",
999
+ "integration.templates.detail.fit.anyIndustry": "Any industry",
1000
+ "integration.templates.detail.fit.title": "Good fit for",
1001
+ "integration.templates.detail.head.fallbackName": "Template",
1002
+ "integration.templates.detail.head.title": "{name} · Integration Studio",
1003
+ "integration.templates.detail.install.createOneLink": "Create one",
1004
+ "integration.templates.detail.install.description": "Pre-wire credentials, then we create the workflow. It starts inactive, so you can finish wiring in the editor and activate when ready.",
1005
+ "integration.templates.detail.install.error.fallback": "Install failed.",
1006
+ "integration.templates.detail.install.nameLabel": "Workflow name",
1007
+ "integration.templates.detail.install.namePlaceholder": "Workflow name",
1008
+ "integration.templates.detail.install.noCredentials": "This template needs no credentials.",
1009
+ "integration.templates.detail.install.noCredentialsOfType": "No credentials of this type yet.",
1010
+ "integration.templates.detail.install.nodeLabel": "node {id}",
1011
+ "integration.templates.detail.install.noneYet": "none yet",
1012
+ "integration.templates.detail.install.notRegistered": "not registered",
1013
+ "integration.templates.detail.install.orInstallLater": "first, or install now and wire it up in the editor.",
1014
+ "integration.templates.detail.install.secretStored": "Stored",
1015
+ "integration.templates.detail.install.secretsDescription": "Referenced secret keys must exist before the workflow runs. Manage them on the",
1016
+ "integration.templates.detail.install.secretsDescriptionSuffix": "page.",
1017
+ "integration.templates.detail.install.secretsHeader": "Secrets",
1018
+ "integration.templates.detail.install.selectLater": "Select later",
1019
+ "integration.templates.detail.install.submit": "Install",
1020
+ "integration.templates.detail.install.submitting": "Setting up…",
1021
+ "integration.templates.detail.publisher.kind.community": "Community",
1022
+ "integration.templates.detail.publisher.kind.partner": "Partner",
1023
+ "integration.templates.detail.publisher.kind.revenexx": "Official",
1024
+ "integration.templates.detail.publisher.shipsWith": "Ships with",
1025
+ "integration.templates.detail.publisher.title": "Publisher",
1026
+ "integration.templates.detail.rail.levelLabel": "Level",
1027
+ "integration.templates.detail.rail.stepsLabel": "Steps",
1028
+ "integration.templates.detail.secrets.chosenAtInstall": "(chosen at install)",
1029
+ "integration.templates.detail.secrets.missing": "Missing",
1030
+ "integration.templates.detail.secrets.missingBadge": "{n} missing",
1031
+ "integration.templates.detail.secrets.set": "Set",
1032
+ "integration.templates.detail.secrets.title": "Required secrets",
1033
+ "integration.templates.detail.setup.ariaLabel": "Setup readiness",
1034
+ "integration.templates.detail.setup.hint": "Creates a paused copy in your workflows. Nothing runs until you activate it.",
1035
+ "integration.templates.detail.setup.missingCredentials": "{n} credential to connect | {n} credentials to connect",
1036
+ "integration.templates.detail.setup.missingSecrets": "{n} secret missing | {n} secrets missing",
1037
+ "integration.templates.detail.setup.ready": "Everything is ready to install.",
1038
+ "integration.templates.detail.state.loading": "Loading template…",
1039
+ "integration.templates.detail.state.notFound": "Template not found.",
1040
+ "integration.templates.detail.steps.empty": "No step-by-step outline for this template yet.",
1041
+ "integration.templates.detail.steps.title": "Step by step",
1042
+ "integration.templates.detail.trigger.schedule": "Schedule",
1043
+ "integration.templates.detail.variables.column.description": "Description",
1044
+ "integration.templates.detail.variables.column.key": "Variable",
1045
+ "integration.templates.detail.variables.column.value": "Value",
1046
+ "integration.templates.detail.variables.description": "Set once after install, used across the workflow.",
1047
+ "integration.templates.detail.variables.title": "Variables you can tune",
1048
+ "integration.templates.gallery.cards.ariaLabel": "Templates",
1049
+ "integration.templates.gallery.empty.filtered": "No templates match these filters.",
1050
+ "integration.templates.gallery.empty.registered.description": "Templates ship with node packages. Once a package that publishes templates is installed, they show up here.",
1051
+ "integration.templates.gallery.empty.registered.title": "No templates registered yet",
1052
+ "integration.templates.gallery.error.title": "Couldn't load templates.",
1053
+ "integration.templates.gallery.filter.all": "All",
1054
+ "integration.templates.gallery.filter.level.advanced": "Advanced",
1055
+ "integration.templates.gallery.filter.level.beginner": "Beginner",
1056
+ "integration.templates.gallery.filter.level.intermediate": "Intermediate",
1057
+ "integration.templates.gallery.filter.levelAllOption": "All levels",
1058
+ "integration.templates.gallery.filter.levelAria": "Filter by level",
1059
+ "integration.templates.gallery.head.title": "Templates · Integration Studio",
1060
+ "integration.templates.gallery.header.description": "Pre-built workflows you can clone, then tweak. Wired by revenexx and our partners.",
1061
+ "integration.templates.gallery.header.title": "Templates",
1062
+ "integration.templates.gallery.search.aria": "Search templates and vendors",
1063
+ "integration.templates.gallery.search.placeholder": "Search templates, vendors…",
1064
+ "integration.templates.gallery.sort.aria": "Sort templates",
1065
+ "integration.templates.gallery.sort.level": "Sort: Simplest first",
1066
+ "integration.templates.gallery.sort.name": "Sort: A–Z",
1067
+ "integration.templates.gallery.sort.nodes": "Sort: Most steps",
1068
+ "integration.templates.gallery.state.loading": "Loading templates…",
1069
+ "integration.templates.gallery.state.regionLabel": "Template gallery",
1070
+ "integration.templates.preview.state.loading": "Preview loading…",
1071
+ "integration.templates.preview.triggerLabel": "Trigger",
1072
+ "integration.templates.state.error.fallback": "Could not load templates.",
1073
+ "integration.templates.trigger.manual": "Run on demand",
1074
+ "integration.templates.trigger.webhook": "Webhook",
1075
+ "integration.triggers.error.loadFailed": "Could not load triggers.",
1076
+ "integration.workflows.action.duplicate": "Duplicate",
1077
+ "integration.workflows.create.action.submit": "Create and open editor",
1078
+ "integration.workflows.create.action.submitting": "Creating…",
1079
+ "integration.workflows.create.dialog.title": "New workflow",
1080
+ "integration.workflows.create.error.generic": "Could not create the workflow.",
1081
+ "integration.workflows.create.error.nameRequired": "Name is required.",
1082
+ "integration.workflows.create.executionMode.asyncOnly.hint": "Always queued.",
1083
+ "integration.workflows.create.executionMode.asyncOnly.label": "Async only",
1084
+ "integration.workflows.create.executionMode.callerDecides.hint": "The request chooses.",
1085
+ "integration.workflows.create.executionMode.callerDecides.label": "Caller decides",
1086
+ "integration.workflows.create.executionMode.syncOnly.hint": "Waits for the result.",
1087
+ "integration.workflows.create.executionMode.syncOnly.label": "Sync only",
1088
+ "integration.workflows.create.field.description.label": "Description",
1089
+ "integration.workflows.create.field.description.placeholder": "Optional: what this workflow does and why it exists.",
1090
+ "integration.workflows.create.field.executionMode.label": "Execution mode",
1091
+ "integration.workflows.create.field.icon.label": "Icon",
1092
+ "integration.workflows.create.field.name.label": "Name",
1093
+ "integration.workflows.create.field.name.placeholder": "Sync orders nightly",
1094
+ "integration.workflows.create.field.tags.label": "Tags",
1095
+ "integration.workflows.create.field.trigger.label": "Trigger",
1096
+ "integration.workflows.create.tab.blank": "Start blank",
1097
+ "integration.workflows.create.tab.template": "Start from template",
1098
+ "integration.workflows.create.template.browseAll": "Browse the full template catalogue",
1099
+ "integration.workflows.create.template.empty": "No templates in the catalogue yet.",
1100
+ "integration.workflows.create.template.noMatch": "Nothing matches “{query}”.",
1101
+ "integration.workflows.create.template.search.aria": "Search templates",
1102
+ "integration.workflows.create.template.search.placeholder": "Search templates…",
1103
+ "integration.workflows.create.toast.templateError": "Could not create the workflow from this template.",
1104
+ "integration.workflows.duplicate.dialog.description": "Creates a paused copy of “{name}” with all triggers off.",
1105
+ "integration.workflows.duplicate.dialog.title": "Duplicate workflow",
1106
+ "integration.workflows.duplicate.error.generic": "Could not duplicate the workflow.",
1107
+ "integration.workflows.duplicate.field.name.default": "{name} (Copy)",
1108
+ "integration.workflows.duplicate.field.name.label": "Name",
1109
+ "integration.workflows.error.duplicateFailed": "Could not duplicate the workflow.",
1110
+ "integration.workflows.error.loadFailed": "Could not load workflows.",
1111
+ "integration.workflows.error.notFound": "Workflow not found.",
1112
+ "integration.workflows.iconCatalog.label.fallback": "Integration",
1113
+ "integration.workflows.iconPicker.action.none": "No icon (default glyph)",
1114
+ "integration.workflows.iconPicker.label.default": "Default icon",
1115
+ "integration.workflows.iconPicker.label.iconFallback": "Icon",
1116
+ "integration.workflows.iconPicker.label.imageFallback": "Image",
1117
+ "integration.workflows.iconPicker.section.integrations": "Integrations",
1118
+ "integration.workflows.list.action.new": "New workflow",
1119
+ "integration.workflows.list.error.title": "Could not load workflows",
1120
+ "integration.workflows.list.head.title": "Workflows · Revenexx Cockpit",
1121
+ "integration.workflows.list.header.title": "Workflows",
1122
+ "integration.workflows.settings.action.save": "Save changes",
1123
+ "integration.workflows.settings.dialog.description": "Execution behaviour and metadata for “{name}”.",
1124
+ "integration.workflows.settings.dialog.title": "Workflow settings",
1125
+ "integration.workflows.settings.field.description.label": "Description",
1126
+ "integration.workflows.settings.field.description.placeholder": "What this workflow does and why it exists.",
1127
+ "integration.workflows.settings.field.executionMode.aria": "Execution mode",
1128
+ "integration.workflows.settings.field.executionMode.placeholder": "Pick a mode",
1129
+ "integration.workflows.settings.field.icon.label": "Icon",
1130
+ "integration.workflows.settings.field.name.label": "Name",
1131
+ "integration.workflows.settings.field.name.placeholder": "Workflow name",
1132
+ "integration.workflows.settings.field.tags.label": "Tags",
1133
+ "integration.workflows.settings.meta.created": "Created",
1134
+ "integration.workflows.settings.meta.definition": "Definition",
1135
+ "integration.workflows.settings.meta.id": "ID",
1136
+ "integration.workflows.settings.meta.revision": "Revision",
1137
+ "integration.workflows.settings.meta.updated": "Updated",
1138
+ "integration.workflows.settings.section.appearance": "Appearance",
1139
+ "integration.workflows.settings.section.execution": "Execution",
1140
+ "integration.workflows.settings.section.metadata": "Metadata",
1141
+ "integration.workflows.table.action.groupByTags": "Group by tags",
1142
+ "integration.workflows.table.column.build": "Build",
1143
+ "integration.workflows.table.column.lastRun": "Last run",
1144
+ "integration.workflows.table.column.mode": "Mode",
1145
+ "integration.workflows.table.column.name": "Name",
1146
+ "integration.workflows.table.column.status": "Status",
1147
+ "integration.workflows.table.column.triggers": "Triggers",
1148
+ "integration.workflows.table.column.updated": "Updated",
1149
+ "integration.workflows.table.deleteDialog.action.deleting": "Deleting…",
1150
+ "integration.workflows.table.deleteDialog.description": "and all its revision history will be permanently deleted.",
1151
+ "integration.workflows.table.deleteDialog.title": "Delete workflow?",
1152
+ "integration.workflows.table.group.noTags": "No tags",
1153
+ "integration.workflows.table.lastRun.aria.never": "{name} last run: Never run",
1154
+ "integration.workflows.table.menu.action.activate": "Activate",
1155
+ "integration.workflows.table.menu.action.openEditor": "Open editor",
1156
+ "integration.workflows.table.menu.action.pause": "Pause",
1157
+ "integration.workflows.table.menu.actions.aria": "Actions for {name}",
1158
+ "integration.workflows.table.menu.actions.label": "Actions",
1159
+ "integration.workflows.table.mode.async": "async",
1160
+ "integration.workflows.table.mode.caller": "caller",
1161
+ "integration.workflows.table.mode.sync": "sync",
1162
+ "integration.workflows.table.search.placeholder": "Search workflows…",
1163
+ "integration.workflows.table.state.empty": "No workflows yet.",
1164
+ "integration.workflows.table.status.build.building": "Building…",
1165
+ "integration.workflows.table.status.build.failed": "Failed",
1166
+ "integration.workflows.table.status.build.pending": "Pending",
1167
+ "integration.workflows.table.status.build.ready": "Ready",
1168
+ "integration.workflows.table.status.lifecycle.active": "Active",
1169
+ "integration.workflows.table.status.lifecycle.draft": "Draft",
1170
+ "integration.workflows.table.status.lifecycle.paused": "Paused",
1171
+ "integration.workflows.table.status.run.cancelled": "Cancelled",
1172
+ "integration.workflows.table.status.run.failed": "Failed",
1173
+ "integration.workflows.table.status.run.queued": "Queued",
1174
+ "integration.workflows.table.status.run.running": "Running",
1175
+ "integration.workflows.table.status.run.succeeded": "Success",
1176
+ "integration.workflows.table.toast.activateBlocked": "Can’t activate “{name}” — {n} validation issue to fix. Open the editor to resolve them. | Can’t activate “{name}” — {n} validation issues to fix. Open the editor to resolve them.",
1177
+ "integration.workflows.table.toast.duplicated": "Duplicated as “{name}”",
1178
+ "integration.workflows.table.toast.statusChangeFailed": "Could not change the workflow status.",
1179
+ "integration.workflows.tagsInput.action.remove": "Remove {tag}",
1180
+ "integration.workflows.tagsInput.placeholder.add": "Add tag…",
1181
+ "integration.workflows.tagsInput.placeholder.addFirst": "Add tags — Enter confirms…",
1182
+ "integration.workflows.validation.summary": "{n} setting{nodesClause} still needs fixing | {n} settings{nodesClause} still need fixing",
1183
+ "integration.workflows.validation.summary.nodesClause": "in {n} node | in {n} nodes",
1184
+ "integration.workflows.variables.action.add": "Add",
1185
+ "integration.workflows.variables.action.copyUsage.title": "Copy ${{ vars.{key} }}",
1186
+ "integration.workflows.variables.action.delete": "Delete variable",
1187
+ "integration.workflows.variables.dialog.description.after": "Changes persist with the workflow Save.",
1188
+ "integration.workflows.variables.dialog.description.before": "Reusable values for this workflow — reference them in any config field as",
1189
+ "integration.workflows.variables.dialog.title": "Workflow variables",
1190
+ "integration.workflows.variables.error.invalidJson": "Not valid JSON.",
1191
+ "integration.workflows.variables.error.invalidKey": "Letters, digits and _ only; must not start with a digit.",
1192
+ "integration.workflows.variables.error.keyExists": "Key already exists.",
1193
+ "integration.workflows.variables.error.mustBeArray": "Must be a JSON array.",
1194
+ "integration.workflows.variables.error.mustBeObject": "Must be a JSON object.",
1195
+ "integration.workflows.variables.field.description.label": "Description",
1196
+ "integration.workflows.variables.field.description.placeholder": "What this variable is for",
1197
+ "integration.workflows.variables.field.newKey.label": "New variable",
1198
+ "integration.workflows.variables.field.newKey.placeholder": "e.g. base_url",
1199
+ "integration.workflows.variables.field.type.label": "Type",
1200
+ "integration.workflows.variables.field.value.label": "Value",
1201
+ "integration.workflows.variables.field.value.placeholder.array": "JSON array, e.g. [1, 2]",
1202
+ "integration.workflows.variables.field.value.placeholder.object": "JSON object, e.g. { … }",
1203
+ "integration.workflows.variables.row.aria": "Variable {key}",
1204
+ "integration.workflows.variables.state.empty": "No variables yet — add the first one below.",
1205
+ "integration.workflows.variables.toast.copied": "Expression copied",
1206
+ "integration.workflows.variables.toast.copyFailed": "Could not copy"
1207
+ }