@revenexx/studio-integrations 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +457 -0
  2. package/dist/module.json +1 -1
  3. package/dist/runtime/components/Integrations/CanvasShortcutsDialog.d.vue.ts +9 -0
  4. package/dist/runtime/components/Integrations/CanvasShortcutsDialog.vue +53 -0
  5. package/dist/runtime/components/Integrations/CanvasShortcutsDialog.vue.d.ts +9 -0
  6. package/dist/runtime/components/Integrations/CredentialDetailDialog.vue +61 -29
  7. package/dist/runtime/components/Integrations/EditorTip.vue +2 -15
  8. package/dist/runtime/components/Integrations/NodeConfigField.d.vue.ts +10 -0
  9. package/dist/runtime/components/Integrations/NodeConfigField.vue +94 -49
  10. package/dist/runtime/components/Integrations/NodeConfigField.vue.d.ts +10 -0
  11. package/dist/runtime/components/Integrations/NodeInspector.vue +37 -60
  12. package/dist/runtime/components/Integrations/RunDetailPanel.vue +80 -33
  13. package/dist/runtime/components/Integrations/TemplateCard.d.vue.ts +0 -4
  14. package/dist/runtime/components/Integrations/TemplateCard.vue +3 -6
  15. package/dist/runtime/components/Integrations/TemplateCard.vue.d.ts +0 -4
  16. package/dist/runtime/components/Integrations/TemplateInstallStep.d.vue.ts +25 -0
  17. package/dist/runtime/components/Integrations/TemplateInstallStep.vue +198 -0
  18. package/dist/runtime/components/Integrations/TemplateInstallStep.vue.d.ts +25 -0
  19. package/dist/runtime/components/Integrations/WorkflowContextMenu.d.vue.ts +2 -2
  20. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue +22 -40
  21. package/dist/runtime/components/Integrations/WorkflowContextMenu.vue.d.ts +2 -2
  22. package/dist/runtime/components/Integrations/WorkflowCreateDialog.vue +94 -65
  23. package/dist/runtime/components/Integrations/WorkflowEditor.d.vue.ts +36 -2
  24. package/dist/runtime/components/Integrations/WorkflowEditor.vue +165 -56
  25. package/dist/runtime/components/Integrations/WorkflowEditor.vue.d.ts +36 -2
  26. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.d.vue.ts +6 -2
  27. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue +4 -106
  28. package/dist/runtime/components/Integrations/WorkflowRunReplayPanel.vue.d.ts +6 -2
  29. package/dist/runtime/components/Integrations/WorkflowsTable.vue +22 -11
  30. package/dist/runtime/composables/useCanvasShortcuts.d.ts +34 -0
  31. package/dist/runtime/composables/useCanvasShortcuts.js +11 -8
  32. package/dist/runtime/composables/useCredentialTypes.js +3 -9
  33. package/dist/runtime/composables/useIntegrationsCredentials.js +6 -14
  34. package/dist/runtime/composables/useIntegrationsNodes.js +2 -2
  35. package/dist/runtime/composables/useIntegrationsRuns.js +8 -13
  36. package/dist/runtime/composables/useIntegrationsSecrets.js +5 -5
  37. package/dist/runtime/composables/useIntegrationsTemplates.js +5 -8
  38. package/dist/runtime/composables/useIntegrationsTriggers.js +1 -4
  39. package/dist/runtime/composables/useIntegrationsWorkflows.js +5 -7
  40. package/dist/runtime/data/canvasShortcuts.d.ts +208 -0
  41. package/dist/runtime/data/canvasShortcuts.js +68 -0
  42. package/dist/runtime/i18n/messages/de.json +30 -16
  43. package/dist/runtime/i18n/messages/en.json +30 -16
  44. package/dist/runtime/pages/integrations/credentials.vue +40 -18
  45. package/dist/runtime/pages/integrations/templates/[slug].vue +22 -132
  46. package/dist/runtime/pages/integrations/workflows/[id].vue +128 -33
  47. package/dist/runtime/utils/apiEnvelope.d.ts +27 -0
  48. package/dist/runtime/utils/apiEnvelope.js +20 -0
  49. package/dist/runtime/utils/apiError.d.ts +35 -8
  50. package/dist/runtime/utils/apiError.js +12 -12
  51. package/dist/runtime/utils/configDefaults.d.ts +18 -0
  52. package/dist/runtime/utils/configDefaults.js +7 -0
  53. package/dist/runtime/utils/errorPathAdvice.d.ts +60 -0
  54. package/dist/runtime/utils/errorPathAdvice.js +19 -0
  55. package/dist/runtime/utils/notify.d.ts +2 -2
  56. package/dist/runtime/utils/runEnvelope.d.ts +12 -0
  57. package/dist/runtime/utils/runEnvelope.js +2 -1
  58. package/dist/runtime/utils/selectOptions.d.ts +48 -0
  59. package/dist/runtime/utils/selectOptions.js +19 -0
  60. package/dist/runtime/utils/shortcutLabel.d.ts +40 -0
  61. package/dist/runtime/utils/shortcutLabel.js +48 -0
  62. package/package.json +1 -1
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Every key the workflow canvas answers, in one list.
3
+ *
4
+ * WHY THIS FILE EXISTS. The bindings used to live only in the editor's keymap,
5
+ * which is `key → function` and carries no words at all — so each surface that
6
+ * shows a key wrote the token out again by hand: fifteen in the canvas context
7
+ * menu, twelve more in the control pane's tooltips, for twenty-two bindings.
8
+ * They had already drifted. The menu offered renaming as `F2` while the keymap
9
+ * answered `F2` *and* `Space`, and it showed `⌫` for a key the keymap does not
10
+ * hold at all — deleting is the canvas library's own, configured somewhere else
11
+ * entirely. Two of the twenty-two were shown nowhere.
12
+ *
13
+ * So the tokens live here, keyed by an id, and the three surfaces are readers:
14
+ * the keymap binds handlers by id, the menu and the tooltips ask for one id's
15
+ * keys, and the overview shows the list. Adding a key is one entry, and it
16
+ * reaches all three.
17
+ *
18
+ * WHAT IS NOT HERE. The handlers, because they belong to the surface that owns
19
+ * the canvas and close over its selection. And the menu's own labels: an entry
20
+ * there says "Copy {n} nodes" against this list's "Copy", because a menu speaks
21
+ * about what is under the pointer while an overview speaks in general. Only the
22
+ * TOKENS are shared, which is what actually drifted.
23
+ */
24
+ /** The heading a key is listed under. Ordered as the overview shows them. */
25
+ export declare const SHORTCUT_GROUPS: readonly ["nodes", "selection", "canvas", "view", "workflow"];
26
+ export type ShortcutGroup = typeof SHORTCUT_GROUPS[number];
27
+ export interface CanvasShortcut {
28
+ /** Stable id: what a handler, a menu item and a tooltip refer to. */
29
+ id: string;
30
+ /**
31
+ * The binding in the matcher's token form; `|` separates two gestures worth
32
+ * knowing about — renaming answers `F2` and `Space`, and neither can be
33
+ * guessed from the other.
34
+ *
35
+ * Everything bound is listed, and nothing is bound that is not: a key that
36
+ * answers without appearing here would be exactly the secret this file exists
37
+ * to abolish. Zooming in was briefly `+` with `=` bound quietly beside it, for
38
+ * the US keyboards that reach the same character that way — and zooming out has
39
+ * no such twin, so there was no symmetry to keep and one key each is the answer.
40
+ *
41
+ * Punctuation is written as the character, never as `shift+<key>`: a layout
42
+ * that needs Shift to type it says so in the event and the matcher drops that
43
+ * Shift, so `shift+/` would bind a US keyboard only.
44
+ */
45
+ keys: string;
46
+ /** The catalogue key for the words the overview shows. */
47
+ labelKey: string;
48
+ group: ShortcutGroup;
49
+ /**
50
+ * Answered by the canvas library rather than by the keymap, so there is no
51
+ * handler to bind — it is listed because an overview that omits the
52
+ * most-used key of the surface is worse than none.
53
+ */
54
+ library?: true;
55
+ }
56
+ export declare const CANVAS_SHORTCUTS: readonly [{
57
+ readonly id: "open";
58
+ readonly keys: "enter";
59
+ readonly labelKey: "integration.canvas.contextMenu.item.open";
60
+ readonly group: "nodes";
61
+ }, {
62
+ readonly id: "rename";
63
+ readonly keys: "f2|space";
64
+ readonly labelKey: "integration.canvas.contextMenu.item.rename";
65
+ readonly group: "nodes";
66
+ }, {
67
+ readonly id: "addNode";
68
+ readonly keys: "tab";
69
+ readonly labelKey: "integration.canvas.contextMenu.item.addNode";
70
+ readonly group: "nodes";
71
+ }, {
72
+ readonly id: "copy";
73
+ readonly keys: "mod+c";
74
+ readonly labelKey: "integration.canvas.contextMenu.item.copy";
75
+ readonly group: "nodes";
76
+ }, {
77
+ readonly id: "paste";
78
+ readonly keys: "mod+v";
79
+ readonly labelKey: "integration.canvas.contextMenu.item.paste";
80
+ readonly group: "nodes";
81
+ }, {
82
+ readonly id: "duplicate";
83
+ readonly keys: "mod+d";
84
+ readonly labelKey: "integration.canvas.contextMenu.item.duplicate";
85
+ readonly group: "nodes";
86
+ }, {
87
+ readonly id: "delete";
88
+ readonly keys: "backspace|delete";
89
+ readonly labelKey: "integration.canvas.shortcuts.item.delete";
90
+ readonly group: "nodes";
91
+ readonly library: true;
92
+ }, {
93
+ readonly id: "selectAll";
94
+ readonly keys: "mod+a";
95
+ readonly labelKey: "integration.canvas.contextMenu.item.selectAll";
96
+ readonly group: "selection";
97
+ }, {
98
+ readonly id: "clearSelection";
99
+ readonly keys: "escape";
100
+ readonly labelKey: "integration.canvas.contextMenu.item.clearSelection";
101
+ readonly group: "selection";
102
+ }, {
103
+ readonly id: "group";
104
+ readonly keys: "mod+g";
105
+ readonly labelKey: "integration.canvas.shortcuts.item.group";
106
+ readonly group: "selection";
107
+ }, {
108
+ readonly id: "pointerSelect";
109
+ readonly keys: "v";
110
+ readonly labelKey: "integration.editor.tool.select";
111
+ readonly group: "canvas";
112
+ }, {
113
+ readonly id: "pointerHand";
114
+ readonly keys: "h";
115
+ readonly labelKey: "integration.editor.tool.hand";
116
+ readonly group: "canvas";
117
+ }, {
118
+ readonly id: "addSticky";
119
+ readonly keys: "shift+s";
120
+ readonly labelKey: "integration.editor.tool.addSticky.tooltip";
121
+ readonly group: "canvas";
122
+ }, {
123
+ readonly id: "tidyUp";
124
+ readonly keys: "shift+alt+t";
125
+ readonly labelKey: "integration.editor.tool.tidyUp";
126
+ readonly group: "canvas";
127
+ }, {
128
+ readonly id: "overview";
129
+ readonly keys: "?";
130
+ readonly labelKey: "integration.canvas.shortcuts.item.overview";
131
+ readonly group: "canvas";
132
+ }, {
133
+ readonly id: "zoomIn";
134
+ readonly keys: "+";
135
+ readonly labelKey: "integration.editor.tool.zoomIn";
136
+ readonly group: "view";
137
+ }, {
138
+ readonly id: "zoomOut";
139
+ readonly keys: "-";
140
+ readonly labelKey: "integration.editor.tool.zoomOut";
141
+ readonly group: "view";
142
+ }, {
143
+ readonly id: "zoomReset";
144
+ readonly keys: "0";
145
+ readonly labelKey: "integration.canvas.shortcuts.item.zoomReset";
146
+ readonly group: "view";
147
+ }, {
148
+ readonly id: "fitView";
149
+ readonly keys: "1";
150
+ readonly labelKey: "integration.canvas.contextMenu.item.fitView";
151
+ readonly group: "view";
152
+ }, {
153
+ readonly id: "run";
154
+ readonly keys: "mod+enter";
155
+ readonly labelKey: "integration.canvas.contextMenu.item.runWorkflow";
156
+ readonly group: "workflow";
157
+ }, {
158
+ readonly id: "toggleActive";
159
+ readonly keys: "shift+a";
160
+ readonly labelKey: "integration.canvas.shortcuts.item.toggleActive";
161
+ readonly group: "workflow";
162
+ }, {
163
+ readonly id: "variables";
164
+ readonly keys: "shift+v";
165
+ readonly labelKey: "integration.editor.tool.variables.tooltip";
166
+ readonly group: "workflow";
167
+ }, {
168
+ readonly id: "state";
169
+ readonly keys: "shift+t";
170
+ readonly labelKey: "integration.canvas.shortcuts.item.state";
171
+ readonly group: "workflow";
172
+ }, {
173
+ readonly id: "settings";
174
+ readonly keys: "shift+alt+s";
175
+ readonly labelKey: "integration.editor.tool.settings.tooltip";
176
+ readonly group: "workflow";
177
+ }];
178
+ /**
179
+ * The ids, as a type.
180
+ *
181
+ * `as const` above is what makes this a union of the literal ids rather than
182
+ * `string` — so a mistyped id in a template (`primaryShortcut('zoomln')`) fails
183
+ * the type check instead of throwing while the editor renders, which is where
184
+ * the lookup below would otherwise report it.
185
+ */
186
+ export type ShortcutId = typeof CANVAS_SHORTCUTS[number]['id'];
187
+ /**
188
+ * The catalogue key per group heading, written out rather than composed.
189
+ *
190
+ * A key built from the group name (`…group.${g}`) would work and would be
191
+ * invisible to every search for it — including the catalogue's own record of
192
+ * where a string is used, which is maintained by hand.
193
+ */
194
+ export declare const SHORTCUT_GROUP_LABELS: Record<ShortcutGroup, string>;
195
+ /** One id's binding, every way of pressing it included. */
196
+ export declare function shortcutKeys(id: ShortcutId): string;
197
+ /** Its gestures one by one, which is a cap each in the overview. */
198
+ export declare function shortcutCaps(id: ShortcutId): string[];
199
+ /**
200
+ * The one way of pressing it that a hint shows.
201
+ *
202
+ * A menu row and a tooltip have room for one gesture, and showing `F2|Space`
203
+ * there would read as a key nobody has. The overview is where both appear —
204
+ * which is also how `Space` stopped being a key the product answers and names
205
+ * nowhere.
206
+ */
207
+ export declare function primaryShortcut(id: ShortcutId): string;
208
+ export declare function libraryKeyCodes(id: ShortcutId): string[];
@@ -0,0 +1,68 @@
1
+ export const SHORTCUT_GROUPS = ["nodes", "selection", "canvas", "view", "workflow"];
2
+ export const CANVAS_SHORTCUTS = [
3
+ // ── A node, and what is done to it ────────────────────────────────────────
4
+ { id: "open", keys: "enter", labelKey: "integration.canvas.contextMenu.item.open", group: "nodes" },
5
+ { id: "rename", keys: "f2|space", labelKey: "integration.canvas.contextMenu.item.rename", group: "nodes" },
6
+ { id: "addNode", keys: "tab", labelKey: "integration.canvas.contextMenu.item.addNode", group: "nodes" },
7
+ { id: "copy", keys: "mod+c", labelKey: "integration.canvas.contextMenu.item.copy", group: "nodes" },
8
+ { id: "paste", keys: "mod+v", labelKey: "integration.canvas.contextMenu.item.paste", group: "nodes" },
9
+ { id: "duplicate", keys: "mod+d", labelKey: "integration.canvas.contextMenu.item.duplicate", group: "nodes" },
10
+ { id: "delete", keys: "backspace|delete", labelKey: "integration.canvas.shortcuts.item.delete", group: "nodes", library: true },
11
+ // ── The selection ─────────────────────────────────────────────────────────
12
+ { id: "selectAll", keys: "mod+a", labelKey: "integration.canvas.contextMenu.item.selectAll", group: "selection" },
13
+ { id: "clearSelection", keys: "escape", labelKey: "integration.canvas.contextMenu.item.clearSelection", group: "selection" },
14
+ { id: "group", keys: "mod+g", labelKey: "integration.canvas.shortcuts.item.group", group: "selection" },
15
+ // ── Working on the canvas itself ──────────────────────────────────────────
16
+ { id: "pointerSelect", keys: "v", labelKey: "integration.editor.tool.select", group: "canvas" },
17
+ { id: "pointerHand", keys: "h", labelKey: "integration.editor.tool.hand", group: "canvas" },
18
+ { id: "addSticky", keys: "shift+s", labelKey: "integration.editor.tool.addSticky.tooltip", group: "canvas" },
19
+ { id: "tidyUp", keys: "shift+alt+t", labelKey: "integration.editor.tool.tidyUp", group: "canvas" },
20
+ // Last of the canvas's own keys, and not one of the workflow's: the overview is
21
+ // about the surface an operator is standing on, not about the thing on it. It
22
+ // lists itself so the key is learnt for next time, the way it is the only key a
23
+ // reader of this list has already found.
24
+ { id: "overview", keys: "?", labelKey: "integration.canvas.shortcuts.item.overview", group: "canvas" },
25
+ // ── What is on screen ─────────────────────────────────────────────────────
26
+ { id: "zoomIn", keys: "+", labelKey: "integration.editor.tool.zoomIn", group: "view" },
27
+ { id: "zoomOut", keys: "-", labelKey: "integration.editor.tool.zoomOut", group: "view" },
28
+ { id: "zoomReset", keys: "0", labelKey: "integration.canvas.shortcuts.item.zoomReset", group: "view" },
29
+ { id: "fitView", keys: "1", labelKey: "integration.canvas.contextMenu.item.fitView", group: "view" },
30
+ // ── The workflow the canvas is showing ────────────────────────────────────
31
+ { id: "run", keys: "mod+enter", labelKey: "integration.canvas.contextMenu.item.runWorkflow", group: "workflow" },
32
+ { id: "toggleActive", keys: "shift+a", labelKey: "integration.canvas.shortcuts.item.toggleActive", group: "workflow" },
33
+ { id: "variables", keys: "shift+v", labelKey: "integration.editor.tool.variables.tooltip", group: "workflow" },
34
+ { id: "state", keys: "shift+t", labelKey: "integration.canvas.shortcuts.item.state", group: "workflow" },
35
+ { id: "settings", keys: "shift+alt+s", labelKey: "integration.editor.tool.settings.tooltip", group: "workflow" }
36
+ ];
37
+ export const SHORTCUT_GROUP_LABELS = {
38
+ nodes: "integration.canvas.shortcuts.group.nodes",
39
+ selection: "integration.canvas.shortcuts.group.selection",
40
+ canvas: "integration.canvas.shortcuts.group.canvas",
41
+ view: "integration.canvas.shortcuts.group.view",
42
+ workflow: "integration.canvas.shortcuts.group.workflow"
43
+ };
44
+ const BY_ID = new Map(CANVAS_SHORTCUTS.map((s) => [s.id, s]));
45
+ export function shortcutKeys(id) {
46
+ const found = BY_ID.get(id);
47
+ if (!found) throw new Error(`Unknown canvas shortcut: ${id}`);
48
+ return found.keys;
49
+ }
50
+ export function shortcutCaps(id) {
51
+ return shortcutKeys(id).split("|");
52
+ }
53
+ export function primaryShortcut(id) {
54
+ return shortcutCaps(id)[0];
55
+ }
56
+ const LIBRARY_KEY_CODES = {
57
+ backspace: "Backspace",
58
+ delete: "Delete"
59
+ };
60
+ export function libraryKeyCodes(id) {
61
+ const entry = BY_ID.get(id);
62
+ if (!entry?.library) throw new Error(`Canvas shortcut ${id} is not the canvas library's own key`);
63
+ return shortcutKeys(id).split("|").map((token) => {
64
+ const code = LIBRARY_KEY_CODES[token];
65
+ if (!code) throw new Error(`No canvas-library key code known for ${token}`);
66
+ return code;
67
+ });
68
+ }
@@ -91,6 +91,20 @@
91
91
  "integration.canvas.palette.search.placeholderGroup": "In {group} suchen…",
