@anchrd/intel-ui 0.19.0 → 0.20.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anchrd/intel-ui",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -33,7 +33,7 @@
33
33
  "typecheck": "tsc --noEmit"
34
34
  },
35
35
  "dependencies": {
36
- "@anchrd/intel-contract": "^0.13.0",
36
+ "@anchrd/intel-contract": "^0.14.0",
37
37
  "@blocknote/core": "^0.52.1",
38
38
  "@blocknote/react": "^0.52.1",
39
39
  "@blocknote/shadcn": "^0.52.1",
@@ -1,3 +1,4 @@
1
+ import type { NodeKind } from "@anchrd/intel-contract/node";
1
2
  import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query";
2
3
  import { useNavigate, useRouterState } from "@tanstack/react-router";
3
4
  import {
@@ -41,7 +42,15 @@ import { Modal } from "@/modal/modal.tsx";
41
42
  import { useIntelRouterContext } from "@/router/router-context.ts";
42
43
  import { selectedFrom } from "@/router/selection-search.ts";
43
44
 
44
- type NewKind = "folder" | "document" | "table" | "flow";
45
+ /**
46
+ * What the plus can MAKE — derived from `NodeKind`, never written out again (#395).
47
+ *
48
+ * ⚠️ `attachment` is excluded because an attachment is uploaded rather than created, and `flow` is
49
+ * added because a flow shares the tree without being a node (ADR-0004 §1). Both are decisions about
50
+ * this menu; the LIST of node kinds is not, and a copy of it here goes stale in the direction that
51
+ * already bit us — the parked kinds stood in such a union long after nothing could make one.
52
+ */
53
+ type NewKind = Exclude<NodeKind, "attachment"> | "flow";
45
54
  type Creating = { parentId: string | null; kind: NewKind };
46
55
 
47
56
  // Attachments are inlined as base64, so the browser holds the file twice while it uploads.
@@ -1,4 +1,5 @@
1
- import type { Flow, ToolCapability } from "@anchrd/intel-contract";
1
+ import type { Flow } from "@anchrd/intel-contract/flow";
2
+ import type { ToolCapability } from "@anchrd/intel-contract/tool";
2
3
  import { useQuery } from "@tanstack/react-query";
3
4
  import { useNavigate } from "@tanstack/react-router";
4
5
  import { FileText, Search, Workflow, Wrench } from "lucide-react";
@@ -0,0 +1,79 @@
1
+ import { useMutation } from "@tanstack/react-query";
2
+ import { Button } from "@/components/ui/button";
3
+ import {
4
+ Dialog,
5
+ DialogContent,
6
+ DialogDescription,
7
+ DialogFooter,
8
+ DialogHeader,
9
+ DialogTitle,
10
+ } from "@/components/ui/dialog";
11
+ import { useI18n } from "@/i18n/i18n-context.tsx";
12
+ import { useIntelRouterContext } from "@/router/router-context.ts";
13
+
14
+ /**
15
+ * Rebuilding the search index, asked for before it happens (#416).
16
+ *
17
+ * ⚠️ Two clicks, not one, and the reason is not that it is dangerous — nothing is lost, the index is
18
+ * derived from D1 and R2 and can always be built again. It is that it is EXPENSIVE and invisible:
19
+ * every node is read and embedded again, which costs money and minutes, and the screen looks exactly
20
+ * the same afterwards. A one-click button next to "Preferences" invites a second press when the
21
+ * first one seems to have done nothing.
22
+ *
23
+ * ⚠️ It reports what was QUEUED, never "done". The answer comes back the moment the work is handed
24
+ * to the queue, and the index catches up behind it — writing "finished" here would be a sentence
25
+ * about something this screen cannot see. The number is the honest part: it says how much was
26
+ * accepted, so a repeat press can be compared against it.
27
+ *
28
+ * The dialog is opened from outside, like the settings one: its trigger is a `DropdownMenuItem`, and
29
+ * Radix unmounts the menu content in the same frame the item is chosen.
30
+ */
31
+ interface ReindexDialogProps {
32
+ open: boolean;
33
+ onOpenChange(open: boolean): void;
34
+ }
35
+
36
+ export function ReindexDialog({ open, onOpenChange }: ReindexDialogProps) {
37
+ const i18n = useI18n();
38
+ const { data } = useIntelRouterContext();
39
+ const reindex = useMutation({ mutationFn: () => data.reindexNodes() });
40
+
41
+ return (
42
+ <Dialog
43
+ open={open}
44
+ onOpenChange={(next) => {
45
+ // Closing forgets the last answer, so re-opening never shows a count from an earlier run as
46
+ // if it were this one's.
47
+ if (!next) reindex.reset();
48
+ onOpenChange(next);
49
+ }}
50
+ >
51
+ <DialogContent className="sm:max-w-md">
52
+ <DialogHeader>
53
+ <DialogTitle>{i18n.t("reindex.title")}</DialogTitle>
54
+ <DialogDescription>{i18n.t("reindex.description")}</DialogDescription>
55
+ </DialogHeader>
56
+ {reindex.isSuccess ? (
57
+ <p role="status" className="text-sm">
58
+ {i18n.t("reindex.queued", { count: reindex.data.queued })}
59
+ </p>
60
+ ) : null}
61
+ {reindex.isError ? (
62
+ <p role="alert" className="text-sm text-destructive">
63
+ {i18n.t("reindex.failed")}
64
+ </p>
65
+ ) : null}
66
+ <DialogFooter>
67
+ <Button variant="outline" onClick={() => onOpenChange(false)}>
68
+ {i18n.t(reindex.isSuccess ? "reindex.close" : "reindex.cancel")}
69
+ </Button>
70
+ {reindex.isSuccess ? null : (
71
+ <Button disabled={reindex.isPending} onClick={() => reindex.mutate()}>
72
+ {i18n.t(reindex.isPending ? "reindex.running" : "reindex.confirm")}
73
+ </Button>
74
+ )}
75
+ </DialogFooter>
76
+ </DialogContent>
77
+ </Dialog>
78
+ );
79
+ }
@@ -4,6 +4,7 @@ import {
4
4
  Archive as ArchiveIcon,
5
5
  ChevronsUpDown,
6
6
  LogOut,
7
+ RefreshCw,
7
8
  Settings,
8
9
  User,
9
10
  Wrench,
@@ -20,6 +21,7 @@ import { SidebarMenu, SidebarMenuItem } from "@/components/ui/sidebar";
20
21
  import { loginPath } from "@/data/intel-data-provider/intel-data-provider.ts";
21
22
  import { useI18n } from "@/i18n/i18n-context.tsx";
22
23
  import { useIntelRouterContext } from "@/router/router-context.ts";
24
+ import { ReindexDialog } from "../reindex-dialog/reindex-dialog.tsx";
23
25
  import { SettingsDialog } from "../settings-dialog/settings-dialog.tsx";
24
26
 
25
27
  /**
@@ -41,6 +43,7 @@ export function UserFooter() {
41
43
  // The state lives here, not in the dialog: its trigger is a DropdownMenuItem, and Radix unmounts
42
44
  // the menu content when an item is chosen — a dialog nested in there would go with it.
43
45
  const [settingsOpen, setSettingsOpen] = useState(false);
46
+ const [reindexOpen, setReindexOpen] = useState(false);
44
47
  const session = useQuery({ queryKey: ["session"], queryFn: () => data.getSession() });
45
48
  const logout = useMutation({
46
49
  mutationFn: () => data.logout(),
@@ -103,6 +106,20 @@ export function UserFooter() {
103
106
  <Settings aria-hidden="true" />
104
107
  {i18n.t("settings.title")}
105
108
  </DropdownMenuItem>
109
+ {/* ⚠️ Drawn only for an administrator, and that is a DRAWING decision — `POST
110
+ /nodes/reindex` asks Gate for `intel/admin` itself and would refuse this row's press
111
+ just the same (#416). Hiding it is not the check; it is not offering everybody a
112
+ door they cannot open. Its own separator, because the rows above belong to the
113
+ person and this one belongs to the installation. */}
114
+ {session.data?.isAdmin ? (
115
+ <>
116
+ <DropdownMenuSeparator />
117
+ <DropdownMenuItem onSelect={() => setReindexOpen(true)}>
118
+ <RefreshCw aria-hidden="true" />
119
+ {i18n.t("reindex.title")}
120
+ </DropdownMenuItem>
121
+ </>
122
+ ) : null}
106
123
  <DropdownMenuSeparator />
107
124
  <DropdownMenuItem
108
125
  disabled={logout.isPending}
@@ -116,6 +133,8 @@ export function UserFooter() {
116
133
  </DropdownMenu>
117
134
  {/* ⚠️ Outside the DropdownMenu on purpose — see the state above. */}
118
135
  <SettingsDialog open={settingsOpen} onOpenChange={setSettingsOpen} />
136
+ {/* ⚠️ Outside the DropdownMenu for the same reason as the settings dialog. */}
137
+ <ReindexDialog open={reindexOpen} onOpenChange={setReindexOpen} />
119
138
  </SidebarMenuItem>
120
139
  {/* ⚠️ Outside the menu on purpose. Choosing sign-out closes the popup, so a refusal rendered
121
140
  inside it would be gone in the same frame it was written — the one message that must
@@ -1,4 +1,5 @@
1
- import type { Flow, Node } from "@anchrd/intel-contract";
1
+ import type { Flow } from "@anchrd/intel-contract/flow";
2
+ import type { Node } from "@anchrd/intel-contract/node";
2
3
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
4
  import { ArchiveRestore } from "lucide-react";
4
5
  import { useI18n } from "@/i18n/i18n-context.tsx";
@@ -1,24 +1,33 @@
1
+ import { ProblemDetails, SessionUser } from "@anchrd/intel-contract";
2
+ import { BundleImportResult } from "@anchrd/intel-contract/bundle";
1
3
  import {
2
- AppendTableRowsInput,
3
- AppendTableRowsResult,
4
4
  ArchiveFlowInput,
5
- ArchiveNodeInput,
6
- BundleImportResult,
7
- CompleteFlowRunStepInput,
8
5
  CreateFlowInput,
9
- CreateNodeInput,
10
- DefineTableInput,
11
6
  Flow,
12
7
  FlowDocument,
13
8
  FlowList,
14
9
  FlowPublishPreview,
15
10
  FlowRequirements,
11
+ FlowValidation,
12
+ ListFlowsInput,
13
+ PreviewFlowPublishInput,
14
+ PublishFlowInput,
15
+ RelationGraph,
16
+ RelationGraphInput,
17
+ SaveFlowVersionInput,
18
+ UpdateFlowInput,
19
+ } from "@anchrd/intel-contract/flow";
20
+ import {
21
+ CompleteFlowRunStepInput,
16
22
  FlowRunHistory,
17
23
  FlowRunList,
18
24
  FlowRunStep,
19
- FlowValidation,
20
25
  ListFlowRunsInput,
21
- ListFlowsInput,
26
+ StartFlowRunInput,
27
+ } from "@anchrd/intel-contract/flow-run";
28
+ import {
29
+ ArchiveNodeInput,
30
+ CreateNodeInput,
22
31
  ListNodesInput,
23
32
  Node,
24
33
  NodeDocument,
@@ -27,30 +36,28 @@ import {
27
36
  NodeList,
28
37
  NodeTable,
29
38
  NodeVersionList,
30
- PreviewFlowPublishInput,
31
- ProblemDetails,
32
- PublishFlowInput,
33
- RelationGraph,
34
- RelationGraphInput,
39
+ ReindexResult,
35
40
  ResolveNodeLinksInput,
36
41
  ResolveNodeLinksResult,
37
- ResourceGrantList,
38
- RevokeGrantInput,
39
- RevokeGrantResult,
40
42
  SaveAttachmentInput,
41
- SaveFlowVersionInput,
42
43
  SaveNodeVersionInput,
43
44
  SearchInput,
44
45
  SearchResult,
45
- SessionUser,
46
+ UpdateNodeInput,
47
+ } from "@anchrd/intel-contract/node";
48
+ import {
49
+ ResourceGrantList,
50
+ RevokeGrantInput,
51
+ RevokeGrantResult,
46
52
  ShareInput,
47
53
  ShareResult,
48
- StartFlowRunInput,
49
- ToolCatalog,
50
- ToolServerCatalog,
51
- UpdateFlowInput,
52
- UpdateNodeInput,
53
- } from "@anchrd/intel-contract";
54
+ } from "@anchrd/intel-contract/share";
55
+ import {
56
+ AppendTableRowsInput,
57
+ AppendTableRowsResult,
58
+ DefineTableInput,
59
+ } from "@anchrd/intel-contract/table";
60
+ import { ToolCatalog, ToolServerCatalog } from "@anchrd/intel-contract/tool";
54
61
  import type { z } from "zod";
55
62
  import { createBrowserSignIn } from "@/data/sign-in/sign-in.ts";
56
63
  import type { IntelDataProvider, TreeEntry } from "./intel-data-provider.types.ts";
@@ -187,6 +194,9 @@ export function createIntelDataProvider(
187
194
  async getSession() {
188
195
  return await request("/session", SessionUser);
189
196
  },
197
+ async reindexNodes() {
198
+ return await request("/nodes/reindex", ReindexResult, { method: "POST", body: "{}" });
199
+ },
190
200
  listNodes,
191
201
  async listTreeChildren(parentId) {
192
202
  // Both sides of one folder, asked for in parallel and merged here rather than on the server:
@@ -439,10 +449,14 @@ export function createIntelDataProvider(
439
449
  },
440
450
  async completeFlowStep(input) {
441
451
  const parsed = CompleteFlowRunStepInput.parse(input);
442
- return await request(`/flow-runs/${encodeURIComponent(parsed.runId)}/complete`, FlowRunStep, {
443
- method: "POST",
444
- body: JSON.stringify(parsed),
445
- });
452
+ return await request(
453
+ `/flow-runs/${encodeURIComponent(parsed.runId)}/steps/complete`,
454
+ FlowRunStep,
455
+ {
456
+ method: "POST",
457
+ body: JSON.stringify(parsed),
458
+ },
459
+ );
446
460
  },
447
461
  async listTools() {
448
462
  return await request("/tools", ToolCatalog);
@@ -1,24 +1,33 @@
1
+ import type { SessionUser } from "@anchrd/intel-contract";
2
+ import type { BundleImportResult } from "@anchrd/intel-contract/bundle";
1
3
  import type {
2
- AppendTableRowsInput,
3
- AppendTableRowsResult,
4
4
  ArchiveFlowInput,
5
- ArchiveNodeInput,
6
- BundleImportResult,
7
- CompleteFlowRunStepInput,
8
5
  CreateFlowInput,
9
- CreateNodeInput,
10
- DefineTableInput,
11
6
  Flow,
12
7
  FlowDocument,
13
8
  FlowList,
14
9
  FlowPublishPreview,
15
10
  FlowRequirements,
11
+ FlowValidation,
12
+ ListFlowsInput,
13
+ PreviewFlowPublishInput,
14
+ PublishFlowInput,
15
+ RelationGraph,
16
+ RelationGraphScope,
17
+ SaveFlowVersionInput,
18
+ UpdateFlowInput,
19
+ } from "@anchrd/intel-contract/flow";
20
+ import type {
21
+ CompleteFlowRunStepInput,
16
22
  FlowRunHistory,
17
23
  FlowRunList,
18
24
  FlowRunStep,
19
- FlowValidation,
20
25
  ListFlowRunsInput,
21
- ListFlowsInput,
26
+ StartFlowRunInput,
27
+ } from "@anchrd/intel-contract/flow-run";
28
+ import type {
29
+ ArchiveNodeInput,
30
+ CreateNodeInput,
22
31
  ListNodesInput,
23
32
  Node,
24
33
  NodeDocument,
@@ -28,29 +37,28 @@ import type {
28
37
  NodeList,
29
38
  NodeTable,
30
39
  NodeVersionList,
31
- PreviewFlowPublishInput,
32
- PublishFlowInput,
33
- RelationGraph,
34
- RelationGraphScope,
40
+ ReindexResult,
35
41
  ResolveNodeLinksInput,
36
42
  ResolveNodeLinksResult,
37
- ResourceGrantList,
38
- RevokeGrantInput,
39
- RevokeGrantResult,
40
43
  SaveAttachmentInput,
41
- SaveFlowVersionInput,
42
44
  SaveNodeVersionInput,
43
45
  SearchInput,
44
46
  SearchResult,
45
- SessionUser,
47
+ UpdateNodeInput,
48
+ } from "@anchrd/intel-contract/node";
49
+ import type {
50
+ ResourceGrantList,
51
+ RevokeGrantInput,
52
+ RevokeGrantResult,
46
53
  ShareInput,
47
54
  ShareResult,
48
- StartFlowRunInput,
49
- ToolCatalog,
50
- ToolServerCatalog,
51
- UpdateFlowInput,
52
- UpdateNodeInput,
53
- } from "@anchrd/intel-contract";
55
+ } from "@anchrd/intel-contract/share";
56
+ import type {
57
+ AppendTableRowsInput,
58
+ AppendTableRowsResult,
59
+ DefineTableInput,
60
+ } from "@anchrd/intel-contract/table";
61
+ import type { ToolCatalog, ToolServerCatalog } from "@anchrd/intel-contract/tool";
54
62
 
55
63
  // One row of the shared tree. Nodes and Flows share the folder, not their nature (ADR-0004), so
56
64
  // this is a union that keeps each side's record whole — never a merged "node" that is a bit of both.
@@ -70,6 +78,14 @@ export type TreeEntry =
70
78
 
71
79
  export interface IntelDataProvider {
72
80
  getSession(): Promise<SessionUser>;
81
+ /**
82
+ * Rebuild the whole search index (`intel/admin`).
83
+ *
84
+ * ⚠️ Answers as soon as the work is QUEUED, not when it is done — `queued` counts the nodes that
85
+ * will be read again, and the index catches up behind it. A screen that said "finished" here
86
+ * would be reporting the wrong thing.
87
+ */
88
+ reindexNodes(): Promise<ReindexResult>;
73
89
  listNodes(input?: Partial<ListNodesInput>): Promise<NodeList>;
74
90
  // One level of the shared tree: the documents and the flows filed in the same folder, in one
75
91
  // sorted list. Per level rather than recursive, so opening a folder is what costs a request.
@@ -1,4 +1,4 @@
1
- import { DocumentLinkInlineType } from "@anchrd/intel-contract";
1
+ import { DocumentLinkInlineType } from "@anchrd/intel-contract/node";
2
2
  import { BlockNoteSchema } from "@blocknote/core";
3
3
  import { createReactInlineContentSpec } from "@blocknote/react";
4
4
  import { FileText, Link2Off } from "lucide-react";
@@ -1,4 +1,4 @@
1
- import type { NodeKind } from "@anchrd/intel-contract";
1
+ import type { NodeKind } from "@anchrd/intel-contract/node";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { ChevronRight, Folder, Search } from "lucide-react";
4
4
  import { useMemo, useState } from "react";
@@ -1,4 +1,4 @@
1
- import type { FlowRunSummary } from "@anchrd/intel-contract";
1
+ import type { FlowRunSummary } from "@anchrd/intel-contract/flow-run";
2
2
  import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
3
3
  import { ChevronDown, ChevronRight, CornerDownRight } from "lucide-react";
4
4
  import { useState } from "react";
@@ -1,5 +1,6 @@
1
- import type { Flow, FlowGraph, FlowNode, Node } from "@anchrd/intel-contract";
2
- import { flowNodeLayer } from "@anchrd/intel-contract";
1
+ import type { Flow, FlowGraph, FlowNode } from "@anchrd/intel-contract/flow";
2
+ import { flowNodeLayer } from "@anchrd/intel-contract/flow";
3
+ import type { Node } from "@anchrd/intel-contract/node";
3
4
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
5
  import { useNavigate, useRouterState } from "@tanstack/react-router";
5
6
  import {
@@ -1,4 +1,4 @@
1
- import type { FlowNode } from "@anchrd/intel-contract";
1
+ import type { FlowNode } from "@anchrd/intel-contract/flow";
2
2
  import {
3
3
  CircleDot,
4
4
  CirclePlay,
@@ -1,4 +1,4 @@
1
- import { flowNodeLayer } from "@anchrd/intel-contract";
1
+ import { flowNodeLayer } from "@anchrd/intel-contract/flow";
2
2
  import { Plus, X } from "lucide-react";
3
3
  import { Fragment, useId, useRef, useState } from "react";
4
4
  import { type NodeIcon, nodeIcon } from "@/flows/node-icon/node-icon.ts";
@@ -1,4 +1,4 @@
1
- import type { FlowNode } from "@anchrd/intel-contract";
1
+ import type { FlowNode } from "@anchrd/intel-contract/flow";
2
2
 
3
3
  export type PaletteKind = FlowNode["kind"];
4
4
 
@@ -1,4 +1,4 @@
1
- import type { RelationGraph } from "@anchrd/intel-contract";
1
+ import type { RelationGraph } from "@anchrd/intel-contract/flow";
2
2
  import type { UseQueryResult } from "@tanstack/react-query";
3
3
  import { lazy, Suspense } from "react";
4
4
  import { useI18n } from "@/i18n/i18n-context.tsx";
package/src/i18n/de.json CHANGED
@@ -283,6 +283,14 @@
283
283
  "settings.appearance.system": "Dem System folgen",
284
284
  "settings.appearance.light": "Hell",
285
285
  "settings.appearance.dark": "Dunkel",
286
+ "reindex.title": "Suchindex neu aufbauen",
287
+ "reindex.description": "Liest jeden Knoten noch einmal und ermittelt seine Sucheinträge von Grund auf. Es geht nichts verloren — der Index entsteht aus den Dokumenten selbst —, aber es kostet Zeit und Geld, und danach sieht der Bildschirm genauso aus.",
288
+ "reindex.confirm": "Neu aufbauen",
289
+ "reindex.running": "Wird gesendet …",
290
+ "reindex.cancel": "Abbrechen",
291
+ "reindex.close": "Schließen",
292
+ "reindex.queued": "{count} Knoten sind eingereiht. Der Index zieht im Hintergrund nach; die Suche funktioniert währenddessen weiter.",
293
+ "reindex.failed": "Der Neuaufbau wurde nicht gestartet. Prüfe deine Berechtigung und versuche es noch einmal.",
286
294
  "auth.signOut": "Abmelden",
287
295
  "auth.signOutFailed": "Das Abmelden ist fehlgeschlagen. Prüfe deine Verbindung und versuche es erneut.",
288
296
  "signIn.refusedTitle": "Angemeldet, aber nicht angenommen",
package/src/i18n/en.json CHANGED
@@ -283,6 +283,14 @@
283
283
  "settings.appearance.system": "Follow the system",
284
284
  "settings.appearance.light": "Light",
285
285
  "settings.appearance.dark": "Dark",
286
+ "reindex.title": "Rebuild the search index",
287
+ "reindex.description": "Reads every node again and works out its search entries from scratch. Nothing is lost — the index is built from the documents themselves — but it costs time and money, and the screen looks the same afterwards.",
288
+ "reindex.confirm": "Rebuild",
289
+ "reindex.running": "Sending…",
290
+ "reindex.cancel": "Cancel",
291
+ "reindex.close": "Close",
292
+ "reindex.queued": "{count} nodes are queued. The index catches up in the background; searching keeps working meanwhile.",
293
+ "reindex.failed": "The rebuild was not started. Check your access and try again.",
286
294
  "auth.signOut": "Sign out",
287
295
  "auth.signOutFailed": "Signing out failed. Check your connection and try again.",
288
296
  "signIn.refusedTitle": "Signed in, but not accepted",
package/src/i18n/es.json CHANGED
@@ -283,6 +283,14 @@
283
283
  "settings.appearance.system": "Seguir al sistema",
284
284
  "settings.appearance.light": "Claro",
285
285
  "settings.appearance.dark": "Oscuro",
286
+ "reindex.title": "Reconstruir el índice de búsqueda",
287
+ "reindex.description": "Vuelve a leer cada nodo y calcula sus entradas de búsqueda desde cero. No se pierde nada — el índice se construye a partir de los propios documentos —, pero cuesta tiempo y dinero, y después la pantalla se ve igual.",
288
+ "reindex.confirm": "Reconstruir",
289
+ "reindex.running": "Enviando…",
290
+ "reindex.cancel": "Cancelar",
291
+ "reindex.close": "Cerrar",
292
+ "reindex.queued": "{count} nodos están en cola. El índice se pone al día en segundo plano; mientras tanto la búsqueda sigue funcionando.",
293
+ "reindex.failed": "No se inició la reconstrucción. Comprueba tu acceso e inténtalo de nuevo.",
286
294
  "auth.signOut": "Cerrar sesión",
287
295
  "auth.signOutFailed": "El cierre de sesión ha fallado. Comprueba tu conexión e inténtalo de nuevo.",
288
296
  "signIn.refusedTitle": "Sesión iniciada, pero no aceptada",
@@ -4,7 +4,7 @@ import {
4
4
  DocumentLinkInlineType,
5
5
  type Node,
6
6
  type NodeDocument,
7
- } from "@anchrd/intel-contract";
7
+ } from "@anchrd/intel-contract/node";
8
8
  import { filterSuggestionItems } from "@blocknote/core";
9
9
  import { SuggestionMenuController, useCreateBlockNote } from "@blocknote/react";
10
10
  import { useMutation, useQuery } from "@tanstack/react-query";
@@ -1,4 +1,4 @@
1
- import type { RelationGraph } from "@anchrd/intel-contract";
1
+ import type { RelationGraph } from "@anchrd/intel-contract/flow";
2
2
  import type { I18n } from "@/i18n/i18n.types.ts";
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import type { RelationGraph } from "@anchrd/intel-contract";
1
+ import type { RelationGraph } from "@anchrd/intel-contract/flow";
2
2
  import Color from "colorjs.io";
3
3
  import { MultiDirectedGraph } from "graphology";
4
4
 
@@ -1,4 +1,4 @@
1
- import type { RelationGraph } from "@anchrd/intel-contract";
1
+ import type { RelationGraph } from "@anchrd/intel-contract/flow";
2
2
  import { ControlsContainer, SigmaContainer, useCamera, useRegisterEvents } from "@react-sigma/core";
3
3
  import { LocateFixed, Minus, Plus } from "lucide-react";
4
4
  import { useEffect, useMemo } from "react";
@@ -1,4 +1,4 @@
1
- import type { Node } from "@anchrd/intel-contract";
1
+ import type { Node } from "@anchrd/intel-contract/node";
2
2
  import { useMutation, useQuery } from "@tanstack/react-query";
3
3
  import { Download } from "lucide-react";
4
4
  import { ActionSlot } from "@/app/action-slot/action-slot.tsx";
@@ -9,8 +9,8 @@ import { useIntelRouterContext } from "@/router/router-context.ts";
9
9
  * A table as a grid (#40).
10
10
  *
11
11
  * Reading is the whole of the first cut: there is no cell editor, and rows arrive through
12
- * `node_table_append` — the point of the kind is that a flow or an MCP client fills it without a
13
- * person retyping anything. Editing in the grid is anchrd/intel#165.
12
+ * `node_table_row_create` — the point of the kind is that a flow or an MCP client fills it
13
+ * without a person retyping anything. Editing in the grid is anchrd/intel#165.
14
14
  *
15
15
  * ⚠️ The rows are the server's answer, parsed by the server's one CSV reader. A second reader here
16
16
  * would eventually disagree with it about a quoted comma, and the grid would then show something
@@ -1,4 +1,4 @@
1
- import type { Node } from "@anchrd/intel-contract";
1
+ import type { Node } from "@anchrd/intel-contract/node";
2
2
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
3
  import { useNavigate, useRouterState } from "@tanstack/react-router";
4
4
  import { Download, History, Paperclip } from "lucide-react";
@@ -1,10 +1,6 @@
1
- import type {
2
- Flow,
3
- FlowValidation,
4
- Node,
5
- ResourceVerb,
6
- UnreadableNodes,
7
- } from "@anchrd/intel-contract";
1
+ import type { Flow, FlowValidation } from "@anchrd/intel-contract/flow";
2
+ import type { Node } from "@anchrd/intel-contract/node";
3
+ import type { ResourceVerb, UnreadableNodes } from "@anchrd/intel-contract/share";
8
4
  import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
9
5
  import { useNavigate, useRouterState } from "@tanstack/react-router";
10
6
  import {
@@ -1,4 +1,4 @@
1
- import { serverOf, type ToolCapability, type ToolServer } from "@anchrd/intel-contract";
1
+ import { serverOf, type ToolCapability, type ToolServer } from "@anchrd/intel-contract/tool";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { useRouterState } from "@tanstack/react-router";
4
4
  import { AlertTriangle, ChevronRight, PlugZap, ShieldOff, Timer, Wrench } from "lucide-react";