@anchrd/intel-ui 0.33.0 → 0.35.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.
- package/package.json +2 -2
- package/src/app/app-tree/app-tree.tsx +100 -11
- package/src/app/tree-move/tree-move.tsx +5 -5
- package/src/archive/archive.tsx +83 -7
- package/src/data/intel-data-provider/intel-data-provider.ts +12 -1
- package/src/data/request-refusal/refusal-notice.tsx +36 -0
- package/src/entry-picker/entry-picker.tsx +27 -4
- package/src/flow-runs/flow-runs.tsx +9 -1
- package/src/flows/flows.tsx +264 -109
- package/src/graph-pane/graph-pane.tsx +9 -0
- package/src/i18n/de.json +34 -17
- package/src/i18n/en.json +34 -17
- package/src/i18n/es.json +34 -17
- package/src/node-editor/node-editor.tsx +24 -1
- package/src/nodes/nodes.tsx +31 -17
- package/src/resource-menu/resource-menu.tsx +84 -24
- package/src/tools/tools.tsx +5 -4
package/src/i18n/de.json
CHANGED
|
@@ -48,8 +48,7 @@
|
|
|
48
48
|
"tree.kind.attachment": "Datei",
|
|
49
49
|
"tree.kind.table": "Tabelle",
|
|
50
50
|
"tree.kind.flow": "Flow",
|
|
51
|
-
"tree.move.
|
|
52
|
-
"tree.move.hint": "oder ziehen",
|
|
51
|
+
"tree.move.rowHint": "Beweglich: diese Zeile auf einen Ordner ziehen, oder sie öffnen und Verschieben wählen.",
|
|
53
52
|
"tree.move.title": "{title} verschieben",
|
|
54
53
|
"tree.move.root": "Oberste Ebene",
|
|
55
54
|
"tree.move.dropRoot": "Hier ablegen, um auf die oberste Ebene zu verschieben",
|
|
@@ -76,6 +75,7 @@
|
|
|
76
75
|
"resource.archive": "Archivieren",
|
|
77
76
|
"resource.columns": "Spalten",
|
|
78
77
|
"resource.export": "Export",
|
|
78
|
+
"resource.exportExcludes": "Nimmt den aktuellen Stand mit. Frühere Versionen, Freigaben und Flow-Läufe bleiben zurück. Von einem veröffentlichten Flow reist der veröffentlichte Graph — spätere Änderungen am Entwurf bleiben zurück.",
|
|
79
79
|
"resource.import": "Import",
|
|
80
80
|
"resource.validate": "Prüfen",
|
|
81
81
|
"resource.links": "Verweise",
|
|
@@ -102,12 +102,17 @@
|
|
|
102
102
|
"archive.purge.links.one": "Ein anderes Dokument verweist darauf; dieser Verweis wird brechen.",
|
|
103
103
|
"archive.purge.links.many": "{count} andere Dokumente verweisen darauf; diese Verweise werden brechen.",
|
|
104
104
|
"archive.purge.grants": "Die Freigaben werden ebenfalls gelöscht.",
|
|
105
|
-
"archive.purge.items": "
|
|
105
|
+
"archive.purge.items": "Insgesamt endgültig gelöscht: {count}.",
|
|
106
106
|
"archive.purge.previewLoading": "Verweise werden geprüft …",
|
|
107
107
|
"archive.purge.previewFailed": "Die Verweise konnten nicht geprüft werden. Lade neu und versuche es vor dem Löschen erneut.",
|
|
108
108
|
"archive.purge.confirm": "Endgültig löschen",
|
|
109
109
|
"archive.purge.cancel": "Abbrechen",
|
|
110
110
|
"archive.purgeFailed": "Es konnte nicht vollständig gelöscht werden. Lade neu und versuche es erneut.",
|
|
111
|
+
"archive.purgeInUse": "Es lässt sich noch nicht löschen, weil veröffentlichte Flows es weiterhin aufrufen.",
|
|
112
|
+
"archive.purgeInUseCallers": "Aufgerufen von: {titles}.",
|
|
113
|
+
"archive.purgeInUseCallersMore": "Und {count} weitere, die du nicht sehen kannst.",
|
|
114
|
+
"archive.purgeInUseCallersHidden": "Es wird noch von {count} aufgerufen, die du nicht sehen kannst.",
|
|
115
|
+
"archive.purgeInUseHint": "Ändere oder depubliziere sie zuerst.",
|
|
111
116
|
"archive.archived": "Archiviert",
|
|
112
117
|
"resource.conflict": "Nicht geändert: Jemand anderes hat diesen Eintrag zuerst geändert. Lade ihn neu und versuche es erneut.",
|
|
113
118
|
"resource.forbidden": "Nicht geändert: Du darfst diesen Eintrag nicht ändern.",
|
|
@@ -154,6 +159,10 @@
|
|
|
154
159
|
"node.shareOrganizationHint": "Jedes angemeldete Mitglied der Organisation bekommt diesen Zugriff, auch wer später dazukommt.",
|
|
155
160
|
"node.shareLibraryWarning": "Ausführen für die ganze Organisation macht diesen Ordner zu einer Bibliothek: Flows von überall im Baum dürfen dann hineinrufen. Das Zurücknehmen wird abgelehnt, solange einer davon es noch tut.",
|
|
156
161
|
"node.revokeInUse": "Dieser Zugriff lässt sich noch nicht zurücknehmen, weil Flows außerhalb dieses Ordners noch hineinrufen.",
|
|
162
|
+
"node.revokeInUseCallers": "Aufgerufen von: {titles}.",
|
|
163
|
+
"node.revokeInUseCallersMore": "Und {count} weitere, die du nicht sehen kannst.",
|
|
164
|
+
"node.revokeInUseCallersHidden": "Aufgerufen von {count}, die du nicht sehen kannst.",
|
|
165
|
+
"node.revokeInUseHint": "Ändere oder depubliziere sie, bevor du den Ordner enger machst.",
|
|
157
166
|
"node.someUser": "Ein Benutzerkonto",
|
|
158
167
|
"node.verbs": "Was diese Freigabe erlaubt",
|
|
159
168
|
"node.verb.read": "Lesen",
|
|
@@ -173,9 +182,9 @@
|
|
|
173
182
|
"node.revokeVerbFor": "{verb} für {recipient} entziehen",
|
|
174
183
|
"node.revokeShare": "Zugriff entziehen",
|
|
175
184
|
"node.shareFailed": "Der Zugriff wurde nicht geändert. Prüfe deine Berechtigung und versuche es erneut.",
|
|
176
|
-
"node.shareUnreadable": "
|
|
177
|
-
"node.shareUnreadableMore": "{count} weitere
|
|
178
|
-
"node.shareUnreadableHidden": "
|
|
185
|
+
"node.shareUnreadable": "Diese Freigabe deckt nicht ab, was Flows in diesem Ordner lesen: {titles}.",
|
|
186
|
+
"node.shareUnreadableMore": "Und {count} weitere, die du nicht sehen kannst.",
|
|
187
|
+
"node.shareUnreadableHidden": "Diese Freigabe deckt nicht alles ab, was Flows in diesem Ordner lesen: {count} davon kannst du nicht sehen.",
|
|
179
188
|
"node.shareUnreadableHint": "Nichts ist blockiert. Ein Lauf dieser Flows hält für sie schlicht an dieser Stelle an.",
|
|
180
189
|
"node.versions": "Versionsverlauf",
|
|
181
190
|
"node.version": "Version {sequence}",
|
|
@@ -227,8 +236,7 @@
|
|
|
227
236
|
"tools.outputSchema": "Ergebnisschema",
|
|
228
237
|
"tools.destructiveShort": "Verändernd",
|
|
229
238
|
"tools.destructiveCount": "{count} verändernd",
|
|
230
|
-
"tools.toolCount": "{count}
|
|
231
|
-
"tools.toolCountOne": "1 Werkzeug",
|
|
239
|
+
"tools.toolCount": "Werkzeuge: {count}",
|
|
232
240
|
"tools.liveNote": "Diese Liste ist eine Live-Abfrage mit deinem eigenen Portal-Zugriff. Intel speichert weder die Werkzeuge noch, wer sie nutzen darf; beides entscheidet das Portal.",
|
|
233
241
|
"flows.select": "Wähle einen Flow oder lege einen an, um den visuellen Editor zu öffnen.",
|
|
234
242
|
"flows.inspect": "Wähle einen Schritt, um seine Konfiguration zu bearbeiten.",
|
|
@@ -259,6 +267,7 @@
|
|
|
259
267
|
"flows.node.condition": "Bedingung",
|
|
260
268
|
"flows.node.subflow": "Flow",
|
|
261
269
|
"flows.node.output": "Ende",
|
|
270
|
+
"flows.nodeInvalid": "Gibt es nicht mehr — ersetze oder entferne diesen Schritt",
|
|
262
271
|
"flows.instruction": "Anweisung für die KI oder die Person",
|
|
263
272
|
"flows.instructionHint": "Bedingungen, Prüfungen und Verzweigungen lassen sich hier in Worten beschreiben. Für jede kleine Entscheidung braucht es keinen eigenen Schritt.",
|
|
264
273
|
"flows.linkEmpty": "Noch nichts gewählt",
|
|
@@ -289,13 +298,21 @@
|
|
|
289
298
|
"flows.publishPreviewFollows": "läuft mit dem aufgerufenen Flow mit",
|
|
290
299
|
"flows.publishPreviewUnavailable": "Der aufgerufene Flow hat noch nichts veröffentlicht, das lässt sich nicht einfrieren.",
|
|
291
300
|
"flows.publishConfirm": "Veröffentlichen",
|
|
292
|
-
"flows.publishFailed": "Das Veröffentlichen ist fehlgeschlagen.
|
|
301
|
+
"flows.publishFailed": "Das Veröffentlichen ist fehlgeschlagen. Versuche es erneut.",
|
|
302
|
+
"flows.publishRefused": "Nicht veröffentlicht: {detail}",
|
|
303
|
+
"flows.publishConflict": "Nicht veröffentlicht: Jemand anderes hat diesen Flow zuerst geändert. Lade die neueste Fassung und versuche es erneut.",
|
|
304
|
+
"flows.publishNodeUnavailable": "Nicht veröffentlicht: {detail}. Frag den Zugriff an oder lass den Schritt auf etwas anderes zeigen.",
|
|
305
|
+
"flows.publishToolUnavailable": "Nicht veröffentlicht: {detail}. Prüf im Portal, ob du diesen Server noch erreichst.",
|
|
293
306
|
"flows.tool": "MCP-Server",
|
|
294
307
|
"flows.selectTool": "Server auswählen",
|
|
295
308
|
"flows.operationFailed": "Der Flow-Vorgang ist fehlgeschlagen. Lade die neueste Fassung und versuche es erneut.",
|
|
309
|
+
"flows.saveInvalid": "Nicht gespeichert: {detail}",
|
|
310
|
+
"flows.saveConflict": "Nicht gespeichert: Jemand anderes hat diesen Flow zuerst geändert. Lade die neueste Fassung und versuche es erneut.",
|
|
311
|
+
"flows.saveFailed": "Der Flow wurde nicht gespeichert. Versuche es erneut.",
|
|
296
312
|
"flows.needs": "Was dieser Flow braucht",
|
|
297
313
|
"flows.needsNodes": "Dokumente",
|
|
298
314
|
"flows.needsTools": "Werkzeuge",
|
|
315
|
+
"flows.needsInvalid": "Nicht mehr vorhanden: {count} — ersetze oder entferne jeden betroffenen Schritt",
|
|
299
316
|
"flows.needsHidden": "{count} weitere, die du nicht sehen kannst",
|
|
300
317
|
"flows.needsEmpty": "Dieser Flow liest keine Dokumente und ruft keine Werkzeuge auf.",
|
|
301
318
|
"flows.needsFailed": "Was dieser Flow braucht, konnte nicht geladen werden.",
|
|
@@ -339,7 +356,7 @@
|
|
|
339
356
|
"reindex.running": "Wird gesendet …",
|
|
340
357
|
"reindex.cancel": "Abbrechen",
|
|
341
358
|
"reindex.close": "Schließen",
|
|
342
|
-
"reindex.queued": "{count}
|
|
359
|
+
"reindex.queued": "Eingereiht: {count}. Der Index zieht im Hintergrund nach; die Suche funktioniert währenddessen weiter.",
|
|
343
360
|
"reindex.failed": "Der Neuaufbau wurde nicht gestartet. Prüfe deine Berechtigung und versuche es noch einmal.",
|
|
344
361
|
"auth.signOut": "Abmelden",
|
|
345
362
|
"auth.signOutFailed": "Das Abmelden ist fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.",
|
|
@@ -376,18 +393,18 @@
|
|
|
376
393
|
"flows.toolFunctions": "Funktionen",
|
|
377
394
|
"flows.toolServersDisconnected": "Du bist nicht mit dem Portal verbunden, daher lässt sich kein Server wählen. Verbinde es zuerst in den Werkzeug-Einstellungen.",
|
|
378
395
|
"flows.toolAllowNone": "Es ist noch keine Funktion ausgewählt, daher lässt sich dieser Schritt nicht veröffentlichen.",
|
|
379
|
-
"flows.toolAllowUnknown": "
|
|
396
|
+
"flows.toolAllowUnknown": "Die Auswahl enthält, was dieser Server gerade nicht anbietet: {count}.",
|
|
380
397
|
"flows.toolStepNeedsServer": "Dem Schritt „{label}“ fehlt noch ein Server.",
|
|
381
398
|
"flows.toolFunctionsFailed": "Die Funktionsliste ließ sich nicht laden, daher ist die Auswahl möglicherweise unvollständig.",
|
|
382
399
|
"flows.publishPreviewToolUnavailable": "Diesen Server erreichst du nicht, daher wird das Veröffentlichen abgelehnt.",
|
|
383
400
|
"flows.publishPreviewToolAllow": "Eingefroren auf: {functions}",
|
|
384
|
-
"flow.shareUnreadable": "
|
|
385
|
-
"flow.shareUnreadableMore": "{count} weitere
|
|
386
|
-
"flow.shareUnreadableHidden": "
|
|
401
|
+
"flow.shareUnreadable": "Diese Freigabe deckt nicht ab, was dieser Flow liest: {titles}.",
|
|
402
|
+
"flow.shareUnreadableMore": "Und {count} weitere, die du nicht sehen kannst.",
|
|
403
|
+
"flow.shareUnreadableHidden": "Diese Freigabe deckt nicht alles ab, was dieser Flow liest: {count} davon kannst du nicht sehen.",
|
|
387
404
|
"flow.shareUnreadableHint": "Nichts ist blockiert. Ein Lauf hält für sie schlicht an dieser Stelle an.",
|
|
388
|
-
"flow.shareUnrunnable": "
|
|
389
|
-
"flow.shareUnrunnableMore": "{count} weitere
|
|
390
|
-
"flow.shareUnrunnableHidden": "
|
|
405
|
+
"flow.shareUnrunnable": "Diese Freigabe deckt nicht ab, was dieser Flow aufruft: {titles}.",
|
|
406
|
+
"flow.shareUnrunnableMore": "Und {count} weitere, die du nicht sehen kannst.",
|
|
407
|
+
"flow.shareUnrunnableHidden": "Diese Freigabe deckt nicht alles ab, was dieser Flow aufruft: {count} davon kannst du nicht sehen.",
|
|
391
408
|
"flow.shareUnrunnableHint": "Eine Freigabe auf einem Flow reicht nur bis zu diesem Flow. Gib die anderen ebenfalls frei oder den Ordner, in dem sie liegen. Mit „Prüfen“ sehen die Beschenkten es vor dem Start selbst.",
|
|
392
409
|
"flow.verbHint.read": "Diesen Flow öffnen und lesen",
|
|
393
410
|
"flow.verbHint.write": "Diesen Flow ändern",
|
package/src/i18n/en.json
CHANGED
|
@@ -48,8 +48,7 @@
|
|
|
48
48
|
"tree.kind.attachment": "File",
|
|
49
49
|
"tree.kind.table": "Table",
|
|
50
50
|
"tree.kind.flow": "Flow",
|
|
51
|
-
"tree.move.
|
|
52
|
-
"tree.move.hint": "or drag",
|
|
51
|
+
"tree.move.rowHint": "Movable: drag this row onto a folder, or open it and choose Move.",
|
|
53
52
|
"tree.move.title": "Move {title}",
|
|
54
53
|
"tree.move.root": "Top level",
|
|
55
54
|
"tree.move.dropRoot": "Drop here to move to the top level",
|
|
@@ -76,6 +75,7 @@
|
|
|
76
75
|
"resource.archive": "Archive",
|
|
77
76
|
"resource.columns": "Columns",
|
|
78
77
|
"resource.export": "Export",
|
|
78
|
+
"resource.exportExcludes": "Carries the current state. Earlier versions, shares and flow runs stay behind. A published flow travels as its published graph — changes drafted since stay behind.",
|
|
79
79
|
"resource.import": "Import",
|
|
80
80
|
"resource.validate": "Check",
|
|
81
81
|
"resource.links": "Links",
|
|
@@ -102,12 +102,17 @@
|
|
|
102
102
|
"archive.purge.links.one": "One other document links to it and that link will break.",
|
|
103
103
|
"archive.purge.links.many": "{count} other documents link to it and those links will break.",
|
|
104
104
|
"archive.purge.grants": "Its shares will also be deleted.",
|
|
105
|
-
"archive.purge.items": "
|
|
105
|
+
"archive.purge.items": "Deleted for good in total: {count}.",
|
|
106
106
|
"archive.purge.previewLoading": "Checking links…",
|
|
107
107
|
"archive.purge.previewFailed": "The links could not be checked. Reload and try again before deleting.",
|
|
108
108
|
"archive.purge.confirm": "Delete for good",
|
|
109
109
|
"archive.purge.cancel": "Cancel",
|
|
110
110
|
"archive.purgeFailed": "It could not be deleted completely. Reload and try again.",
|
|
111
|
+
"archive.purgeInUse": "It cannot be deleted yet, because published flows still call it.",
|
|
112
|
+
"archive.purgeInUseCallers": "Still calling it: {titles}.",
|
|
113
|
+
"archive.purgeInUseCallersMore": "And {count} more you cannot see.",
|
|
114
|
+
"archive.purgeInUseCallersHidden": "It is still called by {count} you cannot see.",
|
|
115
|
+
"archive.purgeInUseHint": "Change or unpublish them first.",
|
|
111
116
|
"archive.archived": "Archived",
|
|
112
117
|
"resource.conflict": "It was not changed: somebody else changed this entry first. Reload it and try again.",
|
|
113
118
|
"resource.forbidden": "It was not changed: you may not change this entry.",
|
|
@@ -154,6 +159,10 @@
|
|
|
154
159
|
"node.shareOrganizationHint": "Every signed-in member of the organization gets this access, including people who join later.",
|
|
155
160
|
"node.shareLibraryWarning": "Run for the whole organization makes this folder a library: flows anywhere in the tree may then call into it. Taking it back is refused while any of them still does.",
|
|
156
161
|
"node.revokeInUse": "This access cannot be withdrawn yet, because flows outside this folder still call into it.",
|
|
162
|
+
"node.revokeInUseCallers": "Still calling into it: {titles}.",
|
|
163
|
+
"node.revokeInUseCallersMore": "And {count} more you cannot see.",
|
|
164
|
+
"node.revokeInUseCallersHidden": "It is still called by {count} you cannot see.",
|
|
165
|
+
"node.revokeInUseHint": "Change or unpublish them before narrowing the folder.",
|
|
157
166
|
"node.someUser": "A user account",
|
|
158
167
|
"node.verbs": "What this grant allows",
|
|
159
168
|
"node.verb.read": "Read",
|
|
@@ -173,9 +182,9 @@
|
|
|
173
182
|
"node.revokeVerbFor": "Revoke {verb} for {recipient}",
|
|
174
183
|
"node.revokeShare": "Revoke access",
|
|
175
184
|
"node.shareFailed": "Access was not changed. Check your permission and try again.",
|
|
176
|
-
"node.shareUnreadable": "
|
|
177
|
-
"node.shareUnreadableMore": "{count} more
|
|
178
|
-
"node.shareUnreadableHidden": "
|
|
185
|
+
"node.shareUnreadable": "This grant does not cover what flows in this folder read: {titles}.",
|
|
186
|
+
"node.shareUnreadableMore": "And {count} more you cannot see.",
|
|
187
|
+
"node.shareUnreadableHidden": "This grant does not cover everything flows in this folder read: {count} you cannot see.",
|
|
179
188
|
"node.shareUnreadableHint": "Nothing is blocked. A run of those flows will simply stop at that step for them.",
|
|
180
189
|
"node.versions": "Version history",
|
|
181
190
|
"node.version": "Version {sequence}",
|
|
@@ -227,8 +236,7 @@
|
|
|
227
236
|
"tools.outputSchema": "Result schema",
|
|
228
237
|
"tools.destructiveShort": "Destructive",
|
|
229
238
|
"tools.destructiveCount": "{count} destructive",
|
|
230
|
-
"tools.toolCount": "{count}
|
|
231
|
-
"tools.toolCountOne": "1 tool",
|
|
239
|
+
"tools.toolCount": "Tools: {count}",
|
|
232
240
|
"tools.liveNote": "This list is a live query with your own portal access. Intel stores neither the tools nor who may use them; the portal decides both.",
|
|
233
241
|
"flows.select": "Select a flow or create one to open the visual editor.",
|
|
234
242
|
"flows.inspect": "Select a node to edit its configuration.",
|
|
@@ -259,6 +267,7 @@
|
|
|
259
267
|
"flows.node.condition": "Condition",
|
|
260
268
|
"flows.node.subflow": "Flow",
|
|
261
269
|
"flows.node.output": "End",
|
|
270
|
+
"flows.nodeInvalid": "Gone — replace or remove this step",
|
|
262
271
|
"flows.instruction": "Instruction for the AI or person",
|
|
263
272
|
"flows.instructionHint": "Conditions, checks and branches can be described here in words. You do not need a separate node for every small decision.",
|
|
264
273
|
"flows.linkEmpty": "Nothing chosen yet",
|
|
@@ -289,13 +298,21 @@
|
|
|
289
298
|
"flows.publishPreviewFollows": "runs along with the called flow",
|
|
290
299
|
"flows.publishPreviewUnavailable": "The called flow has published nothing yet, so this cannot be frozen.",
|
|
291
300
|
"flows.publishConfirm": "Publish",
|
|
292
|
-
"flows.publishFailed": "Publishing failed.
|
|
301
|
+
"flows.publishFailed": "Publishing failed. Try again.",
|
|
302
|
+
"flows.publishRefused": "Not published: {detail}",
|
|
303
|
+
"flows.publishConflict": "Not published: somebody else changed this flow first. Reload the latest version and try again.",
|
|
304
|
+
"flows.publishNodeUnavailable": "Not published: {detail}. Ask for access to it, or point the step at something else.",
|
|
305
|
+
"flows.publishToolUnavailable": "Not published: {detail}. Check in the portal whether you still reach that server.",
|
|
293
306
|
"flows.tool": "MCP server",
|
|
294
307
|
"flows.selectTool": "Select a server",
|
|
295
308
|
"flows.operationFailed": "The flow operation failed. Reload the latest version and try again.",
|
|
309
|
+
"flows.saveInvalid": "Not saved: {detail}",
|
|
310
|
+
"flows.saveConflict": "Not saved: somebody else changed this flow first. Reload the latest version and try again.",
|
|
311
|
+
"flows.saveFailed": "The flow was not saved. Try again.",
|
|
296
312
|
"flows.needs": "What this flow needs",
|
|
297
313
|
"flows.needsNodes": "Documents",
|
|
298
314
|
"flows.needsTools": "Tools",
|
|
315
|
+
"flows.needsInvalid": "No longer there: {count} — replace or remove every affected step",
|
|
299
316
|
"flows.needsHidden": "{count} more you cannot see",
|
|
300
317
|
"flows.needsEmpty": "This flow reads no documents and calls no tools.",
|
|
301
318
|
"flows.needsFailed": "What this flow needs could not be loaded.",
|
|
@@ -339,7 +356,7 @@
|
|
|
339
356
|
"reindex.running": "Sending…",
|
|
340
357
|
"reindex.cancel": "Cancel",
|
|
341
358
|
"reindex.close": "Close",
|
|
342
|
-
"reindex.queued": "{count}
|
|
359
|
+
"reindex.queued": "Queued: {count}. The index catches up in the background; searching keeps working meanwhile.",
|
|
343
360
|
"reindex.failed": "The rebuild was not started. Check your access and try again.",
|
|
344
361
|
"auth.signOut": "Sign out",
|
|
345
362
|
"auth.signOutFailed": "Signing out failed. Check your connection and try again.",
|
|
@@ -376,18 +393,18 @@
|
|
|
376
393
|
"flows.toolFunctions": "Functions",
|
|
377
394
|
"flows.toolServersDisconnected": "You are not connected to the portal, so no server can be chosen. Connect it in the tool settings first.",
|
|
378
395
|
"flows.toolAllowNone": "No function is selected yet, so this step cannot be published.",
|
|
379
|
-
"flows.toolAllowUnknown": "
|
|
396
|
+
"flows.toolAllowUnknown": "The selection includes what this server does not offer right now: {count}.",
|
|
380
397
|
"flows.toolStepNeedsServer": "The step “{label}” still needs a server.",
|
|
381
398
|
"flows.toolFunctionsFailed": "The list of functions could not be loaded, so the selection may be incomplete.",
|
|
382
399
|
"flows.publishPreviewToolUnavailable": "You do not reach this server, so publishing will be refused.",
|
|
383
400
|
"flows.publishPreviewToolAllow": "Frozen to: {functions}",
|
|
384
|
-
"flow.shareUnreadable": "This
|
|
385
|
-
"flow.shareUnreadableMore": "{count} more
|
|
386
|
-
"flow.shareUnreadableHidden": "
|
|
401
|
+
"flow.shareUnreadable": "This grant does not cover what this flow reads: {titles}.",
|
|
402
|
+
"flow.shareUnreadableMore": "And {count} more you cannot see.",
|
|
403
|
+
"flow.shareUnreadableHidden": "This grant does not cover everything this flow reads: {count} you cannot see.",
|
|
387
404
|
"flow.shareUnreadableHint": "Nothing is blocked. A run will simply stop at that step for them.",
|
|
388
|
-
"flow.shareUnrunnable": "This
|
|
389
|
-
"flow.shareUnrunnableMore": "{count} more
|
|
390
|
-
"flow.shareUnrunnableHidden": "
|
|
405
|
+
"flow.shareUnrunnable": "This grant does not cover what this flow calls: {titles}.",
|
|
406
|
+
"flow.shareUnrunnableMore": "And {count} more you cannot see.",
|
|
407
|
+
"flow.shareUnrunnableHidden": "This grant does not cover everything this flow calls: {count} you cannot see.",
|
|
391
408
|
"flow.shareUnrunnableHint": "A grant on one flow reaches that flow alone. Share those flows too, or share the folder they are filed in. Let them check with Validate before they run it.",
|
|
392
409
|
"flow.verbHint.read": "Open this flow and read it",
|
|
393
410
|
"flow.verbHint.write": "Change this flow",
|
package/src/i18n/es.json
CHANGED
|
@@ -48,8 +48,7 @@
|
|
|
48
48
|
"tree.kind.attachment": "Archivo",
|
|
49
49
|
"tree.kind.table": "Tabla",
|
|
50
50
|
"tree.kind.flow": "Flujo",
|
|
51
|
-
"tree.move.
|
|
52
|
-
"tree.move.hint": "o arrastra",
|
|
51
|
+
"tree.move.rowHint": "Movible: arrastra esta fila a una carpeta, o ábrela y elige Mover.",
|
|
53
52
|
"tree.move.title": "Mover {title}",
|
|
54
53
|
"tree.move.root": "Nivel superior",
|
|
55
54
|
"tree.move.dropRoot": "Suelta aquí para mover al nivel superior",
|
|
@@ -76,6 +75,7 @@
|
|
|
76
75
|
"resource.archive": "Archivar",
|
|
77
76
|
"resource.columns": "Columnas",
|
|
78
77
|
"resource.export": "Exportar",
|
|
78
|
+
"resource.exportExcludes": "Se lleva el estado actual. Las versiones anteriores, los permisos y las ejecuciones de flujo se quedan. Un flujo publicado viaja con su grafo publicado; los cambios redactados después se quedan.",
|
|
79
79
|
"resource.import": "Importar",
|
|
80
80
|
"resource.validate": "Comprobar",
|
|
81
81
|
"resource.links": "Enlaces",
|
|
@@ -102,12 +102,17 @@
|
|
|
102
102
|
"archive.purge.links.one": "Otro documento contiene un enlace a este elemento y ese enlace dejará de funcionar.",
|
|
103
103
|
"archive.purge.links.many": "Otros {count} documentos contienen enlaces a este elemento y dejarán de funcionar.",
|
|
104
104
|
"archive.purge.grants": "Sus permisos compartidos también se eliminarán.",
|
|
105
|
-
"archive.purge.items": "
|
|
105
|
+
"archive.purge.items": "Eliminado definitivamente en total: {count}.",
|
|
106
106
|
"archive.purge.previewLoading": "Comprobando enlaces…",
|
|
107
107
|
"archive.purge.previewFailed": "No se pudieron comprobar los enlaces. Recarga e inténtalo de nuevo antes de eliminar.",
|
|
108
108
|
"archive.purge.confirm": "Eliminar definitivamente",
|
|
109
109
|
"archive.purge.cancel": "Cancelar",
|
|
110
110
|
"archive.purgeFailed": "No se pudo eliminar por completo. Recarga e inténtalo de nuevo.",
|
|
111
|
+
"archive.purgeInUse": "Todavía no se puede eliminar, porque hay flujos publicados que siguen invocándolo.",
|
|
112
|
+
"archive.purgeInUseCallers": "Invocado por: {titles}.",
|
|
113
|
+
"archive.purgeInUseCallersMore": "Y {count} más que no puedes ver.",
|
|
114
|
+
"archive.purgeInUseCallersHidden": "Todavía lo invocan {count} que no puedes ver.",
|
|
115
|
+
"archive.purgeInUseHint": "Cámbialos o retira su publicación primero.",
|
|
111
116
|
"archive.archived": "Archivado",
|
|
112
117
|
"resource.conflict": "No se ha cambiado: otra persona ha cambiado esta entrada antes. Recárgala e inténtalo de nuevo.",
|
|
113
118
|
"resource.forbidden": "No se ha cambiado: no puedes cambiar esta entrada.",
|
|
@@ -154,6 +159,10 @@
|
|
|
154
159
|
"node.shareOrganizationHint": "Todos los miembros de la organización que hayan iniciado sesión obtienen este acceso, incluidos quienes se incorporen más tarde.",
|
|
155
160
|
"node.shareLibraryWarning": "Ejecutar para toda la organización convierte esta carpeta en una biblioteca: los flujos de cualquier parte del árbol podrán invocarla. Retirarlo se rechaza mientras alguno siga haciéndolo.",
|
|
156
161
|
"node.revokeInUse": "Este acceso todavía no se puede retirar, porque hay flujos fuera de esta carpeta que siguen invocándola.",
|
|
162
|
+
"node.revokeInUseCallers": "Invocada por: {titles}.",
|
|
163
|
+
"node.revokeInUseCallersMore": "Y {count} más que no puedes ver.",
|
|
164
|
+
"node.revokeInUseCallersHidden": "Invocada por {count} que no puedes ver.",
|
|
165
|
+
"node.revokeInUseHint": "Cámbialos o retira su publicación antes de restringir la carpeta.",
|
|
157
166
|
"node.someUser": "Una cuenta de usuario",
|
|
158
167
|
"node.verbs": "Qué permite este acceso",
|
|
159
168
|
"node.verb.read": "Leer",
|
|
@@ -173,9 +182,9 @@
|
|
|
173
182
|
"node.revokeVerbFor": "Retirar {verb} a {recipient}",
|
|
174
183
|
"node.revokeShare": "Retirar el acceso",
|
|
175
184
|
"node.shareFailed": "El acceso no se ha cambiado. Comprueba tu permiso e inténtalo de nuevo.",
|
|
176
|
-
"node.shareUnreadable": "
|
|
177
|
-
"node.shareUnreadableMore": "{count} más
|
|
178
|
-
"node.shareUnreadableHidden": "
|
|
185
|
+
"node.shareUnreadable": "Este acceso no cubre lo que leen los flujos de esta carpeta: {titles}.",
|
|
186
|
+
"node.shareUnreadableMore": "Y {count} más que no puedes ver.",
|
|
187
|
+
"node.shareUnreadableHidden": "Este acceso no cubre todo lo que leen los flujos de esta carpeta: {count} que no puedes ver.",
|
|
179
188
|
"node.shareUnreadableHint": "No se bloquea nada. Una ejecución de esos flujos simplemente se detendrá en ese paso para esa persona.",
|
|
180
189
|
"node.versions": "Historial de versiones",
|
|
181
190
|
"node.version": "Versión {sequence}",
|
|
@@ -227,8 +236,7 @@
|
|
|
227
236
|
"tools.outputSchema": "Esquema del resultado",
|
|
228
237
|
"tools.destructiveShort": "Destructiva",
|
|
229
238
|
"tools.destructiveCount": "{count} destructivas",
|
|
230
|
-
"tools.toolCount": "{count}
|
|
231
|
-
"tools.toolCountOne": "1 herramienta",
|
|
239
|
+
"tools.toolCount": "Herramientas: {count}",
|
|
232
240
|
"tools.liveNote": "Esta lista es una consulta en vivo con tu propio acceso al portal. Intel no guarda ni las herramientas ni quién puede usarlas; ambas cosas las decide el portal.",
|
|
233
241
|
"flows.select": "Elige un flujo o crea uno para abrir el editor visual.",
|
|
234
242
|
"flows.inspect": "Elige un paso para editar su configuración.",
|
|
@@ -259,6 +267,7 @@
|
|
|
259
267
|
"flows.node.condition": "Condición",
|
|
260
268
|
"flows.node.subflow": "Flujo",
|
|
261
269
|
"flows.node.output": "Fin",
|
|
270
|
+
"flows.nodeInvalid": "Ya no existe — sustituye o quita este paso",
|
|
262
271
|
"flows.instruction": "Instrucción para la IA o la persona",
|
|
263
272
|
"flows.instructionHint": "Las condiciones, comprobaciones y bifurcaciones se pueden describir aquí con palabras. No hace falta un paso propio para cada decisión pequeña.",
|
|
264
273
|
"flows.linkEmpty": "Todavía no se ha elegido nada",
|
|
@@ -289,13 +298,21 @@
|
|
|
289
298
|
"flows.publishPreviewFollows": "va con el flujo llamado",
|
|
290
299
|
"flows.publishPreviewUnavailable": "El flujo llamado todavía no ha publicado nada, así que esto no se puede congelar.",
|
|
291
300
|
"flows.publishConfirm": "Publicar",
|
|
292
|
-
"flows.publishFailed": "La publicación ha fallado.
|
|
301
|
+
"flows.publishFailed": "La publicación ha fallado. Inténtalo de nuevo.",
|
|
302
|
+
"flows.publishRefused": "No se ha publicado: {detail}",
|
|
303
|
+
"flows.publishConflict": "No se ha publicado: otra persona ha cambiado este flujo antes. Carga la versión más reciente e inténtalo de nuevo.",
|
|
304
|
+
"flows.publishNodeUnavailable": "No se ha publicado: {detail}. Pide acceso a él o haz que el paso apunte a otra cosa.",
|
|
305
|
+
"flows.publishToolUnavailable": "No se ha publicado: {detail}. Comprueba en el portal si todavía alcanzas ese servidor.",
|
|
293
306
|
"flows.tool": "Servidor MCP",
|
|
294
307
|
"flows.selectTool": "Elegir un servidor",
|
|
295
308
|
"flows.operationFailed": "La operación del flujo ha fallado. Carga la versión más reciente e inténtalo de nuevo.",
|
|
309
|
+
"flows.saveInvalid": "No se ha guardado: {detail}",
|
|
310
|
+
"flows.saveConflict": "No se ha guardado: otra persona ha cambiado este flujo antes. Carga la versión más reciente e inténtalo de nuevo.",
|
|
311
|
+
"flows.saveFailed": "El flujo no se ha guardado. Inténtalo de nuevo.",
|
|
296
312
|
"flows.needs": "Qué necesita este flujo",
|
|
297
313
|
"flows.needsNodes": "Documentos",
|
|
298
314
|
"flows.needsTools": "Herramientas",
|
|
315
|
+
"flows.needsInvalid": "Lo que ya no está: {count} — sustituye o quita cada paso afectado",
|
|
299
316
|
"flows.needsHidden": "{count} más que no puedes ver",
|
|
300
317
|
"flows.needsEmpty": "Este flujo no lee ningún documento ni llama a ninguna herramienta.",
|
|
301
318
|
"flows.needsFailed": "Lo que necesita este flujo no se ha podido cargar.",
|
|
@@ -339,7 +356,7 @@
|
|
|
339
356
|
"reindex.running": "Enviando…",
|
|
340
357
|
"reindex.cancel": "Cancelar",
|
|
341
358
|
"reindex.close": "Cerrar",
|
|
342
|
-
"reindex.queued": "{count}
|
|
359
|
+
"reindex.queued": "En cola: {count}. El índice se pone al día en segundo plano; mientras tanto la búsqueda sigue funcionando.",
|
|
343
360
|
"reindex.failed": "No se inició la reconstrucción. Comprueba tu acceso e inténtalo de nuevo.",
|
|
344
361
|
"auth.signOut": "Cerrar sesión",
|
|
345
362
|
"auth.signOutFailed": "El cierre de sesión ha fallado. Comprueba tu conexión e inténtalo de nuevo.",
|
|
@@ -376,18 +393,18 @@
|
|
|
376
393
|
"flows.toolFunctions": "Funciones",
|
|
377
394
|
"flows.toolServersDisconnected": "No estás conectado al portal, así que no se puede elegir ningún servidor. Conéctalo primero en la configuración de herramientas.",
|
|
378
395
|
"flows.toolAllowNone": "Todavía no hay ninguna función seleccionada, así que este paso no se puede publicar.",
|
|
379
|
-
"flows.toolAllowUnknown": "
|
|
396
|
+
"flows.toolAllowUnknown": "La selección incluye lo que este servidor no ofrece ahora mismo: {count}.",
|
|
380
397
|
"flows.toolStepNeedsServer": "Al paso «{label}» todavía le falta un servidor.",
|
|
381
398
|
"flows.toolFunctionsFailed": "No se pudo cargar la lista de funciones, así que la selección puede estar incompleta.",
|
|
382
399
|
"flows.publishPreviewToolUnavailable": "No alcanzas este servidor, así que la publicación será rechazada.",
|
|
383
400
|
"flows.publishPreviewToolAllow": "Congelado en: {functions}",
|
|
384
|
-
"flow.shareUnreadable": "Este
|
|
385
|
-
"flow.shareUnreadableMore": "{count} más
|
|
386
|
-
"flow.shareUnreadableHidden": "
|
|
401
|
+
"flow.shareUnreadable": "Este acceso no cubre lo que lee este flujo: {titles}.",
|
|
402
|
+
"flow.shareUnreadableMore": "Y {count} más que no puedes ver.",
|
|
403
|
+
"flow.shareUnreadableHidden": "Este acceso no cubre todo lo que lee este flujo: {count} que no puedes ver.",
|
|
387
404
|
"flow.shareUnreadableHint": "No se bloquea nada. Una ejecución simplemente se detendrá en ese paso para esa persona.",
|
|
388
|
-
"flow.shareUnrunnable": "Este
|
|
389
|
-
"flow.shareUnrunnableMore": "{count} más
|
|
390
|
-
"flow.shareUnrunnableHidden": "
|
|
405
|
+
"flow.shareUnrunnable": "Este acceso no cubre lo que invoca este flujo: {titles}.",
|
|
406
|
+
"flow.shareUnrunnableMore": "Y {count} más que no puedes ver.",
|
|
407
|
+
"flow.shareUnrunnableHidden": "Este acceso no cubre todo lo que invoca este flujo: {count} que no puedes ver.",
|
|
391
408
|
"flow.shareUnrunnableHint": "Un acceso sobre un flujo llega solo a ese flujo. Comparte también esos flujos, o la carpeta donde están. Con «Validar» lo verán ellos mismos antes de ejecutarlo.",
|
|
392
409
|
"flow.verbHint.read": "Abrir este flujo y leerlo",
|
|
393
410
|
"flow.verbHint.write": "Cambiar este flujo",
|
|
@@ -12,6 +12,7 @@ import { Link2 } from "lucide-react";
|
|
|
12
12
|
import { useEffect, useMemo, useRef, useState } from "react";
|
|
13
13
|
import { ActionSlot } from "@/app/action-slot/action-slot.tsx";
|
|
14
14
|
import { BlockNoteView, defaultSlashMenuItems } from "@/blocknote-view/blocknote-view.tsx";
|
|
15
|
+
import { IntelRequestError } from "@/data/intel-data-provider/intel-data-provider.ts";
|
|
15
16
|
import type { IntelDataProvider } from "@/data/intel-data-provider/intel-data-provider.types.ts";
|
|
16
17
|
import {
|
|
17
18
|
DocumentLinkProvider,
|
|
@@ -57,6 +58,28 @@ function editorSnapshot(blocks: unknown): string {
|
|
|
57
58
|
return JSON.stringify(blocks);
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Which of the two sentences a failed save is told with.
|
|
63
|
+
*
|
|
64
|
+
* ⚠️ The refusal's `code`, never the server's prose: `POST /nodes/{id}/versions` words the conflict
|
|
65
|
+
* as `A newer version already exists`, and an English sentence from the API is not a translation
|
|
66
|
+
* source. The code is the contract (`ProblemDetails.code`), and `IntelRequestError` is what carries
|
|
67
|
+
* it this far.
|
|
68
|
+
*
|
|
69
|
+
* ⚠️ The two are not a vaguer and a sharper wording of one event. `node.saveError` says "reload and
|
|
70
|
+
* try again", which is right for a network failure and dangerous for a conflict: reloading without
|
|
71
|
+
* knowing that a foreign version now stands loses either the reader's own work or, on the second
|
|
72
|
+
* attempt, the other one. That is why this distinction is worth a branch at all (#451).
|
|
73
|
+
*
|
|
74
|
+
* ⚠️ Local rather than through `resourceErrorKey`: that one answers for the resource menu and the
|
|
75
|
+
* column dialog, and its sentences are the `resource.*` ones. The editor has its own two.
|
|
76
|
+
*/
|
|
77
|
+
function saveErrorKey(error: unknown): string {
|
|
78
|
+
return error instanceof IntelRequestError && error.code === "version_conflict"
|
|
79
|
+
? "node.saveConflict"
|
|
80
|
+
: "node.saveError";
|
|
81
|
+
}
|
|
82
|
+
|
|
60
83
|
export function NodeEditor({
|
|
61
84
|
data,
|
|
62
85
|
document,
|
|
@@ -173,7 +196,7 @@ export function NodeEditor({
|
|
|
173
196
|
<UnsavedChangesGuard dirty={dirty} />
|
|
174
197
|
{save.isError && (
|
|
175
198
|
<p role="alert" className="mx-6 mt-4 text-sm text-destructive">
|
|
176
|
-
{i18n.t(
|
|
199
|
+
{i18n.t(saveErrorKey(save.error))}
|
|
177
200
|
</p>
|
|
178
201
|
)}
|
|
179
202
|
<TitleRowScrollArea className="min-h-0 flex-1 overflow-y-auto py-6">
|
package/src/nodes/nodes.tsx
CHANGED
|
@@ -3,7 +3,9 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
3
3
|
import { useNavigate, useRouterState } from "@tanstack/react-router";
|
|
4
4
|
import { Download, Paperclip } from "lucide-react";
|
|
5
5
|
import { lazy, Suspense } from "react";
|
|
6
|
+
import { treeLevelKey } from "@/app/tree-move/tree-move.tsx";
|
|
6
7
|
import { ViewToggle } from "@/app/view-toggle/view-toggle.tsx";
|
|
8
|
+
import { RefusalNotice } from "@/data/request-refusal/refusal-notice.tsx";
|
|
7
9
|
import { refusalOf } from "@/data/request-refusal/request-refusal.ts";
|
|
8
10
|
import { FolderContents } from "@/folder-contents/folder-contents.tsx";
|
|
9
11
|
import { GraphPane } from "@/graph-pane/graph-pane.tsx";
|
|
@@ -41,6 +43,27 @@ export function Nodes() {
|
|
|
41
43
|
// answered "no" (`packages/ui/CLAUDE.md`). While the request is in flight there is no refusal to
|
|
42
44
|
// report, and the loading line below stays.
|
|
43
45
|
const refusal = refusalOf(document.error);
|
|
46
|
+
/**
|
|
47
|
+
* The top level of the tree — the same query the sidebar already holds, by the same key and the
|
|
48
|
+
* same function, so this is a second reader of one cache entry rather than a second request.
|
|
49
|
+
*
|
|
50
|
+
* ⚠️ The screen needs a source of its own because the one above cannot answer here: the refusal
|
|
51
|
+
* branch hangs on `["node", selectedId]`, and without a selection that query is not enabled at
|
|
52
|
+
* all. The empty state was therefore reached BEFORE anything had been asked — and it invited the
|
|
53
|
+
* reader to select something, which is exactly what somebody without `intel.nodes.read` cannot
|
|
54
|
+
* do. The sidebar beside it has said so since #430; two surfaces, two answers (#445).
|
|
55
|
+
*/
|
|
56
|
+
const rootLevel = useQuery({
|
|
57
|
+
queryKey: treeLevelKey(null),
|
|
58
|
+
queryFn: () => data.listTreeChildren(null),
|
|
59
|
+
enabled: selectedId === null,
|
|
60
|
+
});
|
|
61
|
+
// ⚠️ Off the ERROR, and here that is half the ticket rather than a detail. A sentence about a
|
|
62
|
+
// missing permission, shown while the answer is still travelling, claims a refusal nobody has
|
|
63
|
+
// spoken yet — the mistake from #350, and `packages/ui/CLAUDE.md` has the rule: a missing answer
|
|
64
|
+
// is a reason to say less, never to refuse more. So the negative sentence hangs off the refusal;
|
|
65
|
+
// until one arrives, what stands is the invitation, which claims nothing about permission.
|
|
66
|
+
const rootRefusal = refusalOf(rootLevel.error);
|
|
44
67
|
// A folder shows its contents as a graph, and so does the root of the tree (#19). A document has
|
|
45
68
|
// nothing to draw — which is why the switch is not offered on one rather than offered and empty.
|
|
46
69
|
const graphable = selectedId === null || selected?.kind === "folder";
|
|
@@ -80,26 +103,17 @@ export function Nodes() {
|
|
|
80
103
|
}
|
|
81
104
|
/>
|
|
82
105
|
) : !selectedId ? (
|
|
83
|
-
|
|
84
|
-
{
|
|
85
|
-
|
|
106
|
+
rootRefusal ? (
|
|
107
|
+
<RefusalNotice refusal={rootRefusal} />
|
|
108
|
+
) : (
|
|
109
|
+
<div className="grid flex-1 place-items-center p-8 text-center text-sm text-muted-foreground">
|
|
110
|
+
{i18n.t("node.select")}
|
|
111
|
+
</div>
|
|
112
|
+
)
|
|
86
113
|
) : document.isPending ? (
|
|
87
114
|
<p className="p-6 text-sm text-muted-foreground">{i18n.t("common.loading")}</p>
|
|
88
115
|
) : refusal ? (
|
|
89
|
-
|
|
90
|
-
share was revoked was left in front of "Loading…" — the worst answer of all, because it
|
|
91
|
-
says the program is still working. They get a sentence and no retry button: the answer
|
|
92
|
-
was final, and a button that changes nothing is an invitation to keep waiting.
|
|
93
|
-
|
|
94
|
-
⚠️ One sentence for `404`, whichever of its two reasons applies. Intel answers the same
|
|
95
|
-
status for "no such node" and "not for you" on purpose — `requireVisible` in
|
|
96
|
-
`packages/api/src/nodes/nodes.ts` — and a screen that told them apart would undo that
|
|
97
|
-
from the other side. */
|
|
98
|
-
<div role="status" className="grid flex-1 place-items-center p-8 text-center text-sm">
|
|
99
|
-
<p className="max-w-sm text-muted-foreground">
|
|
100
|
-
{i18n.t(refusal === "no-permission" ? "common.noPermission" : "common.noAccess")}
|
|
101
|
-
</p>
|
|
102
|
-
</div>
|
|
116
|
+
<RefusalNotice refusal={refusal} />
|
|
103
117
|
) : document.isError || !selected ? (
|
|
104
118
|
<div role="alert" className="grid flex-1 place-items-center p-8 text-center text-sm">
|
|
105
119
|
<div className="space-y-3">
|