92
92
  "integration.canvas.palette.title.addNode": "Node hinzufügen",
93
93
  "integration.canvas.palette.version.selectAria": "Einzufügende Version für {name}",
94
+ "integration.canvas.shortcuts.dialog.description": "Die Tasten, die dieser Canvas beantwortet. Keine davon löst aus, solange ein Dialog offen ist oder der Cursor in einem Feld steht.",
95
+ "integration.canvas.shortcuts.dialog.title": "Tastenkürzel",
96
+ "integration.canvas.shortcuts.group.canvas": "Canvas",
97
+ "integration.canvas.shortcuts.group.nodes": "Nodes",
98
+ "integration.canvas.shortcuts.group.selection": "Auswahl",
99
+ "integration.canvas.shortcuts.group.view": "Ansicht",
100
+ "integration.canvas.shortcuts.group.workflow": "Workflow",
101
+ "integration.canvas.shortcuts.item.delete": "Auswahl löschen",
102
+ "integration.canvas.shortcuts.item.group": "Auswahl gruppieren",
103
+ "integration.canvas.shortcuts.item.overview": "Diese Tastenkürzel anzeigen",
104
+ "integration.canvas.shortcuts.item.state": "Was sich dieser Workflow merkt",
105
+ "integration.canvas.shortcuts.item.toggleActive": "Workflow aktivieren oder pausieren",
106
+ "integration.canvas.shortcuts.item.zoomReset": "Zoom auf 100 %",
107
+ "integration.canvas.shortcuts.or": "oder",
94
108
  "integration.canvas.sticky.action.delete": "Notiz löschen",
