@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 +2 -2
- package/src/app/app-tree/app-tree.tsx +10 -1
- package/src/app/header-search/header-search.tsx +2 -1
- package/src/app/reindex-dialog/reindex-dialog.tsx +79 -0
- package/src/app/user-footer/user-footer.tsx +19 -0
- package/src/archive/archive.tsx +2 -1
- package/src/data/intel-data-provider/intel-data-provider.ts +43 -29
- package/src/data/intel-data-provider/intel-data-provider.types.ts +40 -24
- package/src/document-link/document-link.tsx +1 -1
- package/src/entry-picker/entry-picker.tsx +1 -1
- package/src/flow-runs/flow-runs.tsx +1 -1
- package/src/flows/flows.tsx +3 -2
- package/src/flows/node-icon/node-icon.ts +1 -1
- package/src/flows/node-palette/node-palette.tsx +1 -1
- package/src/flows/node-palette/node-palette.types.ts +1 -1
- package/src/graph-pane/graph-pane.tsx +1 -1
- package/src/i18n/de.json +8 -0
- package/src/i18n/en.json +8 -0
- package/src/i18n/es.json +8 -0
- package/src/node-editor/node-editor.tsx +1 -1
- package/src/node-graph/graph-notice.tsx +1 -1
- package/src/node-graph/node-graph.ts +1 -1
- package/src/node-graph/node-graph.tsx +1 -1
- package/src/node-table/node-table.tsx +3 -3
- package/src/nodes/nodes.tsx +1 -1
- package/src/resource-menu/resource-menu.tsx +3 -7
- package/src/tools/tools.tsx +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anchrd/intel-ui",
|
|
3
|
-
"version": "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.
|
|
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
|
-
|
|
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
|
|
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
|
package/src/archive/archive.tsx
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Flow
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
UpdateNodeInput,
|
|
47
|
+
} from "@anchrd/intel-contract/node";
|
|
48
|
+
import {
|
|
49
|
+
ResourceGrantList,
|
|
50
|
+
RevokeGrantInput,
|
|
51
|
+
RevokeGrantResult,
|
|
46
52
|
ShareInput,
|
|
47
53
|
ShareResult,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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(
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
+
UpdateNodeInput,
|
|
48
|
+
} from "@anchrd/intel-contract/node";
|
|
49
|
+
import type {
|
|
50
|
+
ResourceGrantList,
|
|
51
|
+
RevokeGrantInput,
|
|
52
|
+
RevokeGrantResult,
|
|
46
53
|
ShareInput,
|
|
47
54
|
ShareResult,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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";
|
package/src/flows/flows.tsx
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { Flow, FlowGraph, FlowNode
|
|
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 { 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 { 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 { 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
|
-
* `
|
|
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
|
package/src/nodes/nodes.tsx
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
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 {
|
package/src/tools/tools.tsx
CHANGED
|
@@ -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";
|