95
109
  "integration.canvas.sticky.action.resize": "Größe ändern",
96
110
  "integration.canvas.sticky.state.emptyHint": "Zum Bearbeiten doppelklicken",
@@ -327,7 +341,8 @@
327
341
  "integration.editor.action.more.aria": "Weitere Aktionen für diesen Workflow",
328
342
  "integration.editor.action.more.label": "Aktionen",
329
343
  "integration.editor.action.pause.title": "Workflow pausieren",
330
- "integration.editor.action.retry": "Erneut versuchen",
344
+ "integration.editor.action.retry": "Erneut ausführen",
345
+ "integration.editor.action.retry.title": "Führt den Workflow in seinem aktuell gespeicherten Stand aus, mit dem Trigger-Payload dieses Runs.",
331
346
  "integration.editor.action.save.label": "Speichern",
332
347
  "integration.editor.action.save.saving": "Wird gespeichert…",
333
348
  "integration.editor.action.state.label": "Workflow-Status",
@@ -362,6 +377,13 @@
362
377
  "integration.editor.dropGhost.label": "Loslassen zum Hinzufügen",
363
378
  "integration.editor.emptyState.hint": "Ziehen Sie einen Trigger und eine Aktion aus dem Panel links.",
364
379
  "integration.editor.emptyState.title": "Leere Arbeitsfläche",
380
+ "integration.editor.errorPath.action.stop": "Fehlerausgang stoppen lassen",
381
+ "integration.editor.errorPath.advice": "{n} Node leitet Fehler auf einen Ausgang, an dem nichts hängt — der Fehler wird dort nicht behandelt. | {n} Nodes leiten Fehler auf einen Ausgang, an dem nichts hängt — der Fehler wird dort nicht behandelt.",
382
+ "integration.editor.errorPath.ariaFix": "Ausgang „{port}“ von {label} auf Stop und Fehler legen",
383
+ "integration.editor.errorPath.ariaReveal": "{label} auf der Canvas zeigen — der Ausgang „{port}“ ist nicht verbunden",
384
+ "integration.editor.errorPath.message": "{label} fehlgeschlagen: ${{ nodes.{nodeId}.outputs.{port}.message }}",
385
+ "integration.editor.errorPath.more": "…und {n} weitere",
386
+ "integration.editor.errorPath.toast.added": "Stop und Fehler an {label} gehängt — noch nicht gespeichert.",
365
387
  "integration.editor.event.toast.noneReceived": "Noch kein {topic}-Event empfangen.",
366
388
  "integration.editor.executionMode.async.hint": "Runs werden immer in die Warteschlange gestellt; der Trigger antwortet sofort.",
367
389
  "integration.editor.executionMode.async.label": "Nur asynchron",
@@ -419,8 +441,8 @@
419
441
  "integration.editor.runPayload.action.sampleEvent": "Beispiel-Event",
420
442
  "integration.editor.runPayload.action.sampleEvent.titleAvailable": "Beispiel-Payload aus dem Katalog einfügen",
421
443
  "integration.editor.runPayload.action.sampleEvent.titleUnavailable": "Der Event-Katalog enthält kein Beispiel für dieses Topic.",
422
- "integration.editor.runPayload.dialog.description": "Startet einen manuellen Run mit diesem Trigger-Payload. Das Ergebnis erscheint im Tab Runs.",
423
- "integration.editor.runPayload.dialog.title": "Mit Payload ausführen",
444
+ "integration.editor.runPayload.dialog.description": "Startet einen manuellen Run dieses Workflows. Was er zurückgibt, erscheint hier, sobald er beendet ist.",
445
+ "integration.editor.runPayload.dialog.title": "Workflow ausführen",
424
446
  "integration.editor.runPayload.prefill.label": "Vorbelegen mit",
425
447
  "integration.editor.runView.details": "Details",
426
448
  "integration.editor.runView.replay": "Replay",
@@ -829,7 +851,7 @@
829
851
  "integration.nodes.error.loadFailed": "Nodes konnten nicht geladen werden.",
830
852
  "integration.replay.badge.live": "Live",
831
853
  "integration.replay.badge.snapshot": "Momentaufnahme",
832
- "integration.replay.canvas.pickRun": "Run auswählen",
854
+ "integration.replay.canvas.pickRun": "Kein Run ausgewählt",
833
855
  "integration.replay.canvas.runLabel": "Run #{id}",
834
856
  "integration.replay.debug.emptyHint": "Status, Zeiten und Payloads des aktiven Schritts erscheinen hier, während die Wiedergabe den Run durchläuft.",
835
857
  "integration.replay.debug.field.attempt": "Versuch",
@@ -845,13 +867,8 @@
845
867
  "integration.replay.debug.stepCounter": "Schritt {current} / {total}",
846
868
  "integration.replay.debug.titleFallback": "Debug",
847
869
  "integration.replay.error.loadStepsFailed": "Die Run-Schritte konnten nicht geladen werden.",
848
- "integration.replay.runsList.description": "Klicken Sie sich durch die Runs, um sie auf dem Canvas abzuspielen.",
849
- "integration.replay.runsList.empty": "Noch keine Runs — im Editor auf Run klicken.",
850
- "integration.replay.runsList.heading": "Runs",
851
- "integration.replay.runsList.loadMore": "Ältere Runs laden",
852
870
  "integration.replay.state.noSteps": "Für diesen Run wurden keine Schritte aufgezeichnet.",
853
- "integration.replay.state.pickRunHint": "Wählen Sie rechts einen Run zum Abspielen aus.",
854
- "integration.replay.toast.loadRunsFailed": "Die Runs konnten nicht geladen werden.",
871
+ "integration.replay.state.pickRunHint": "Kein Run zum Abspielen.",
855
872
  "integration.replay.transport.action.next": "Weiter",
856
873
  "integration.replay.transport.action.pause": "Pause",
857
874
  "integration.replay.transport.action.play": "Abspielen",
@@ -862,11 +879,9 @@
862
879
  "integration.runs.action.back": "Zurück",
863
880
  "integration.runs.action.cancel": "Run stoppen",
864
881
  "integration.runs.action.resume": "Fortsetzen",
865
- "integration.runs.action.retry": "Erneut ausführen",
866
882
  "integration.runs.action.terminate": "Terminieren",
867
883
  "integration.runs.confirm.cancel": "Diesen Run stoppen?",
868
884
  "integration.runs.confirm.resume": "Diesen Run fortsetzen?",
869
- "integration.runs.confirm.retry": "Diesen Run wiederholen?",
870
885
  "integration.runs.confirm.terminate": "Diesen Run terminieren?",
871
886
  "integration.runs.detail.error.details.expired": "Verlauf ist nicht mehr verfügbar (Aufbewahrung abgelaufen, kein Snapshot vorhanden).",
872
887
  "integration.runs.detail.error.details.generic": "Temporal-Details konnten nicht geladen werden.",
@@ -898,15 +913,13 @@
898
913
  "integration.runs.detail.stackTrace.hint": "Laden, um den aktuellen Call-Stack beim laufenden Worker abzufragen.",
899
914
  "integration.runs.detail.stackTrace.loading": "Worker wird abgefragt…",
900
915
  "integration.runs.detail.stackTrace.title": "Stacktrace",
901
- "integration.runs.detail.steps.action.hidePayloads": "Payloads ausblenden",
902
- "integration.runs.detail.steps.action.showPayloads": "Payloads anzeigen",
903
916
  "integration.runs.detail.steps.attemptLabel": "Versuch",
904
917
  "integration.runs.detail.steps.branchLabel": "Branch",
905
918
  "integration.runs.detail.steps.empty": "Noch keine Schritte erfasst.",
906
919
  "integration.runs.detail.steps.field.input": "Eingabe",
907
920
  "integration.runs.detail.steps.field.output": "Ausgabe",
908
921
  "integration.runs.detail.steps.loading": "Schritte werden geladen…",
909
- "integration.runs.detail.steps.payloadHint": "Aktivieren Sie „Payloads anzeigen“, um Eingabe und Ausgabe dieses Schritts zu laden.",
922
+ "integration.runs.detail.steps.payloadsLoading": "Eingabe und Ausgabe dieses Schritts werden geladen…",
910
923
  "integration.runs.detail.steps.title": "Schritte",
911
924
  "integration.runs.detail.timeline.label.activity": "Aktivität",
912
925
  "integration.runs.detail.timeline.label.timer": "Timer",
@@ -1082,6 +1095,7 @@
1082
1095
  "integration.templates.detail.install.secretsDescriptionSuffix": ".",
1083
1096
  "integration.templates.detail.install.secretsHeader": "Secrets",
1084
1097
  "integration.templates.detail.install.selectLater": "Später auswählen",
1098
+ "integration.templates.detail.install.state.loading": "Es wird geprüft, was diese Vorlage benötigt…",
1085
1099
  "integration.templates.detail.install.submit": "Installieren",
1086
1100
  "integration.templates.detail.install.submitting": "Wird eingerichtet…",
1087
1101
  "integration.templates.detail.publisher.kind.community": "Community",
@@ -1161,13 +1175,13 @@
1161
1175
  "integration.workflows.create.field.trigger.label": "Trigger",
1162
1176
  "integration.workflows.create.tab.blank": "Leer starten",
1163
1177
  "integration.workflows.create.tab.template": "Aus Vorlage starten",
1178
+ "integration.workflows.create.template.backToPicker": "Zurück zu den Vorlagen",
1164
1179
  "integration.workflows.create.template.browseAll": "Gesamten Vorlagenkatalog durchsuchen",
1165
1180
  "integration.workflows.create.template.empty": "Noch keine Vorlagen im Katalog.",
1166
1181
  "integration.workflows.create.template.noMatch": "Keine Treffer für „{query}“.",
1167
1182
  "integration.workflows.create.template.search.aria": "Vorlagen durchsuchen",
1168
1183
  "integration.workflows.create.template.search.placeholder": "Vorlagen durchsuchen…",
1169
1184
  "integration.workflows.create.template.state.loading": "Vorlagen werden geladen…",
1170
- "integration.workflows.create.toast.templateError": "Der Workflow konnte nicht aus dieser Vorlage erstellt werden.",
1171
1185
  "integration.workflows.delete.action.deleting": "Wird gelöscht…",
1172
1186
  "integration.workflows.delete.dialog.description": "und der gesamte Revisionsverlauf werden endgültig gelöscht.",
1173
1187
  "integration.workflows.delete.dialog.title": "Workflow löschen?",
@@ -91,6 +91,20 @@
91
91
  "integration.canvas.palette.search.placeholderGroup": "Search in {group}…",
92
92
  "integration.canvas.palette.title.addNode": "Add node",
93
93
  "integration.canvas.palette.version.selectAria": "Version to insert for {name}",
94
+ "integration.canvas.shortcuts.dialog.description": "The keys this canvas answers. None of them fires while a dialog is open or the cursor is in a field.",
95
+ "integration.canvas.shortcuts.dialog.title": "Keyboard shortcuts",
96
+ "integration.canvas.shortcuts.group.canvas": "Canvas",
97
+ "integration.canvas.shortcuts.group.nodes": "Nodes",
98
+ "integration.canvas.shortcuts.group.selection": "Selection",
99
+ "integration.canvas.shortcuts.group.view": "View",
100
+ "integration.canvas.shortcuts.group.workflow": "Workflow",
101
+ "integration.canvas.shortcuts.item.delete": "Delete the selection",
102
+ "integration.canvas.shortcuts.item.group": "Group the selection",
103
+ "integration.canvas.shortcuts.item.overview": "Show these shortcuts",
104
+ "integration.canvas.shortcuts.item.state": "What this workflow remembers",
105
+ "integration.canvas.shortcuts.item.toggleActive": "Activate or pause the workflow",
106
+ "integration.canvas.shortcuts.item.zoomReset": "Zoom to 100%",
107
+ "integration.canvas.shortcuts.or": "or",
94
108
  "integration.canvas.sticky.action.delete": "Delete note",
95
109
  "integration.canvas.sticky.action.resize": "Resize",
96
110
  "integration.canvas.sticky.state.emptyHint": "Double-click to edit",
@@ -327,7 +341,8 @@
327
341
  "integration.editor.action.more.aria": "More actions for this workflow",
328
342
  "integration.editor.action.more.label": "Actions",
329
343
  "integration.editor.action.pause.title": "Pause this workflow",
330
- "integration.editor.action.retry": "Retry",
344
+ "integration.editor.action.retry": "Run again",
345
+ "integration.editor.action.retry.title": "Runs the workflow as it is saved now, with this run's trigger payload.",
331
346
  "integration.editor.action.save.label": "Save",
332
347
  "integration.editor.action.save.saving": "Saving…",
333
348
  "integration.editor.action.state.label": "Workflow status",
@@ -362,6 +377,13 @@
362
377
  "integration.editor.dropGhost.label": "Drop to add",
363
378
  "integration.editor.emptyState.hint": "Drag a trigger and an action from the panel on the left.",
364
379
  "integration.editor.emptyState.title": "Empty canvas",
380
+ "integration.editor.errorPath.action.stop": "Stop the run on error",
381
+ "integration.editor.errorPath.advice": "{n} node routes failures to an output with nothing attached — nothing handles the failure there. | {n} nodes route failures to an output with nothing attached — nothing handles the failure there.",
382
+ "integration.editor.errorPath.ariaFix": "Route {label}'s \"{port}\" output to Stop and Error",
383
+ "integration.editor.errorPath.ariaReveal": "Show {label} on the canvas — its \"{port}\" output is not connected",
384
+ "integration.editor.errorPath.message": "{label} failed: ${{ nodes.{nodeId}.outputs.{port}.message }}",
385
+ "integration.editor.errorPath.more": "…and {n} more",
386
+ "integration.editor.errorPath.toast.added": "Stop and Error attached to {label} — not saved yet.",
365
387
  "integration.editor.event.toast.noneReceived": "No {topic} event received yet.",
366
388
  "integration.editor.executionMode.async.hint": "Runs are always queued; the trigger returns immediately.",
367
389
  "integration.editor.executionMode.async.label": "Async only",
@@ -419,8 +441,8 @@
419
441
  "integration.editor.runPayload.action.sampleEvent": "Sample event",
420
442
  "integration.editor.runPayload.action.sampleEvent.titleAvailable": "Insert the catalogue sample payload",
421
443
  "integration.editor.runPayload.action.sampleEvent.titleUnavailable": "The event catalogue has no sample for this topic.",
422
- "integration.editor.runPayload.dialog.description": "Starts a manual run with this trigger payload. The result lands on the Runs tab.",
423
- "integration.editor.runPayload.dialog.title": "Run with payload",
444
+ "integration.editor.runPayload.dialog.description": "Starts a manual run of this workflow. What it returns is shown here when it ends.",
445
+ "integration.editor.runPayload.dialog.title": "Run workflow",
424
446
  "integration.editor.runPayload.prefill.label": "Prefill",
425
447
  "integration.editor.runView.details": "Details",
426
448
  "integration.editor.runView.replay": "Replay",
@@ -829,7 +851,7 @@
829
851
  "integration.nodes.error.loadFailed": "Could not load nodes.",
830
852
  "integration.replay.badge.live": "Live",
831
853
  "integration.replay.badge.snapshot": "Snapshot",
832
- "integration.replay.canvas.pickRun": "Pick a run",
854
+ "integration.replay.canvas.pickRun": "No run selected",
833
855
  "integration.replay.canvas.runLabel": "Run #{id}",
834
856
  "integration.replay.debug.emptyHint": "The active step's status, timings and payloads land here while the replay walks the run.",
835
857
  "integration.replay.debug.field.attempt": "Attempt",
@@ -845,13 +867,8 @@
845
867
  "integration.replay.debug.stepCounter": "Step {current} / {total}",
846
868
  "integration.replay.debug.titleFallback": "Debug",
847
869
  "integration.replay.error.loadStepsFailed": "Could not load the run steps.",
848
- "integration.replay.runsList.description": "Click through the executions to replay them on the canvas.",
849
- "integration.replay.runsList.empty": "No runs yet — trigger one from the editor's Run button.",
850
- "integration.replay.runsList.heading": "Runs",
851
- "integration.replay.runsList.loadMore": "Load older runs",
852
870
  "integration.replay.state.noSteps": "No steps recorded for this run.",
853
- "integration.replay.state.pickRunHint": "Pick a run on the right to replay it.",
854
- "integration.replay.toast.loadRunsFailed": "Could not load the runs.",
871
+ "integration.replay.state.pickRunHint": "No run to replay.",
855
872
  "integration.replay.transport.action.next": "Next",
856
873
  "integration.replay.transport.action.pause": "Pause",
857
874
  "integration.replay.transport.action.play": "Play",
@@ -862,11 +879,9 @@
862
879
  "integration.runs.action.back": "Back",
863
880
  "integration.runs.action.cancel": "Cancel run",
864
881
  "integration.runs.action.resume": "Resume",
865
- "integration.runs.action.retry": "Retry",
866
882
  "integration.runs.action.terminate": "Terminate",
867
883
  "integration.runs.confirm.cancel": "Cancel this run?",
868
884
  "integration.runs.confirm.resume": "Resume this run?",
869
- "integration.runs.confirm.retry": "Retry this run?",
870
885
  "integration.runs.confirm.terminate": "Terminate this run?",
871
886
  "integration.runs.detail.error.details.expired": "History is no longer available (retention expired and no snapshot).",
872
887
  "integration.runs.detail.error.details.generic": "Could not load Temporal details.",
@@ -898,15 +913,13 @@
898
913
  "integration.runs.detail.stackTrace.hint": "Load to query the running worker for its current call stack.",
899
914
  "integration.runs.detail.stackTrace.loading": "Querying worker…",
900
915
  "integration.runs.detail.stackTrace.title": "Stack Trace",
901
- "integration.runs.detail.steps.action.hidePayloads": "Hide payloads",
902
- "integration.runs.detail.steps.action.showPayloads": "Show payloads",
903
916
  "integration.runs.detail.steps.attemptLabel": "attempt",
904
917
  "integration.runs.detail.steps.branchLabel": "branch",
905
918
  "integration.runs.detail.steps.empty": "No steps projected yet.",
906
919
  "integration.runs.detail.steps.field.input": "Input",
907
920
  "integration.runs.detail.steps.field.output": "Output",
908
921
  "integration.runs.detail.steps.loading": "Loading steps…",
909
- "integration.runs.detail.steps.payloadHint": "Enable “Show payloads” to load this step's input and output.",
922
+ "integration.runs.detail.steps.payloadsLoading": "Loading this step's input and output…",
910
923
  "integration.runs.detail.steps.title": "Steps",
911
924
  "integration.runs.detail.timeline.label.activity": "Activity",
912
925
  "integration.runs.detail.timeline.label.timer": "Timer",
@@ -1082,6 +1095,7 @@
1082
1095
  "integration.templates.detail.install.secretsDescriptionSuffix": "page.",
1083
1096
  "integration.templates.detail.install.secretsHeader": "Secrets",
1084
1097
  "integration.templates.detail.install.selectLater": "Select later",
1098
+ "integration.templates.detail.install.state.loading": "Checking what this template needs…",
1085
1099
  "integration.templates.detail.install.submit": "Install",
1086
1100
  "integration.templates.detail.install.submitting": "Setting up…",
1087
1101
  "integration.templates.detail.publisher.kind.community": "Community",
@@ -1161,13 +1175,13 @@
1161
1175
  "integration.workflows.create.field.trigger.label": "Trigger",
1162
1176
  "integration.workflows.create.tab.blank": "Start blank",
1163
1177
  "integration.workflows.create.tab.template": "Start from template",
1178
+ "integration.workflows.create.template.backToPicker": "Back to templates",
1164
1179
  "integration.workflows.create.template.browseAll": "Browse the full template catalogue",
1165
1180
  "integration.workflows.create.template.empty": "No templates in the catalogue yet.",
1166
1181
  "integration.workflows.create.template.noMatch": "Nothing matches “{query}”.",
1167
1182
  "integration.workflows.create.template.search.aria": "Search templates",
1168
1183
  "integration.workflows.create.template.search.placeholder": "Search templates…",
1169
1184
  "integration.workflows.create.template.state.loading": "Loading templates…",
1170
- "integration.workflows.create.toast.templateError": "Could not create the workflow from this template.",
1171
1185
  "integration.workflows.delete.action.deleting": "Deleting…",
1172
1186
  "integration.workflows.delete.dialog.description": "and all its revision history will be permanently deleted.",
1173
1187
  "integration.workflows.delete.dialog.title": "Delete workflow?",